Cet article vous permettra de maîtriser 22 compétences de formation en réseau de neurones

L'article suivant provient de Deep Blue AI, auteur Kuang Ji, envahi et supprimé

Cet article vous permettra de maîtriser 22 compétences de formation en réseau de neurones


La formation du réseau neuronal est un processus très complexe, dans lequel de nombreuses variables interagissent les unes avec les autres, il est donc difficile pour nos chercheurs de comprendre comment ces variables affectent le réseau neuronal au cours de ce processus. Les nombreux conseils donnés dans cet article visent à rendre plus facile et plus pratique pour chacun d'accélérer le réseau de formation dans le processus de formation du réseau de neurones. Bien sûr, ces conseils ne sont pas un processus nécessaire pour former le réseau, mais comme des suggestions heuristiques, afin que chacun puisse mieux comprendre la tâche à accomplir et choisir la technologie appropriée de manière ciblée.

Tout d'abord, le choix d'un bon état d'entraînement initial est un sujet très vaste qui comprend : du rehaussement d'image au choix des hyperparamètres, etc. Nous listons ci-dessous les opérations spécifiques :


1.Suradapter un seul lot

Surajustement par lot unique - principalement utilisé pour tester les performances de notre réseau. Tout d'abord, entrez un seul lot de données et assurez-vous que les étiquettes correspondant à ce lot de données sont correctes (si des étiquettes sont requises). Ensuite, répétez la formation sur ce lot de données jusqu'à ce que la valeur de la fonction de perte se stabilise. Si votre réseau n'est pas en mesure d'atteindre un taux de précision parfait (en utilisant différentes métriques), alors d'abord vérifier les données, dans cette méthode que nous proposons, consiste à vérifier les performances de notre modèle sous la condition de s'assurer que les données sont correctes. De cette façon, nous évitons d'utiliser des modèles trop grands ou complexes pour résoudre des problèmes simples.Après tout, trouver la méthode la plus appropriée est la plus efficace (pas besoin de couteau pour tuer un poulet)


2. Exécuter avec un nombre élevé d'époques

Dans de nombreux cas, nous pouvons obtenir un bon résultat après avoir entraîné le modèle sur un grand nombre d'époques. Si, nous pouvons nous permettre de former le modèle pendant une longue période, alors nous pouvons adopter une stratégie pour choisir le nombre d'époques (par exemple : augmenter progressivement de 100 à 500). De cette façon, lorsque nous avons beaucoup d'expérience dans les modèles de formation, nous pouvons résumer notre propre ensemble de données (appelés facteurs d'époque). En utilisant ces paramètres, lorsque nous formons un nouveau modèle, nous pouvons rapidement définir les époques de formation initiales, et suivre Un certain pourcentage pour augmenter les époques.


3.Définir les graines

Pour assurer la reproductibilité du modèle, une approche que nous pouvons adopter consiste à amorcer toute opération de génération de nombres aléatoires. Par exemple, si nous utilisions un TensorFlowframework, nous pourrions prendre l'extrait de code suivant :

import os, random
import numpy as np
import tensorflow as tf

def set_seeds(seed: int):
 os.environ['PYTHONHASHSEED'] = str(seed)
 random.seed(seed)
 tf.random.set_seed(seed)
 np.random.seed(seed)

PytorchCadre:


np.random.seed(0)
torch.manual_seed(0)
torch.cuda.manual_seed_all(0)

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

La raison de l'utilisation de la graine d'opération est que l'ordinateur ne peut pas réellement produire de nombres aléatoires, c'est-à-dire que l'ordinateur produit des nombres pseudo-aléatoires, qui produisent des nombres aléatoires selon certaines règles. Dans ce cas, nous pouvons utiliser une série de règles pour simuler la génération de nombres aléatoires, c'est-à-dire que nous utilisons la fonction set_seed pour simuler la génération de nombres aléatoires.Pour plus de détails, vous pouvez vous référer à la documentation de TensorFlow.


4.Rééquilibrez le jeu de données

Ensembles de données déséquilibrés, c'est-à-dire qu'une ou plusieurs classes occupent une grande partie de l'ensemble de données ; inversement, une ou plusieurs classes occupent une petite partie de l'ensemble de données. Si les différentes catégories de données que nous utilisons ont essentiellement les mêmes caractéristiques, nous envisageons des stratégies pour résoudre ces problèmes, telles que : sur-échantillonner les données de la plus petite catégorie, sous-échantillonner les données de la plus grande catégorie, collecter des échantillons de données supplémentaires (si possible) et utiliser l'augmentation des données pour générer de faux échantillons de données, etc.


