logo

Réseaux d'unités récurrentes fermées

Gated Recurrent Unit (GRU) est un type de réseau neuronal récurrent (RNN) introduit par Cho et al. en 2014 comme alternative plus simple aux réseaux LSTM (Long Short-Term Memory). Comme LSTM, GRU peut traiter des données séquentielles telles que des données textuelles, vocales et chronologiques.

L'idée de base de GRU est d'utiliser des mécanismes de contrôle pour mettre à jour de manière sélective l'état caché du réseau à chaque pas de temps. Les mécanismes de contrôle sont utilisés pour contrôler le flux d’informations entrant et sortant du réseau. Le GRU dispose de deux mécanismes de déclenchement, appelés porte de réinitialisation et porte de mise à jour.



La porte de réinitialisation détermine la quantité de l'état caché précédent qui doit être oubliée, tandis que la porte de mise à jour détermine la quantité de la nouvelle entrée qui doit être utilisée pour mettre à jour l'état caché. La sortie du GRU est calculée sur la base de l'état caché mis à jour.

Les équations utilisées pour calculer la porte de réinitialisation, la porte de mise à jour et l'état caché d'un GRU sont les suivantes :

Réinitialiser le portail : r_t = sigmoïde (W_r * [h_{t-1}, x_t])
Porte de mise à jour : z_t = sigmoïde (W_z * [h_{t-1}, x_t])
État caché du candidat : h_t' = tanh(W_h * [r_t * h_{t-1}, x_t])
État masqué : h_t = (1 – z_t) * h_{t-1} + z_t * h_t'
où W_r, W_z et W_h sont des matrices de poids apprenables, x_t est l'entrée au pas de temps t, h_{t-1} est l'état caché précédent et h_t est l'état caché actuel.



En résumé, les réseaux GRU sont un type de RNN qui utilise des mécanismes de déclenchement pour mettre à jour de manière sélective l'état caché à chaque pas de temps, leur permettant ainsi de modéliser efficacement les données séquentielles. Ils se sont révélés efficaces dans diverses tâches de traitement du langage naturel, telles que la modélisation du langage, la traduction automatique et la reconnaissance vocale.

Prérequis : réseaux de neurones récurrents, réseaux de mémoire à long terme et à court terme

Pour résoudre le problème des gradients de disparition et d'explosion souvent rencontré lors du fonctionnement d'un réseau neuronal récurrent de base, de nombreuses variantes ont été développées. L'une des variantes les plus connues est la Réseau de mémoire à long terme (LSTM) . L'une des variantes les moins connues mais tout aussi efficace est la Réseau d'unités récurrentes fermées (GRU) .

Contrairement au LSTM, il se compose de seulement trois portes et ne maintient pas d'état de cellule interne. Les informations qui sont stockées dans l'état de cellule interne dans une unité récurrente LSTM sont incorporées dans l'état caché de l'unité récurrente fermée. Ces informations collectives sont transmises à la prochaine unité récurrente fermée. Les différentes portes d'un GRU sont décrites ci-dessous : -

    Update Gate(z) : il détermine la quantité de connaissances passées qui doit être transmise dans le futur. C'est analogue à la porte de sortie dans une unité récurrente LSTM. Réinitialiser la porte (r) : elle détermine la quantité de connaissances passées à oublier. C'est analogue à la combinaison de la porte d'entrée et de la porte oubliée dans une unité récurrente LSTM.Current Memory Gate ( overline{h}_{t} = tanh(Wodot x_{t}+Wodot (r_{t}odot h_{t-1})) ) : Il est souvent négligé lors d’une discussion typique sur le réseau d’unités récurrentes fermées. Il est incorporé dans la porte de réinitialisation, tout comme la porte de modulation d'entrée est une sous-partie de la porte d'entrée et est utilisé pour introduire une certaine non-linéarité dans l'entrée et pour rendre l'entrée à moyenne nulle. Une autre raison d'en faire une sous-partie de la porte de réinitialisation est de réduire l'effet des informations précédentes sur les informations actuelles transmises dans le futur.

Le flux de travail de base d'un réseau d'unités récurrentes fermées est similaire à celui d'un réseau neuronal récurrent de base lorsqu'il est illustré. La principale différence entre les deux réside dans le fonctionnement interne au sein de chaque unité récurrente, car les réseaux d'unités récurrentes fermées sont constitués de portes qui modulent le entrée actuelle et l’état caché précédent.



Fonctionnement d'une unité récurrente fermée :

  • Prenez en entrée l'entrée actuelle et l'état caché précédent comme vecteurs.
  • Calculez les valeurs des trois portes différentes en suivant les étapes indiquées ci-dessous : -
    1. Pour chaque porte, calculez l'entrée actuelle paramétrée et les vecteurs d'état précédemment cachés en effectuant une multiplication par éléments (produit Hadamard) entre le vecteur concerné et les poids respectifs pour chaque porte.
    2. Appliquez la fonction d'activation respective pour chaque élément de porte sur les vecteurs paramétrés. Vous trouverez ci-dessous la liste des portails avec la fonction d'activation à appliquer pour le portail.
 Update Gate : Sigmoid Function Reset Gate : Sigmoid Function>
  • Le processus de calcul de la Current Memory Gate est un peu différent. Tout d’abord, le produit Hadamard de la porte de réinitialisation et du vecteur d’état précédemment caché est calculé. Ensuite, ce vecteur est paramétré puis ajouté au vecteur d'entrée courant paramétré.

    h_{t} = z_{t}odot h_{t-1} + (1-z_{t})odot overline{h}_{t}
  • Pour calculer l'état caché actuel, d'abord, un vecteur de uns et de mêmes dimensions que celui de l'entrée est défini. Ce vecteur sera appelé un et sera mathématiquement noté 1. Tout d'abord, calculez le produit Hadamard de la porte de mise à jour et le vecteur d'état précédemment caché. Générez ensuite un nouveau vecteur en soustrayant la porte de mise à jour de celles-ci, puis calculez le produit Hadamard du vecteur nouvellement généré avec la porte mémoire actuelle. Enfin, ajoutez les deux vecteurs pour obtenir le vecteur d'état actuellement caché.
    E_{t} = -y_{t}log(overline{y}_{t})

    Le fonctionnement indiqué ci-dessus est indiqué ci-dessous : -

