Grande question!
tl; dr: L'état de cellule et l'état caché sont deux choses différentes, mais l'état caché dépend de l'état de cellule et ils ont en effet la même taille.
Explication plus longue
La différence entre les deux peut être vue sur le schéma ci-dessous (partie du même blog):
L'état de cellule est la ligne en gras se déplaçant d'ouest en est à travers le sommet. L'ensemble du bloc vert est appelé la «cellule».
L'état masqué du pas de temps précédent est traité comme faisant partie de l'entrée au pas de temps actuel.
Cependant, il est un peu plus difficile de voir la dépendance entre les deux sans effectuer une procédure pas à pas complète. Je vais le faire ici, pour fournir une autre perspective, mais fortement influencée par le blog. Ma notation sera la même et j'utiliserai des images du blog dans mon explication.
J'aime penser à l'ordre des opérations un peu différemment de la façon dont elles ont été présentées dans le blog. Personnellement, comme à partir de la porte d'entrée. Je présenterai ce point de vue ci-dessous, mais veuillez garder à l'esprit que le blog peut très bien être le meilleur moyen de configurer un LSTM par calcul et cette explication est purement conceptuelle.
Voici ce qui se passe:
La porte d'entrée
txtht−1
xt=[1,2,3]ht=[4,5,6]
xtht−1[1,2,3,4,5,6]
WiWi⋅[xt,ht−1]+biWibi
Supposons que nous passions d'une entrée en six dimensions (la longueur du vecteur d'entrée concaténé) à une décision en trois dimensions sur les états à mettre à jour. Cela signifie que nous avons besoin d'une matrice de poids 3x6 et d'un vecteur de biais 3x1. Donnons à ces quelques valeurs:
Wi=⎡⎣⎢123123123123123123⎤⎦⎥
bi=⎡⎣⎢111⎤⎦⎥
Le calcul serait:
⎡⎣⎢123123123123123123⎤⎦⎥⋅⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢123456⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢111⎤⎦⎥=⎡⎣⎢224262⎤⎦⎥
it=σ(Wi⋅[xt,ht−1]+bi)
σ(x)=11+exp(−x)x
σ(⎡⎣⎢224262⎤⎦⎥)=[11+exp(−22),11+exp(−42),11+exp(−62)]=[1,1,1]
En anglais, cela signifie que nous allons mettre à jour tous nos états.
La porte d'entrée comporte une deuxième partie:
Ct~=tanh(WC[xt,ht−1]+bC)
Le but de cette partie est de calculer comment nous pourrions mettre à jour l'état, si nous le faisions. C'est la contribution de la nouvelle entrée à ce pas de temps à l'état de la cellule. Le calcul suit la même procédure illustrée ci-dessus, mais avec une unité tanh au lieu d'une unité sigmoïde.
Ct~it
itCt~
Vient ensuite la porte des oublis, qui était au cœur de votre question.
La porte de l'oubli
Le but de la porte d'oubli est de supprimer les informations apprises précédemment qui ne sont plus pertinentes. L'exemple donné dans le blog est basé sur la langue, mais nous pouvons également penser à une fenêtre coulissante. Si vous modélisez une série chronologique qui est naturellement représentée par des nombres entiers, comme le nombre d'individus infectieux dans une zone lors d'une épidémie, alors peut-être qu'une fois que la maladie s'est éteinte dans une zone, vous ne voulez plus vous soucier de considérer cette zone lorsque penser à la suite de la maladie.
Tout comme la couche d'entrée, la couche oublier prend l'état caché du pas de temps précédent et la nouvelle entrée du pas de temps actuel et les concatène. Il s'agit de décider stochastiquement ce qu'il faut oublier et ce qu'il faut retenir. Dans le calcul précédent, j'ai montré une sortie de couche sigmoïde de tous les 1, mais en réalité, elle était plus proche de 0,999 et j'ai arrondi.
Le calcul ressemble beaucoup à ce que nous avons fait dans la couche d'entrée:
ft=σ(Wf[xt,ht−1]+bf)
Cela nous donnera un vecteur de taille 3 avec des valeurs comprises entre 0 et 1. Imaginons qu'il nous donne:
[0.5,0.8,0.9]
Ensuite, nous décidons stochastiquement en fonction de ces valeurs laquelle de ces trois parties d'informations à oublier. Une façon de le faire est de générer un nombre à partir d'une distribution uniforme (0, 1) et si ce nombre est inférieur à la probabilité que l'unité s'allume (0,5, 0,8 et 0,9 pour les unités 1, 2 et 3). respectivement), puis nous allumons cette unité. Dans ce cas, cela signifierait que nous oublions ces informations.
Remarque rapide: le calque d'entrée et le calque oublier sont indépendants. Si j'étais un parieur, je parierais que c'est un bon endroit pour la parallélisation.
Mise à jour de l'état de la cellule
Nous avons maintenant tout ce dont nous avons besoin pour mettre à jour l'état de la cellule. Nous prenons une combinaison des informations de l'entrée et des portes d'oubli:
Ct=ft∘Ct−1+it∘Ct~
∘
A part: produit Hadamard
x1=[1,2,3]x2=[3,2,1]
x1∘x2=[(1⋅3),(2⋅2),(3⋅1)]=[3,4,3]
Fin à part.
De cette façon, nous combinons ce que nous voulons ajouter à l'état de cellule (entrée) avec ce que nous voulons retirer de l'état de cellule (oublier). Le résultat est le nouvel état de cellule.
La porte de sortie
Cela nous donnera le nouvel état caché. Le point essentiel de la porte de sortie est de décider quelles informations nous voulons que la prochaine partie du modèle prenne en compte lors de la mise à jour de l'état de cellule suivant. L'exemple dans le blog est à nouveau, la langue: si le nom est pluriel, la conjugaison des verbes à l'étape suivante changera. Dans un modèle de maladie, si la sensibilité des individus dans une zone particulière est différente de celle d'une autre zone, la probabilité de contracter une infection peut changer.
La couche de sortie reprend la même entrée, mais considère ensuite l'état de cellule mis à jour:
ot=σ(Wo[xt,ht−1]+bo)
Encore une fois, cela nous donne un vecteur de probabilités. Ensuite, nous calculons:
ht=ot∘tanh(Ct)
Ainsi, l'état actuel de la cellule et la porte de sortie doivent s'accorder sur ce qu'il faut sortir.
tanh(Ct)[0,1,1]ot[0,0,1][0,0,1]
htyt=σ(W⋅ht)
ht
Il existe de nombreuses variantes sur les LSTM, mais cela couvre l'essentiel!