5.Utilisez une classe neutre

Considérez la situation suivante, votre jeu de données a deux classes : classe1 et classe2 (c'est-à-dire pas classe1), en supposant que ces échantillons de données sont tous étiquetés par des experts (pour garantir l'exactitude des étiquettes de données). Ensuite, s'il y a un exemple dans ces données dont la classe ne peut pas être déterminée, la classe de cet échantillon peut être marquée comme aucune, ou elle peut être marquée comme une classe (mais avec une confiance très faible). Dans de tels cas, nous introduisons une troisième catégorie est un bon moyen de résoudre ces problèmes. Dans le cas présent, cette catégorie supplémentaire est désignée sous le nom de catégorie "indéterminée". Lors de la formation du modèle de réseau, nous pouvons exclure ce troisième type de données de la participation à la formation. Après cela, nous pouvons utiliser le modèle formé pour réétiqueter ces échantillons de données étiquetés flous.


6.Définissez le biais de la couche de sortie

Pour les ensembles de données non étiquetés, le réseau ne peut pas éviter de deviner des échantillons de données au stade initial. Même si le modèle de réseau peut être formé pour apprendre les étiquettes correctes pour les échantillons de données, cela augmentera considérablement le temps de formation. Nous pouvons réduire le temps de formation du modèle en concevant une meilleure formule de biais du modèle pendant la phase de conception du modèle. Pour une couche sigmoïde, le biais peut être calculé par la formule suivante (en supposant qu'il n'y a que deux classes) :
biais = log (pos/négatif) biais=log(pos/négatif)biais s=l o g ( pos / n e g a t i v e )
Lorsque nous avons créé le modèle, nous pouvons utiliser les valeurs calculées ci-dessus pour initialiser le biais .


7. Réglez le taux d'apprentissage

Si vous souhaitez ajuster certains hyperparamètres, la première chose sur laquelle vous devez vous concentrer est le taux d'apprentissage. Ci-dessous, nous donnons un graphique de sortie des résultats d'apprentissage du modèle lorsque le taux d'apprentissage est trop élevé :

insérez la description de l'image ici
En revanche, si on utilise un taux d'apprentissage initial différent et plus petit, on peut obtenir les résultats suivants :
insérez la description de l'image ici
Évidemment, le choix du taux d'apprentissage correspondant à la consommation de temps d'apprentissage et à la précision du modèle est particulièrement important, et nous ne l'expliquerons pas ici Si une stratégie est conçue pour sélectionner un taux d'apprentissage optimal par la formation, la méthode de sélection du taux d'apprentissage optimal sera détaillée dans un article de suivi (veuillez prêter attention à l'article de suivi). Ici, nous donnons des valeurs d'apprentissage empiriques, c'est-à-dire un taux d'apprentissage initial compris entre 0,001 et 0,01.


8.Utilisez des pipelines de données rapides

Pour les petits projets, nous pouvons utiliser un générateur personnalisé. Et lorsque nous sommes impliqués dans un grand projet, nous pouvons remplacer le générateur par un mécanisme de jeu de données spécialisé. Dans l'exemple TenorFlow, nous pouvons utiliser tf.datacette API, cette fonction API contient la plupart des méthodes requises, telles que : mélange, traitement par lots et prélecture, etc. Ce mécanisme de jeu de données professionnel, au lieu de notre générateur de données personnalisé, peut être bien appliqué dans nos projets réels.


9.Utiliser l'augmentation des données

L'augmentation des données nous permet de former un modèle de réseau plus robuste en augmentant le nombre d'ensembles de données ou en suréchantillonnant de petites catégories de données, mais la consommation de ces augmentations de données correspond à une augmentation du nombre de sessions de formation. Ci-dessous, nous donnons quelques données couramment utilisées Méthodes courantes d'amélioration des données d'image :
1.Flip (flip)
insérez la description de l'image ici
2.Rotation (rotation)
insérez la description de l'image ici
3.Scale (zoom)
insérez la description de l'image ici
4.Crop (rognage)
insérez la description de l'image ici


10. Entraînez un AutoEncoder sur des données non étiquetées, utilisez la représentation de l'espace latent comme intégration

