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é:
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.
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:
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:
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.
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"vecteur). 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.
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:
où est une fonction sigmoïde appliquée à chaque composante du vecteur d'état de cellule.
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:
- 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?
- 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").
Réponses:
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.
la source
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.
la source