Blame
|
1 | # 7. Réseaux récurrents |
||||||
|
2 | |||||||
| 3 | Les réseaux à propagation avant et les réseaux convolutifs transforment une entrée de taille fixe en une sortie en une seule passe, mais de nombreux problèmes se présentent sous forme de séquences dont la longueur varie et dont l'ordre importe (texte, audio, séries temporelles). Un réseau de neurones récurrent (RNN) traite une séquence pas à pas et propage un état caché vers l'avant, de sorte que les entrées passées influencent la sortie courante. Ce module introduit la récurrence, la cellule RNN de base, la façon dont elle est entraînée par rétropropagation à travers le temps, et pourquoi les gradients à longue portée ont tendance à s'évanouir ou à exploser. |
|||||||
| 4 | ||||||||
|
5 | ## 7.1 Pourquoi pas un MLP ou un CNN ? |
||||||
|
6 | |||||||
|
7 | Une séquence est une liste ordonnée d'entrées $x_1, x_2, \dots, x_T$ : les mots d'une critique, les échantillons d'un extrait audio, les valeurs quotidiennes d'une série temporelle. Deux choses la rendent inconfortable pour les réseaux que nous avons déjà. La longueur $T$ change d'un exemple à l'autre, et l'ordre porte le sens : « pas bon, en fait excellent » et « pas excellent, en fait bon » contiennent exactement les mêmes mots. |
||||||
|
8 | |||||||
|
9 | Essayons les outils déjà sur la table : |
||||||
|
10 | |||||||
|
11 | - **Un MLP** attend un unique vecteur de taille fixe $a^{[0]} = x$, une séquence plus longue n'entre donc tout simplement pas dans sa couche d'entrée. Pire, chaque position reçoit ses propres poids privés : un motif appris sur le 2e mot n'apprend rien sur le même motif au 9e, le problème de la couche dense de la leçon 5 à nouveau, dans le temps plutôt que dans l'espace. |
||||||
| 12 | - **Un CNN 1D** corrige le partage : un noyau glisse le long de la séquence, les mêmes poids à chaque position. Mais sa fenêtre fait $k$ pas de large, deux entrées ne se rencontrent donc que si elles tombent dans le même champ réceptif. La fin d'une longue séquence ne peut pas voir son début sans empiler beaucoup de couches, et la portée reste fixée à la construction. |
|||||||
|
13 | |||||||
|
14 | Ce que les séquences demandent, ce sont trois choses à la fois : accepter n'importe quelle longueur, appliquer les mêmes poids à chaque pas, et porter une mémoire de ce qui a été vu jusque-là, aussi loin que ce soit. |
||||||
| 15 | ||||||||
| 16 |  |
|||||||
| 17 | ||||||||
| 18 | *La même séquence de six pas, deux fois. Le MLP a des cases fixes et des poids privés par position. La convolution 1D partage ses poids, mais ne relie que les entrées qui tombent dans sa fenêtre.* |
|||||||
| 19 | ||||||||
| 20 | Ce qui satisfera les trois exigences à la fois sera le sujet de cette leçon. Avant de le construire, notons les formes que prennent les tâches séquentielles : |
|||||||
|
21 | |||||||
| 22 | | Configuration | Entrée | Sortie | Exemple | |
|||||||
| 23 | | --- | --- | --- | --- | |
|||||||
| 24 | | Plusieurs vers un | séquence | vecteur unique | sentiment d'une phrase | |
|||||||
| 25 | | Plusieurs vers plusieurs (aligné) | séquence | séquence, même longueur | étiquetage morphosyntaxique | |
|||||||
| 26 | | Plusieurs vers plusieurs (seq2seq) | séquence | séquence, autre longueur | traduction automatique | |
|||||||
| 27 | | Un vers plusieurs | vecteur unique | séquence | légendage d'image | |
|||||||
| 28 | ||||||||
|
29 | ## 7.2 La cellule RNN de base |
||||||
| 30 | ||||||||
| 31 | Le réseau récurrent satisfait les trois exigences d'un seul geste. Il conserve un **état caché** (ou mémoire) $h_t$ qui résume tout ce qui est pertinent jusqu'au pas $t$, et il **partage** un unique jeu de paramètres à chaque pas, de sorte que la même transformation s'applique que la séquence ait 5 éléments ou 500. Le partage garde le nombre de paramètres indépendant de $T$ et permet à un motif appris à une position de généraliser à n'importe quelle autre. |
|||||||
| 32 | ||||||||
| 33 | *Remarque :* le partage de poids dans le temps est l'analogue séquentiel du partage de poids dans l'espace dans un réseau convolutif. Tous deux encodent l'a priori qu'une même caractéristique peut apparaître n'importe où. |
|||||||
|
34 | |||||||
|
35 | ### 7.2.1 Récurrence |
||||||
|
36 | |||||||
| 37 | Au pas $t$ la cellule lit l'entrée courante $x_t$ et l'état caché précédent $h_{t-1}$, puis produit un nouvel état caché via une activation $g$ (habituellement $\tanh$) : |
|||||||
| 38 | ||||||||
| 39 | $$\boxed{ h_t = g\left(W_{hh}\, h_{t-1} + W_{xh}\, x_t + b_h\right) }$$ |
|||||||
| 40 | ||||||||
| 41 | L'état caché est initialisé à $h_0 = \mathbf{0}$ (ou à un vecteur appris). La sortie par pas est une lecture linéaire de l'état caché : |
|||||||
| 42 | ||||||||
| 43 | $$\boxed{ \hat{y}_t = W_{hy}\, h_t + b_y }$$ |
|||||||
| 44 | ||||||||
| 45 | Ici $W_{hh}$ transforme l'état en état, $W_{xh}$ transforme l'entrée en état, et $W_{hy}$ transforme l'état en sortie. Si la taille cachée est $n_h$ et la taille d'entrée est $n_x$, alors $W_{hh}$ est de taille $(n_h \times n_h)$, $W_{xh}$ est de taille $(n_h \times n_x)$, et $b_h$ a pour forme $n_h$. |
|||||||
| 46 | ||||||||
|
47 | *Remarque :* cela conserve la convention de biais explicite de tout le cours de Deep Learning. Le biais $b_h$ est un terme additif séparé, jamais incorporé dans les matrices de poids comme le cours de Machine Learning incorporait l'ordonnée à l'origine dans $w^T x$ avec $x_0 = 1$. |
||||||
|
48 | |||||||
|
49 | ### 7.2.2 Poids partagés |
||||||
|
50 | |||||||
| 51 | Le point crucial est que $W_{hh}$, $W_{xh}$, $W_{hy}$, $b_h$ et $b_y$ ne dépendent **pas** de $t$. Les cinq mêmes paramètres sont réutilisés à chaque pas : |
|||||||
| 52 | ||||||||
|
53 | $$\boxed{ w = \{W_{hh},\, W_{xh},\, W_{hy},\, b_h,\, b_y\} \quad \text{utilisés à chaque pas } t }$$ |
||||||
|
54 | |||||||
| 55 | Un RNN n'est donc pas un réseau très profond avec des couches distinctes, c'est une petite cellule appliquée de façon répétée, réinjectant sa propre sortie en entrée. |
|||||||
| 56 | ||||||||
|
57 | ## 7.3 Déroulement dans le temps |
||||||
|
58 | |||||||
| 59 | Comme la même cellule est réutilisée, on peut **dérouler** la récurrence en une chaîne : on dessine une copie de la cellule par pas de temps et on connecte l'état caché de chaque copie à la suivante. La vue déroulée est un graphe à propagation avant ordinaire (à poids liés), ce qui est exactement ce qui rend possible le calcul du gradient. |
|||||||
| 60 | ||||||||
|
61 |  |
||||||
|
62 | |||||||
| 63 | *Déroulé dans le temps, un réseau récurrent réutilise les mêmes poids à chaque pas et propage l'état caché vers l'avant.* |
|||||||
| 64 | ||||||||
| 65 | *Remarque :* les flèches horizontales entre états cachés sont le seul chemin par lequel l'information du passé atteint le présent. Chacune d'elles multiplie par la même matrice $W_{hh}$, ce qui est à la fois la source de la puissance du modèle et de sa difficulté d'entraînement. |
|||||||
| 66 | ||||||||
|
67 | ## 7.4 Rétropropagation à travers le temps |
||||||
|
68 | |||||||
| 69 | L'entraînement minimise un coût total qui somme la perte par pas sur la séquence. Avec une perte par pas $L_t$ comparant $\hat{y}_t$ à la cible $y_t$, le coût pour une séquence est : |
|||||||
| 70 | ||||||||
| 71 | $$\boxed{ J = \sum_{t=1}^{T} L_t\left(\hat{y}_t, y_t\right) }$$ |
|||||||
| 72 | ||||||||
| 73 | La rétropropagation à travers le temps (BPTT) est une rétropropagation ordinaire exécutée sur le graphe déroulé. Comme $W_{hh}$ est réutilisée à chaque pas, son gradient est la **somme** des contributions de tous les pas : |
|||||||
| 74 | ||||||||
| 75 | $$\boxed{ \frac{\partial J}{\partial W_{hh}} = \sum_{t=1}^{T} \frac{\partial L_t}{\partial W_{hh}} }$$ |
|||||||
| 76 | ||||||||
| 77 | Pour un pas unique $t$, la perte dépend de $W_{hh}$ à la fois directement (via $h_t$) et indirectement via chaque état caché antérieur $h_k$ avec $k \le t$, puisque chacun d'eux a lui-même été produit avec $W_{hh}$. En appliquant la règle de dérivation en chaîne à travers la chaîne d'états, on obtient : |
|||||||
| 78 | ||||||||
| 79 | $$\boxed{ \frac{\partial L_t}{\partial W_{hh}} = \sum_{k=1}^{t} \frac{\partial L_t}{\partial h_t}\left(\prod_{i=k+1}^{t} \frac{\partial h_i}{\partial h_{i-1}}\right)\frac{\partial h_k}{\partial W_{hh}} }$$ |
|||||||
| 80 | ||||||||
| 81 | *Remarque :* en pratique la somme sur $k$ est tronquée après une fenêtre fixe, ce qu'on appelle la BPTT tronquée. Elle borne la mémoire et le calcul par mise à jour au prix d'ignorer les dépendances plus longues que la fenêtre. |
|||||||
| 82 | ||||||||
|
83 | ## 7.5 Évanouissement et explosion des gradients |
||||||
|
84 | |||||||
| 85 | Le produit interne $\prod_{i=k+1}^{t} \frac{\partial h_i}{\partial h_{i-1}}$ est ce qui transporte l'information de gradient du pas $t$ jusqu'au pas $k$. À partir de la récurrence $h_i = g(W_{hh} h_{i-1} + W_{xh} x_i + b_h)$, chaque facteur vaut : |
|||||||
| 86 | ||||||||
| 87 | $$\boxed{ \frac{\partial h_i}{\partial h_{i-1}} = \operatorname{diag}\!\left(g'(z_i)\right) W_{hh} }$$ |
|||||||
| 88 | ||||||||
| 89 | où $z_i = W_{hh} h_{i-1} + W_{xh} x_i + b_h$ est la pré-activation au pas $i$. En composant sur tout l'écart de $k$ à $t$, on obtient un produit de $t - k$ matrices de ce type : |
|||||||
| 90 | ||||||||
| 91 | $$\boxed{ \prod_{i=k+1}^{t} \frac{\partial h_i}{\partial h_{i-1}} = \prod_{i=k+1}^{t} \operatorname{diag}\!\left(g'(z_i)\right) W_{hh} }$$ |
|||||||
| 92 | ||||||||
| 93 | Ce produit de $t - k$ facteurs quasi identiques se comporte à peu près comme une matrice élevée à la puissance $t - k$. Si la magnitude pertinente (informellement, la plus grande valeur singulière de $\operatorname{diag}(g'(z_i)) W_{hh}$) est inférieure à $1$, le produit rétrécit géométriquement vers zéro à mesure que l'écart grandit, de sorte que les gradients lointains **s'évanouissent**. Si elle est supérieure à $1$, le produit explose et les gradients **explosent**. |
|||||||
| 94 | ||||||||
|
95 |  |
||||||
|
96 | |||||||
| 97 | *Au fil de nombreux pas de temps, le gradient rétrécit ou croît géométriquement, de sorte que les dépendances à longue portée sont difficiles à apprendre pour un RNN simple.* |
|||||||
| 98 | ||||||||
| 99 | | Régime | Produit dans le temps | Effet sur l'entraînement | |
|||||||
| 100 | | --- | --- | --- | |
|||||||
| 101 | | Magnitude du facteur $< 1$ | décroît vers $0$ | les gradients à longue portée s'évanouissent, aucune mémoire longue apprise | |
|||||||
| 102 | | Magnitude du facteur $\approx 1$ | reste bornée | stable, le cas idéal | |
|||||||
| 103 | | Magnitude du facteur $> 1$ | croît sans borne | les gradients explosent, les mises à jour divergent | |
|||||||
| 104 | ||||||||
| 105 | *Remarque :* les gradients qui explosent sont habituellement maîtrisés par **écrêtage du gradient** (rééchelonner le gradient quand sa norme dépasse un seuil). Les gradients qui s'évanouissent sont plus difficiles à traiter, car le signal est perdu plutôt que simplement grand, et aucun rééchelonnement simple ne le récupère. |
|||||||
| 106 | ||||||||
| 107 | Comme une activation saturante telle que $\tanh$ a $g' \le 1$ partout, le facteur diagonal tend à tirer le produit vers l'évanouissement, ce qui rend difficile pour un RNN de base l'apprentissage de dépendances distantes de plus de quelques dizaines de pas. Cette limitation est précisément ce qui motive les cellules à portes, qui ajoutent un chemin quasi linéaire le long duquel l'état peut circuler sans écrasement répété. |
|||||||
| 108 | ||||||||
| 109 | *La prochaine leçon introduit le LSTM et le GRU, des architectures à portes qui transportent un état de cellule à travers des mises à jour additives afin que les gradients puissent traverser de longues portées sans s'évanouir.* |
|||||||
| 110 | ||||||||
| 111 | --- |
|||||||
|
112 | Suivant : [LSTM et GRU](/fr/Deep%20Learning/08%20LSTM%20and%20GRU) · [Vue d'ensemble du cours](/fr/Deep%20Learning) |
||||||
