# Long short-term memory

A long short-term memory (LSTM), em português: memória de curto longo prazo, é uma rede neural recorrente (RNN), projetada para lidar com o problema do gradiente desvanecente presente em RNNs tradicionais. Sua relativa insensibilidade ao comprimento do intervalo é sua vantagem sobre outras RNNs, modelos ocultos de Markov e outros métodos de aprendizado de sequências. Ela visa fornecer uma memória de curto prazo para RNN que pode durar milhares de passos, daí "curto longo prazo". É aplicável à classificação, processamento e previsão de dados com base em séries temporais, como em caligrafia, reconhecimento de fala, tradução automática, detecção de atividade de fala, controle de robôs, vídeo games, e cuidados de saúde.
Uma unidade LSTM comum é composta por uma célula, uma porta de entrada, uma porta de saída e uma porta de esquecimento. A célula lembra valores ao longo de intervalos de tempo arbitrários, e as três portas regulam o fluxo de informações para dentro e para fora da célula. As portas de esquecimento decidem quais informações descartar do estado anterior, atribuindo ao estado anterior, em comparação com uma entrada atual, um valor entre 0 e 1. Um valor (arredondado) de 1 significa manter a informação, e um valor de 0 significa descartá-la. As portas de entrada decidem quais partes de novas informações armazenar no estado atual, usando o mesmo sistema das portas de esquecimento. As portas de saída controlam quais partes de informações no estado atual produzir, atribuindo um valor de 0 a 1 às informações, considerando os estados anterior e atual. Produzir seletivamente informações relevantes do estado atual permite que a rede LSTM mantenha dependências úteis de longo prazo para fazer previsões, tanto nos passos temporais atuais quanto futuros.

## Motivação

Em teoria, redes neurais recorrentes (também chamadas “vanilla”) RNNs podem acompanhar dependências de longo prazo arbitrariamente nas sequências de entrada. O problema com as RNNs "vanilla" é de natureza computacional (ou prática): ao treinar uma RNN "vanilla" usando retropropagação, os gradientes de longo prazo que são retropropagados podem "desaparecer" (ou seja, podem tender a zero) ou "explodir" (ou seja, podem tender ao infinito), devido aos cálculos envolvidos no processo, que utilizam números de precisão finita. RNNs usando unidades LSTM resolvem parcialmente o Vanishing Gradient Problem, também conhecido como Problema do Gradiente Desvanecente, pois as unidades LSTM permitem que os gradientes também fluam inalterados. No entanto, redes LSTM ainda podem sofrer do problema do gradiente explosivo.
O intuito por trás da arquitetura LSTM é criar um módulo adicional em uma rede neural que aprende quando lembrar e quando esquecer informações pertinentes. Em outras palavras, a rede aprende efetivamente quais informações podem ser necessárias mais tarde em uma sequência e quando essas informações não são mais necessárias. Por exemplo, no contexto de processamento de linguagem natural, a rede pode aprender dependências gramaticais. Uma LSTM pode processar a frase "Dave, como resultado das alegações controversas dele, é agora uma pária" ao lembrar o gênero e número gramatical (estatisticamente prováveis) do sujeito Dave, observar que essas informações são pertinentes para o pronome dele e perceber que essas informações não são mais importantes após o verbo ser.

## Variantes

Nas equações abaixo, as variáveis em minúsculas representam vetores. As matrizes $W_{q}$ e $U_{q}$ contêm, respectivamente, os pesos das conexões de entrada e recorrentes, onde o subscrito $_{q}$ pode ser a porta de entrada $i$, a porta de saída $o$, a porta de esquecimento $f$ ou a célula de memória $c$, dependendo da ativação que está sendo calculada. Nesta seção, estamos usando uma "notação vetorial". Assim, por exemplo, $c_{t}\in \mathbb {R} ^{h}$ não representa apenas uma unidade de uma célula LSTM, mas apresenta as unidades de $h$ de células LSTM.

### Porta de esquecimento com LSTM

As formas compactas das equações para a passagem direta de uma célula LSTM com uma porta de esquecimento são:
    ${\begin{aligned}f_{t}&=\sigma _{g}(W_{f}x_{t}+U_{f}h_{t-1}+b_{f})\\i_{t}&=\sigma _{g}(W_{i}x_{t}+U_{i}h_{t-1}+b_{i})\\o_{t}&=\sigma _{g}(W_{o}x_{t}+U_{o}h_{t-1}+b_{o})\\{\tilde {c}}_{t}&=\sigma _{c}(W_{c}x_{t}+U_{c}h_{t-1}+b_{c})\\c_{t}&=f_{t}\odot c_{t-1}+i_{t}\odot {\tilde {c}}_{t}\\h_{t}&=o_{t}\odot \sigma _{h}(c_{t})\end{aligned}}$
