Gran pregunta!
tl; dr: El estado de la celda y el estado oculto son dos cosas diferentes, pero el estado oculto depende del estado de la celda y, de hecho, tienen el mismo tamaño.
Explicación más larga
La diferencia entre los dos se puede ver en el siguiente diagrama (parte del mismo blog):
El estado de la celda es la línea en negrita que viaja de oeste a este a través de la parte superior. Todo el bloque verde se llama 'celda'.
El estado oculto del paso de tiempo anterior se trata como parte de la entrada en el paso de tiempo actual.
Sin embargo, es un poco más difícil ver la dependencia entre los dos sin hacer un recorrido completo. Lo haré aquí, para proporcionar otra perspectiva, pero fuertemente influenciada por el blog. Mi notación será la misma y utilizaré imágenes del blog en mi explicación.
Me gusta pensar en el orden de las operaciones un poco diferente de la forma en que se presentaron en el blog. Personalmente, como comenzar desde la puerta de entrada. Presentaré ese punto de vista a continuación, pero tenga en cuenta que el blog puede ser la mejor manera de configurar un LSTM computacionalmente y esta explicación es puramente conceptual.
Esto es lo que está sucediendo:
La puerta de entrada
txtht−1
xt=[1,2,3]ht=[4,5,6]
xtht−1[1,2,3,4,5,6]
WiWi⋅[xt,ht−1]+biWibi
Supongamos que estamos pasando de una entrada de seis dimensiones (la longitud del vector de entrada concatenado) a una decisión tridimensional sobre qué estados actualizar. Eso significa que necesitamos una matriz de peso de 3x6 y un vector de sesgo de 3x1. Vamos a darles algunos valores:
Wi=⎡⎣⎢123123123123123123⎤⎦⎥
bi=⎡⎣⎢111⎤⎦⎥
El cálculo sería:
⎡⎣⎢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 inglés, eso significa que vamos a actualizar todos nuestros estados.
La puerta de entrada tiene una segunda parte:
Ct~=tanh(WC[xt,ht−1]+bC)
El objetivo de esta parte es calcular cómo actualizaríamos el estado, si tuviéramos que hacerlo. Es la contribución de la nueva entrada en este paso de tiempo al estado de la celda. El cálculo sigue el mismo procedimiento ilustrado anteriormente, pero con una unidad de tanh en lugar de una unidad sigmoidea.
Ct~it
itCt~
Luego viene la puerta de olvidar, que fue el quid de tu pregunta.
La puerta de olvidar
El propósito de la puerta de olvido es eliminar la información previamente aprendida que ya no es relevante. El ejemplo dado en el blog está basado en el idioma, pero también podemos pensar en una ventana deslizante. Si está modelando una serie temporal que está naturalmente representada por números enteros, como los recuentos de individuos infecciosos en un área durante un brote de enfermedad, entonces tal vez una vez que la enfermedad haya desaparecido en un área, ya no quiera molestarse en considerar esa área cuando pensando en cómo viajará la enfermedad a continuación.
Al igual que la capa de entrada, la capa de olvido toma el estado oculto del paso de tiempo anterior y la nueva entrada del paso de tiempo actual y los concatena. El punto es decidir estocásticamente qué olvidar y qué recordar. En el cálculo anterior, mostré una salida de capa sigmoidea de todos los 1, pero en realidad estaba más cerca de 0.999 y redondeé hacia arriba.
El cálculo se parece mucho a lo que hicimos en la capa de entrada:
ft=σ(Wf[xt,ht−1]+bf)
Esto nos dará un vector de tamaño 3 con valores entre 0 y 1. Supongamos que nos dio:
[0.5,0.8,0.9]
Luego decidimos estocásticamente, en base a estos valores, cuál de esas tres partes de la información olvidamos. Una forma de hacerlo es generar un número a partir de una distribución uniforme (0, 1) y si ese número es menor que la probabilidad de que la unidad se 'encienda' (0.5, 0.8 y 0.9 para las unidades 1, 2 y 3 respectivamente), luego activamos esa unidad. En este caso, eso significaría que olvidamos esa información.
Nota rápida: la capa de entrada y la capa de olvidar son independientes. Si fuera una persona de apuestas, apostaría que es un buen lugar para la paralelización.
Actualizar el estado de la celda
Ahora tenemos todo lo que necesitamos para actualizar el estado de la celda. Tomamos una combinación de la información de la entrada y las puertas de olvido:
Ct=ft∘Ct−1+it∘Ct~
∘
Aparte: producto Hadamard
x1=[1,2,3]x2=[3,2,1]
x1∘x2=[(1⋅3),(2⋅2),(3⋅1)]=[3,4,3]
Fin a un lado.
De esta manera, combinamos lo que queremos agregar al estado de la celda (entrada) con lo que queremos quitar del estado de la celda (olvidar). El resultado es el nuevo estado de la celda.
La puerta de salida
Esto nos dará el nuevo estado oculto. Esencialmente, el objetivo de la puerta de salida es decidir qué información queremos que la siguiente parte del modelo tenga en cuenta al actualizar el estado de la celda posterior. El ejemplo en el blog es nuevamente lenguaje: si el sustantivo es plural, la conjugación verbal en el siguiente paso cambiará. En un modelo de enfermedad, si la susceptibilidad de los individuos en un área particular es diferente a la de otra área, entonces la probabilidad de contraer una infección puede cambiar.
La capa de salida toma la misma entrada nuevamente, pero luego considera el estado actualizado de la celda:
ot=σ(Wo[xt,ht−1]+bo)
Nuevamente, esto nos da un vector de probabilidades. Luego calculamos:
ht=ot∘tanh(Ct)
Por lo tanto, el estado actual de la celda y la puerta de salida deben acordar qué salida.
tanh(Ct)[0,1,1]ot[0,0,1][0,0,1]
htyt=σ(W⋅ht)
ht
Hay muchas variantes en LSTM, ¡pero eso cubre lo esencial!