Redes Neurais | LSTM

Como lidar com perda de memória com Machine Learning.

Fernando Matsumoto
Turing Talks
8 min readDec 15, 2019

--

Escrito por: Fernando Matsumoto, Guilherme Duarte e Leonardo Murakami.

Imagem por Daniel Herron em Unsplash

Fala, galera! Ansiosos para aprenderem mais sobre as Redes Neurais Recorrentes? Seguindo o último post a respeito do assunto — caso você tenha perdido, basta clicar aqui — , daremos continuidade no estudo das redes neurais com memória. Em particular, hoje conheceremos um dos modelos mais usados de RNNs, as LSTMs.

Introdução

Um dos atrativos das RNNs é a ideia de que elas podem conectar informações anteriores à tarefa atual, como o uso de frames de vídeo anteriores para auxiliar no entendimento do quadro atual. Se as RNNs realmente pudessem fazer isso, elas seriam extremamente úteis. Mas elas podem?

Algumas vezes, nós precisamos apenas olhar para informações recentes para realizar a tarefa desejada. Por exemplo, imagine um modelo que tenta prever a próxima palavra baseada nas anteriores, como a função de autocompletar do Google. Se estamos tentando prever a última palavra na frase “as nuvens estão no céu”, não é necessário nenhum contexto, afinal, é bem óbvio que a última palavra será “céu”. Em tais casos, onde o gap entre a informação relevante e o lugar que ela é requisitada é pequeno, as RNNs podem aprender a usar informações passadas. Repare aqui que o contexto se refere apenas a termos que estão longe do presente, afinal, para a rede prever corretamente a palavra “céu”, precisamos saber que ela está antecedida das palavras “nuvens” e “estão”.

Então temos esses casos onde o contexto não importa, mas também há casos onde ele é importante. Considere tentar prever a última palavra no texto “Eu cresci na Inglaterra… Eu falo fluentemente inglês”. A informação recente sugere que a última palavra é provavelmente um idioma, mas se queremos acertar qual exatamente é, precisamos saber que o sujeito que está falando cresceu na Inglaterra. Agora reparem nas reticências colocadas entre as duas partes do texto. É possível que elas representem um texto pequeno, mas também é possível que elas estejam escondendo um texto gigante. Ou seja, o gap entre a informação relevante e o ponto onde ela é requisitada pode se tornar bem grande.

Infelizmente, conforme esse gap aumenta de tamanho, as RNNs comuns se tornam incapazes de aprender a conectar as informações. O que acontece na verdade é que elas sofrem do chamado vanish gradient problem.

O gradiente é o valor usado para atualizar os pesos de uma rede neural. O vanishing gradient problem ocorre quando o gradiente desaparece conforme ocorre o backpropagation through time. Se o valor de um gradiente se torna pequeno, ele não contribui muito para o aprendizado. Então em RNNs, as camadas que recebem esse gradiente não aprendem. Geralmente essas são as primeiras camadas. É isso que leva ao “esquecimento” das informações mais antigas.

Caso você queira saber mais sobre o vanish gradient problem, basta dar uma olhada nesse post.

Felizmente, as LSTMs não têm esse problema!

As redes Long Short-Term Memory (memória de curto e longo prazo), usualmente chamadas simplesmente de “LSTMs”, são um tipo especial de rede neural recorrente, pois são capazes de aprender conexões de longo prazo. Dessa maneira, elas têm um incrível poder de predição e funcionam muito bem em uma variada gama de problemas, sendo amplamente usadas atualmente.

A arquitetura de uma LSTM, que veremos mais à frente, faz todo sentido do ponto de vista biológico. Como já sabemos, há diversas analogias entre as redes neurais biológicas e as redes neurais artificiais. Quando olhamos para o modo como o cérebro humano funciona, descobrimos que a nossa memória pode ser dividida em dois tipos:

  • memória de curto prazo, que atua no momento em que a informação está sendo adquirida, retém essa informação por alguns segundos e, então, a destina para ser guardada por períodos mais longos, ou a descarta.
  • memória de longo prazo, que retém de forma definitiva a informação, permitindo sua recuperação ou evocação. Nela estão contidos todos os nossos dados autobiográficos e todo nosso conhecimento. Sua capacidade é praticamente ilimitada.

Intuitivamente, é assim que as LSTMs funcionam. Por uma célula desse tipo de rede, existem dois canais, que podem ser interpretados da mesma maneira como interpretamos a memória humana!

As Redes LSTM

Para entender o funcionamento das redes LSTM, vamos rever brevemente as camadas recorrentes básicas:

Imagem retirada do post anterior, sobre RNNs.

Nesse diagrama, cada célula recorrente (os retângulos verdes) recebe um input x e o estado do instante anterior e gera um output o. Uma forma de explicitar como essa transformação do input para o output é feita, é dada no diagrama abaixo:

Esse diagrama mostra uma única camada convolucional ao longo do tempo. Observe que o input x é combinado com o estado anterior h(t-1) e passado à função de ativação tanh, gerando uma saída h(t). Os pesos U e V ficam implícitos na função de ativação. Esse novo tipo de diagrama será muito útil para o entendimento de redes mais complexas, como a LSTM.

No caso da RNN, a única informação passada de um instante de tempo para o próximo é a saída h, também chamada de hidden state. Essa saída corresponde a uma memória de curto prazo, devido ao vanishing gradient. Para a LSTM, como já vimos, é necessária a adição de uma memória de longo prazo. O principal trabalho se torna entender como uma memória deve influenciar a outra, ou seja, como a rede decide quais partes da memória de curto prazo devem ser lembradas e como a memória de longo prazo deve afetar o entendimento atual do texto.

