Redes Neurais Recorrentes e Long Short Term Memory

Prof. Letícia Raposo

UNIRIO

Introdução às Redes Neurais Recorrentes

  • Redes neurais recorrentes (RNR ou RNN — Recurrent Neural Networks) constituem uma classe de modelos projetados para o processamento de dados sequenciais.
  • São adequadas para tarefas em que a ordem dos elementos possui relevância: séries temporais, texto, sinais biológicos, áudio, entre outros.
  • Exemplo de aplicação: predição da próxima palavra em sistemas de autocompletar usados em smartphones.

Motivação

  • Modelos feedforward tradicionais tratam entradas como independentes, limitando sua capacidade de capturar dependências temporais.
  • RNNs introduzem mecanismos de estado interno, que acumulam informações ao longo da sequência.
  • Assim, permitem modelar relações de curto e médio prazo entre elementos consecutivos.

Estado interno em RNNs

  • O estado interno (hidden state) é uma representação numérica que a RNN mantém ao longo do tempo.
  • Ele funciona como uma forma de memória, permitindo que a rede retenha informações relevantes do que já foi processado na sequência.
  • Esse estado é atualizado a cada novo passo temporal.

Como funciona na prática?

  • A cada nova entrada \(x_t\), a rede combina:
    • a informação atual, e
    • o estado interno anterior \(h_{t-1}\).
  • Dessa combinação surge um novo estado \(h_t\), que sintetiza o que a RNN “aprendeu” até aquele momento.
  • Esse processo ocorre repetidamente ao longo de toda a sequência.

Por que o estado interno importa?

  • Permite que a RNN construa contexto a partir do passado.
  • Faz com que a rede consiga relacionar informações ao longo do tempo, em vez de tratar cada entrada isoladamente.
  • Sem esse estado, a RNN não conseguiria capturar dependências temporais nem produzir saídas coerentes em tarefas sequenciais.

Estrutura Fundamental de uma RNN

  • RNNs contêm conexões recorrentes, nas quais a saída do neurônio em um passo temporal retroalimenta sua entrada em passos subsequentes.
  • Essa dependência de estados anteriores cria uma memória dinâmica.

Equações fundamentais de uma RNN

A atualização do estado interno é dada por: \(h_t = \phi(W_{xh} x_t + W_{hh} h_{t-1} + b_h)\)

  • \(x_t\): entrada observada no instante \(t\).
  • \(h_{t-1}\): estado interno anterior, que funciona como a memória da rede.
  • \(W_{xh}\): pesos que transformam a entrada no espaço do estado oculto.
  • \(W_{hh}\): pesos recorrentes responsáveis por integrar o passado ao presente.
  • \(b_h\): termo de viés que ajusta a transformação.
  • \(\phi(\cdot)\): função de ativação (como \(\tanh\) ou ReLU), que introduz não linearidade.

A equação mostra como a RNN combina informação nova (\(x_t\)) com memória acumulada (\(h_{t-1}\)) para formar o novo estado \(h_t\).

Saída da RNN

  • A saída produzida no instante \(t\) é:

\[y_t = W_{hy} h_t + b_y\]

Interpretação:

  • \(h_t\): estado interno atualizado, contendo o contexto da sequência até o instante atual.
  • \(W_{hy}\): pesos que mapeiam o estado interno para o espaço da saída.
  • \(b_y\): termo de viés.

A saída \(y_t\) depende diretamente do estado interno, pois é nele que a rede armazena tudo o que considera relevante para produzir a resposta naquele ponto da sequência.

Resumo intuitivo

  • A primeira equação responde:
    “Como atualizo minha memória combinando o que acabei de ver com o que já lembrava?”

  • A segunda equação responde:
    “Com a memória atualizada, qual deve ser minha saída neste instante?”

Essa combinação permite que a RNN modele dependências temporais e utilize contexto ao longo da sequência.

Desdobramento no Tempo (Unrolling)

  • Uma RNN pode ser vista como várias cópias de um mesmo módulo neural repetidas ao longo da sequência temporal.
  • Esse processo é denominado unrolling e permite o uso de algoritmos de retropropagação através do tempo (Backpropagation Through Time — BPTT).
  • Visualmente, corresponde a uma rede feedforward profunda onde cada camada representa o estado em um instante \(t\).

FNN vs RNN

Combinações de Entrada/Saída

Existem quatro configurações principais:

  1. One-to-one — equivalente a FNN
  2. One-to-many
  3. Many-to-one
  4. Many-to-many

One-to-Many

  • Entrada única, múltiplas saídas

  • Aplicação: image captioning

  • Uma imagem → sequência de palavras

Many-to-One

  • Múltiplas entradas, uma saída
  • Aplicação: classificação de sentimento
  • Sequência variável de palavras → rótulo único

Many-to-Many (tipo 1)

  • Número de entradas = número de saídas
  • Aplicação: rotulagem de quadros em vídeo
  • Cada frame recebe um rótulo correspondente

Many-to-Many (tipo 2)

  • Número de entradas ≠ número de saídas

  • Aplicação: tradução automática

  • n palavras de entrada → m palavras traduzidas