Si les ensembles de données étiquetés que nous utilisons pour la formation sont relativement petits, il existe encore des stratégies que nous pouvons utiliser pour utiliser ces ensembles de données pour accomplir la tâche. L'une des méthodes consiste à utiliser AutoEncoder, dont l'arrière-plan est que nous pouvons facilement collecter des données non étiquetées. Ensuite, nous pouvons utiliser AutoEncoder, et AutoEncoder grand un espace latent de taille appropriée (par exemple : 300 à 600 entrées), pour obtenir une valeur raisonnable et petite de la fonction de perte de reconstruction. Afin d'obtenir les informations d'intégration des données réelles, nous pouvons ignorer la couche réseau du décodeur, puis nous utilisons la couche réseau du codeur réservé pour générer les informations d'intégration.


11.Utiliser les incorporations d'autres modèles

Contrairement au point 10, qui utilise nos propres données pour obtenir les informations d'intégration, nous pouvons également apprendre les informations d'intégration à partir d'autres modèles. Pour les tâches de données textuelles, le téléchargement d'intégrations pré-appris est une approche courante. Pour les tâches de données d'image, nous pouvons utiliser un modèle formé sur un grand ensemble de données (par exemple : ImageNet), sélectionner une couche réseau entièrement formée et couper ces sorties, puis utiliser les résultats de ces coupes comme informations d'intégration.


12.Utilisez des intégrations pour réduire les données

Tout d'abord, en supposant que nos échantillons d'ensemble de données ont une information de caractéristique de catégorie, alors au début, la caractéristique de catégorie correspondant à un échantillon de données ne peut prendre que deux valeurs, c'est-à-dire que l'encodage one-hot correspondant a deux indices . Cependant, une fois que cette valeur de catégorie est étendue à 1000 catégories ou plus, une méthode d'encodage one-hot clairsemée n'est plus efficace, car nous pouvons représenter les données dans une dimension relativement faible, puis l'utilisation de l'intégration d'informations est une méthode efficace. Nous pouvons insérer une couche d'intégration avant la formation (avec des informations de données de grande catégorie, de 0 à 1000, ou même des catégories plus grandes), des informations de catégorie d'entrée ou des informations d'intégration à dimensionnalité réduite. De telles représentations peuvent être obtenues grâce à l'apprentissage du modèle de réseau.


13.Utilisez les points de contrôle

Lorsque nous entraînons un modèle de réseau pendant des heures ou plus, mais que malheureusement, le modèle plante, mais que toutes les informations d'entraînement sont perdues, c'est une chose très frustrante. Considérant que ni le matériel ni le logiciel ne fonctionnent parfaitement, c'est une opération très importante pour nous de faire un bon travail dans le stockage des points de sauvegarde. Dans une utilisation simple des points de contrôle, nous pourrions simplement enregistrer les poids du modèle toutes les k étapes, dans une utilisation ultérieure complexe des points de contrôle, nous pouvons enregistrer l'état de l'optimiseur, ainsi que les informations actuelles et toute autre information clé. Ensuite, après le démarrage de l'exécution d'entraînement, nous pouvons vérifier les instantanés d'exécution ayant échoué et restaurer rapidement tous les paramètres nécessaires en fonction de cet instantané d'exécution. En particulier, l'utilisation de points de contrôle en conjonction avec 14 sessions de formation personnalisées est très efficace.


14. Écrivez des boucles d'entraînement personnalisées

Dans la plupart des cas, l'utilisation du pipeline d'entraînement par défaut, comme dans TensorFlow model.fit\(\), est suffisamment efficace. Cependant, nous avons remarqué que la flexibilité d'utilisation du processus de formation par défaut est limitée, certaines modifications mineures peuvent être faciles à intégrer, mais des modifications plus importantes sont difficiles à mettre en œuvre. C'est pourquoi nous vous recommandons d'écrire votre propre algorithme personnalisé. Ici, nous n'entrerons plus dans les détails, et nous développerons dans la série d'articles de suivi pour expliquer comment implémenter et modifier rapidement l'algorithme à travers différents cas de code et intégrer nos propres dernières idées.


15.Définir les hyperparamètres de manière appropriée

