Traitement de séquences avec LSTM et GRU


Introduction

Le traitement des données séquentielles est une problématique centrale en intelligence artificielle, notamment dans des domaines tels que le traitement du langage naturel, la reconnaissance vocale, la prévision de séries temporelles, ou encore la génération musicale. Contrairement aux données classiques statiques, les données séquentielles comportent un ordre, une dépendance temporelle entre les éléments, qui doit être prise en compte pour comprendre et modéliser correctement l’information.

Les Réseaux de Neurones Récurrents (RNN) ont été conçus précisément pour cela : ils possèdent une mémoire interne leur permettant de traiter des séquences d’entrées en tenant compte du contexte passé. Cependant, les RNN classiques souffrent de limitations importantes (problèmes de gradients, difficulté à mémoriser sur le long terme). Pour y remédier, deux architectures avancées sont devenues les standards : les LSTM (Long Short-Term Memory) et les GRU (Gated Recurrent Units). Ces deux types de cellules introduisent des mécanismes de portes permettant de contrôler précisément le flux d’information dans le réseau.

Dans cet article, nous allons détailler :


Comprendre les RNN classiques

 

Le problème du traitement séquentiel

Une séquence est une série d’éléments (x1,x2,...,xt)(x_1, x_2, …, x_t), où l’ordre importe. Un exemple typique est une phrase composée de mots dans un ordre précis. Traiter une séquence ne revient pas à traiter chaque élément indépendamment, car chaque élément est influencé par les précédents (contexte).

La structure d’un RNN simple

Les RNNs sont conçus pour prendre en compte ce contexte passé grâce à une boucle interne qui recycle l’information d’un pas de temps à l’autre.

Voici un schéma simple représentant un RNN unitaire sur une séquence :

x1 ----> [RNN Cell] ----> h1 ----> y1

|
h0 (initialisé souvent à 0)

x2 ----> [RNN Cell] ----> h2 ----> y2

|
h1

...

xt ----> [RNN Cell] ----> ht ----> yt

|
h_{t-1}

Calcul mathématique d’une cellule RNN

La cellule RNN met à jour son état caché avec la formule suivante :

ht=tanh(Wxhxt+Whhht1+bh)h_t = \tanh(W_{xh} x_t + W_{hh} h_{t-1} + b_h)

La sortie yty_t est ensuite calculée (selon la tâche) via :

yt=softmax(Whyht+by)y_t = \mathrm{softmax}(W_{hy} h_t + b_y)


Limitations des RNN classiques

Bien que puissants, ces réseaux simples souffrent de problèmes majeurs :

Ces phénomènes limitent fortement la capacité du RNN à apprendre des séquences longues où les événements lointains influencent la sortie.


LSTM : Long Short-Term Memory

Pour pallier les problèmes des RNN classiques, Hochreiter et Schmidhuber ont proposé en 1997 la cellule LSTM, qui est aujourd’hui la base de la plupart des modèles séquentiels performants.


Intuition derrière les LSTM

Les LSTM possèdent une mémoire explicite appelée cell state CtC_t, qui transporte l’information sur de nombreuses étapes sans être modifiée par défaut. Cette mémoire est modulée via des portes, des mécanismes qui décident quoi garder, quoi oublier et quoi ajouter.


Structure détaillée d’une cellule LSTM

La cellule LSTM se compose de plusieurs portes et états :


Schéma explicatif d’une cellule LSTM

+----------------------------+
x_t ---> | |
| Cellule LSTM |
| |
h_{t-1} --> | | --> h_t
| |
C_{t-1} --> | | --> C_t
+----------------------------+

Calculs détaillés

À chaque pas tt, la cellule LSTM effectue les calculs suivants :

ft=σ(Wf[ht1,xt]+bf)f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)
it=σ(Wi[ht1,xt]+bi)i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)
C~t=tanh(WC[ht1,xt]+bC)\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)
Ct=ftCt1+itC~tC_t = f_t * C_{t-1} + i_t * \tilde{C}_t ot=σ(Wo[ht1,xt]+bo)o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)
ht=ottanh(Ct)h_t = o_t * \tanh(C_t)

Explications :


Visualisation synthétique des flux d’information

C_{t-1} ----(f_t)----> + ----(+)----> C_t ----> (tanh) ---> (*) ---> h_t
| ^
(i_t)* (tilde C_t) |
(o_t)
x_t, h_{t-1} -----> [calculs portes] |

GRU : Gated Recurrent Unit

Les GRU sont une variante plus récente, plus simple et plus rapide que les LSTM, introduite par Cho et al. en 2014.


Pourquoi une alternative aux LSTM ?

Les LSTM ont beaucoup de paramètres (4 matrices de poids et biais), ce qui peut ralentir l’entraînement. Les GRU proposent une structure plus simple en fusionnant certaines portes et en réduisant le nombre d’états.


Structure d’une cellule GRU

Une cellule GRU possède deux portes :


Calculs détaillés

À chaque pas tt, on calcule :

zt=σ(Wz[ht1,xt])z_t = \sigma(W_z \cdot [h_{t-1}, x_t])
rt=σ(Wr[ht1,xt])r_t = \sigma(W_r \cdot [h_{t-1}, x_t])
h~t=tanh(W[rtht1,xt])\tilde{h}_t = \tanh(W \cdot [r_t * h_{t-1}, x_t])
ht=(1zt)ht1+zth~th_t = (1 – z_t) * h_{t-1} + z_t * \tilde{h}_t


Schéma synthétique d’une cellule GRU

x_t, h_{t-1} --> [Calcul portes z_t, r_t]

r_t * h_{t-1} + x_t -> tanh -> \tilde{h}_t

Combinaison via z_t --> h_t (état caché mis à jour)

Comparaison entre LSTM et GRU

Aspect LSTM GRU
Nombre de portes 3 (oubli, entrée, sortie) 2 (mise à jour, réinitialisation)
Cell state distinct Oui Non (fusion cell + hidden)
Complexité paramétrique Plus élevée Plus faible
Capacité à gérer séquences longues Très bonne Bonne
Rapidité d’entraînement Plus lent Plus rapide
Usage courant Traitement NLP, séries temporelles complexes Applications temps réel, ressources limitées

Cas d’usage et recommandations


Conclusion

Les réseaux récurrents classiques ont ouvert la voie à la modélisation des séquences, mais leurs limites ont engendré le développement de variantes plus sophistiquées. Les LSTM et GRU, avec leurs mécanismes de portes, sont désormais des piliers incontournables pour traiter efficacement des données séquentielles dans de nombreux domaines.

Le choix entre LSTM et GRU dépendra essentiellement de la nature de la tâche, la longueur des séquences, la complexité du modèle désiré, et les contraintes de calcul.