Para isso, serão utilizadas gates (ou portas) que controlam a passagem de informações entre os dois canais. O componente básico dessas gates é a seguinte estrutura:

Essa estrutura aplica uma função sigmóide ao input b e multiplica o resultado pelo sinal a da linha horizontal. Como a saída da função sigmóide é um número entre 0 e 1, essa estrutura controla qual porcentagem de cada valor deve passar pela porta.

Na LSTM, temos 3 gates. Em ordem, são elas:

  1. a forget gate, que decide quais partes do cell state continuam importantes;
  2. a remember gate, que decide quais informações da memória de curto prazo devem ser adicionadas ao cell state; e
  3. a output gate, que decide quais partes do cell state são importantes no instante atual para gerar o output.

Por exemplo, suponha que o algoritmo queira prever a próxima palavra do texto e se depare com o seguinte trecho: “[…] Eu falo inglês e o meu amigo, ???”. Ao chegar na palavra amigo, esses passos se traduzirão em:
1. esquecer o sujeito “eu” (forget gate);
2. lembrar do sujeito “meu amigo” (input gate); e
3. utilizar o cell state para lembrar qual idioma o meu amigo fala (output gate).

Passados esses preliminares, vamos agora ver o esquema completo de uma rede LSTM:

Parece bem mais complicado que o da RNN, mas vamos ver que pensando em termos de gates o comportamento dessa rede não é tão difícil de entender. Primeiramente, observe que há duas linhas principais. A de cima, em laranja é chamada de célula de memória, pois armazena o cell state (a memória de longo prazo). A de baixo, correspondente à memória de curto prazo, contém a entrada e o hidden state (a saída no instante anterior). Entre essas linhas, estão localizadas as 3 gates que controlam a passagem de informação.

A forget gate, que determina quais partes do cell state são importantes e quais devem ser esquecidas. Conforme a figura abaixo, os vetores h e x são passados por uma função sigmóide (novamente, com uma matriz de pesos Wf implícita), dando um vetor f que é multiplicado pelo cell state.

Forget gate (a multiplicação entre f e C é feita ponto-a-ponto).

Em seguida, determina-se quais novas informações da memória de curto prazo devem ser colocadas no cell state, por meio da input gate. Para isso, são realizados o cálculo de:

  1. um vetor de ativações C+, que contém as novas informações; e
  2. um vetor i que determina o quão importante cada informação é.
Input gate (a multiplicação entre i e C é feita ponto-a-ponto).

O último passo é utilizar o cell state para calcular a saída h da rede. Para isso, primeiramente, passa-se o estado C por uma função de ativação tanh. Em seguida, a memória de curto prazo é utilizada para determinar quais partes dessa saída são realmente relevantes nesse instante (output gate).

Input gate (a multiplicação entre o e tanh(C) é feita ponto-a-ponto).

No caso da RNN, o vanishing gradient ocorre por causa da função de ativação. Como na célula de memória não é aplicada nenhuma função de ativação (as funções são aplicadas só nas gates), não temos esse problema.

Existem diversas variantes do modelo de LSTM descrito neste post. Algumas delas podem ser encontradas nesse post, que foi uma das inspirações para a explicação acima.

Exemplos de aplicação de uma LSTM

Geração de Texto

As redes neurais baseadas em células de memória podem ser utilizadas para produzir textos, onde cada letra ou palavra gerada utiliza-se da memória de todos as outras geradas até então.

O modelo utiliza as palavras iniciais para predizer a próxima com base na probabilidade dela ocorrer.

Reconhecimento de Escrita

As camadas de memória possibilitam o reconhecimento de escrita, seja juntamente às camadas convolucionais ou de maneira independente. Os pixels são passados da direita para a esquerda (caso seja o sentido da linguagem desejada) em batches. Com o passar do tempo, as células emitem as probabilidades, como no exemplo abaixo:

Em baixo, temos a probabilidade de acontecimento de cada letra, onde blank é a não ocorrência de nenhuma letra naquele tempo.

Caso você tenha se interessado por essa aplicação, recomendamos esse link.

Composição Musical

Assim como textos são sequências de caracteres, músicas são sequências ordenadas de notas e sons. De tal modo, uma LSTM pode levar em conta as últimas notas tocadas para gerar a próxima.

Predição de Séries Temporais

As redes com células LSTM são capazes de produzir resultados significativos no campo de séries temporais, seja para produzir predições do preço de ações, ou para identificar sazonalidade. Essas redes possuem um menor índice de erro que redes neurais recorrentes básicas, por exemplo.

Conclusão

Sabemos que o caminho até aqui foi árduo e, muito provavelmente, seja necessária mais de uma leitura a respeito deste e do post anterior. Porém, não se preocupem. Todo esse esforço será recompensado em nossa 3ª parte, onde, finalmente, colocaremos as mãos na massa e iremos implementar nossa primeira RNN/LSTM, juntos, treinando e testando-a com o TensorFlow 2.0.

Gostou desse texto? Então não deixe de mostrar seu suporte curtindo e compartilhando esse texto com as pessoas que você adora! Aproveite também para conferir nossos outros conteúdos no Facebook, LinkedIn e Instagram, para se aproximar da nossa comunidade, o Grupo Turing, e ficar sempre antenado com o que há de melhor em inteligência artificial.

--

--