Capacidade de Memória

  • O estado oculto funciona como um mecanismo de armazenamento que retém informações relevantes.
  • A atualização recorrente permite capturar dependências contextuais.
  • Entretanto, essa memória é limitada, e a retenção de dependências longas é problemática nas RNN clássicas.

O problema das dependências de longo prazo

  • Em muitas tarefas, informações recentes são suficientes para determinar a próxima saída de uma sequência.
    • Exemplo: ao prever a palavra final na frase “as nuvens estão no ___”, o contexto imediato já permite inferir “céu”. Em casos assim, as RNNs convencionais conseguem aproveitar adequadamente o histórico recente.

O problema das dependências de longo prazo

  • Entretanto, há situações em que a informação relevante está distante na sequência.
    • Exemplo: no enunciado “Cresci na França… falo ______ fluentemente”, restringir a resposta correta ao idioma francês exige recuperar um elemento contextual apresentado muito antes.
  • À medida que a distância entre o contexto relevante e a predição desejada aumenta, as RNNs tornam-se incapazes de capturar dependências de longo alcance, limitando o desempenho do modelo.

O problema das dependências de longo prazo

As RNNs simples apresentam vulnerabilidade ao fenômeno do desvanecimento do gradiente (vanishing gradient), que dificulta a retenção de informações ao longo de longas sequências temporais.

O problema das dependências de longo prazo

  • Durante o treinamento, o gradiente é retropropagado ao longo de toda a sequência por meio do algoritmo Backpropagation Through Time (BPTT).
  • Em cada passo temporal, o gradiente é multiplicado pelas derivadas das funções de ativação e pelos pesos recorrentes. Quando esses termos são menores que 1, ocorre um decaimento exponencial, produzindo gradientes extremamente pequenos.
  • Esse processo impede que a rede atualize adequadamente os pesos associados a passos temporais distantes, fazendo com que aprenda apenas dependências de curto prazo.
  • Como consequência, as RNNs básicas apresentam desempenho limitado em tarefas que requerem integração de informações remotas no tempo.

O problema das dependências de longo prazo

Para enfrentar essa limitação, foi introduzida a arquitetura Long Short-Term Memory (LSTM), que incorpora mecanismos de controle — os portões — capazes de regular o fluxo de informações, preservar estados internos por longos intervalos e mitigar o desvanecimento do gradiente, tornando possível o aprendizado de dependências de longo prazo.

Long Short-Term Memory

  • As LSTMs são um tipo especial de RNN, capazes de aprender dependências de longo prazo. Elas foram introduzidas por Hochreiter & Schmidhuber (1997).
  • Elas alcançam capacidade de memória de longo prazo com uma nova arquitetura, sendo uma RNN com subestruturas que ajudam a gerenciar a “memória” da RNN.
  • Estas subestruturas são denominadas células de memória, e são fundamentais na solução do problema que a LSTM se propõem a resolver.

Arquitetura da RNN geral

Todas as RNN têm a forma de uma cadeia de módulos repetidos de rede neural. Em RNN padrão, esse módulo de repetição terá uma estrutura muito simples, como uma única camada de tanh.

Arquitetura da LSTM

LSTMs também têm essa estrutura de cadeia, mas o módulo de repetição tem uma estrutura diferente. Em vez de ter uma única camada de rede neural, existem quatro, interagindo de uma forma muito especial.

Notações

  • Cada linha carrega um vetor inteiro, desde a saída de um nó até as entradas de outros.
  • Círculos rosa: operações pontuais, como adição de vetores.
  • Caixas amarelas: camadas de rede neural aprendidas.
  • Linhas mescladas: concatenação.
  • Bifurcação de linhas: denota seu conteúdo sendo copiado e as cópias indo para locais diferentes.

A ideia central por trás das LSTMs

  • A chave para as LSTMs é o estado da célula, a linha horizontal que atravessa a parte superior do diagrama.
  • Ela representa a memória de longo prazo e percorre toda a cadeia.
  • Embora ela possa ser modificada por essa multiplicação e adição, não há pesos e vieses que possam modificá-la diretamente.
  • Essa falta de pesos permite que as memórias de longo prazo fluam através de uma série de unidades sem fazer com que o gradiente exploda ou desapareça.

A ideia central por trás das LSTMs

  • A LSTM tem a capacidade de remover ou adicionar informações ao estado da célula, cuidadosamente regulado por estruturas chamadas gates (portões).
  • Os gates são uma maneira opcional de deixar passar informações. Eles são compostos por uma camada de rede neural sigmóide e uma operação de multiplicação pontual.
    • A camada sigmóide gera números entre zero e um, descrevendo quanto de cada componente deve passar. Um valor 0 significa “não deixe nada passar”, enquanto um valor 1 significa “deixe passar tudo!”.

A ideia central por trás das LSTMs

Uma LSTM tem três gates para proteger e controlar o estado da célula.

A ideia central por trás das LSTMs

  • Forget Gate: decide quanto esquecer (apagar) cada valor no estado da célula.
  • Input Gate: decide quanto atualizar cada valor no estado da célula com os novos valores de entrada;
  • Output Gate: filtra a saída com base no estado da célula;

