# Rétropropagation du gradient

En intelligence artificielle, plus précisément en apprentissage automatique, la rétropropagation du gradient est une méthode pour entraîner un réseau de neurones. Elle consiste à mettre à jour les poids de chaque neurone de la dernière couche vers la première. Elle vise à corriger les erreurs selon l'importance de la contribution de chaque élément à celles-ci. Dans le cas des réseaux de neurones, les poids synaptiques qui contribuent plus à une erreur sont modifiés de manière plus importante que les poids qui provoquent une erreur marginale.
De façon abusive, on appelle souvent « technique de rétropropagation du gradient » l'algorithme classique de correction des erreurs reposant sur le calcul du gradient grâce à la rétropropagation. C'est cette méthode qui est présentée ici. La correction des erreurs peut se faire selon d'autres méthodes, par exemple le calcul de la dérivée seconde.
Ce principe fonde les méthodes de type algorithme du gradient, qui sont utilisées dans des réseaux de neurones multicouches comme les perceptrons multicouches. L'algorithme du gradient a pour but de converger de manière itérative vers une configuration optimale des poids synaptiques. Cette configuration peut être un minimum local de la fonction dite fonction de coût, ou, idéalement, le minimum global de cette fonction. Normalement, la fonction de coût est non linéaire au regard des poids synaptiques. Elle dispose également d'une borne inférieure et moyennant quelques précautions lors de l'apprentissage, les procédures d'optimisation finissent par aboutir à une configuration stable au sein du réseau de neurones.

## Historique

La méthode de rétropropagation du gradient a fait l'objet de communications dès 1975 (Werbos), puis 1985 (Parker et LeCun), mais ce sont les travaux de Rumelhart, Hinton et Williams en 1986 qui ont suscité le véritable début de l'engouement pour cette méthode.
Jürgen Schmidhuber, dans un état de l'art publié en 2015 établit que la méthode a été mise au point pour la première fois par Seppo Linnainmaa dans son mémoire de maîtrise soutenu à l'université d'Helsinki en 1970$^,$.

## Utilisation au sein d'un apprentissage supervisé

Dans le cas d'un apprentissage supervisé, des données sont présentées à l'entrée du réseau de neurones et celui-ci produit des sorties. La valeur des sorties dépend des paramètres liés à la structure du réseau de neurones : connectique entre neurones, fonctions d'agrégation et d'activation ainsi que les poids synaptiques.
Les différences entre ces sorties et les sorties désirées forment des erreurs qui sont corrigées via la rétropropagation, les poids du réseau de neurones sont alors changés. La manière de quantifier cette erreur peut varier selon le type d'apprentissage à effectuer. En appliquant cette étape plusieurs fois, l'erreur tend à diminuer et le réseau offre une meilleure prédiction. Il se peut toutefois qu'il ne parvienne pas à échapper à un minimum local, c'est pourquoi on ajoute en général un terme d'inertie (« momentum ») à la formule de la rétropropagation pour aider l'algorithme du gradient à sortir de ces minimums locaux.

## Algorithme

Les poids dans le réseau de neurones sont au préalable initialisés avec des valeurs aléatoires. On considère ensuite un ensemble de données qui vont servir à l'apprentissage. Chaque échantillon possède ses valeurs cibles qui sont celles que le réseau de neurones doit à terme prédire lorsqu'on lui présente le même échantillon. L'algorithme suit les étapes suivantes.
* Soient un échantillon ${\vec {x}}$ que l'on présente à l'entrée du réseau de neurones et ${\vec {t}}$ la sortie désirée pour cet échantillon.
* On propage le signal en avant dans les couches du réseau de neurones : $x_{k}^{(n-1)}\mapsto x_{j}^{(n)}$, avec $n$ le numéro de la couche, et $k$ et $j$ les numéros des neurones sur leur couche respective.
* La propagation vers l'avant se calcule à l'aide de la fonction d'activation $g$, de la fonction d'agrégation $h$ (souvent un produit scalaire entre les poids et les entrées du neurone) et des poids synaptiques ${\vec {w}}_{jk}$ entre le neurone $x_{k}^{(n-1)}$ et le neurone $x_{j}^{(n)}$. La notation est alors inversée : ${\vec {w}}_{jk}$ indique bien un poids de $k$ vers $j$.
    $x_{j}^{(n)}=g^{(n)}(h_{j}^{(n)})=g^{(n)}{\Big\sum _{k}w_{jk}^{(n)}x_{k}^{(n-1)}{\Big )}$
* Lorsque la propagation vers l'avant est terminée, on obtient à la sortie le résultat ${\vec {y}}$, c-à-d, ${\vec {y}}_{i}=x_{i}^{sortie}$.
* On calcule alors l'erreur entre la sortie donnée par le réseau ${\vec {y}}$ et le vecteur ${\vec {t}}$ désiré à la sortie pour cet échantillon. Pour chaque neurone $i$ dans la couche de sortie, on calcule ($g'$ étant la dérivée de $g$):
    $e_{i}^{\text{sortie}}=g'(h_{i}^{\text{sortie}})(y_{i}-t_{i})$
