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.
Respostas:
Pelo que entendi, o que você imagina é basicamente concatenar a entrada, o estado oculto anterior e o estado anterior da célula e passá-los por uma ou várias camadas totalmente conectadas para calcular o estado oculto da saída e o estado da célula, em vez de calcular independentemente "fechado" "atualizações que interagem aritmeticamente com o estado da célula. Isso basicamente criaria uma RNN regular que produzia apenas parte do estado oculto.
A principal razão para não fazer isso é que a estrutura dos cálculos do estado celular do LSTM garante fluxo constante de erros através de longas sequências . Se você usou pesos para calcular diretamente o estado da célula, seria necessário retropropagá-los a cada passo! Evitar essas operações resolve em grande parte gradientes de fuga / explosão que, de outra forma, afetam os RNNs.
Além disso, a capacidade de reter informações facilmente em períodos mais longos é um bônus interessante. Intuitivamente, seria muito mais difícil para a rede aprender do zero para preservar o estado da célula em períodos mais longos.
Vale notar que a alternativa mais comum ao LSTM, o GRU , calcula similarmente as atualizações de estado oculto sem aprender pesos que operam diretamente no próprio estado oculto.
fonte
Se entendi corretamente, as duas perguntas se resumem a isso. Dois lugares em que usamos tanh e sigmoid para processar as informações. Em vez disso, devemos usar uma única rede neural que capte todas as informações.
Não conheço as desvantagens de usar uma única rede neural. Na minha opinião, podemos usar uma única rede neural com não linearidade sigmóide que aprende corretamente o vetor que será usado adequadamente (adicionado no estado da célula no primeiro caso ou passado como estado oculto no segundo caso).
No entanto, da maneira como estamos fazendo isso agora, estamos dividindo a tarefa em duas partes, uma parte que usa a não linearidade sigmóide para aprender a quantidade de dados a serem mantidos. A outra parte que usa tanh como não linearidade está apenas realizando a tarefa de aprender as informações importantes.
Em termos simples, o sigmoid aprende quanto economizar e tanh aprende o que salvar e quebrá-lo em duas partes facilitará o treinamento.
fonte