Quelle est l'intuition derrière un réseau neuronal récurrent de mémoire à court terme (LSTM)?

11

L'idée derrière le réseau neuronal récurrent (RNN) est claire pour moi. Je le comprends de la manière suivante:
nous avons une séquence d'observations ( ) (ou, en d'autres termes, des séries temporelles multivariées). Chaque observation est un vecteur numérique à dimensions. Dans le modèle RNN, nous supposons que la prochaine observation est fonction de l'observation précédente ainsi que du précédent "état caché" , où les états cachés sont également représentés par des nombres vecteurs (les dimensions des états observés et cachés peuvent être différentes). Les états cachés eux-mêmes sont également supposés dépendre de l'observation précédente et de l'état caché:o1,o2,,onoiNoi+1oihi

oi,hi=F(oi1,hi1)

Enfin, dans le modèle RNN, la fonction est supposée être un réseau neuronal. Nous formons (ajustons) le réseau neuronal en utilisant les données disponibles (une séquence d'observations). Notre objectif dans la formation est de pouvoir prédire la prochaine observation aussi précisément que possible en utilisant les observations précédentes.F

Maintenant, le réseau LSTM est une modification du réseau RNN. D'après ce que j'ai compris, la motivation derrière LSTM est de résoudre le problème de la mémoire courte qui est propre aux RNN (les RNN conventionnels ont des problèmes à relier des événements trop éloignés dans le temps).

Je comprends le fonctionnement des réseaux LSTM. Voici la meilleure explication de LSTM que j'ai trouvée. L'idée basique est la suivante:

En plus du vecteur d'état caché, nous introduisons un vecteur dit "d'état de cellule" qui a la même taille (dimensionnalité) que le vecteur d'état caché ( ). Je pense que le vecteur "état cellulaire" est introduit pour modéliser la mémoire à long terme. Comme dans le cas des RNN conventionnels, le réseau LSTM obtient l'état observé et caché en entrée. En utilisant cette entrée, nous calculons un nouvel "état de cellule" de la manière suivante:ci

ci+1=ω1(oi,hi)ci+ω2(oi,hi)cint(oi,hi),

où les fonctions de , et sont modélisées par des réseaux de neurones. Pour rendre l'expression plus simple, je supprime simplement les arguments:ω1ω2cint

ci+1=ω1ci+ω2cint

Ainsi, nous pouvons voir que le nouveau "vecteur d'état de cellule" ( ) est une somme pondérée de l'ancien vecteur d'état ( ) et un vecteur d'état de cellule "intermédiaire" ( ). La multiplication entre les vecteurs est composante (nous multiplions deux vecteurs N dimensionnels et obtenons, par conséquent, un autre vecteur N dimensionnel). En d'autres termes, nous mélangeons deux vecteurs d'états de cellule (l'ancien et intermédiaire) en utilisant des poids spécifiques aux composants.cici1cint

Voici l'intuition entre les opérations décrites. Le vecteur d'état de cellule peut être interprété comme un vecteur mémoire. Le deuxième vecteur de poids (calculé par un réseau de neurones) est une porte "garder" (ou oublier). Ses valeurs décident si nous gardons ou oublions (effaçons) une valeur correspondante du vecteur d'état de cellule (ou vecteur de mémoire à long terme). Le premier vecteur de poids ( ), qui est calculé par un autre réseau de neurones, est appelé porte "écrire" ou "mémoriser". Il décide si une nouvelle mémoire (le vecteur d'état de cellule "intermédiaire") doit être sauvegardée (ou plus précisément, si un composant particulier doit être sauvegardé / écrit). "Intermédiaire"ω2ω1ω1vecteur). En fait, il serait plus juste de dire qu'avec les deux vecteurs de poids ( et ) nous "mélangeons" l'ancienne et la nouvelle mémoire.ω1ω2

