Ótima pergunta!
tl; dr: O estado da célula e o estado oculto são duas coisas diferentes, mas o estado oculto depende do estado da célula e eles realmente têm o mesmo tamanho.
Explicação mais longa
A diferença entre os dois pode ser vista no diagrama abaixo (parte do mesmo blog):
O estado da célula é a linha em negrito que viaja de oeste para leste através do topo. Todo o bloco verde é chamado de 'célula'.
O estado oculto da etapa anterior é tratado como parte da entrada na etapa atual.
No entanto, é um pouco mais difícil ver a dependência entre os dois sem fazer uma explicação completa. Farei isso aqui, para fornecer outra perspectiva, mas fortemente influenciada pelo blog. Minha anotação será a mesma e usarei imagens do blog na minha explicação.
Eu gosto de pensar na ordem das operações um pouco diferente da maneira como elas foram apresentadas no blog. Pessoalmente, como começar pelo portão de entrada. Apresentarei esse ponto de vista abaixo, mas lembre-se de que o blog pode muito bem ser a melhor maneira de configurar um LSTM computacionalmente e essa explicação é puramente conceitual.
Aqui está o que está acontecendo:
O portão de entrada
txtht - 1
xt= [ 1 , 2 , 3 ]ht= [ 4 , 5 , 6 ] , a porta de entrada fará o seguinte:
xtht - 1[ 1 , 2 , 3 , 4 , 5 , 6 ]
WEuWEu⋅ [ Xt, ht - 1] + bEuWEubEu
Vamos supor que estamos passando de uma entrada tridimensional (o comprimento do vetor de entrada concatenada) para uma decisão tridimensional sobre o que estados atualizar. Isso significa que precisamos de uma matriz de peso 3x6 e um vetor de viés 3x1. Vamos dar alguns desses valores:
WEu= ⎡⎣⎢123123123123123123⎤⎦⎥
bEu= ⎡⎣⎢111⎤⎦⎥
O cálculo seria:
⎡⎣⎢123123123123123123⎤⎦⎥⋅ ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢123456⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥+ ⎡⎣⎢111⎤⎦⎥= ⎡⎣⎢2242.62⎤⎦⎥
c) Alimente esse cálculo anterior com uma não linearidade: Eut= σ( WEu⋅ [ Xt, ht - 1] + bEu)
σ( x ) = 11 + e x p ( - x ) (aplicamos este elemento aos valores no vetor x)
σ( ⎡⎣⎢2242.62⎤⎦⎥) = [ 11 + e x p ( - 22 ), 11 + e x p ( - 42 ), 11 + e x p ( - 62 )] = [ 1 , 1 , 1 ]
Em inglês, isso significa que vamos atualizar todos os nossos estados.
O portão de entrada tem uma segunda parte:
d) Ct~= t a n h ( WC[ xt, ht - 1] + bC)
O objetivo desta parte é calcular como atualizaríamos o estado, se o fizéssemos. É a contribuição da nova entrada neste momento para o estado da célula. O cálculo segue o mesmo procedimento ilustrado acima, mas com uma unidade tanh em vez de uma unidade sigmóide.
A saída Ct~ é multiplicado por esse vetor binário Eut, mas abordaremos isso quando chegarmos à atualização da célula.
Juntos, Eut nos diz quais estados queremos atualizar e Ct~nos diz como queremos atualizá-los. Ele nos diz que novas informações queremos adicionar à nossa representação até agora.
Então vem o portão de esquecer, que foi o cerne da sua pergunta.
O portão de esquecer
O objetivo do portal de esquecer é remover as informações aprendidas anteriormente que não são mais relevantes. O exemplo dado no blog é baseado em linguagem, mas também podemos pensar em uma janela deslizante. Se você estiver modelando uma série temporal que é naturalmente representada por números inteiros, como contagens de indivíduos infecciosos em uma área durante um surto de doença, talvez uma vez que a doença tenha desaparecido em uma área, não será mais necessário considerar a área quando pensando em como a doença viajará a seguir.
Assim como a camada de entrada, a camada de esquecer pega o estado oculto da etapa de tempo anterior e a nova entrada da etapa de tempo atual e as concatena. O objetivo é decidir estocisticamente o que esquecer e o que lembrar. No cálculo anterior, eu mostrei uma saída da camada sigmóide de todos os 1s, mas, na realidade, estava mais perto de 0,999 e eu arredondei.
A computação se parece muito com o que fizemos na camada de entrada:
ft= σ( Wf[ xt, ht - 1] + bf)
Isso nos dará um vetor de tamanho 3 com valores entre 0 e 1. Vamos fingir que ele nos deu:
[ 0,5 , 0,8 , 0,9 ]
Então, decidimos estocástica com base nesses valores qual dessas três partes da informação esquecer. Uma maneira de fazer isso é gerar um número a partir de uma distribuição uniforme (0, 1) e se esse número for menor que a probabilidade da unidade 'ligar' (0,5, 0,8 e 0,9 para as unidades 1, 2 e 3 respectivamente), então ligamos essa unidade. Nesse caso, isso significa que esquecemos essa informação.
Nota rápida: a camada de entrada e a camada de esquecimento são independentes. Se eu fosse uma pessoa de apostas, aposto que é um bom lugar para a paralelização.
Atualizando o estado da célula
Agora, temos tudo o que precisamos para atualizar o estado da célula. Tomamos uma combinação das informações da entrada e dos portões de esquecimento:
Ct= ft∘ Ct - 1+ it∘ Ct~
Agora, isso vai ser um pouco estranho. Em vez de multiplicar como fizemos antes, aqui∘ indica o produto Hadamard, que é um produto básico.
Aparte: produto Hadamard
Por exemplo, se tivéssemos dois vetores x1= [ 1 , 2 , 3 ] e x2= [ 3 , 2 , 1 ] e queríamos usar o produto Hadamard, faríamos o seguinte:
x1∘ x2= [ ( 1 ⋅ 3 ) , ( 2 ⋅ 2 ) , ( 3 ⋅ 1 ) ] = [ 3 , 4 , 3 ]
Fim à parte.
Dessa maneira, combinamos o que queremos adicionar ao estado da célula (entrada) com o que queremos remover do estado da célula (esqueça). O resultado é o novo estado da célula.
O portão de saída
Isso nos dará o novo estado oculto. Essencialmente, o objetivo da porta de saída é decidir quais informações queremos que a próxima parte do modelo leve em consideração ao atualizar o estado subsequente da célula. O exemplo no blog é novamente, idioma: se o substantivo for plural, a conjugação de verbos na próxima etapa será alterada. Em um modelo de doença, se a suscetibilidade de indivíduos em uma área específica for diferente da de outra área, a probabilidade de adquirir uma infecção pode mudar.
A camada de saída recebe a mesma entrada novamente, mas considera o estado atualizado da célula:
ot= σ( Wo[ xt, ht - 1] + bo)
Novamente, isso nos dá um vetor de probabilidades. Então calculamos:
ht= otA t a n h ( Ct)
Portanto, o estado atual da célula e a porta de saída devem concordar com o que produzir.
Ou seja, se o resultado de t a n h ( Ct) é [ 0 , 1 , 1 ] após a tomada da decisão estocástica sobre se cada unidade está ligada ou desligada, e o resultado de ot é [ 0 , 0 , 1 ], quando pegarmos o produto Hadamard, obteremos [ 0 , 0 , 1 ], e apenas as unidades ativadas pela porta de saída e no estado da célula farão parte da saída final.
[EDIT: Há um comentário no blog que diz o ht é transformado novamente em uma saída real por yt= σ( W⋅ ht), o que significa que a saída real da tela (supondo que você tenha alguma) é o resultado de outra transformação não linear.]
O diagrama mostra que htvai para dois lugares: a próxima célula e a 'saída' - para a tela. Eu acho que a segunda parte é opcional.
Existem muitas variantes nos LSTMs, mas isso abrange o essencial!