Pilier 7

Rétropropagation — la règle de la chaîne appliquée à une pile

Idée

On a besoin de savoir comment chaque coefficient profond influence l'erreur en sortie ; on fait remonter l'information depuis la sortie en multipliant à chaque étape par la dérivée locale.

Pourquoi

Quand l'erreur est calculée à la sortie d'une pile de couches, on a besoin de savoir comment chaque poids $W_\ell$ profond influence cette erreur. La rétropropagation fait remonter l'information de la sortie vers l'entrée, couche par couche, en multipliant à chaque étape par la dérivée locale. C'est exactement la règle de la chaîne $(f \circ g \circ h)' = f'(g(h)) \cdot g'(h) \cdot h'$ vue en analyse de spé MPSI, mecanisee sur un graphe d'opérations. Pytorch l'execute automatiquement via loss.backward() ; le PDF rappelle p5 que 'le graphe de calcul est reinitialise à chaque étape forward'. À retenir : la rétropropagation n'est qu'une comptabilité bien tenue. Pas de magie — juste la règle de la chaîne déroulée d'arrière en avant à travers la pile.

Outil

Règle de la chaîne $(f \circ g \circ h)' = f'(g(h)) \cdot g'(h) \cdot h'$ d'analyse MPSI, mecanisee sur un graphe d'opérations.

Formule

La rétropropagation (backprop) est l'algorithme qui calcule efficacement les gradients de la fonction de coût par rapport à tous les paramètres d'un réseau profond. C'est la règle de la chaîne du calcul différentiel — la même que celle vue en MPSI pour dériver $f(g(x))$ — appliquée systématiquement à une pile de couches. On part de la sortie : on a $L = f_{\text{loss}}(A^{[L]}, y)$, et on calcule $\partial L / \partial Z^{[L]}$. Puis on remonte : $\partial L / \partial W^{[L]} = (\partial L / \partial Z^{[L]}) \cdot (\partial Z^{[L]} / \partial W^{[L]})$, etc. À chaque couche, on a besoin de deux choses : le gradient venant de la couche suivante (déjà calculé), et la dérivée locale de cette couche (facile, c'est juste $\sigma'$ et la matrice $W$). En une seule remontée — donc en un coût comparable à un seul passage avant — on obtient tous les gradients. Sans cet algorithme, calculer chaque $\partial L / \partial w_{ij}$ par différence finie coûterait un passage avant entier par paramètre, ce qui est impossible pour un réseau à des millions de poids. C'est l'astuce qui rend l'apprentissage profond praticable.

Piège

Le piège dimensionnel par excellence. Sans transposition, on multiplie une matrice $(n_2, m)$ par une matrice $(n_1, m)$ — soit la multiplication échoue (dimensions incompatibles), soit, pire, broadcasting silencieux qui produit une matrice de mauvaise forme. La transposition de $A_1$ est ce qui fait disparaître l'axe $m$ (somme sur les exemples) et ce qui fait apparaître la bonne forme $(n_2, n_1)$ identique à celle de $W_2$. Vidéo 8 fait toute la vérification dimensionnelle.