Aller au contenu principal

Chargement du lab visuel…

#rnn-lstmApprentissage profond

RNN et LSTM : se souvenir d'une séquence.

Ce que tu vas manipuler

  1. 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ée x_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), avec h_0 = 0. C'est la même cellule, les mêmes poids, copiés à chaque pas : sa seule mémoire, c'est h. Le pas courant est mis en avant, les suivants sont grisés ; /avancer fait un pas. La question du canal : que reste-t-il du premier symbole quand on arrive au bout ?
  2. 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.
  3. Saute directement à la fin : /pas 9. Compare h_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.
  4. 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.
  5. Change de cellule : /cellule lstm. Le LSTM ajoute une seconde mémoire, l'état de cellule c_t — la bande verte tout en haut — et trois portes en sigmoïde, dessinées comme des vannes dans chaque boîte.
  6. Mets la porte d'oubli en avant : /porte oubli. C'est elle qui décide, à chaque pas, quelle part de c_{t−1} survit.
  7. Et le gradient ? Redemande la courbe : /gradient.
  8. À toi de jouer : /tache compteur (compter les 1) puis /longueur 12 pour une séquence aléatoire longue, /porte entree ou /porte sortie pour lire les autres vannes, /avancer pour suivre h_t et c_t pas à pas, /sequence abcabc pour des lettres (voyelle = 1, consonne = 0), /graine 42 pour d'autres poids, /cellule rnn et /gradient pour comparer à nouveau, /reinit pour 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).
  • /avancerPasse 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.
  • /gradientAffiche 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.
  • /reinitRevient 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_t que 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_T vers h_1 en 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_t et de trois portes apprises (oubli, entrée, sortie). Le gradient circule le long de c sans 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_t et h_{t−1}. f décide quelle part de c_{t−1} survit, i quelle part du candidat g_t s'ajoute, o quelle part de tanh(c_t) sort dans h_t. Ce sont les vannes de la scène.
état de cellule
La bande c_t = f_t ⊙ c_{t−1} + i_t ⊙ g_t du 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

  • #optimiseursSGD, Momentum et Adam : la course vers le minimum.
  • #batch-normalisationBatch normalisation : garder les activations dans la bonne plage.
  • #rnn-lstmRNN et LSTM : se souvenir d'une séquence.
  • #autoencodeurAutoencodeur : compresser puis reconstruire.
  • #transfer-learningApprentissage par transfert : repartir d'un réseau déjà entraîné.
  • #ganGAN : un faussaire contre un inspecteur