Ainsi, après le mélange (ou l'oubli et la mémorisation) décrit ci-dessus, nous avons un nouveau vecteur d'état cellulaire. Ensuite, nous calculons un état caché "intermédiaire" en utilisant un autre réseau de neurones (comme précédemment, nous utilisons en état observé et l'état caché ). Enfin, nous combinons le nouvel état de cellule (mémoire) avec l'état caché "intermédiaire" ( ) pour obtenir le nouvel état caché (ou "final") que nous émettons réellement:oihihint

hi+1=hintS(ci+1),

où est une fonction sigmoïde appliquée à chaque composante du vecteur d'état de cellule.S

Donc, ma question est: pourquoi (ou comment exactement) cette architecture résout-elle le problème?

En particulier, je ne comprends pas ce qui suit:

  1. Nous utilisons un réseau de neurones pour générer une mémoire "intermédiaire" (vecteur d'état cellulaire) qui est mélangée à la "vieille" mémoire (ou état cellulaire) pour obtenir une "nouvelle" mémoire (état cellulaire). Les facteurs de pondération pour le mélange sont également calculés par les réseaux de neurones. Mais pourquoi ne pouvons-nous pas utiliser un seul réseau neuronal pour calculer le "nouvel" état cellulaire (ou mémoire). Ou, en d'autres termes, pourquoi ne pouvons-nous pas utiliser l'état observé, l'état caché et l'ancienne mémoire comme entrées dans un réseau neuronal qui calcule la "nouvelle" mémoire?
  2. En fin de compte, nous utilisons les états observés et masqués pour calculer un nouvel état masqué, puis nous utilisons le «nouvel» état de cellule (ou la mémoire (à long terme)) pour corriger la composante du nouvel état masqué calculé. En d'autres termes, les composants de l'état de cellule sont utilisés comme des poids qui réduisent simplement les composants correspondants de l'état caché calculé. Mais pourquoi le vecteur d'état cellulaire est-il utilisé de cette manière particulière? Pourquoi ne pouvons-nous pas calculer le nouvel état caché en mettant le vecteur d'état cellulaire (mémoire à long terme) à l'entrée d'un réseau neuronal (qui prend également les états observés et cachés comme entrée)?

Ajoutée:

Voici une vidéo qui pourrait aider à clarifier l'organisation des différentes portes ("garder", "écrire" et "lire").

romain
la source
1
Vous semblez mieux comprendre les LSTM que moi, donc je ne posterai pas de réponse réelle, car ce n'est peut-être pas ce que vous cherchez: les portes LSTM (principalement les portes oublier) lui permettent de garder les activations et les gradients aussi longtemps le cas échéant. Ainsi l'information au temps t peut être maintenue disponible jusqu'au temps t + n, pour n arbitrairement grand.
rcpinto
@rcpinto, je pense aussi que l'idée principale derrière "l'architecture" proposée est de permettre de conserver les informations pendant longtemps (plusieurs pas de temps). Mais je ne comprends pas ce qui le rend exactement possible. Les deux réseaux de portes ("garder" et "écrire") pourraient apprendre que les poids de maintien doivent être grands et les poids d'écriture doivent être petits (alors nous gardons la mémoire pendant longtemps). Mais cela ne peut-il pas être réalisé par un seul réseau? Un réseau de neurones (qui prend un état caché (mémoire) et un état observable en entrée) ne peut-il pas apprendre que l'état caché doit être conservé sans changement?
Roman
En effet, il suffit de définir la matrice de poids récurrente sur l'identité et elle gardera toujours la dernière activation. Le problème est la partie toujours , ce qui signifie que de nouvelles entrées s'accumuleront et satureront rapidement l'activation des neurones, ce qui est aussi une sorte d'oubli. Ainsi, la capacité d'effacer une mémoire précédente ou de bloquer la formation de nouveaux souvenirs est cruciale.
rcpinto
@rcpinto, mais la "capacité d'effacer une mémoire précédente ou de bloquer la formation d'une nouvelle" ne peut-elle pas être atteinte au sein d'un seul réseau neuronal? Le réseau neuronal obtient le vecteur mémoire (ou un vecteur d'état caché) et le vecteur d'état observé en entrée. Un tel réseau ne peut-il pas "décider" de conserver ou de remplacer certains composants de l'état caché (sa mémoire) en fonction des valeurs des composants dans le vecteur d'état observé?
Roman
Les LSTM peuvent le faire parce que les portes s'ouvrent ou se ferment en fonction de l'entrée et de l'état actuels. Il n'y a pas un tel concept dans les RNN simples. Dans ce cas, l'état lui-même réagit toujours directement et immédiatement à l'entrée / l'état, l'empêchant de «choisir» de stocker ou non les nouvelles informations. De plus, il n'y a pas de mécanisme pour effacer une mémoire stockée, elle s'accumulera toujours en fonction des poids d'entrée vers le neurone, et ces poids ne peuvent pas changer après l'entraînement. Étant donné que les portes LSTM sont multiplicatives, elles simulent le changement de poids pendant l'inférence, réagissant à l'entrée / à l'état actuel.
rcpinto

Réponses:

1

Si je comprends bien vos questions, ce que vous imaginez est essentiellement de concaténer l'entrée, l'état caché précédent et l'état de cellule précédent, et de les passer à travers une ou plusieurs couches entièrement connectées pour calculer l'état caché de sortie et l'état de cellule, au lieu de calculer indépendamment "gated "mises à jour qui interagissent arithmétiquement avec l'état de la cellule. Cela créerait essentiellement un RNN régulier qui ne produirait qu'une partie de l'état caché.

La principale raison de ne pas le faire est que la structure des calculs d'état de cellule du LSTM garantit un flux d'erreur constant sur de longues séquences . Si vous avez utilisé des poids pour calculer directement l'état de la cellule, vous devez les propager à chaque étape! Éviter de telles opérations résout en grande partie la disparition / l'explosion des gradients qui affligent autrement les RNN.

De plus, la possibilité de conserver facilement des informations sur des périodes plus longues est un bon bonus. Intuitivement, il serait beaucoup plus difficile pour le réseau d'apprendre à partir de zéro pour préserver l'état des cellules sur des périodes plus longues.

Il convient de noter que l'alternative la plus courante à LSTM, le GRU , calcule de manière similaire les mises à jour des états masqués sans apprendre les pondérations qui opèrent directement sur l'état masqué lui-même.

Gianni
la source
0

Si j'ai bien compris, vos deux questions se résument à ceci. Deux endroits où nous utilisons à la fois tanh et sigmoïde pour traiter les informations. Au lieu de cela, nous devrions utiliser un seul réseau de neurones qui recueille toutes les informations.

Je ne connais pas les inconvénients de l'utilisation d'un seul réseau neuronal. À mon avis, nous pouvons utiliser un réseau neuronal unique avec une non-linéarité sigmoïde qui apprend correctement le vecteur qui sera utilisé de manière appropriée (ajouté à l'état cellulaire dans le premier cas ou transmis comme état caché dans le second cas).

Cependant, la façon dont nous le faisons maintenant nous divisons la tâche en deux parties, une partie qui utilise la non-linéarité sigmoïde pour apprendre la quantité de données à conserver. L'autre partie qui utilise tanh comme non-linéarité est juste de faire la tâche d'apprendre les informations qui sont importantes.

En termes simples, sigmoid apprend combien économiser et tanh apprend quoi sauvegarder et le casser en deux parties facilitera la formation.

apprenant
la source