Démonstration de rétropropagation
$$ \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 entraîner rapidement de grands réseaux de neurones. Cet article explique le fonctionnement de l'algorithme.

Veuillez faire défiler la page vers le bas...

Réseau de neurones simple

Sur la droite, vous voyez un réseau de neurones avec une entrée, un nœud de sortie et deux couches cachées de deux nœuds chacune.

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

Fonction d'activation

Chaque nœud comporte 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})\). \(f(\color{input}x\color{black})\) doit être une fonction non linéaire, sinon le réseau de neurones ne pourra apprendre que des modèles linéaires.

Une fonction d'activation couramment utilisée 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 automatiquement les pondérations du réseau à partir des données, de sorte que la sortie prévue \(\color{output}y_{output}\) soit proche de la cible \(\color{output}y_{target}\) pour toutes les entrées \(\color{input}x_{input}\).

Pour mesurer notre avancement par rapport à l'objectif, nous utilisons une fonction d'erreur \(E\). Une fonction d'erreur couramment utilisée est \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \).

Propagation avant

Pour commencer, prenons un exemple d'entrée \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) et mettons à jour la couche d'entrée du réseau.

Par souci de cohérence, nous considérons que l'entrée est comme n'importe quel autre nœud, mais sans fonction d'activation. Son résultat est donc égal à son entrée, c'est-à-dire \( \color{output}y_1 \color{black} = \color{input} x_{input} \).

Propagation avant

Nous allons maintenant mettre à 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 dans la première couche cachée. Pour cela, nous utilisons 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 propageons 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étermine dans quelle mesure chaque pondération du réseau doit être mise à jour après avoir comparé la sortie prévue avec la sortie souhaitée pour un exemple particulier. Pour cela, nous devons calculer l'évolution de l'erreur pour 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 à l'aide d'une simple règle de mise à jour:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
où \(\alpha\) est une constante positive, appelée taux d'apprentissage, que nous devons ajuster empiriquement.

[Remarque] La règle de mise à jour est très simple: si l'erreur diminue lorsque la pondération augmente (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)), augmentez-la, sinon, si l'erreur augmente lorsque la pondération augmente (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)), diminuez ensuite la pondération.

Autres dérivées

Pour faciliter le calcul \(\color{dweight}\frac{dE}{dw_{ij}}\), nous stockons également deux dérivées supplémentaires pour chaque nœud : comment l'erreur change 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 à propager les dérivées d'erreur. Étant donné que nous avons la sortie prévue de cet exemple d'entrée particulier, nous pouvons calculer comment l'erreur évolue avec cette sortie. Compte tenu de notre fonction d'erreur, \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) nous avons:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$

Rétropropagation

Maintenant que nous disposons \(\color{doutput} \frac{dE}{dy}\) de la règle \(\color{dinput}\frac{dE}{dx}\) ,
$$\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 entrant dans 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

Et avec la règle de chaîne, nous pouvons aussi obtenir \(\frac{dE}{dy}\) de la couche précédente. Nous avons créé un cercle complet.
$$ \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

Il suffit 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...