Blame
|
1 | # 5. Rétropropagation |
||||||
| 2 | ||||||||
| 3 | La rétropropagation est l'algorithme qui calcule le gradient du coût par rapport à chaque paramètre d'un réseau. Ce n'est rien de plus que la règle de dérivation en chaîne appliquée avec soin, dans l'ordre inverse, sur le graphe de calcul, en réutilisant les quantités mises en cache lors de la passe avant. Ce module la dérive couche par couche à l'aide du signal d'erreur $\delta^{[l]} = \partial L / \partial z^{[l]}$. |
|||||||
| 4 | ||||||||
| 5 | **Objectifs** |
|||||||
| 6 | - Lire un réseau comme une composition de fonctions et comprendre pourquoi les gradients circulent en sens inverse par la règle de dérivation en chaîne. |
|||||||
| 7 | - Définir l'erreur de couche $\delta^{[l]}$ et calculer l'erreur de la couche de sortie $\delta^{[L]}$. |
|||||||
| 8 | - Établir la récurrence arrière qui propage $\delta$ de la couche $L$ jusqu'à la couche $1$. |
|||||||
| 9 | - Transformer chaque $\delta^{[l]}$ en gradients des paramètres $W^{[l]}$ et $b^{[l]}$. |
|||||||
| 10 | - Assembler l'algorithme complet avant-et-arrière et le relier à la mise à jour des paramètres. |
|||||||
| 11 | ||||||||
| 12 | ## 5.1 La règle de dérivation en chaîne sur un graphe de calcul |
|||||||
| 13 | ||||||||
| 14 | Un réseau à propagation avant est une composition de fonctions. Chaque couche $l$ prend l'activation précédente $a^{[l-1]}$ et produit une pré-activation et une activation : |
|||||||
| 15 | ||||||||
| 16 | $$\boxed{ z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}, \quad a^{[l]} = g^{[l]}\!\left(z^{[l]}\right) }$$ |
|||||||
| 17 | ||||||||
| 18 | avec $a^{[0]} = x$ et la prédiction $\hat{y} = a^{[L]}$. La perte scalaire $L$ se trouve à la fin de cette chaîne. Comme le coût est une composition, sa dérivée par rapport à n'importe quelle quantité intermédiaire est un produit de dérivées locales, une par lien du graphe. La règle de dérivation en chaîne nous dit d'accumuler ces produits. |
|||||||
| 19 | ||||||||
| 20 | La manière efficace de procéder est de parcourir le graphe en sens inverse. Un seul parcours arrière calcule, pour chaque nœud, la dérivée de la perte finale par rapport à ce nœud, et chaque étape réutilise la dérivée déjà calculée pour le nœud situé juste en aval. C'est cette réutilisation qui fait que la rétropropagation coûte à peu près autant qu'une seule passe avant, plutôt qu'une passe par paramètre. |
|||||||
| 21 | ||||||||
| 22 |  |
|||||||
| 23 | ||||||||
| 24 | *La rétropropagation parcourt le graphe de calcul en sens inverse : la passe avant (trait plein) met les valeurs en cache, la passe arrière (trait pointillé) propage l'erreur delta.* |
|||||||
| 25 | ||||||||
| 26 | *Remarque :* les flèches pleines représentent la passe avant (les données circulant vers la perte) et les flèches pointillées la passe arrière (les gradients circulant depuis la perte). Les deux passes parcourent le même graphe dans des directions opposées. |
|||||||
| 27 | ||||||||
| 28 | ## 5.2 L'erreur de couche |
|||||||
| 29 | ||||||||
| 30 | L'objet central est l'erreur de la couche $l$, la sensibilité de la perte à la pré-activation $z^{[l]}$ : |
|||||||
| 31 | ||||||||
| 32 | $$\boxed{ \delta^{[l]} = \frac{\partial L}{\partial z^{[l]}} \in \mathbb{R}^{n_l} }$$ |
|||||||
| 33 | ||||||||
| 34 | Une fois que l'on connaît $\delta^{[l]}$ à chaque couche, tous les gradients des paramètres en découlent immédiatement (section 5.5). L'algorithme tout entier se ramène au calcul de ces vecteurs, d'abord à la couche de sortie, puis récursivement en sens inverse. |
|||||||
| 35 | ||||||||
| 36 | *Remarque :* placer $\delta$ à la pré-activation $z^{[l]}$ plutôt qu'à l'activation $a^{[l]}$ est un choix délibéré. Cela fait apparaître la dérivée de l'activation $g'^{[l]}$ exactement une fois par couche et garde la récurrence propre. |
|||||||
| 37 | ||||||||
| 38 | ## 5.3 Erreur de la couche de sortie |
|||||||
| 39 | ||||||||
| 40 | À la couche de sortie, la règle de dérivation en chaîne comporte deux liens : la perte dépend de $a^{[L]} = \hat{y}$, et $a^{[L]}$ dépend de $z^{[L]}$ à travers l'activation $g^{[L]}$. En multipliant les deux dérivées locales élément par élément, on obtient l'erreur de sortie : |
|||||||
| 41 | ||||||||
| 42 | $$\boxed{ \delta^{[L]} = \nabla_{a^{[L]}} L \;\odot\; g'^{[L]}\!\left(z^{[L]}\right) }$$ |
|||||||
| 43 | ||||||||
| 44 | Le produit de Hadamard $\odot$ apparaît parce que $g^{[L]}$ agit élément par élément, de sorte que la composante $j$ de $z^{[L]}$ n'influence que la composante $j$ de $a^{[L]}$. |
|||||||
| 45 | ||||||||
| 46 | ### 5.3.1 Le raccourci softmax et entropie croisée |
|||||||
| 47 | ||||||||
| 48 | Pour la classification multiclasse, l'appariement naturel est une sortie softmax avec la perte d'entropie croisée (introduite dans [Fonctions de perte et couches de sortie](/fr/Deep%20Learning/04%20Loss%20functions%20and%20output%20layers)). Les deux dérivées se combinent et s'annulent, laissant un résultat d'une simplicité frappante : |
|||||||
| 49 | ||||||||
| 50 | $$\boxed{ \delta^{[L]} = \hat{y} - y }$$ |
|||||||
| 51 | ||||||||
| 52 | *Remarque :* la même forme épurée apparaît pour une sortie sigmoïde avec entropie croisée binaire, et pour une sortie linéaire avec erreur quadratique. Dans chaque cas, l'activation de sortie est la fonction de lien inverse appariée à la perte, si bien que les facteurs encombrants s'annulent et que l'erreur se réduit au résidu $\hat{y} - y$. |
|||||||
| 53 | ||||||||
| 54 | ## 5.4 La récurrence arrière |
|||||||
| 55 | ||||||||
| 56 | Étant donné l'erreur à la couche $l+1$, on obtient l'erreur à la couche $l$. La perte ne dépend de $z^{[l]}$ qu'à travers $z^{[l+1]} = W^{[l+1]} a^{[l]} + b^{[l]}$, et $a^{[l]} = g^{[l]}(z^{[l]})$. En propageant la sensibilité en arrière à travers la matrice de poids puis à travers l'activation, on obtient : |
|||||||
| 57 | ||||||||
| 58 | $$\boxed{ \delta^{[l]} = \left( \left(W^{[l+1]}\right)^{T} \delta^{[l+1]} \right) \odot g'^{[l]}\!\left(z^{[l]}\right) }$$ |
|||||||
| 59 | ||||||||
| 60 | Deux opérations ont lieu ici. La transposée $\left(W^{[l+1]}\right)^{T}$ renvoie l'erreur aval à travers l'application linéaire, en répartissant chaque composante aval sur les unités qui l'ont alimentée. Le produit élément par élément avec $g'^{[l]}(z^{[l]})$ la filtre ensuite selon la sensibilité de chaque activation à son point de fonctionnement. |
|||||||
| 61 | ||||||||
| 62 | | Symbole | Signification | Forme | |
|||||||
| 63 | | --- | --- | --- | |
|||||||
| 64 | | $\delta^{[l]}$ | erreur à la couche $l$ | $(n_l)$ | |
|||||||
| 65 | | $W^{[l+1]}$ | poids entrant dans la couche $l+1$ | $(n_{l+1} \times n_l)$ | |
|||||||
| 66 | | $\left(W^{[l+1]}\right)^{T}\delta^{[l+1]}$ | erreur renvoyée vers la couche $l$ | $(n_l)$ | |
|||||||
| 67 | | $g'^{[l]}(z^{[l]})$ | pente locale de l'activation | $(n_l)$ | |
|||||||
| 68 | ||||||||
| 69 | *Remarque :* la passe avant utilise $W^{[l+1]}$ et la passe arrière utilise sa transposée. C'est la même application linéaire lue en sens inverse, ce qui explique pourquoi la passe arrière a le même coût que la passe avant. |
|||||||
| 70 | ||||||||
| 71 | ## 5.5 Gradients des paramètres |
|||||||
| 72 | ||||||||
| 73 | L'erreur $\delta^{[l]}$ est tout ce dont nous avons besoin pour les paramètres de la couche $l$. Puisque $z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}$ est linéaire en $W^{[l]}$ et $b^{[l]}$, le dernier lien de la règle de dérivation en chaîne est simple. Le gradient des poids est le produit extérieur de l'erreur de couche avec l'activation d'entrée mise en cache : |
|||||||
| 74 | ||||||||
| 75 | $$\boxed{ \frac{\partial L}{\partial W^{[l]}} = \delta^{[l]} \left(a^{[l-1]}\right)^{T}, \qquad \frac{\partial L}{\partial b^{[l]}} = \delta^{[l]} }$$ |
|||||||
| 76 | ||||||||
| 77 | Le gradient des poids a la forme $(n_l \times n_{l-1})$, correspondant à $W^{[l]}$, et le gradient du biais a la forme $(n_l)$, correspondant à $b^{[l]}$. Le gradient du biais vaut exactement $\delta^{[l]}$ car $\partial z^{[l]} / \partial b^{[l]}$ est l'identité. |
|||||||
| 78 | ||||||||
| 79 | *Remarque :* l'activation mise en cache $a^{[l-1]}$ issue de la passe avant est réutilisée telle quelle dans le gradient des poids. C'est le bénéfice concret de la mise en cache : rien de la passe avant n'est recalculé. |
|||||||
| 80 | ||||||||
| 81 | ## 5.6 L'algorithme complet |
|||||||
| 82 | ||||||||
| 83 | La rétropropagation exécute une passe avant pour remplir un cache, une passe arrière pour propager $\delta$, puis une mise à jour des paramètres. |
|||||||
| 84 | ||||||||
| 85 | 1. **Passe avant.** Poser $a^{[0]} = x$. Pour $l = 1, \dots, L$, calculer $z^{[l]}$ et $a^{[l]}$, en mettant chacun en cache. Évaluer la perte $L$ en $\hat{y} = a^{[L]}$. |
|||||||
| 86 | 2. **Erreur de sortie.** Calculer $\delta^{[L]}$ d'après la section 5.3. |
|||||||
| 87 | 3. **Passe arrière.** Pour $l = L-1, \dots, 1$, appliquer la récurrence de la section 5.4 pour obtenir $\delta^{[l]}$. |
|||||||
| 88 | 4. **Gradients.** Pour chaque couche, former $\partial L / \partial W^{[l]}$ et $\partial L / \partial b^{[l]}$ d'après la section 5.5. |
|||||||
| 89 | 5. **Mise à jour.** Sur un lot, moyenner les gradients par exemple pour obtenir le gradient du coût $\nabla J$ et effectuer un pas de descente de gradient (détaillé dans [Optimisation](/fr/Deep%20Learning/06%20Optimization)). |
|||||||
| 90 | ||||||||
| 91 |  |
|||||||
| 92 | ||||||||
| 93 | *L'algorithme de rétropropagation vu comme un pipeline, depuis une passe avant mise en cache jusqu'à la mise à jour des paramètres.* |
|||||||
| 94 | ||||||||
| 95 | *Remarque :* la rétropropagation donne le gradient, pas le pas. Elle indique quelle direction abaisse le coût, et de combien par unité de chaque paramètre. Transformer ce gradient en une modification effective des poids est le travail de l'optimiseur. |
|||||||
| 96 | ||||||||
| 97 | En résumé, la rétropropagation est une application ordonnée, en une seule passe, de la règle de dérivation en chaîne qui réutilise les quantités avant mises en cache pour calculer chaque gradient au prix d'environ une passe avant supplémentaire. *Le gradient en main, la prochaine leçon étudie comment bien l'utiliser : taux d'apprentissage, momentum, et les méthodes adaptatives qui rendent les réseaux profonds entraînables.* |
|||||||
| 98 | ||||||||
| 99 | --- |
|||||||
| 100 | Suivant : [Optimisation](/fr/Deep%20Learning/06%20Optimization) · [Vue d'ensemble du cours](/fr/Deep%20Learning) |
|||||||
