#rnn-lstm — Apprentissage profond
RNN et LSTM : se souvenir d'une séquence.
Ce que tu vas manipuler
- Bienvenue dans #rnn-lstm. À l'écran, un réseau récurrent déroulé dans le temps : une boîte par symbole de la séquence
10110, lue de gauche à droite. Sous chaque boîte, l'entréex_t; au-dessus, l'état cachéh_t— six barres, bleu positif, rouge négatif — et une flèche qui le transmet au pas suivant :h_t = tanh(W·x_t + U·h_{t−1} + b), avech_0 = 0. C'est la même cellule, les mêmes poids, copiés à chaque pas : sa seule mémoire, c'esth. Le pas courant est mis en avant, les suivants sont grisés ;/avancerfait un pas. La question du canal : que reste-t-il du premier symbole quand on arrive au bout ? - Donne-lui une séquence piège — un 1, sept 0, puis un 1 :
/sequence 100000001. La tâche est « mémoire » : à la fin, il faudra se souvenir du premier symbole. - Saute directement à la fin :
/pas 9. Compareh_9à ce qu'il serait si la séquence avait commencé par un 0 — c'est l'« écart au premier symbole » donné dans la réponse. - Pourquoi l'entraînement ne corrigerait-il pas ça ? Parce que le signal d'erreur suit le même chemin, à l'envers. Affiche la norme du gradient rétropropagé dans le temps, pas par pas :
/gradient. - Change de cellule :
/cellule lstm. Le LSTM ajoute une seconde mémoire, l'état de cellulec_t— la bande verte tout en haut — et trois portes en sigmoïde, dessinées comme des vannes dans chaque boîte. - Mets la porte d'oubli en avant :
/porte oubli. C'est elle qui décide, à chaque pas, quelle part dec_{t−1}survit. - Et le gradient ? Redemande la courbe :
/gradient. - À toi de jouer :
/tache compteur(compter les 1) puis/longueur 12pour une séquence aléatoire longue,/porte entreeou/porte sortiepour lire les autres vannes,/avancerpour suivreh_tetc_tpas à pas,/sequence abcabcpour des lettres (voyelle = 1, consonne = 0),/graine 42pour d'autres poids,/cellule rnnet/gradientpour comparer à nouveau,/reinitpour repartir. Prochaine étape : le canal #autoencodeur, où un réseau apprend à compresser puis reconstruire ses entrées.
Commandes du canal
/cellule <rnn|lstm>— Change de cellule récurrente (mêmes poids de graine) ; masque la courbe de gradient et la porte mise en avant./sequence <mot>— Nouvelle séquence de 3 à 12 symboles : des 0/1 ou des lettres (voyelle = 1, consonne = 0). Retour au pas 1./longueur <3..12>— Tire une séquence aléatoire de cette longueur (même alphabet que la séquence courante). Retour au pas 1./pas <1..12>— Se place au pas t (la séquence est déjà entièrement déroulée : on choisit ce qu'on regarde)./avancer— Passe au pas suivant (t + 1) ; après le dernier, revient au pas 1./porte <oubli|entree|sortie|aucune>— Met une porte du LSTM en avant dans chaque cellule (vannes = sigmoïdes) et détaille sa valeur au pas courant./gradient— Affiche ou masque la courbe (échelle log) de la norme du gradient rétropropagé dans le temps, du pas T au pas 1./tache <memoire|compteur|parite>— Change la tâche jouet lue sur h_t : mémoire du premier symbole, compteur de 1, parité. Réajuste la lecture linéaire./graine <1..9999>— Retire les poids fixes de la cellule (W, U, biais) et les séquences d'essai avec une autre graine./reinit— Revient au RNN simple, séquence 10110, tâche mémoire, pas 1, graine 7, sans courbe de gradient.
Glossaire
- réseau récurrent (RNN)
- Réseau qui lit une séquence un élément à la fois en réutilisant la même cellule (mêmes poids) à chaque pas, et qui transmet un état d'un pas au suivant :
h_t = tanh(W·x_t + U·h_{t−1} + b). Texte, audio, séries temporelles : tout ce qui a un ordre. - état caché
- Le vecteur
h_tque la cellule recalcule à chaque pas : sa mémoire de travail, tout ce qu'elle « sait » de la séquence lue jusqu'ici. Dans un RNN simple, il est réécrit en entier à chaque pas, d'où sa mémoire courte. - déroulement dans le temps
- Représenter le réseau récurrent comme une chaîne de copies de la cellule, une par pas de temps, reliées par l'état caché. C'est ce que montre la scène : un RNN de T pas est un réseau profond de T couches qui partagent leurs poids.
- rétropropagation dans le temps (BPTT)
- La rétropropagation appliquée au réseau déroulé : le gradient de la perte remonte de
h_Tversh_1en multipliant, à chaque pas, par la jacobienne∂h_{t+1}/∂h_t. Les corrections de tous les pas s'additionnent sur les mêmes poids partagés. - évanouissement du gradient
- Quand les jacobiennes successives ont une norme < 1, leur produit tend vers zéro exponentiellement : le gradient qui atteint les premiers pas est minuscule et le réseau ne peut plus apprendre les dépendances longues. C'est la courbe qui s'effondre pour le RNN.
- explosion du gradient
- Le problème symétrique : des jacobiennes de norme > 1 font croître le gradient exponentiellement le long de la séquence, jusqu'à des mises à jour absurdes. Remède courant : le gradient clipping, qui plafonne sa norme avant la mise à jour.
- LSTM
- Long Short-Term Memory (Hochreiter & Schmidhuber, 1997) : une cellule récurrente dotée d'un état de cellule additif
c_tet de trois portes apprises (oubli, entrée, sortie). Le gradient circule le long decsans traverser de tanh, ce qui règle l'évanouissement en pratique. - porte d'oubli, d'entrée et de sortie
- Trois vecteurs en sigmoïde, entre 0 (fermé) et 1 (ouvert), calculés à partir de
x_teth_{t−1}. f décide quelle part dec_{t−1}survit, i quelle part du candidatg_ts'ajoute, o quelle part detanh(c_t)sort dansh_t. Ce sont les vannes de la scène. - état de cellule
- La bande
c_t = f_t ⊙ c_{t−1} + i_t ⊙ g_tdu LSTM : une mémoire longue mise à jour par addition et non par réécriture. Avec une porte d'oubli proche de 1, une information écrite au pas 1 est encore là au pas 12 — et le gradient fait le chemin inverse aussi bien. - GRU
- Gated Recurrent Unit (Cho et al., 2014) : une variante allégée du LSTM à deux portes (mise à jour et réinitialisation), sans état de cellule séparé. Moins de paramètres, résultats souvent comparables ; les deux ont été largement remplacés par les transformers pour le texte, mais restent utilisés sur les séries temporelles et l'embarqué.
Autres canaux du thème Apprentissage profond
- #optimiseurs — SGD, Momentum et Adam : la course vers le minimum.
- #batch-normalisation — Batch normalisation : garder les activations dans la bonne plage.
- #rnn-lstm — RNN et LSTM : se souvenir d'une séquence.
- #autoencodeur — Autoencodeur : compresser puis reconstruire.
- #transfer-learning — Apprentissage par transfert : repartir d'un réseau déjà entraîné.
- #gan — GAN : un faussaire contre un inspecteur