Formation ML / Deep learning

RNN et LSTM

Avancé 55 min 13 sections

L'état caché porte la mémoire d'un pas au suivant ; trois portes la sauvent du gradient évanescent.

Objectifs d'apprentissage

  • Comprendre le concept de mémoire dans les réseaux de neurones
  • Connaître le problème du gradient qui disparaît
  • Comprendre l'architecture LSTM et ses portes
  • Appliquer les concepts aux séries temporelles

Prérequis

Module Réseau de neurones recommandé

Théorie

Pourquoi des réseaux récurrents?

Les données séquentielles ont une structure temporelle que les réseaux classiques ignorent.

Exemples de séquences:

  • Séries temporelles (bourse, météo, capteurs)
  • Texte (mots dans une phrase)
  • Audio (parole, musique)
  • Vidéo (suite d'images)

Problème des réseaux classiques:

  • Traitent chaque entrée indépendamment
  • Pas de notion de "contexte" ou "historique"
  • Le mot "banque" à un sens différent selon le contexte!

Solution: Les RNN Un Récurrent Neural Network maintient un état cache (hidden state) qui encode l'historique de la séquence.

Intuition:

"Pour comprendre ce mot, je dois me souvenir des mots précédents."

Applications:

  • Prédiction de séries temporelles
  • Traduction automatique
  • Génération de texte
  • Reconnaissance vocale
Théorie

Schéma: Architecture RNN

Le RNN "déroule" dans le temps:

flowchart LR subgraph T1 ["t=1"] X1["x1"] H1["h1"] Y1["y1"] end subgraph T2 ["t=2"] X2["x2"] H2["h2"] Y2["y2"] end subgraph T3 ["t=3"] X3["x3"] H3["h3"] Y3["y3"] end X1 --> H1 --> Y1 X2 --> H2 --> Y2 X3 --> H3 --> Y3 H1 -->|"mémoire"| H2 -->|"mémoire"| H3 class H1 ml-node-main class H2 ml-node-main class H3 ml-node-main

Formule du RNN:

$$h_t = \tanh(W_x x_t + W_h h_{t-1} + b)$$

$$y_t = W_y h_t + b_y$$

Problème: Gradient qui disparaît

flowchart LR G1["Gradient fort
(recent)"] G2["Gradient moyen"] G3["Gradient faible"] G4["Gradient ~0
(ancien)"] G1 --> G2 --> G3 --> G4 class G1 ml-node-accent class G4 ml-node-muted

Le gradient devient très petit pour les entrées anciennes → le RNN "oublie" le passe lointain.

Exemple concret avec code couleur - Calcul d'un état cache RNN:

Entrée au temps t: $\textcolor{#3498db}{x_t = 0.8}$ (prix normalise) État précédent: $\textcolor{#e67e22}{h_{t-1} = 0.3}$ (mémoire) Poids: $\textcolor{#9B7AC4}{W_x = 0.5}$, $\textcolor{#F7E64D}{W_h = 0.7}$, $\textcolor{#9B7AC4}{b = 0.1}$

Calcul du nouvel état cache:

$h_t = \tanh(\textcolor{#9B7AC4}{W_x} \cdot \textcolor{#3498db}{x_t} + \textcolor{#F7E64D}{W_h} \cdot \textcolor{#e67e22}{h_{t-1}} + \textcolor{#9B7AC4}{b})$

$h_t = \tanh(\textcolor{#9B7AC4}{0.5} \times \textcolor{#3498db}{0.8} + \textcolor{#F7E64D}{0.7} \times \textcolor{#e67e22}{0.3} + \textcolor{#9B7AC4}{0.1})$

$h_t = \tanh(\textcolor{#3498db}{0.40} + \textcolor{#e67e22}{0.21} + \textcolor{#9B7AC4}{0.10}) = \tanh(0.71) = \textcolor{#27ae60}{\mathbf{0.61}}$

Interprétation:

  • Le nouvel état $\textcolor{#27ae60}{h_t = 0.61}$ combine:
  • L'entrée actuelle ($\textcolor{#3498db}{0.40}$)
  • La mémoire du passe ($\textcolor{#e67e22}{0.21}$)
  • Cette "mémoire" sera transmise à t+1

Légende des couleurs:

  • $\textcolor{#3498db}{Bleu}$: Entrée actuelle $x_t$ et sa contribution
  • $\textcolor{#e67e22}{Orange}$: État précédent $h_{t-1}$ (mémoire)
  • $\textcolor{#9B7AC4}{Violet}$: Poids d'entrée $W_x$ et biais
  • $\textcolor{#F7E64D}{Jaune}$: Poids récurrent $W_h$
  • $\textcolor{#27ae60}{Vert}$: Nouvel état cache $h_t$
Avancé Exercice manuel: À vous de calculer!

Objectif: Comprendre le fonctionnement des RNN à la main (état cache, séquence).

CONTEXTE

RNN simple avec :

  • Entrée : vecteur de dimension 1
  • État cache : dimension 1
  • Poids : $W_h = 0.5$ (état vers état), $W_x = 0.8$ (entrée vers état)
  • Biais : $b = 0$
  • Activation : tanh (valeurs entre -1 et 1)

Séquence d'entrée : $x = [1, 0.5, -0.5]$

État initial : $h_0 = 0$

Formule : $h_t = \tanh(W_h \cdot h_{t-1} + W_x \cdot x_t + b)$

Valeurs tanh : tanh(0)=0, tanh(0.5)≈0.46, tanh(0.8)≈0.66, tanh(1)≈0.76

PARTIE 1 : Propagation pas à pas

1.1) Calculez $h_1$ pour $x_1 = 1$ 1.2) Calculez $h_2$ pour $x_2 = 0.5$ 1.3) Calculez $h_3$ pour $x_3 = -0.5$

PARTIE 2 : Interprétation

2.1) Comment l'état cache "mémorise" les entrées précédentes ? 2.2) Que représente $h_3$ par rapport à toute la séquence ?

Avancé Solution de l'exercice manuel

SOLUTION DÉTAILLÉE

$W_h = 0.5$, $W_x = 0.8$, $h_0 = 0$

PARTIE 1 : Propagation pas à pas

1.1) Pas 1 ($x_1 = 1$) :

$$h_1 = \tanh(0.5 \cdot 0 + 0.8 \cdot 1) = \tanh(0.8)$$

$\boxed{h_1 = \textcolor{#3498db}{0.66}}$

1.2) Pas 2 ($x_2 = 0.5$) :

$$h_2 = \tanh(0.5 \cdot 0.66 + 0.8 \cdot 0.5)$$

$$= \tanh(0.33 + 0.4) = \tanh(0.73)$$

$\boxed{h_2 = \textcolor{#e67e22}{0.62}}$

1.3) Pas 3 ($x_3 = -0.5$) :

$$h_3 = \tanh(0.5 \cdot 0.62 + 0.8 \cdot (-0.5))$$

$$= \tanh(0.31 - 0.4) = \tanh(-0.09)$$

$\boxed{h_3 = \textcolor{#27ae60}{-0.09}}$

PasEntrée $x_t$État $h_{t-1}$Calcul$h_t$
11.00tanh(0.8)0.66
20.50.66tanh(0.73)0.62
3-0.50.62tanh(-0.09)-0.09

PARTIE 2 : Interprétation

2.1) Mémoire via l'état cache :

  • $h_1$ dépend de $x_1$
  • $h_2$ dépend de $x_2$ ET de $h_1$ (donc indirectement de $x_1$)
  • $h_3$ "résumé" toute la séquence $[x_1, x_2, x_3]$

2.2) $h_3$ est un encodage de la séquence entière. C'est pourquoi les RNN sont utilisés pour le texte, les séries temporelles, etc.

$\boxed{\text{L'état final contient l'information de toute la séquence}}$

Légende : $\textcolor{#3498db}{Bleu}$: h1, $\textcolor{#e67e22}{Orange}$: h2, $\textcolor{#27ae60}{Vert}$: h3

Code

Explorer les données

Ctrl+Entrée
Cliquez sur "Exécuter" pour voir le résultat
Code

Préparer les séquences

Ctrl+Entrée
Cliquez sur "Exécuter" pour voir le résultat
Contenu verrouillé
6 / 13

Continuez votre apprentissage

Vous avez exploré 6 sections de ce module. Connectez-vous pour débloquer le reste du cours, incluant les exercices pratiques et les solutions.

Console Python

Raccourcis clavier
Ctrl/Cmd+Enter Exécuter
Ctrl/Cmd+Shift+/ Commenter
Tab Indenter
Shift+Tab Désindenter
Ctrl/Cmd+Z Annuler
Ctrl/Cmd+Y Rétablir
Ctrl+Entrée pour exécuter
Cliquez sur "Exécuter" pour voir le résultat