Formation ML / Deep Learning

RNN et LSTM

Avance 55 min 13 sections

Maitrisez les reseaux recurrents et LSTM pour traiter des donnees sequentielles comme les series temporelles.

Objectifs d'apprentissage

  • Comprendre le concept de memoire dans les reseaux de neurones
  • Connaitre le probleme du gradient qui disparait
  • Comprendre l'architecture LSTM et ses portes
  • Appliquer les concepts aux series temporelles

Prerequis

Module Reseaux de Neurones recommande

Theorie

Pourquoi des reseaux recurrents?

Les donnees sequentielles ont une structure temporelle que les reseaux classiques ignorent.

Exemples de sequences:

  • Series temporelles (bourse, meteo, capteurs)
  • Texte (mots dans une phrase)
  • Audio (parole, musique)
  • Video (suite d'images)

Probleme des reseaux classiques:

  • Traitent chaque entree independamment
  • Pas de notion de "contexte" ou "historique"
  • Le mot "banque" a un sens different selon le contexte!

Solution: Les RNN

Un Recurrent Neural Network maintient un etat cache (hidden state) qui encode l'historique de la sequence.

Intuition:

"Pour comprendre ce mot, je dois me souvenir des mots precedents."

Applications:

  • Prediction de series temporelles
  • Traduction automatique
  • Generation de texte
  • Reconnaissance vocale
Theorie

Schema: Architecture RNN

Le RNN "deroule" 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 -->|"memoire"| H2 -->|"memoire"| H3 style H1 fill:#9B7AC4,color:#FFFFFF style H2 fill:#9B7AC4,color:#FFFFFF style H3 fill:#9B7AC4,color:#FFFFFF

Formule du RNN:

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

$$y_t = W_y h_t + b_y$$

Probleme: Gradient qui disparait

flowchart LR G1["Gradient fort
(recent)"] G2["Gradient moyen"] G3["Gradient faible"] G4["Gradient ~0
(ancien)"] G1 --> G2 --> G3 --> G4 style G1 fill:#F7E64D,color:#1A1A1A style G4 fill:#6B6B6B,color:#FFFFFF

Le gradient devient tres petit pour les entrees anciennes → le RNN "oublie" le passe lointain.

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

Entree au temps t: $\textcolor{#3498db}{x_t = 0.8}$ (prix normalise)

Etat precedent: $\textcolor{#e67e22}{h_{t-1} = 0.3}$ (memoire)

Poids: $\textcolor{#9B7AC4}{W_x = 0.5}$, $\textcolor{#F7E64D}{W_h = 0.7}$, $\textcolor{#9B7AC4}{b = 0.1}$

Calcul du nouvel etat 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}}$

Interpretation:

  • Le nouvel etat $\textcolor{#27ae60}{h_t = 0.61}$ combine:
  • L'entree actuelle ($\textcolor{#3498db}{0.40}$)
  • La memoire du passe ($\textcolor{#e67e22}{0.21}$)
  • Cette "memoire" sera transmise a t+1

Legende des couleurs:

  • $\textcolor{#3498db}{Bleu}$: Entree actuelle $x_t$ et sa contribution
  • $\textcolor{#e67e22}{Orange}$: Etat precedent $h_{t-1}$ (memoire)
  • $\textcolor{#9B7AC4}{Violet}$: Poids d'entree $W_x$ et biais
  • $\textcolor{#F7E64D}{Jaune}$: Poids recurrent $W_h$
  • $\textcolor{#27ae60}{Vert}$: Nouvel etat cache $h_t$
Avance Exercice manuel: A vous de calculer!

Objectif: Comprendre le fonctionnement des RNN a la main (etat cache, sequence).

CONTEXTE

RNN simple avec :

  • Entree : vecteur de dimension 1
  • Etat cache : dimension 1
  • Poids : $W_h = 0.5$ (etat vers etat), $W_x = 0.8$ (entree vers etat)
  • Biais : $b = 0$
  • Activation : tanh (valeurs entre -1 et 1)

Sequence d'entree : $x = [1, 0.5, -0.5]$

Etat 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 a 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 : Interpretation

2.1) Comment l'etat cache "memorise" les entrees precedentes ?

2.2) Que represente $h_3$ par rapport a toute la sequence ?

Avance Solution de l'exercice manuel

SOLUTION DETAILLEE

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

PARTIE 1 : Propagation pas a 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}}$

PasEntree __MATH_12f8a3e3__Etat __MATH_84eea22d__Calcul__MATH_ab27a1b0__
11.00tanh(0.8)0.66
20.50.66tanh(0.73)0.62
3-0.50.62tanh(-0.09)-0.09

PARTIE 2 : Interpretation

2.1) Memoire via l'etat cache :

  • $h_1$ depend de $x_1$
  • $h_2$ depend de $x_2$ ET de $h_1$ (donc indirectement de $x_1$)
  • $h_3$ "resume" toute la sequence $[x_1, x_2, x_3]$

2.2) $h_3$ est un encodage de la sequence entiere.

C'est pourquoi les RNN sont utilises pour le texte, les series temporelles, etc.

$\boxed{\text{L'etat final contient l'information de toute la sequence}}$

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

Code

Explorer les donnees

Cliquez sur "Executer" pour voir le resultat
Code

Preparer les sequences

Cliquez sur "Executer" pour voir le resultat
Contenu verrouille section restante
6 / 13

Continuez votre apprentissage

Vous avez explore 6 sections de ce module. Connectez-vous pour debloquer le reste du cours, incluant les exercices pratiques et les solutions.

Console Python

Raccourcis clavier
Ctrl/Cmd+Enter Executer
Ctrl/Cmd+Shift+/ Commenter
Tab Indenter
Shift+Tab Desindenter
Ctrl/Cmd+Z Annuler
Ctrl/Cmd+Y Retablir
Ctrl+Enter pour executer
Cliquez sur "Executer" pour voir le resultat