Partie 4
Lire mot après mot (RNN, LSTM)
La moyenne des embeddings donnait [0,67 ; 0,67] pour « fièvre sans toux » comme pour « toux sans fièvre » : elle ignore l'ordre. Un réseau récurrent (RNN) lit les tokens un par un et garde un état h(t), un nombre (ou un vecteur) qui résume tout ce qui a été lu jusqu'au token t.
h(t) = w × h(t − 1) + u · x(t), avec h(0) = 0. x(t) est l'embedding du t-ième token, u · x(t) un produit scalaire, et w, u sont des poids appris, les mêmes à chaque token (comme un filtre de J2 à chaque position). Ici : w = 0,5 et u = [2 ; −1].
À faire à la main : u · x vaut 2 pour « fièvre » ([1 ; 0]), −1 pour « sans » ([0 ; 1]) et 1 pour « toux » ([1 ; 1]). Tu vas écrire la boucle qui enchaîne les mises à jour : chaque nouvel état dépend de l'ancien, donc il faut garder h d'un tour à l'autre et le recalculer à chaque token. C'est cet enchaînement qui rend l'ordre important.
À toi de coder
Le début du texte s'efface
L'apport du premier token est multiplié par w à chaque token qui le suit. Avec w = 0,5 et 8 tokens ensuite, il en reste 1/256. Dans un résumé de 241 tokens, il est multiplié 240 fois : 0,000…0006 (72 zéros). La pente qui remonte jusqu'à lui subit la même multiplication (règle de la chaîne, J1) : c'est l'évanouissement des pentes de J1, le long du texte. Avec w > 1, les pentes explosent.
Le LSTM : une mémoire protégée par des portes
Le LSTM transmet un état h et une mémoire c. Une porte est un nombre entre 0 et 1 (sigmoïde) qui multiplie ce qu'elle règle : 0 bloque, 1 laisse tout passer. À chaque token, six étapes :
| # | Étape | Rôle |
|---|---|---|
| 1 | Porte d'oubli f | quelle part de l'ancienne mémoire garder |
| 2 | Porte d'entrée i | quelle quantité de nouvelle information ajouter |
| 3 | Information candidate | ce qui pourrait être stocké |
| 4 | Nouvelle mémoire | c(t) = f × c(t−1) + i × candidate |
| 5 | Porte de sortie o | quelle part de la mémoire exposer |
| 6 | Nouvel état | h(t) = o × tanh(c(t)) |
Les étapes 1, 2, 3 et 5 se calculent à partir de x(t) et h(t−1). La mémoire est mise à jour par addition : si f = 1, l'ancienne mémoire est gardée entière au lieu d'être multipliée par 0,5.
Deux calculs pour toucher du doigt l'effacement et la parade. Pour le premier, pense à une puissance : le premier token traverse 240 multiplications par 0,5. Pour le second, tu écris l'étape 4 du LSTM avec une porte d'entrée i = 1 : la mémoire garde f × c puis ajoute l'information. Compare f = 0,5 (oubli) et f = 1 (garde tout) sur les mêmes informations.
À toi de coder