* On propage l'erreur vers l'arrière $e_{i}^{(n)}\mapsto e_{j}^{(n-1)}$ grâce à la formule suivante :
    $e_{j}^{(n-1)}=g'^{(n-1)}(h_{j}^{(n-1)})\sum _{i}w_{ij}^{(n)}e_{i}^{(n)}$
    note: $e_{i}^{(n)}=e_{i}^{\text{sortie}}=(y_{i}-t_{i}){\frac {\partial y_{i}}{\partial h_{i}^{(n)}}}$
Avec $E$ l'énergie à minimiser : $E={\frac {1}{2}}\sum _{i}(y_{i}-t_{i})^{2}$ sous la forme ${\partial E \over \partial w}={\partial E \over \partial y}{\partial y \over \partial h}{\partial h \over \partial w}$: ${\frac {\partial E}{\partial w_{ab}^{(l)}}}=\sum _{i}(y_{i}-t_{i})g'^{(n)}(h_{i}^{(n)})\sum _{k}w_{ik}^{(n)}{\frac {\partial x_{k}^{(n-1)}}{\partial w_{ab}^{(l)}}}$ ${\frac {\partial E}{\partial w_{ab}^{(l)}}}=\sum _{k}{\frac {\partial x_{k}^{(n-1)}}{\partial w_{ab}^{(l)}}}\sum _{i}w_{ik}^{(n)}\underbrace {g'^{(n)}(h_{i}^{(n)})(y_{i}-t_{i})} _{e_{i}^{(n)}}$ ${\frac {\partial E}{\partial w_{ab}^{(l)}}}=\sum _{k}{\frac {\partial x_{k}^{(n-1)}}{\partial w_{ab}^{(l)}}}\sum _{i}w_{ik}^{(n)}e_{i}^{(n)}$ En utilisant la même technique sur la dérivée partielle de $x_{k}^{(n-1)}$, on obtient :${\frac {\partial E}{\partial w_{ab}^{(l)}}}=\sum _{k}{\frac {\partial x_{k}^{(n-2)}}{\partial w_{ab}^{(l)}}}\sum _{i}w_{ik}^{(n-1)}e_{i}^{(n-1)}$ En itérant l'algorithme jusqu'à la couche $l$, on arrive à : ${\frac {\partial E}{\partial w_{ab}^{(l)}}}=\sum _{k}{\frac {\partial x_{k}^{(l)}}{\partial w_{ab}^{(l)}}}\sum _{i}w_{ik}^{(l+1)}e_{i}^{(l+1)}=x_{b}^{(l-1)}e_{a}^{(l)}$ On voit qu'en définissant la suite des $e_{i}^{(l)}$ comme nous l'avons fait, on peut facilement obtenir la dérivée de l'énergie par rapport aux poids synaptiques d'un neurone à distance $n-l$ de la sortie.
* On met à jour les poids dans toutes les couches :
    $w_{ij}^{(n)}=w_{ij}^{(n)}-\lambda e_{i}^{(n)}x_{j}^{(n-1)}$ où $\lambda$ représente le taux d'apprentissage (de faible magnitude et compris entre $0{,}0$ et $1{,}0$).

## Implémentation

L'algorithme présenté ici est de type « online », c'est-à-dire que l'on met à jour les poids pour chaque échantillon d'apprentissage présenté dans le réseau de neurones. Une autre méthode est dite en « batch », c'est-à-dire que l'on calcule d'abord les erreurs pour tous les échantillons sans mettre à jour les poids (on additionne les erreurs) et lorsque l'ensemble des données est passé une fois dans le réseau, on applique la rétropropagation en utilisant l'erreur totale. Cette façon de faire (batch) est préférée pour des raisons de rapidité et de convergence.
L'algorithme est itératif et la correction s'applique autant de fois que nécessaire pour obtenir une bonne prédiction. Il faut cependant veiller aux problèmes de surapprentissage liés à un mauvais dimensionnement du réseau ou un apprentissage trop poussé.

## Ajout d'inertie

Pour éviter les problèmes liés à une stabilisation dans un minimum local, on ajoute un terme d'inertie (momentum). Celui-ci permet de sortir des minimums locaux dans la mesure du possible et de poursuivre la descente de la fonction d'erreur. À chaque itération, le changement de poids conserve les informations des changements précédents. Cet effet de mémoire permet d'éviter les oscillations et accélère l'optimisation du réseau. Par rapport à la formule de modification des poids présentée auparavant, le changement des poids avec inertie au temps $t$ se traduit par :
    $w_{ij}^{(l)}(t)=w_{ij}^{(l)}(t-1)-\alpha \lambda e_{i}^{(l)}x_{j}^{(l-1)}+(1-\alpha )\Delta w_{ij}^{(l)}(t-1)$
avec $\alpha$ un paramètre compris entre 0 et 1.

## Analogie biologique

Un phénomène biologique équivalent à la rétropropagation d'information dans les réseaux de neurones  a été attesté par Stuart et ses collègues : c'est la rétropropagation neuronale. L'interaction entre les potentiels post-synaptiques et cette rétropropagation semble intervenir dans la plasticité synaptique.