Les GPU modernes sont très bons pour les calculs matriciels, c'est pourquoi ils sont largement utilisés pour former de grands modèles de réseaux neuronaux. En choisissant des hyperparamètres appropriés, nous pouvons encore améliorer l'efficacité de l'algorithme, par exemple, pour les GPU Nvidia (actuellement les GPU grand public), nous pouvons nous référer aux directives suivantes :

  1. La taille de lot sélectionnée peut être normale par 4, ou un multiple de 2

  2. Pour les couches de réseau denses, définissez l'entrée et la sortie pour qu'elles soient divisibles par 64

  3. Pour les couches convolutionnelles, définissez les canaux d'entrée et de sortie pour qu'ils soient divisibles par 4, ou un multiple de 2

  4. Rembourrage de l'image d'entrée de RVB à trois canaux à 4 canaux

  5. Mode de données utilisant BHWC (Batch_height_width_channels)

  6. Pour les couches réseau récurrentes, définissez le lot et les couches cachées pour qu'elles soient divisibles par 4, les valeurs idéales sont 64, 128, 256

L'idée derrière ces recommandations est de rendre les données plus équitablement réparties. Ici, nous donnons quelques documents de référence :

Documentation Nvidia 1

Documentation Nvidia 2

Documentation Nvidia 3


16. Utilisez EarlyStopping

Quand arrêter la formation d'un modèle est une question difficile à répondre. Un phénomène qui peut se produire est la descente bicouche profonde : c'est-à-dire que les métriques de votre modèle commencent à se détériorer après une amélioration constante, puis, après quelques mises à jour de formation, le score du modèle s'améliore à nouveau, encore mieux qu'avant. Pour éviter les allers-retours entre les deux, nous pouvons utiliser un ensemble de données de validation. Cet ensemble de données distinct est utilisé pour mesurer les performances de l'algorithme sur de nouvelles données inédites. Si les performances ne sont pas mises à jour dans les "étapes du patient" que nous avons définies, le modèle ne continuera pas à s'entraîner. Ici, la clé est de choisir un "paramètre d'étape du patient" approprié, qui peut aider notre modèle de service client à surmonter le plateau de score temporaire. Un "paramètre d'étape du patient" couramment utilisé peut être sélectionné entre 5 et 20 époques.


17.Utilisez l'apprentissage par transfert

L'idée derrière l'apprentissage par transfert est d'utiliser les résultats du modèle qui ont été formés sur un grand nombre d'ensembles de données dans l'industrie et de les appliquer à notre tâche. Idéalement, les réseaux que nous utilisons sont entraînés sur les mêmes types de données (images, texte, audio) et des tâches similaires à nos tâches (classification, traduction, détection). Il existe principalement deux méthodes liées :

1. Réglage fin

Le réglage fin consiste à prendre un modèle déjà formé et à mettre à jour les poids du problème caractéristique. En règle générale, nous figeons les premières couches, car elles sont entraînées à reconnaître les fonctionnalités de base, puis affinons les couches restantes sur notre jeu de données.

2. Extraction de fonctionnalités

Contrairement au réglage fin, l'extraction de caractéristiques décrit une méthode d'extraction de caractéristiques à l'aide d'un réseau formé. Sur le modèle formé présélectionné, ajoutez votre propre classificateur et mettez à jour uniquement cette partie du réseau ; la couche de base est gelée. La raison pour laquelle nous suivons cette approche est que le réseau de niveau supérieur d'origine n'est formé que pour le problème caractéristique, mais notre tâche est différente. Souvent, en apprenant à partir de zéro des parties personnalisées des couches réseau, nous pouvons être sûrs de nous concentrer sur notre ensemble de données, tout en conservant les avantages d'un grand modèle de base.


18.Employer une formation parallèle aux données (en utilisant la formation parallèle aux données)

Si nous voulons entraîner notre modèle plus rapidement, nous pouvons exécuter l'algorithme sur plusieurs GPU pour calculer la vitesse d'entraînement. En règle générale, cela se fait de manière parallèle aux données : le réseau est répliqué sur différents appareils et différents lots de données sont divisés et distribués. Ensuite, les gradients sont moyennés et appliqués sur chaque réplique du réseau. Sur TensorFlow, nous pouvons utiliser un certain nombre de stratégies de formation distribuées différentes. L'option la plus simple est "MirroredStategy", mais il existe de nombreuses autres stratégies que je n'aborderai pas ici. Par exemple, si nous écrivons une boucle d'entraînement personnalisée (comme le point 14 ci-dessus), nous pouvons suivre ces tutoriels. Selon notre expérience de formation, la distribution des données d'un GPU à deux ou trois formations est la plus rapide, et pour les grands ensembles de données, c'est un moyen efficace de réduire le nombre de sessions de formation.


19.Utilisez l'activation sigmoïde pour les tâches multi-étiquettes