onde os valores iniciais são $c_{0}=0$ e $h_{0}=0$ e o operador $\odot$ denota o produto de Hadamard (produto elemento a elemento). O subscrito $t$ indexa o passo do tempo.

#### Variáveis

* $x_{t}\in \mathbb {R} ^{d}$: vetor de entrada para a unidade LSTM
* $f_{t}\in {(0,1)}^{h}$: vetor de ativação da porta de esquecimento
* $i_{t}\in {(0,1)}^{h}$: vetor de ativação da porta de entrada/atualização
* $o_{t}\in {(0,1)}^{h}$: vetor de ativação da porta de saída
* $h_{t}\in {(-1,1)}^{h}$: vetor de estado oculto, também conhecido como vetor de saída da unidade LSTM
* ${\tilde {c}}_{t}\in {(-1,1)}^{h}$: vetor de ativação da entrada da célula
* $c_{t}\in \mathbb {R} ^{h}$: vetor de estado da célula
* $W\in \mathbb {R} ^{h\times d}$, $U\in \mathbb {R} ^{h\times h}$ e $b\in \mathbb {R} ^{h}$: matrizes de pesos e vetor de viés que precisam ser aprendidos durante o treinamento
onde os expoentes $d$ e $h$ referem-se ao número de características de entrada e ao número de unidades ocultas, respectivamente.

#### Funções de Ativação

* $\sigma _{g}$: função sigmoide.
* $\sigma _{c}$: função tangente hiperbólica.
* $\sigma _{h}$: função tangente hiperbólica ou, como sugere o artigo da LSTM de orifício de espiada, $\sigma _{h}(x)=x$.

### LSTM de olho mágico (peepholes)

A figura à direita é uma representação gráfica de uma unidade LSTM com conexões de olho mágico (ou seja, uma LSTM de olho mágico). Conexões de LSTM de olho mágico permitem que os portões acessem o carrossel de erro constante (CEC), cuja ativação é o estado da célula. $h_{t-1}$ não é usado, sendo $c_{t-1}$ usado em seu lugar em sua maior parte.
    ${\begin{aligned}f_{t}&=\sigma _{g}(W_{f}x_{t}+U_{f}c_{t-1}+b_{f})\\i_{t}&=\sigma _{g}(W_{i}x_{t}+U_{i}c_{t-1}+b_{i})\\o_{t}&=\sigma _{g}(W_{o}x_{t}+U_{o}c_{t-1}+b_{o})\\c_{t}&=f_{t}\odot c_{t-1}+i_{t}\odot \sigma _{c}(W_{c}x_{t}+b_{c})\\h_{t}&=o_{t}\odot \sigma _{h}(c_{t})\end{aligned}}$
Cada um dos portões pode ser considerado como um neurônio "padrão" em uma rede neural feedforward (ou multi-camadas): ou seja, eles calculam uma ativação (usando uma função de ativação) de uma soma ponderada. $i_{t},o_{t}$ e $f_{t}$ representam as ativações, respectivamente, dos portões de entrada, saída e esquecimento, no marco de tempo $t$.
As 3 setas de saída da célula de memória $c$ para os 3 portões $i,o$ e $f$ representam as conexões de olho mágico. Essas conexões de olho mágico denotam as contribuições da ativação da célula de memória $c$ no marco de tempo $t-1$, ou seja, a contribuição de $c_{t-1}$ (e não de $c_{t}$ , como a imagem pode sugerir). Em outras palavras, os portões $i,o$ e $f$ calculam suas ativações no passo de tempo $t$ (ou seja, $i_{t},o_{t}$ and $f_{t}$) também considerando a ativação da célula de memória $c$ no passo de tempo $t-1$, ou seja, $c_{t-1}$.A única seta da esquerda para a direita que sai da célula de memória não é uma conexão de olho mágico e denota$c_{t}$.
Os pequenos círculos contendo um símbolo de $\times$ representam uma multiplicação elemento a elemento entre suas entradas. Os grandes círculos contendo uma curva em forma de S representam a aplicação de uma função diferenciável (como a função sigmoide) a uma soma ponderada.

### LSTM de olho mágico convolutional

LSTM de olho mágico convolucional. O símbolo $*$ denota o operador de convolução.
    ${\begin{aligned}f_{t}&=\sigma _{g}(W_{f}*x_{t}+U_{f}*h_{t-1}+V_{f}\odot c_{t-1}+b_{f})\\i_{t}&=\sigma _{g}(W_{i}*x_{t}+U_{i}*h_{t-1}+V_{i}\odot c_{t-1}+b_{i})\\c_{t}&=f_{t}\odot c_{t-1}+i_{t}\odot \sigma _{c}(W_{c}*x_{t}+U_{c}*h_{t-1}+b_{c})\\o_{t}&=\sigma _{g}(W_{o}*x_{t}+U_{o}*h_{t-1}+V_{o}\odot c_{t}+b_{o})\\h_{t}&=o_{t}\odot \sigma _{h}(c_{t})\end{aligned}}$

