# Réseau de neurones récurrents

Un réseau de neurones récurrents (RNN pour recurrent neural network en anglais) est un réseau de neurones artificiels présentant des connexions récurrentes. Un réseau de neurones récurrents est constitué d'unités (neurones) interconnectées interagissant non-linéairement et pour lequel il existe au moins un cycle dans la structure. Les unités sont reliées par des arcs (synapses) qui possèdent un poids. La sortie d'un neurone est une combinaison non linéaire de ses entrées.
Les réseaux de neurones récurrents sont adaptés pour des données d'entrée de taille variable. Ils conviennent en particulier pour l'analyse de séries temporelles. Ils sont utilisés en reconnaissance automatique de la parole ou de l'écriture manuscrite - plus généralement en reconnaissance de formes - ou encore en traduction automatique. Dépliés, ils sont comparables à des réseaux de neurones classiques avec des contraintes d'égalité entre les poids du réseau (voir schéma à droite). Les techniques d'entraînement du réseau sont les mêmes que pour les réseaux classiques (rétropropagation du gradient), néanmoins les réseaux de neurones récurrents se heurtent au problème de disparition du gradient pour apprendre à mémoriser des évènements passés. Des architectures particulières répondent à ce dernier problème, on peut citer en particulier les réseaux Long short-term memory. On peut étudier les comportements des réseaux de neurones récurrents avec la théorie des bifurcations, mais la complexité de cette étude augmente très rapidement avec le nombre de neurones.

## Réseaux Elman et réseaux Jordan

Un réseau Elman est un réseau de 3 couches (x, y, et z dans l'illustration) complété d'un ensemble d'unités de contexte (u dans l'illustration). La couche y du milieu (cachée) est connectée à ces unités de contexte, et a des poids. A chaque étape, l'entrée est retransmise et une règle d'apprentissage est appliquée. Les connexions finales fixées enregistrent une copie des valeurs précédentes des unités cachées dans les unités de contexte (puisqu'elles propagent les connexions avant que la règle d'apprentissage soit appliquée). Donc le réseau peut maintenir une sorte d'état, lui permettant d'exécuter des tâches telles que la prédiction séquentielle qui est au-delà de la puissance d'un perceptron multicouche standard.
Les réseaux Jordan sont similaires aux réseaux Elman. Les unités de contexte sont alimentées par la couche de sortie à la place de la couche cachée. Les unités de contexte dans un réseau Jordan mentionnent aussi la couche d'état. Elles ont une connexion récurrente à elles-mêmes.
Les réseaux Elman et Jordan sont aussi connus comme des simples réseaux récurrents (SRN pour simple recurrent networks). Voici les équations pour deux types de réseaux :

### Réseau Elman

    ${\begin{aligned}h_{t}&=\sigma _{h}(W_{h}x_{t}+U_{h}h_{t-1}+b_{h})\\y_{t}&=\sigma _{y}(W_{y}h_{t}+b_{y})\end{aligned}}$
    où :
   * $x_{t}$ est le vecteur d'entrée à l'instant t
   * $h_{t}$ est le vecteur de la couche cachée à l'instant t
   * $y_{t}$ est le vecteur de sortie à l'instant t
   * $W_{h}$ est la matrice entre la couche d'entrée et la couche cachée, $U_{h}$ est la matrice entre la couche cachée et elle-même, $W_{y}$ est la matrice entre la couche cachée et la couche de sortie, et $b$ est le vecteur de biais ($W_{h}$, $U_{h}$, $W_{y}$, et $b$ sont les paramètres)
   * $\sigma _{h}$ et $\sigma _{y}$ sont les fonctions d'activation respectivement au niveau de la couche cachée et de la couche de sortie.

### Réseau Jordan

    ${\begin{aligned}h_{t}&=\sigma _{h}(W_{h}x_{t}+U_{h}y_{t-1}+b_{h})\\y_{t}&=\sigma _{y}(W_{y}h_{t}+b_{y})\end{aligned}}$
