RNN et LSTM : Modéliser les Séquences
Maîtrisez les réseaux récurrents : pourquoi les RNN oublient, comment les LSTM résolvent le vanishing gradient avec leurs 3 portes, et quand les utiliser face aux Transformers.
Pourquoi les réseaux classiques échouent sur les séquences
Un MLP (Multi-Layer Perceptron) traite chaque entrée de manière indépendante. Il n'a aucune notion d'ordre ou de dépendance temporelle. Or, de nombreux problèmes sont séquentiels :
- "Je ne suis pas content" : le "pas" change tout ce qui précède
- Une série temporelle de températures : demain dépend des jours passés
- Une mélodie : chaque note s'inscrit dans une progression harmonique
RNN : la boucle récurrente
Le Recurrent Neural Network ajoute un état caché h_t qui se propage d'un pas temporel au suivant.
L'équation centrale :
h_t = tanh(W_hh · h_{t-1} + W_xh · x_t + b)
h_t encode tout ce que le réseau a "vu" jusqu'ici. En théorie, il peut capturer des dépendances arbitrairement longues. En pratique, c'est là que le problème commence.
Le vanishing gradient : pourquoi les RNN oublient
Lors de la rétropropagation dans le temps (BPTT), le gradient doit traverser chaque pas temporel, multiplié à chaque fois par la dérivée de tanh et les poids W_hh.
Gradient au pas t=0 ≈ gradient × W_hh^T
Pour T=100, W_hh=0.9 : 0.9^100 ≈ 0.000027 ← pratiquement zéro
Le vanishing gradient n'est pas un bug : c'est une conséquence mathématique inévitable. Un RNN standard ne peut pas apprendre des dépendances au-delà de ~10-20 pas temporels.
LSTM : les 3 portes qui changent tout
Le Long Short-Term Memory introduit deux vecteurs distincts :
h_t: état caché (court terme)c_t: état de cellule (long terme : la vraie mémoire)
Et trois portes qui contrôlent le flux d'information :
Forget gate : "Que faut-il oublier ?"
f_t = σ(W_f · [h_{t-1}, x_t] + b_f) → entre 0 (tout oublier) et 1 (tout garder)
Input gate : "Quelle nouvelle information stocker ?"
i_t = σ(W_i · [h_{t-1}, x_t] + b_i)
g_t = tanh(W_g · [h_{t-1}, x_t] + b_g)
c_t = f_t ⊙ c_{t-1} + i_t ⊙ g_t
Output gate : "Que révéler de la mémoire ?"
o_t = σ(W_o · [h_{t-1}, x_t] + b_o)
h_t = o_t ⊙ tanh(c_t)
Pourquoi les LSTM résolvent le vanishing gradient : c_t est mis à jour par addition (pas seulement multiplication), créant une autoroute pour les gradients qui traversent de nombreux pas sans disparaître.
GRU : la version allégée
| Critère | RNN | LSTM | GRU |
|---|---|---|---|
| Paramètres (hidden=128) | ~16k | ~66k | ~50k |
| Mémoire long terme | Faible | Excellente | Très bonne |
| Vitesse | Rapide | Lente | Moyenne |
En pratique, GRU et LSTM donnent des performances similaires. Commencez par GRU (plus rapide), passez au LSTM si vous avez des problèmes de dépendances très longues.
Micro-exercice : prédiction de série temporelle avec LSTM PyTorch
import torch
import torch.nn as nn
import numpy as np
class LSTMPredictor(nn.Module):
def __init__(self, input_size=1, hidden_size=32, num_layers=2):
super().__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, 1)
def forward(self, x):
out, _ = self.lstm(x)
return self.fc(out[:, -1, :]) # Dernier pas temporel
# Données synthétiques : sinusoïde + bruit
t = np.linspace(0, 4 * np.pi, 1000)
temps = np.sin(t) * 10 + 20 + np.random.normal(0, 0.5, 1000)
# Créer les séquences
seq_len = 30
X = torch.FloatTensor([temps[i:i+seq_len] for i in range(len(temps)-seq_len)]).unsqueeze(-1)
y = torch.FloatTensor([temps[i+seq_len] for i in range(len(temps)-seq_len)]).unsqueeze(-1)
model = LSTMPredictor()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()
for epoch in range(50):
pred = model(X)
loss = criterion(pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 10 == 0:
print(f"Epoch {epoch:3d} | Loss: {loss.item():.4f}")
Bonus : remplacez nn.LSTM par nn.GRU et comparez la vitesse de convergence. Sur des séquences de longueur modérée, GRU converge souvent légèrement plus vite.
Pourquoi les Transformers ont remplacé les RNN
| Critère | LSTM/GRU | Transformer |
|---|---|---|
| Parallélisation | Séquentielle (impossible) | Totale |
| Dépendances longues | Bonne mais limitée | Parfaite (attention globale) |
| Entraînement sur gros corpus | Lent | Très rapide |
| Cas d'usage NLP | Dépassé pour la plupart | Standard actuel |
LSTM reste pertinent pour :
- Séries temporelles sur ressources limitées (edge, microcontrôleurs)
- Streaming temps réel avec causalité stricte
- Petits datasets (les Transformers nécessitent beaucoup de données)
Specialiste IA — Master Intelligence Artificielle
Diplome d'un Master en Intelligence Artificielle, je travaille au quotidien sur des projets IA en entreprise. J'ai cree IwanttolearnAI pour rendre l'apprentissage de l'IA accessible a tous, gratuitement.
Continuer a apprendre
Diffusion Models : l'Architecture de Stable Diffusion
Plongez dans l'architecture des modèles de diffusion : forward process, U-Net débruiteur, guidance CLIP et Latent Diffusion. Comprenez ce qui propulse Stable Diffusion, SDXL et Flux.
Reinforcement Learning : Apprendre par l'Erreur
Maîtrisez le reinforcement learning : paradigme Agent/Environment, Q-Learning, DQN sur CartPole, PPO et le lien avec RLHF pour l'alignement des LLMs.
GANs et Génération d'Images par IA
Comprenez les réseaux adversariaux génératifs (GANs) et l'évolution vers Stable Diffusion : architecture, entraînement, applications et limites éthiques.