Notez que les cercles bleus indiquent une multiplication élément par élément. Le signe positif dans le cercle désigne l'addition vectorielle tandis que le signe négatif indique la soustraction vectorielle (addition vectorielle avec une valeur négative). La matrice de poids W contient différents poids pour le vecteur d'entrée actuel et l'état caché précédent pour chaque porte.

Tout comme les réseaux de neurones récurrents, un réseau GRU génère également une sortie à chaque pas de temps et cette sortie est utilisée pour entraîner le réseau à l'aide de la descente de gradient.

Notez que tout comme le flux de travail, le processus de formation d'un réseau GRU est également schématiquement similaire à celui d'un réseau neuronal récurrent de base et ne diffère que par le fonctionnement interne de chaque unité récurrente.

L'algorithme de rétro-propagation dans le temps pour un réseau d'unités récurrentes fermées est similaire à celui d'un réseau de mémoire à long terme et ne diffère que par la formation de chaîne différentielle.

Laisser E = somme _{t} E_{t}être la sortie prédite à chaque pas de temps et Rightarrow E = sum _{t} -y_{t}log(overline{y}_{t})être la sortie réelle à chaque pas de temps. Ensuite, l'erreur à chaque pas de temps est donnée par : -

frac{partial E}{partial W} = sum _{t} frac{partial E_{t}}{partial W}

L'erreur totale est donc donnée par la somme des erreurs à tous les pas de temps.

frac{partial E_{t}}{partial W} = frac{partial E_{t}}{partial overline{y}_{t}}frac{partial overline{y}_ {t}}{partial h_{t}}frac{partial h_{t}}{partial h_{t-1}}frac{partial h_{t-1}}{partial h_{t -2}}......frac{partial h_{0}}{partial W}
frac{partial E}{partial W} = sum _{t}frac{partial E_{t}}{partial overline{y}_{t}}frac{partial overline{ y}_{t}}{partial h_{t}}frac{partial h_{t}}{partial h_{t-1}}frac{partial h_{t-1}}{partial h_{t-2}}......frac{partial h_{0}}{partial W}

De même, la valeur h_{t} = z_{t}odot h_{t-1} + (1-z_{t})odot overline{h}_{t}peut être calculé comme la somme des gradients à chaque pas de temps.

frac{partial h_{t}}{partial h_{t-1}} = z + (1-z)frac{partial overline{h}_{t}}{partial h_{t- 1}}

En utilisant la règle de la chaîne et en utilisant le fait que overline{h}_{t} = tanh(Wodot x_{t}+Wodot (r_{t}odot h_{t-1}))est une fonction de frac{partial overline{h_{t}}}{partial h_{t-1}} = frac{partial (tanh(Wodot x_{t}+Wodot (r_{t} odot h_{t-1})))}{partial h_{t-1}} Rightarrow frac{partial overline{h_{t}}}{partial h_{t-1}} = (1 -overline{h}_{t}^{2})(Wodot r)et qui est en effet fonction de , l'expression suivante apparaît : -



Ainsi, le gradient d’erreur total est donné par ce qui suit : -



Notez que l'équation du gradient implique une chaîne de qui ressemble à celle d'un réseau neuronal récurrent de base, mais cette équation fonctionne différemment en raison du fonctionnement interne des dérivées de .

Comment les unités récurrentes fermées résolvent-elles le problème de la disparition des gradients ?

La valeur des gradients est contrôlée par la chaîne de dérivées partant de . Rappelez-vous l'expression de :-



En utilisant l'expression ci-dessus, la valeur de est:-



Rappelez-vous l'expression de :-



En utilisant l'expression ci-dessus pour calculer la valeur de :-



Étant donné que les portes de mise à jour et de réinitialisation utilisent la fonction sigmoïde comme fonction d'activation, les deux peuvent prendre les valeurs 0 ou 1.

Cas 1(z = 1) :

Dans ce cas, quelle que soit la valeur de , le terme est égal à z qui à son tour est égal à 1.

Cas 2A(z=0 et r=0) :

Dans ce cas, le terme est égal à 0.

Cas 2B(z=0 et r=1) :

Dans ce cas, le terme est égal à . Cette valeur est contrôlée par la matrice de poids qui peut être entraînée et ainsi le réseau apprend à ajuster les poids de telle manière que le terme se rapproche de 1.

Ainsi l'algorithme de Back-Propagation Through Time ajuste les poids respectifs de telle manière que la valeur de la chaîne de dérivées soit la plus proche possible de 1.