où les notations sont les mêmes sauf que $U_{h}$ est ici la matrice entre la couche de sortie et la couche cachée.

## Problème de disparition du gradient

Les réseaux de neurones récurrents classiques sont exposés au problème de disparition de gradient qui les empêche de modifier leurs poids en fonction d'évènements trop anciens. Lors de l'entraînement, le réseau essaie de minimiser une fonction d'erreur dépendant en particulier de la sortie $E(o_{t})$. Pour l'exemple donné ci-dessus, suivant la règle de dérivation en chaîne, la contribution au gradient ${\frac {\partial E(o_{t})}{\partial U_{mn}}}$ de l'entrée $x_{t-k}$ est
    ${\frac {\partial E(o_{t})}{\partial U_{mn}}}=\cdots +{\frac {\partial E(o_{t})}{\partial o_{t}}}{\frac {\partial o_{t}}{\partial h_{t}}}{\frac {\partial h_{t}}{\partial h_{t-1}}}\cdots {\frac {\partial h_{t-k+1}}{\partial h_{t-k}}}{\frac {\partial h_{t-k}}{\partial U_{mn}}}+\cdots$
    ${\frac {\partial E(o_{t})}{\partial U_{mn}}}=\cdots +{\frac {\partial E(o_{t})}{\partial o_{t}}}{\frac {\partial o_{t}}{\partial h_{t}}}{\frac {\partial h_{t}}{\partial h_{t-1}}}\cdots {\frac {\partial h_{t-k+1}}{\partial h_{t-k}}}\sigma _{h}'(Ux_{t-k}+Vh_{t-k-1})E_{m,n}x_{t-k}+\cdots$
où $E_{mn}$ représente la matrice tel que le seul terme non nul est le terme $(m,n)$ égal à 1. Pour des valeurs standard de la fonction d'activation et des poids du réseau le produit ${\frac {\partial h_{t}}{\partial h_{t-1}}}...{\frac {\partial h_{t-k+1}}{\partial h_{t-k}}}$ décroît exponentiellement en fonction de $k$. Par conséquent la correction de l'erreur si cela doit faire intervenir un évènement lointain diminuera exponentiellement avec l'intervalle de temps entre cet évènement et le présent. Le réseau sera incapable de prendre en compte les entrées passées.

## Types
### Long short-term memory

Un réseau Long short-term memory (LSTM), en français réseau récurrent à mémoire court et long terme ou plus explicitement réseau de neurones récurrents à mémoire court-terme et long terme, est l'architecture de réseau de neurones récurrents la plus utilisée en pratique qui permet de répondre au problème de disparition de gradient. Le réseau LSTM a été proposé par Sepp Hochreiter et Jürgen Schmidhuber en 1997. L'idée d'un LSTM est que chaque unité computationnelle est liée non seulement à un état caché $h$ mais également à un état $c$ de la cellule qui joue le rôle de mémoire. Le passage de $c_{t-1}$ à $c_{t}$ se fait par transfert à gain constant et égal à 1. De cette façon les erreurs se propagent aux pas antérieurs (jusqu'à 1 000 étapes dans le passé) sans phénomène de disparition de gradient. L'état de la cellule peut être modifié à travers une porte qui autorise ou bloque la mise à jour (input gate). De même une porte contrôle si l'état de cellule est communiqué en sortie de l'unité LSTM (output gate). La version la plus répandue des LSTM utilise aussi une porte permettant la remise à zéro de l'état de la cellule (forget gate).

#### Équations