## Treinamento

Uma RNN usando unidades LSTM pode ser treinada de forma supervisionada em um conjunto de sequências de treinamento, usando um algoritmo de otimização como descida do gradiente combinado com retropropagação através do tempo para calcular os gradientes necessários durante o processo de otimização, a fim de alterar cada peso da rede LSTM proporcionalmente à derivada do erro (na camada de saída da rede LSTM) em relação ao peso correspondente.
Um problema ao usar descida do gradiente para RNNs padrão é que os gradientes de erro desaparecem exponencialmente rápido com o tamanho do atraso entre eventos importantes. Isso ocorre porque $\lim _{n\to \infty }W^{n}=0$ se o raio espectral de $W$ for menor que 1.
No entanto, com unidades LSTM, quando os valores de erro são retropropagados da camada de saída, o erro permanece na célula da unidade LSTM. Este "carrossel de erro" alimenta continuamente o erro de volta para cada um dos portões da unidade LSTM, até que aprendam a cortar o valor.

### Função de pontuação CTC

Muitas aplicações usam pilhas RNNs LSTM e as treinam com classificação temporal conexa (CTC) para encontrar uma matriz de peso RNN que maximize a probabilidade das sequências de rótulos em um conjunto de treinamento, dadas as sequências de entrada correspondentes. CTC alcança tanto o alinhamento quanto o reconhecimento.

### Alternativas

Às vezes, pode ser vantajoso treinar (partes de) uma LSTM por neuroevolução ou por métodos de gradiente de política, especialmente quando não há um "professor" (ou seja, rótulos de treinamento).

#### Casos de sucesso

Houve várias histórias de sucesso no treinamento, de maneira não supervisionada, de RNNs com unidades LSTM.
Em 2018, Bill Gates chamou isso de "um grande marco no avanço da inteligência artificial" quando bots desenvolvidos pela OpenAI foram capazes de vencer humanos no jogo Dota 2. O OpenAI Five consiste em cinco redes neurais independentes, porém coordenadas. Cada rede é treinada por um método de gradiente de política sem um professor supervisor e contém uma LSTM de uma camada com 1024 unidades que observa o estado atual do jogo e emite ações por meio de várias possíveis cabeças de ação.
Em 2018, a OpenAI também treinou uma LSTM semelhante por gradientes de política para controlar uma mão robótica semelhante à humana que manipula objetos físicos com destreza sem precedentes.
Em 2019, o programa AlphaStar da DeepMind usou um núcleo profundo LSTM para se destacar no complexo jogo de vídeo Starcraft II. Isso foi visto como um progresso significativo em direção à Inteligência Artificial Geral.

## Aplicações

As aplicações da LSTM incluem:
* Controle de robôs
* Previsão de séries temporais
* Reconhecimento de fala
* Aprendizado de ritmo
* Composição musical
* Aprendizado de gramática
* Reconhecimento de caligrafia
* Reconhecimento de ação humana
* Tradução de língua de sinais
* Detecção de homologia de proteínas
* Previsão da localização subcelular de proteínas
* Detecção de anomalias em séries temporais
* Diversas tarefas de previsão na área de gerenciamento de processos de negócios
* Previsão em trajetórias de cuidados médicos
* Análise semântica
* Cosegmentação de objetos
* Gerenciamento de passageiros de aeroportos
* Previsão do tráfego em curto prazo
* Desenho de fármacos
* Previsão de Mercado

## Linha do tempo do desenvolvimento

