A ideia por trás da Rede Neural Recorrente (RNN) é clara para mim. Entendo da seguinte maneira:
Temos uma sequência de observações ( ) (ou, em outras palavras, séries temporais multivariadas). Cada observação única é um vetor numérico dimensional. No modelo RNN, assumimos que a próxima observação é uma função da observação anterior , bem como do "estado oculto" anterior , onde estados ocultos também são representados por vetores (as dimensões dos estados observados e ocultos podem ser diferentes). Também se supõe que os próprios estados ocultos dependam da observação anterior e do estado oculto:
Finalmente, no modelo RNN, a função é assumida como uma rede neural. Nós treinamos (ajustamos) a rede neural usando os dados disponíveis (uma sequência de observações). Nosso objetivo no treinamento é poder prever a próxima observação com a maior precisão possível, usando as observações anteriores.
Agora, a rede LSTM é uma modificação da rede RNN. Até onde eu entendi, a motivação por trás do LSTM é resolver o problema de memória curta que é peculiar à RNN (a RNN convencional tem problemas em relacionar eventos que são separados demais no tempo).
Entendo como as redes LSTM funcionam. Aqui está a melhor explicação do LSTM que eu encontrei. A ideia básica é a seguinte:
Além do vetor de estado oculto, introduzimos um vetor chamado "estado da célula" que tem o mesmo tamanho (dimensionalidade) que o vetor de estado oculto ( ). Eu acho que o vetor "estado da célula" é introduzido para modelar a memória de longo prazo. Como no caso da RNN convencional, a rede LSTM obtém o estado observado e oculto como entrada. Usando essa entrada, calculamos um novo "estado da célula" da seguinte maneira:
onde as funções de , e são modeladas por redes neurais. Para simplificar a expressão, basta remover os argumentos:
Portanto, podemos ver que o novo "vetor de estado da célula" ( ) é uma soma ponderada do vetor de estado antigo ( ) e um vetor de estado da célula "intermediário" ( ). A multiplicação entre os vetores é em termos de componentes (multiplicamos dois vetores dimensionais N e obtemos, como resultado, outro vetor dimensional N). Em outras palavras, misturamos dois vetores de estados celulares (o antigo e o intermediário) usando pesos específicos do componente.
Aqui está a intuição entre as operações descritas. O vetor de estado da célula pode ser interpretado como um vetor de memória. O segundo vetor de pesos (calculado por uma rede neural) é um portão "manter" (ou esquecer). Seus valores decidem se mantemos ou esquecemos (apagamos) um valor correspondente do vetor de estado da célula (ou vetor de memória de longo prazo). O primeiro vetor de pesos ( ), calculado por outra rede neural, é chamado de porta "write" ou "memorize". Ele decide se uma nova memória (o vetor de estado da célula "intermediário") deve ser salva (ou mais precisamente, se um componente específico dela deve ser salvo / gravado). O "intermediário"vetor). Na verdade, seria mais preciso dizer que, com os dois vetores de pesos ( e ), "misturamos" a memória antiga e a nova.
Assim, após a mistura descrita acima (ou esquecimento e memorização), temos um novo vetor de estado celular. Em seguida, calculamos um estado oculto "intermediário" usando outra rede neural (como antes, usamos o estado observado e o estado oculto como entradas). Finalmente, combinamos o novo estado da célula (memória) com o estado oculto "intermediário" ( ) para obter o novo estado oculto (ou "final") que realmente produzimos:
onde é uma função sigmóide aplicada a cada componente do vetor de estado celular.
Então, minha pergunta é: por que (ou exatamente) essa arquitetura resolve o problema?
Em particular, eu não entendo o seguinte:
- Usamos uma rede neural para gerar memória "intermediária" (vetor de estado da célula) que é misturada com a memória "antiga" (ou estado da célula) para obter uma "nova" memória (estado da célula). Os fatores de ponderação para a mistura também são calculados por redes neurais. Mas por que não podemos usar apenas uma rede neural para calcular o "novo" estado da célula (ou memória). Ou, em outras palavras, por que não podemos usar o estado observado, o estado oculto e a memória antiga como entradas para uma rede neural que calcula a "nova" memória?
- No final, usamos os estados observados e ocultos para calcular um novo estado oculto e, em seguida, usamos o "novo" estado da célula (ou memória (de longo prazo)) para corrigir o componente do recém-calculado estado oculto. Em outras palavras, os componentes do estado da célula são usados exatamente como pesos que apenas reduzem os componentes correspondentes do estado oculto calculado. Mas por que o vetor de estado celular é usado dessa maneira específica? Por que não podemos calcular o novo estado oculto colocando o vetor de estado da célula (memória de longo prazo) na entrada de uma rede neural (que também leva os estados observados e ocultos como entrada)?
Adicionado:
Aqui está um vídeo que pode ajudar a esclarecer como diferentes portais ("manter", "escrever" e "ler") são organizados.