$$ \definecolor{input}{RGB}{66, 133, 244} \definecolor{output}{RGB}{219, 68, 55} \definecolor{dinput}{RGB}{244, 180, 0} \definecolor{doutput}{RGB}{15, 157, 88} \definecolor{dweight}{RGB}{102, 0, 255} $$

Algorithme de rétropropagation

L'algorithme de rétropropagation est essentiel pour identifier rapidement les paramètres idéaux sur de grands réseaux de neurones. Voici son principe de fonctionnement.

Faites défiler la page vers le bas.

Réseau de neurones simple

À droite, vous pouvez voir un réseau de neurones composé d'une entrée, d'un nœud de sortie et de deux couches cachées de deux nœuds chacune.

Les nœuds des couches voisines sont connectés avec des pondérations \(w_{ij}\), qui correspondent aux paramètres du réseau.

Fonction d'activation

Chaque nœud possède une entrée totale \(\color{input}x\), une fonction d'activation \(f(\color{input}x\color{black})\) et une sortie \(\color{output}y\color{black}=f(\color{input}x\color{black})\). La fonction \(f(\color{input}x\color{black})\) ne doit pas être linéaire. Sinon, le réseau de neurones ne pourra apprendre que des modèles linéaires.

L'une des fonctions d'activation couramment utilisées est la fonction sigmoïde : \(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\).

Fonction d'erreur

L'objectif est d'apprendre les pondérations du réseau automatiquement à partir des données de sorte que la sortie prévue \(\color{output}y_{output}\) soit proche de celle ciblée \(\color{output}y_{target}\) pour toutes les entrées \(\color{input}x_{input}\).

Pour évaluer dans quelle mesure nous sommes proches ou non de l'objectif, nous utilisons une fonction d'erreur \(E\). L'une des plus courantes est la suivante : \(E(\color{output}y_{sortie}\color{black},\color{output}y_{cible}\color{black}) = \frac{1}{2}(\color{output}y_{sortie}\color{black} - \color{output}y_{cible}\color{black})^2 \).

Propagation avant

Nous commençons par prendre un exemple d'entrée \((\color{input}x_{entrée}\color{black},\color{output}y_{cible}\color{black})\) et par mettre à jour la couche d'entrée du réseau.

Pour des raisons de cohérence, nous voulons que l'entrée soit comme n'importe quel autre nœud, mais sans fonction d'activation (avec une sortie égale à l'entrée). Par exemple : \( \color{output}y_1 \color{black} = \color{input} x_{entrée} \).

Propagation avant

À présent, nous mettons à jour la première couche cachée. Nous prenons la sortie \(\color{output}y\) des nœuds de la couche précédente et nous utilisons les pondérations pour calculer l'entrée \(\color{input}x\) des nœuds de la couche suivante.
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$

Propagation avant

Ensuite, nous mettons à jour la sortie des nœuds de la première couche cachée. Pour ce faire, nous utlisons la fonction d'activation \( f(x) \).
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$

Propagation avant

À l'aide de ces deux formules, nous effectuons une propagation pour le reste du réseau et obtenons la sortie finale du réseau.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$

Dérivée d'erreur

L'algorithme de rétropropagation décide dans quelle mesure chaque pondération du réseau doit être mise à jour après avoir comparé la sortie prévue à la sortie souhaitée pour un exemple précis. Pour cela, nous devons calculer comment l'erreur évolue en fonction de chaque pondération \(\color{dweight}\frac{dE}{dw_{ij}}\).
Une fois que nous avons les dérivées d'erreur, nous pouvons mettre à jour les pondérations en appliquant une règle simple :
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
où \(\alpha\) est une constante positive, appelée taux d'apprentissage, dont nous avons besoin pour procéder à un ajustement de façon empirique.

[Remarque] Cette règle de mise à jour est très simple : si l'erreur diminue quand la pondération augmente (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)), il vous suffit d'augmenter la pondération. Inversement, si l'erreur augmente quand la pondération augmente (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)), vous devez diminuer la pondération.

Autres dérivées

Pour faciliter le calcul de \(\color{dweight}\frac{dE}{dw_{ij}}\), nous enregistrons également pour chaque nœud deux autres dérivées : Comment l'erreur évolue avec :
  • l'entrée totale du nœud \(\color{dinput}\frac{dE}{dx}\) et ;
  • la sortie du nœud \(\color{doutput}\frac{dE}{dy}\).

Rétropropagation

Commençons par effectuer une rétropropagation des dérivées d'erreur. Comme nous possédons la sortie prévue de cet exemple d'entrée précis, nous pouvons calculer dans quelle mesure l'erreur évolue avec cette sortie. Compte tenu de notre fonction d'erreur \(E = \frac{1}{2}(\color{output}y_{sortie}\color{black} - \color{output}y_{cible}\color{black})^2\) nous avons :
$$ \color{doutput} \frac{\partial E}{\partial y_{sortie}} \color{black} = \color{output} y_{sortie} \color{black} - \color{output} y_{cible}$$

Rétropropagation

Maintenant que nous avons \(\color{doutput} \frac{dE}{dy}\) nous pouvons obtenir \(\color{dinput}\frac{dE}{dx}\) en utilisant le théorème de dérivation des fonctions composées.
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
où \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) lorsque \(f(\color{input}x\color{black})\) est la fonction d'activation sigmoïde.

Rétropropagation

Dès que nous avons la dérivée d'erreur par rapport à l'entrée totale d'un nœud, nous pouvons obtenir la dérivée d'erreur par rapport aux pondérations intégrant ce nœud.
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$

Rétropropagation

À l'aide du théorème de dérivation des fonctions composées, nous pouvons également obtenir \(\frac{dE}{dy}\) à partir de la couche précédente. La boucle est maintenant bouclée.
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$

Rétropropagation

Tout ce qui reste à faire est de répéter les trois formules précédentes jusqu'à ce que nous ayons calculé toutes les dérivées d'erreur.

Fin

Calcul…