Le schéma suivant indique grossièrement comment on calcule les différentes valeurs.
* Les symboles $\sigma$ et $\tanh$ représentent respectivement la fonction sigmoïde et la fonction tangente hyperbolique, bien que d'autres fonctions d'activation soient possibles. Chaque boîte $\sigma$ et $\tanh$ applique la fonction à l'entrée qui est une combinaison affine (les poids ne sont pas indiqués sur le schéma).
* Chaque porte + correspond à l'addition de vecteurs
* Chaque porte X correspond au produit matriciel de Hadamard (produit terme à terme).
Les valeurs initiales sont $c_{0}=0$ et $h_{0}=0$. Dans les équations suivantes, l'opérateur $\circ$ symbolise le produit matriciel de Hadamard (produit terme à terme). Les équations suivantes décrivent précisément les calculs présentés dans le schéma ci-dessus :
    ${\begin{aligned}F_{t}&=\sigma (W_{F}x_{t}+U_{F}h_{t-1}+b_{F})\,\,\,\,&{\text{(forget gate)}}\\I_{t}&=\sigma (W_{I}x_{t}+U_{I}h_{t-1}+b_{I})&{\text{(input gate)}}\\O_{t}&=\sigma (W_{O}x_{t}+U_{O}h_{t-1}+b_{O})&{\text{(output gate)}}\\c_{t}&=F_{t}\circ c_{t-1}+I_{t}\circ \tanh(W_{c}x_{t}+U_{c}h_{t-1}+b_{c})\\h_{t}&=O_{t}\circ \tanh(c_{t})\\o_{t}&=f(W_{o}h_{t}+b_{o})\end{aligned}}$
Les vecteurs $F_{t}$, $I_{t}$ et $O_{t}$ pour respectivement les portes d'oubli, d'entrée et de sortie à l'instant t s'obtiennent de la même façon : l'application de la fonction sigmoïde à des combinaisons affines à partir du vecteur d'entrée à l'instant t et du vecteur pour la couche cachée à l'instant t - 1. Ces vecteurs permettent alors de calculer le vecteur $c_{t}$ et le vecteur $h_{t}$ de la couche cachée à l'instant t.

#### Variantes

Il existe des variantes de LSTM tel :
* Peephole LSTM
* Bi-LSTM (bi-directional LSTM)$^,$, permettant de tenir compte dans une séquence de l'influence de la suite sur ce qu'il précède, en plus de l'habituelle influence du précédant sur ce qui suit.

### Gated Recurrent Unit

Un réseau Gated Recurrent Unit (GRU) (en français, réseau récurrent à portes ou plus explicitement réseau de neurones récurrents à portes) est une variante des LSTM introduite en 2014 par Kyunghyun Cho et al. Les réseaux GRU ont des performances comparables aux LSTM pour la prédiction de séries temporelles (ex : partitions musicales, données de parole). Une unité requiert moins de paramètres à apprendre qu'une unité LSTM. Un neurone n'est associé plus qu'à un état caché (plus de cell state) et les portes d'entrée et d'oubli de l'état caché sont fusionnées (update gate). La porte de sortie est remplacée par une porte de réinitialisation (reset gate).

#### Équations

Valeur initiale : $h_{0}=0$.
${\begin{aligned}Z_{t}&=\sigma (W_{Z}x_{t}+U_{Z}h_{t-1}+b_{Z})\,\,\,\,&{\text{(update gate)}}\\R_{t}&=\sigma (W_{R}x_{t}+U_{R}h_{t-1}+b_{R})&{\text{(reset gate)}}\\h_{t}&=Z_{t}\circ h_{t-1}+(1-Z_{t})\circ \tanh(W_{h}x_{t}+U_{h}(R_{t}\circ h_{t-1})+b_{h})\end{aligned}}$

### Applications industrielles

Ces réseaux sont utiles sur des processus temporels (prise en compte du passé d'une séquence) :
* Prévision de processus industriels (électricité)
* Intégration de contrôle/commande
* Outils de traitement du langage naturel et processus de traduction. A noter que ces modèles ont donné naissance aux architectures à base de Transformers qui sont à la base des Large Language Models mis en production à partir de 2022 et 2023.