18.11. Rétropropagation et formation sur les réseaux neuronaux : normalisation par lots
Le processus de rétropropagation est au cœur de la formation des réseaux de neurones profonds (Deep Learning). Il est chargé de mettre à jour efficacement les poids du réseau en fonction de l'erreur calculée entre les sorties prédites et les sorties souhaitées. Cependant, la formation des réseaux de neurones peut s'avérer difficile en raison de problèmes tels que la disparition ou l'explosion des gradients. Pour atténuer ces problèmes et améliorer l'efficacité et la stabilité de la formation, des techniques telles que la normalisation par lots sont appliquées.
Qu'est-ce que la rétropropagation ?
La rétropropagation est une méthode utilisée pour calculer le gradient de la fonction de coût par rapport à chaque poids du réseau. Le calcul du gradient est essentiel pour ajuster les poids via l'algorithme de descente de gradient ou ses variantes. L'idée centrale est de propager l'erreur de la sortie du réseau vers les couches précédentes, en ajustant les poids afin que l'erreur soit minimisée dans les itérations suivantes.
Défis de la formation sur les réseaux neuronaux
Lors de la formation de réseaux de neurones profonds, des problèmes peuvent survenir rendant la convergence des modèles difficile. Les gradients qui disparaissent se produisent lorsque les gradients deviennent si petits que l'ajustement des pondérations devient insignifiant, empêchant le réseau d'apprendre. D’un autre côté, une explosion de gradient se produit lorsque les gradients deviennent excessivement importants, entraînant des mises à jour de poids très importantes et potentiellement instables. Ces deux problèmes sont particulièrement répandus dans les réseaux comportant plusieurs couches.
Normalisation par lots : une solution
La normalisation par lots est une technique introduite par Sergey Ioffe et Christian Szegedy en 2015 pour lutter contre les problèmes susmentionnés. L'idée est de normaliser les entrées de chaque couche au sein d'un mini-batch, c'est-à-dire d'ajuster et de mettre à l'échelle les données pour qu'elles aient une moyenne proche de zéro et un écart type proche de un. Cela aide à stabiliser le processus d'apprentissage et permet d'utiliser des taux d'apprentissage plus élevés, accélérant ainsi la formation.
Comment fonctionne la normalisation par lots ?
La normalisation par lots est appliquée à chaque mini-lot pendant l'entraînement. Pour chaque caractéristique, la moyenne et la variance sont calculées sur le mini-lot. Ensuite, les entrées sont normalisées en soustrayant la moyenne et en divisant par la racine carrée de la variance. De plus, deux paramètres entraînables, appelés gamma (γ) et bêta (β), sont introduits afin que le réseau puisse apprendre l'échelle et le déplacement optimaux des données normalisées, au cas où la normalisation pure ne serait pas idéale pour apprendre la tâche en question.
Avantages de la normalisation par lots
- Réduire les problèmes de dégradé : en normalisant les entrées, les dégradés sont moins susceptibles de disparaître ou d'exploser pendant l'entraînement.
- Permet des taux d'apprentissage plus élevés : la stabilité fournie par la normalisation permet d'utiliser des taux d'apprentissage plus élevés, accélérant ainsi la formation.
- Soulage le besoin de démarrages spécifiques : la normalisation réduit la dépendance de l'entraînement à l'initialisation du poids.
- Régularisation : la normalisation par lots introduit également un certain niveau de bruit dans les données (du fait du calcul des moyennes et des variances dans les mini-lots), ce qui peut avoir un effet régularisant et améliorer la généralisation des le modèle.
Mise en œuvre de la normalisation par lots en Python avec TensorFlow/Keras
En Python, à l'aide de bibliothèques telles que TensorFlow et Keras, la normalisation par lots peut être facilement implémentée dans un réseau neuronal. Voici un exemple de la façon d'ajouter une couche de normalisation par lots à un modèle séquentiel dans Keras :
depuis keras.models import séquentiel
à partir de keras.layers import Dense, BatchNormalization
modèle = Séquentiel()
model.add(Dense(64, input_shape=(input_dim,), activation='relu'))
model.add (BatchNormalization ())
model.add(Dense(64, activation='relu'))
model.add (BatchNormalization ())
model.add(Dense(num_classes, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
Cet exemple montre un modèle avec deux couches masquées, chacune suivie d'une couche de normalisation par lots. En ajoutant ces couches, la normalisation est automatiquement appliquée pendant l'entraînement.
Conclusion
La rétropropagation et la normalisation par lots sont des éléments fondamentaux dans la formation des réseaux neuronaux profonds. Alors que la rétropropagation garantit que les erreurs se propagent efficacement à travers le réseau, la normalisation par lots permet de maintenir les gradients dans une plage contrôlée, facilitant ainsi la formation et améliorant les performances du modèle. En incorporant la normalisation par lots dans les modèles Deep LeGrâce à leur formation, les chercheurs et les développeurs peuvent accélérer la formation et obtenir des résultats remarquables dans diverses applications d'apprentissage automatique.