Dans le cas où un échantillon peut avoir plusieurs étiquettes, nous pouvons utiliser une fonction d'activation sigmoïde, contrairement à softmax, le sigmoïde est appliqué à chaque neurone individuellement, ce qui signifie que plusieurs neurones peuvent être déclenchés et que les valeurs de sortie sont toutes comprises entre 0 et 1, ce qui est pratique pour l'interprétation. Cette méthode est importante dans des tâches telles que la classification d'échantillons en plusieurs classes ou la détection d'une variété d'objets différents.


20. Données catégorielles d'encodage à chaud (données catégorielles encodées à chaud

Les données catégorielles doivent être codées sous forme de nombres en raison de notre besoin de représentation numérique. Par exemple, nous ne pouvons pas renvoyer directement la catégorie "Golden Retriever", mais seulement obtenir le numéro de catégorie représentant "Golden Retriever". Une option plus attrayante consiste à énumérer toutes les valeurs possibles, c'est-à-dire que cette approche signifie trier sur "Golden Retriever" codé 1 et "Orange Cat" codé 2. Cependant, ces ordonnancements sont rarement utilisés en pratique, c'est pourquoi nous nous appuyons sur l'encodage one-hot, qui garantit l'indépendance des variables.


21. Redimensionner les entrées numériques

Le modèle de réseau est formé en mettant à jour les pondérations, et l'optimiseur en est principalement responsable. Normalement, si les valeurs de sortie sont comprises entre [-1, 1], elles peuvent être ajustées à la meilleure valeur, alors pourquoi ? Supposons un paysage vallonné, afin de trouver le point le plus bas, s'il y a plus de collines dans les environs, plus nous passons de temps à trouver le minimum vallonné local. Et si nous pouvions modifier l'état actuel du paysage ? Pouvons-nous trouver des solutions plus rapidement ? C'est ce que nous obtenons en ajustant la valeur, lorsque nous mettons la valeur à l'échelle [-1,1], nous utilisons la courbure pour être plus sphérique (c'est-à-dire plus ronde et plus uniforme). Si nous formons notre modèle avec cette gamme de données, nous pouvons converger plus rapidement. Pourquoi est-ce? Étant donné que la taille de l'entité (c'est-à-dire la valeur de poids) affecte l'amplitude du gradient, les entités plus grandes produisent des gradients plus grands, ce qui entraîne des mises à jour de poids plus importantes qui nécessitent plus d'étapes pour converger, ce qui entraîne un entraînement plus lent. Si vous souhaitez en savoir plus à ce sujet, vous pouvez consulter le didacticiel TensorFlow.


22.Utilisez la distillation des connaissances

Vous devez avoir entendu parler du modèle BERT, n'est-ce pas ? Ce modèle Transformer a des centaines de millions de paramètres, mais nous ne pourrons peut-être pas l'entraîner sur notre GPU, ce grand nombre de paramètres est l'endroit où le processus de distillation des connaissances devient efficace, nous entraînons un deuxième modèle pour produire la sortie d'un modèle plus grand , tandis que la sortie est toujours l'ensemble de données d'origine, mais les étiquettes font référence à la sortie du modèle, également appelée sortie logicielle. Le but de cette technique est de répliquer des modèles plus grands à l'aide de petits modèles. Ici, nous n'avons pas trop expliqué la connaissance de la distillation des connaissances et du modèle de réseau enseignant-élève. Si vous avez besoin de plus de compréhension, vous pouvez vous référer à ces tutoriels connexes.


Référence
[1] https://towardsdatascience.com/tips-and-tricks-for-neural-networks-63876e3aad1a?gi=2732cb2a6e99

[2].https://nanonets.com/blog/data-augmentation-how-to-use-deep-learning-when-you-ha ve-limited-data-part2/

[3].https://www.tensorflow.org/tutorials/structured_data/imbalanced_data#optional_set_the_correct_initial_bias

[4].https://docs.nvidia.com/deeplearning/performance/index.html

[5].https://docs.nvidia.com/deeplearning/performance/dl-performance-fully-connected/inde x.html

[6].https://docs.nvidia.com/deeplearning/performance/dl-performance-convolutional/index. html

[7].https://openai.com/blog/deep-double-descent/

[8].https://www.tensorflow.org/tutorials/distribute/multi_worker_with_ctl

[9].https://www.tensorflow.org/tutorials/images/transfer_learning#rescale_pixel_values

[10].https://medium.com/huggingface/distilbert-8cf3380435b5

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43694096/article/details/125837438
conseillé
Classement