Titeur : Dr. Haithem Hermessi
Cours : Fondamentaux du Deep learning
A/U :2021-2021
RNNs, GRUs, LSTMs, Attention, et Réseaux mémoire
1. Réseaux récurrents (RNNs) :
Dans un réseau neuronal convolutif, le graphe ou les interconnexions entre les modules ne peuvent
pas avoir de boucles. Il existe au moins un ordre partiel entre les modules, de sorte que les entrées
sont disponibles lorsque nous calculons les sorties.
Comme le montre la figure 1, il existe des boucles dans les réseaux neuronaux récurrents.
Figure 1 : Réseau neuronal récurrent enroulé
x(t) : entrée qui varie dans le temps
Enc(x(t)) : encodeur qui génère une représentation de l’entrée
h(t) : une représentation de l’entrée
w : paramètres pouvant être entraînés
g : fonction qui peut être un réseau de neurones compliqué. L’une des entrées est z(t−1) qui
z(t−1) : état caché précédent, qui est la sortie du pas de temps précédent
z(t) : état caché actuel
est la sortie du pas de temps précédent
Dec(z(t)) : décodeur qui génère une sortie
2. Réseaux récurrents dépliés :
L’entrée est une séquence x1, x2,⋯, xT.
Je n’aime pas ce film
I don’t like this movie
Advertisement
Figure 2. Réseaux récurrents dépliés
temps
l’entrée
Dans la figure 2, l’entrée est x1, x2, x3.
Au
la
t=0,
représentation h(x(0))=Enc(x(0)) puis la passe à G pour générer l’état caché z(0)=G(h0,z’,w).
À t=0, z’ dans G peut être initialisé comme 0 ou initialisé de façon aléatoire. z(0) est passé au
décodeur pour générer une sortie et également au pas de temps suivant.
Comme il n’y a pas de boucles dans ce réseau nous pouvons mettre en œuvre la rétropropagation.
l’encodeur
génère
passée
x(0)
qui
est
à
La figure 2 montre un réseau avec une caractéristique particulière : chaque bloc partage les mêmes
poids. Trois encodeurs, décodeurs et fonctions G ont respectivement les mêmes poids sur différents
pas de temps.
Malheureusement, la rétropropagation à travers le temps (BPTT pour Backpropagation through
time) ne fonctionne pas aussi bien dans la forme naïve du RNN.
Problèmes avec les RNNs :
Disparition du gradient :
o Dans une longue séquence, les gradients sont multipliés par la matrice de poids
Advertisement
(transposée) à chaque pas de temps. S’il y a de petites valeurs dans la matrice de
poids, la norme des gradients devient de plus en plus petite de manière
exponentielle.
Explosion du gradient :
o Si nous avons une grande matrice de poids et que la non-linéarité dans la couche
récurrente n’est pas saturée, les gradients vont exploser. Les poids divergeront à
l’étape de mise à jour. Il se peut que nous devions utiliser un taux d’apprentissage
minuscule pour que la descente des gradients fonctionne.
L’une des raisons d’utiliser les RNNs est l’avantage de se souvenir des informations du passé.
Cependant, il pourrait ne pas mémoriser les informations d’il y a longtemps.
Un exemple du problème de la disparition des gradients. Considérons une entrée constituée des
caractères d’un programme en langage C. Le système indiquera s’il s’agit d’un programme
syntaxiquement correct. Un programme syntaxiquement correct doit avoir un nombre valide
d’accolades et de parenthèses. Ainsi, le réseau doit se souvenir du nombre de parenthèses et
d’accolades ouvertes à vérifier, et si nous les avons toutes fermées. Le réseau doit stocker ces
informations dans des états cachés comme un compteur. Cependant, en raison de la disparition des
gradients, il ne parviendra pas à conserver ces informations dans un programme long.
Astuces pour les RNNs
Couper les gradients pour éviter l’explosion : Écrasez les gradients lorsqu’ils deviennent
trop importants.
Jouer sur l’initialisation (commencer à droite évite l’explosion/la disparition) : Initialiser
les matrices de poids pour préserver la norme dans une certaine mesure. Par exemple,
l’initialisation orthogonale initialise la matrice de poids comme une matrice orthogonale
aléatoire.
3. Modules multiplicatifs
Advertisement
Dans les modules multiplicatifs, plutôt que de calculer uniquement une somme pondérée d’entrées,
nous calculons les produits des entrées et nous calculons ensuite la somme pondérée de celles-ci.
La sortie du système est une somme pondérée classique d’entrées et de poids. Les poids eux-mêmes
sont également des sommes pondérées de poids et d’entrées.
Architecture d’hyper-réseau : les poids sont calculés par un autre réseau.
4. Les Gated Recurrent Units (GRUs) :
Comme mentionné ci-dessus, le RNN souffre de la disparition/explosion des gradients et ne se
souvient pas des états pendant très longtemps. Les GRUS, Cho et al. (2014), sont une application
de modules multiplicatifs qui tente de résoudre ces problèmes. C’est un exemple de réseau récurrent
avec mémoire. La structure d’une unité GRU est présentée ci-dessous :
Figure 3 : Gated Recurrent Unit
où ⊙ indique une multiplication par élément (produit Hadamard), xt est le vecteur d’entrée, ht est
le vecteur de sortie, zt est le vecteur de mise à jour, rt est le vecteur de réinitialisation, ϕh est une
tanh, et W,U,b sont des paramètres pouvant être appris.
Pour être précis, zt est un vecteur de porte qui détermine quelle part des informations passées doit
être transmise pour la suite. Il applique une fonction sigmoïde à la somme de deux couches linéaires
et un biais sur l’entrée xt et l’état précédent ht−1. zt contient des coefficients entre 0 et 1 résultant de
l’application de la fonction sigmoïde. L’état final de sortie ht est une combinaison convexe de ht−1
et de ϕh(Wh xt+Uh(rt⊙ht−1)+bh) via zt. Si le coefficient est égal à 1, la sortie de l’unité actuelle n’est
qu’une copie de l’état précédent et ignore l’entrée (ce qui est le comportement par défaut). S’il est
inférieur à 1, il prend en compte de nouvelles informations provenant de l’entrée.
La porte de réinitialisation rt est utilisée pour décider quelle quantité d’informations passées doit
être oubliée. Dans le nouveau contenu de la mémoire ϕh(Wh xt+Uh(rt⊙ht−1)+bh), si le coefficient
dans rt est 0, alors il ne stocke aucune des informations du passé. Si en plus zt vaut 0, alors le
système est complètement réinitialisé puisque ht ne regarderait que l’entrée.
5. Les LSTMs (Long Short-Term Memory) :
Advertisement
Les GRUs sont en fait une version simplifiée des LSTMs qui ont été conçues beaucoup plus
tôt, Hochreiter, Schmidhuber, 1997. En constituant des cellules de mémoire pour préserver les
informations passées, les LSTMs visent également à résoudre les problèmes de perte de mémoire
à long terme dans les RNNs. La structure des LSTMs est présentée ci-dessous :
Figure 4 : Long Short-Term Memory
où ⊙ indique une multiplication par élément, xt∈ℝa est un vecteur d’entrée de l’unité LSTM, ft
∈ ℝh est le vecteur d’activation de la porte d’oubli, it∈ ℝh est le vecteur d’activation de la porte
d’entrée/mise à jour, ot∈ ℝh est le vecteur d’activation de la porte de sortie, ht∈ ℝh est le vecteur
d’état caché (également appelé sortie), ct∈ ℝh est le vecteur d’état de la cellule.
Une unité LSTM utilise un état de cellule ct pour transmettre l’information. Elle régule la manière
dont l’information est préservée ou retirée de l’état de la cellule par des structures appelées “gates”
(portes). La porte d’oubli ft décide de la quantité d’informations que nous voulons conserver de
l’état de cellule précédent ct−1 en regardant l’entrée actuelle et l’état caché précédent. Elle produit
un nombre entre 0 et 1 comme coefficient de ct−1. tanh(Wcxt+Ucht−1+bc) calcule un nouveau candidat
pour mettre à jour l’état de la cellule, et comme la porte d’oubli, la porte d’entrée it décide de la
part de mise à jour à appliquer. Enfin, la sortie ht sera basée sur l’état de la cellule ct, mais passera
par une tanh puis sera filtrée par la porte de sortie ot.
Bien que les LSTMs soient largement utilisés en NLP, leur popularité est en baisse. Par exemple,
la reconnaissance vocale se dirige vers l’utilisation de ConvNets temporels, et les autres utilisations
se dirigent vers l’utilisation de transformers.
Happy Learning
Contact: [email protected]