Passo a passo do LSTM

  • 1o: decidir quais informações vamos descartar do estado da célula.
  • Essa decisão é feita pelo forget gate. Ele olha para \(h_{t-1}\) (memória de curto prazo) e \(x_t\) (entrada) e gera um número entre 0 (“livre-se completamente disso”) e 1 (“manter isto completamente”) para cada número no estado da célula \(C_{t}\).
  • Ou seja, ela determina qual porcentagem da memória de longo prazo será lembrada.

Passo a passo do LSTM

Passo a passo do LSTM

  • 2o: decidir quais novas informações vamos armazenar no estado da célula.
  • Bloco à direita: combina a memória de curto prazo e a entrada para criar uma possível memória de longo prazo.
  • Bloco à esquerda: determina qual % dessa memória potencial deve ser adicionada à memória de longo prazo.
  • Primeiro uma camada sigmóide decide quais valores atualizaremos e, em seguida, uma camada tanh cria um vetor de novos valores candidatos, \(\tilde{C_t}\), que poderiam ser adicionados ao estado.

Passo a passo do LSTM

  • Agora é hora de atualizar o estado da célula antiga, \(C_{t-1}\), para o novo estado de célula \(C_{t}\).
  • Multiplicamos o estado antigo por \(f_{t}\), esquecendo as coisas que decidimos esquecer antes. Então adicionamos \(i_t * \tilde{C_t}\). Esses são os novos valores candidatos, dimensionados por quanto decidimos atualizar cada valor de estado.

Passo a passo do LSTM

Passo a passo do LSTM

  • Este estágio final atualiza a memória de curto prazo. A nova memória de longo prazo gerada na etapa anterior é usada como entrada para a função tanh, gerando uma memória de curto prazo em potencial.
  • Quanto dessa memória será repassada é decidida usando uma função de ativação sigmóide.
  • Essa nova memória de curto prazo é a saída de toda esta unidade LSTM. Esse estágio é chamado de porta de saída.

Passo a passo do LSTM

Forget Gate (O que devo esquecer?)

Texto sendo lido:
> “O céu ficou nublado.”

Quando chega a palavra “nublado”, a LSTM olha para o que estava guardado na memória antes:

  • partes da memória sobre “céu” ainda podem ser úteis → manter parcialmente
  • partes sobre “ficou” não ajudam muito a prever clima → esquecer quase tudo
  • informações muito antigas → descartar

Função do forget gate: Decidir quais pedaços da memória passada continuam sendo úteis.

Intuição: “Vou manter só o que ainda faz sentido para entender ‘nublado’.”

Input Gate (O que devo aprender agora?)

Agora a LSTM decide quanto da nova palavra “nublado” deve entrar na memória.

  1. Sigmóide: “Quanto disso vale a pena guardar?”
  • “nublado” é muito relevante → valores altos (ex.: 0.8–0.9)
  • partes redundantes → valores médios
  • ruídos → valores baixos
  1. Tanh: “Qual é exatamento o conteúdo que posso guardar?” Cria uma representação interna de:
  • “o estado do tempo é nublado”
  • “pode ocorrer chuva depois”

O input gate decide quais partes novas entram na memória de longo prazo.

Atualizar a memória de longo prazo

A LSTM combina:

  • o que foi mantido da memória antiga
  • com o que deve ser adicionado agora

Isso forma a nova memória de longo prazo.

Resultado final da memória após ler “nublado”:

“O contexto atual fala sobre clima, especificamente: está nublado.”

Essa informação é importante porque ajuda a prever palavras posteriores como “chover”, “garoa”, “vento”, etc.

Função desta etapa: Criar a memória mais estável e profunda da LSTM.

Output Gate (O que devo mostrar agora?)

Agora a LSTM decide qual parte da sua memória profunda deve aparecer como saída do passo atual (estado de curto prazo).

  1. Tanh prepara um “resumo utilizável” Transforma a memória de longo prazo em uma versão pronta para uso: “clima nublado → possível chuva”

  2. Sigmóide decide o que é útil: AGORA Como estamos falando de clima, a LSTM deixa passar principalmente:

  • informações sobre condição climática
  • informações sobre continuação meteorológica
  1. Saída final da LSTM: \(h_t\): a saída enfatiza o contexto climático, permitindo prever o que vem a seguir.

Referências

  • Canal do YouTube StatQuest, Josh Starmer (2022): https://www.youtube.com/watch?v=YCzL96nL7j0
  • “Análise de sentimentos com redes neurais recorrentes LSTM”, Luís Gonçalves (2018): https://medium.com/luisfredgs/an%C3%A1lise-de-sentimentos-com-redes-neurais-recorrentes-lstm-a5352b21e6aa.
  • “Long Short-Term Memory”, J. Hochreiter and J. Schmidhuber (1997): https://www.bioinf.jku.at/publications/older/2604.pdf.
  • “Understanding LSTM Networks”, Christopher Olah: http://colah.github.io/posts/2015-08-Understanding-LSTMs/.