Théorie

Soit $E$ l'erreur du réseau par rapport à  la vérité terrain $\bf t$.

Pour corriger l'erreur on modifie les poids $w_{ij}$ du réseau donc on veut évaluer la contribution de chaque poids à  l'erreur c.a.d. $ \displaystyle \frac{\partial E}{\partial w_{ij}}$ pour tout $i, j$. Le vecteur composé de l'ensemble de ces dérivées paritelles est le gradiant de E, noté $\nabla E$.

Comme $$ \frac{\partial E}{\partial w_{ij}} = \frac{\partial E}{\partial y} \; \frac{\partial y}{\partial w_{ij}} $$

on peut remonter de fil en aiguille pour avoir l'erreur due à  un poids loin en amont.

En choisissant comme fonction d'activation une sigmoïde et une erreur quadratique, on a :

$$ \begin{align} \frac{\partial E}{\partial w^2_{0,0}} &= \frac{\partial E}{\partial y} \; \frac{\partial y}{\partial z} \; \frac{\partial z}{\partial y^2_0} \; \frac{\partial y^2_0}{\partial z^2_0} \; \frac{\partial z^2_0}{\partial w^2_{0,0}} \\ &= 2\, (y-t)\; y\,(1-y)\; w^3_0 \; y^2_0 (1-y^2_0) \; y^1_0 \end{align} $$

Méthode itérative

On corrige les poids en remontant le gradient d'erreur :

$$ \forall \; {\rm layer} \; l \quad {\bf W}^{l} \leftarrow {\bf W}^{l} - \eta \nabla E({\bf W}^{l}) $$

ou avec d'autres méthodes plus sophistiquées (qui s'appuie sur ce principe).

Gradient tape

TensorFlow permet de caluler les dérivées partielle explicitement en un point $x$ donné. Ici on veut calculer $\displaystyle \frac{\partial z}{\partial x}(3)$ avec

$\displaystyle \frac{\partial z}{\partial x}= \frac{\partial z}{\partial y} \frac{\partial y}{\partial x} = 2 \, y \; 2\, x = 2 \, x^2 \; 2 \, x = 4 \, x^3$ ce qui est donne bien 108 pour $x = 3$.

Gradient tape pour un réseau

Regardons comment l'utiliser sur ce réseau (Xor).

Mettre à jour un morceau du réseau

La fonction apply_gradients permet de choisir les poids mis à jour. Cela permet de ne mettre à jour qu'une partie du réseau. Ainsi si votre réseau est composé de sous-réseaux, vous pouvez calculer une erreur pour un sous-réseau et ne mettre à jour que ce sous-réseau.