1991: Sepp Hochreiter analisou o problema da dissipação do gradiente e desenvolveu os princípios do método em sua tese de diploma alemã.
1995: "Long Short-Term Memory (LSTM)" é publicado em um relatório técnico por Sepp Hochreiter e Jürgen Schmidhuber.
1996: LSTM é publicado na conferência NIPS'1996, uma conferência revisada por pares.
1997: O principal artigo do LSTM é publicado no jornal Neural Computation. Ao introduzir unidades de "Constant Error Carousel" (CEC), o LSTM lida com o problema da dissipação do gradiente. A versão inicial do bloco LSTM incluía células, portas de entrada e saída.
1999: Felix Gers, Jürgen Schmidhuber e Fred Cummins introduziram a porta de esquecimento (também chamada de "porta de prosseguir") na arquitetura do LSTM,permitindo que o LSTM redefina seu próprio estado.
2000: Gers, Schmidhuber e Cummins adicionaram conexões de "peephole" (conexões da célula para as portas) à arquitetura. Além disso, a função de ativação de saída foi omitida.
2001: Gers e Schmidhuber treinaram o LSTM para aprender idiomas que não podiam ser aprendidos por modelos tradicionais como os Modelos de Markov Ocultos.
Hochreiter et al. usaram o LSTM para meta-aprendizado (ou seja, aprender um algoritmo de aprendizado).
2004: Primeira aplicação bem-sucedida do LSTM para a fala Alex Graves et al.
2005: Primeira publicação (Graves e Schmidhuber) do LSTM com retropropagação ao longo do tempo completa e LSTM bidirecional.
2005: Daan Wierstra, Faustino Gomez e Schmidhuber treinaram o LSTM por neuroevolução sem um professor.
2006: Graves, Fernandez, Gomez e Schmidhuber introduzem uma nova função de erro para o LSTM: Connectionist Temporal Classification (CTC) para alinhamento e reconhecimento simultâneos de sequências. O LSTM treinado por CTC levou a avanços no reconhecimento de fala.
Mayer et al. treinaram LSTM para controlar robôs.
2007: Wierstra, Foerster, Peters e Schmidhuber treinaram LSTM por meio de gradientes de política para aprendizado por reforço sem um professor.
Hochreiter, Heuesel e Obermayr aplicaram LSTM à detecção de homologia de proteínas no campo da biologia.
2009: Um LSTM treinado por CTC venceu a competição de reconhecimento de escrita à mão conectada do ICDAR (Conferência Internacional sobre Análise e Reconhecimento de Documentos). Três modelos desse tipo foram submetidos por uma equipe liderada por Alex Graves. Um deles foi o modelo mais preciso na competição e outro foi o mais rápido. Foi a primeira vez que uma RNN venceu competições internacionais.
2009: Justin Bayer et al. introduziram a busca de arquitetura neural para LSTM.
2013: Alex Graves, Abdel-rahman Mohamed e Geoffrey Hinton usaram redes LSTM como componente principal de uma rede que alcançou uma taxa recorde de erro de fonema de 17,7% no conjunto de dados de fala natural clássico TIMIT (corpus de fala transcrita fonêmica e lexicalmente de falantes do inglês americano).
2014: Kyunghyun Cho et al. apresentaram uma variante simplificada da LSTM da porta de esquecimento chamada unidade recorrente fechada (GRU).
2015: O Google começou a usar um LSTM treinado por CTC para reconhecimento de fala no Google Voice. De acordo com a postagem oficial no blog, o novo modelo reduziu os erros de transcrição em 49%.
2015: Rupesh Kumar Srivastava, Klaus Greff e Schmidhuber utilizaram princípios de LSTM para criar a rede Highway, uma rede neural feedforward com centenas de camadas, muito mais profunda do que redes anteriores. Sete meses depois, Kaiming He, Xiangyu Zhang, Shaoqing Ren e Jian Sun venceram a competição ImageNet 2015 com uma variante da rede Highway chamada rede neural residual, com portões abertos ou sem portões. Esta se tornou a rede neural mais citada do século XXI.
2016: O Google começou a utilizar uma LSTM para sugerir mensagens no aplicativo de conversa Allo. No mesmo ano, o Google lançou o sistema Google Neural Machine Translation para o Google Translate, que utilizava LSTMs para reduzir erros de tradução em 60%.
A Apple anunciou em sua Worldwide Developers Conference que começaria a usar a LSTM para o QuickType no iPhone e para a Siri.
A Amazon lançou o Polly, que gera as vozes por trás da Alexa, utilizando uma LSTM bidirecional para a tecnologia de texto para fala.
2017: O Facebook realizava cerca de 4,5 bilhões de traduções automáticas diariamente utilizando redes neurais de LSTM.
Pesquisadores da Michigan State University, IBM Research e Cornell University publicaram um estudo na conferência Knowledge Discovery and Data Mining (KDD). O Time-Aware LSTM (T-LSTM) deles tem um desempenho melhor em determinados conjuntos de dados do que o LSTM padrão.
A Microsoft relatou alcançar uma precisão de reconhecimento de 94,9% no corpus Switchboard, incorporando um vocabulário de 165.000 palavras. A abordagem utilizada foi "long short-term memory baseada em sessão de diálogo".
2018: A OpenAI utilizou LSTM treinado por gradientes de política para vencer humanos no complexo jogo de vídeo Dota 2, e para controlar uma mão de robô semelhante à humana que manipula objetos físicos com destreza sem precedentes.
2019: A DeepMind utilizou LSTM treinado por gradientes de política para se destacar no complexo jogo de vídeo Starcraft II.
2021: De acordo com o Google Scholar, em 2021, LSTM foi citado mais de 16.000 vezes em um único ano. Isso reflete aplicações de LSTM em muitos campos diferentes, incluindo saúde.