La rétropropagation
Un seul passage arrière qui récupère le gradient de tous les poids : la règle de la chaîne, industrialisée.
Au chapitre 7, on a appris à calculer pour un poids isolé, en multipliant des dérivées locales le long du graphe d’un neurone. C’était la règle de la chaîne, posée brique par brique. Mais un réseau réel n’a pas un poids : il en a des milliers, enchaînés sur plusieurs couches. Refaire ce calcul de zéro pour chaque poids serait ruineux.
La question de ce chapitre est donc précise : comment obtenir la dérivée de la note par rapport à tous les poids d’un coup, en un seul passage, sans répéter mille fois les mêmes multiplications ? La réponse est un algorithme d’une élégance rare, et tu en as déjà tous les morceaux. Il ne reste qu’à les organiser.
Acte 1 : le coût de la force brute
Reprends la fin du chapitre 7. Pour un seul neurone, on avait
Trois facteurs, multipliés le long du chemin . Simple. Maintenant, empile deux couches. La note dépend des poids de la dernière couche, mais aussi de ceux de la couche cachée, qui agissent plus tôt et dont l’effet doit traverser toute la suite du réseau avant d’atteindre la note.
L’approche naïve consiste à traiter chaque poids séparément : pour chacun, repartir de la note et redescendre la chaîne de dérivées jusqu’à lui. Le problème saute aux yeux dès qu’on compte. Deux poids qui finissent au même neurone de sortie partagent exactement le même début de chaîne. Le recalculer pour chacun, c’est refaire la même multiplication encore et encore. Sur un réseau à un million de poids, c’est un million de chaînes presque identiques, recalculées en pure perte.
L’idée libératrice tient en une phrase : et si on calculait une seule fois les morceaux communs, qu’on les mémorisait, et qu’on les réutilisait ? C’est précisément ce que fait la rétropropagation. Le mot désigne l’algorithme qui calcule le gradient de la note par rapport à chaque poids en remontant le réseau de la sortie vers l’entrée, en réutilisant les résultats intermédiaires au lieu de les recalculer.
Acte 2 : le signal d’erreur et les deux passes
Le morceau commun à toutes les chaînes qui passent par un neurone, c’est la sensibilité de la note à ce neurone. On lui donne un nom et un symbole. Le signal d’erreur Signal d'erreur Sensibilité de la perte à la pré-activation d'un neurone, notée delta = dL/dz. Elle mesure de combien la note changerait si l'entrée nette du neurone variait d'un cheveu. La rétropropagation calcule ce signal pour chaque neurone, de la sortie vers l'entrée, puis en déduit le gradient de chaque poids par la règle dL/dw = delta multiplié par l'activation amont. d’un neurone, noté , est la dérivée de la note par rapport à la pré-activation de ce neurone :
Il se lit : de combien la note changerait si l’entrée nette de ce neurone variait d’un cheveu. Une fois ce nombre connu pour un neurone, le gradient de chacun de ses poids entrants s’en déduit d’un seul produit. C’est la formule maîtresse du chapitre :
le signal d’erreur du neurone d’arrivée , multiplié par l’activation du neurone de départ . Tout le travail se réduit donc à calculer les . Et pour cela, on procède en deux passes.
La passe avant mémorise. On fait d’abord un forward pass normal, des entrées vers la sortie, mais cette fois on garde en mémoire chaque pré-activation et chaque activation . Elles vont resservir.
La passe arrière propage l’erreur. La passe arrière Passe arrière Phase de la rétropropagation où le signal d'erreur se propage de la sortie vers l'entrée, en sens inverse du forward pass, pour assembler le gradient de chaque poids. Elle réutilise les activations mémorisées pendant la passe avant au lieu de les recalculer. part de la sortie et remonte. Au neurone de sortie, le signal d’erreur combine la pente de la note et la pente de l’activation :
Puis on recule d’une couche. Le signal d’erreur d’un neurone caché est l’erreur des neurones qu’il alimente, ramenée jusqu’à lui en la pondérant par les poids de connexion, puis modulée par sa propre pente locale :
La somme parcourt tous les neurones de la couche suivante que alimente. C’est là tout le sens du préfixe : l’erreur se propage à rebours, de la sortie vers l’entrée, chaque neurone recevant la part d’erreur qu’il a contribué à créer en aval.
Déroulons sur un petit réseau jouet à deux entrées, deux neurones cachés et une sortie, avec les poids suivants : la couche cachée a et des biais nuls, la sortie a et un biais . On présente l’entrée avec la cible .
La passe avant donne , donc , puis et . La note vaut . La passe arrière donne d’abord , dont on tire les gradients de la sortie, puis les signaux cachés , dont on tire les gradients de la couche cachée. Tu remarqueras déjà que les signaux d’erreur cachés sont presque dix fois plus petits que celui de la sortie : retiens-le, l’acte 3 y reviendra.
Avance pas à pas dans le composant : la passe avant éclaire le réseau de gauche à droite, puis la passe arrière fait remonter le signal d’erreur de droite à gauche.
Rétropropagation, étape par étape
Trois choses à observer en jouant :
- Pendant la passe avant, chaque neurone range son activation. Pendant la passe arrière, ces activations ressortent telles quelles dans les produits : rien n’est recalculé, tout est réutilisé.
- Le signal d’erreur de sortie se répartit vers les neurones cachés en suivant les poids à rebours. Un neurone caché relié par un poids fort reçoit une plus grosse part de l’erreur.
- Chaque gradient de poids est le produit de deux nombres déjà calculés : le signal d’erreur du neurone d’arrivée et l’activation du neurone de départ. La formule maîtresse, en acte.
Acte 3 : pourquoi « rétro », et le produit qui s’effondre
Le sens de la passe arrière n’est pas un choix arbitraire, il est imposé par le graphe. Lire un réseau comme un graphe de calcul Graphe de calcul Représentation d'un calcul comme un graphe orienté dont les noeuds sont des opérations et les arêtes les valeurs qui circulent. Lire un réseau comme un graphe de calcul rend la rétropropagation systématique : on multiplie les dérivées locales le long des arêtes, en remontant des sorties vers les entrées. , c’est voir chaque valeur comme un noeud et chaque dépendance comme une flèche. Or les flèches du calcul vont de l’entrée vers la sortie : détermine , qui détermine , qui détermine . Les dérivées, elles, voyagent dans le sens inverse, car pour savoir comment dépend d’un poids profond, il faut remonter toute la chaîne qui sépare ce poids de la note. Le calcul descend, l’erreur remonte.
Cette remontée a une conséquence lourde. Le signal d’erreur d’un neurone profond est un produit : à chaque couche traversée vers l’arrière, on multiplie par un nouveau facteur . Or la dérivée de la sigmoïde ne dépasse jamais , sa valeur maximale, atteinte en . Multiplier des nombres tous inférieurs à , couche après couche, fait fondre le résultat de façon exponentielle. Au bout de quelques couches, le signal d’erreur des premières couches est si petit qu’elles n’apprennent presque plus. C’est le vanishing gradient Vanishing gradient Disparition du gradient dans les couches profondes d'un réseau. Quand la dérivée maximale d'une fonction d'activation est inférieure à 1, le gradient se multiplie à chaque couche traversée et s'écrase exponentiellement. Identifié par Glorot et Bengio (2010), c'est l'une des raisons du passage à ReLU. Source : Glorot et Bengio, 2010 , la disparition du gradient, et tu en as vu le germe dès le réseau jouet, où les gradients cachés étaient déjà bien plus petits que ceux de la sortie.
Empile des couches dans le simulateur et regarde le gradient s’effondrer. Bascule l’activation pour comparer : la sigmoïde écrase tout, alors que ReLU, dont la dérivée vaut dans sa zone active, laisse passer le signal.
Glisse pour empiler des couches et regarde le produit des dérivées s'effondrer.
Trois choses à observer en jouant :
- En sigmoïde, chaque couche ajoutée divise le gradient par au moins quatre. Sur six couches, il ne reste presque rien pour les premières.
- En ReLU, la dérivée vaut dans la zone active, donc le produit ne s’écrase pas de la même façon. C’est l’une des grandes raisons du passage massif à ReLU.
- Le phénomène est une pure conséquence de la rétropropagation : le gradient profond est un produit de dérivées locales, et un produit de petits nombres est minuscule.
Exercices
Prends de quoi écrire. Les corrigés sont volontairement détaillés, ligne par ligne. On garde le réseau jouet de l’acte 2, et on te donne les valeurs de sigmoïde utiles : et .
Exercice 1. Fais la passe avant du réseau jouet. Calcule , , puis , en utilisant les valeurs de sigmoïde fournies.
Exercice 2. On donne et la cible . Calcule le signal d’erreur de sortie , puis le gradient du premier poids de sortie.
Exercice 3. Rétropropage le signal jusqu’au premier neurone caché. Calcule , puis le gradient (le poids de la première entrée vers le premier neurone caché). On rappelle , et .
Exercice 4. Pour comprendre le vanishing gradient, suppose une chaîne de neurones sigmoïdes tous centrés en , où . Donne le facteur multiplicatif accumulé après 3 couches, puis après 6 couches.
En une phrase
La rétropropagation calcule le gradient de tous les poids en une passe avant qui mémorise les activations et une passe arrière qui propage le signal d’erreur de la sortie vers l’entrée, chaque gradient de poids étant le produit du signal d’erreur du neurone d’arrivée par l’activation du neurone de départ.
Quiz
1. Que représente le signal d’erreur δ d’un neurone ?
2. Pourquoi la passe avant mémorise-t-elle les activations ?
3. Comment obtient-on le signal d’erreur d’un neurone caché ?
4. Pourquoi parle-t-on de propagation « arrière » ?
5. D’où vient le vanishing gradient avec la sigmoïde ?
Vers le chapitre 9
On sait maintenant calculer, en un seul passage arrière, le gradient de la note par rapport à chaque poids du réseau. On tient donc la boussole complète : pour chaque poids, dans quel sens et de combien le bouger ferait baisser la note. Mais savoir où descendre n’est pas descendre. De combien avancer à chaque pas ? Que se passe-t-il si le pas est trop grand, ou trop petit ? La descente de gradient, au chapitre 9, transforme ce gradient en une règle de mise à jour des poids, et fait enfin apprendre le réseau.
Sources
- Rumelhart, D. E., Hinton, G. E. & Williams, R. J. (1986). « Learning representations by back-propagating errors. » Nature 323, 533-536. DOI 10.1038/323533a0
- Goodfellow, I., Bengio, Y. & Courville, A. (2016). Deep Learning. MIT Press. Section 6.5 (rétropropagation et différentiation). https://www.deeplearningbook.org
- Nielsen, M. (2015). Neural Networks and Deep Learning. Chapitre 2, sur l’algorithme de rétropropagation. http://neuralnetworksanddeeplearning.com/chap2.html