Você está na página 1de 12

MACHINE LEARNING – REDES NEURAIS RECORRENTES E LSTM

Script

Slide 2

Antes de tentarmos entender um conceito de redes neurais recorrentes e de estudarmos a


fundo a sua estrutura, é importante que façamos uma contextualização de forma que o
entendimento do assunto que está sendo proposto seja facilitado.

Então, vamos lá! Algo bem comum no nosso dia-a-dia é a checagem da previsão de
temperatura de um dado dia, especialmente quando estamos fazendo planos para aquela
data. Para isso, normalmente usamos um aplicativo/site específico. E como se chega à
temperatura que vemos no celular? Basicamente, tem-se uma sequência de valores de
temperaturas coletados nos diferentes horários observados em um período de tempo e
baseado nesse histórico a aplicação prevê qual será a temperatura. Ou seja, para essa
aplicação a minha entrada são dados seqüenciais e que dependem uns dos outros, pois a
temperatura que meu celular fornece agora depende da temperatura de 1 hora atrás, ou
do dia anterior porque os valores não mudam bruscamente.

Nesse sentido, eu tenho um problema: as redes neurais tradicionais, ou standard


feedfoward, não podem fazer isso. Thays, por que não? Porque, como vimos nas
apresentações anteriores, as redes feedfoward alimentam informações diretamente.
Analisando sua estrutura, vemos que se tem uma entrada, uma camada oculta e uma
saída. Em outras palavras, exemplos de entrada são alimentados na rede e transformados
em uma saída; Com a aprendizagem supervisionada, a saída seria, por exemplo, um
rótulo, um nome aplicado à entrada. Ou seja, elas mapeiam dados brutos para
categorias, reconhecendo padrões que podem sinalizar, por exemplo, que uma imagem
de entrada deve ser rotulada como “gato” ou “cachorro”.

Dessa forma, quando eu penso em aplicações com dados seqüenciais, existe essa
limitação para as redes tradicionais, pois cada amostra é processada individualmente,
não memorizando amostras vistas no passado.

Slide 3

Então, diante dessa limitação, nós temos as Redes neurais recorrentes que podem ser
entendidas como redes com loops, permitindo que as informações persistam por isso
também são conhecidas como Redes Neurais de Retroalimentação. Isto porque as redes
recorrentes são um tipo de rede neural artificial projetada para reconhecer padrões em
sequências de dados. Agora, então, eu posso trabalhar em aplicações como previsão de
temperatura, por exemplo, tendo em vista que se eu tenho elementos seqüenciais
dependentes eu penso em uma arquitetura de rede recorrente para resolver esse
problema.

Slide 4
Por que contextualizar ao invés de começar com um conceito? Para que se entenda dois
pontos fundamentais: 1º A diferença entre as redes recorrentes e as redes padrões
observando a necessidade das redes recorrentes para determinadas aplicações,
observando que as estruturas são diferentes pois a tradicional se tem uma entrada, uma
camada oculta e uma saída já na recorrente tem uma retroalimentação, o que explicarei
mais tarde e 2º Entender o tipo de dado que a Rede recorrente processa. Que tipo de
dado é esse? Seq de tamanho T com valores X indexados no tempo até x(t) com um
determinado output. Então, repito: quando eu penso em aplicações com dados
seqüenciais eu trabalho com redes recorrentes.

Entendido isso, vamos começar a nos aprofundar na estrutura e arquitetura das redes
recorrentes ou Recurrent Neural Networks (RNNs)

Slide 5

Na rede recorrente eu tenho uma entrada no tempo t que passa por uma camada no
tempo t e produz uma saída no tempo t mas percebam que o resultado da camada no
tempo t vai retroalimentar a próxima entrada de forma que quando eu tenho uma entrada
x no tempo t+1 ele vai receber também a saída de h(t). Qual a ideia? Tem-se sempre
uma relação entre a entrada no tempo T e a informação da entrada no tempo anterior.
Em outras palavras: A camada oculta obtém sua entrada da camada de entrada e da
camada oculta do tempo anterior. E isso faz com que o fluxo dessas informações em
etapas de tempos adjacentes na camada oculta permita que a rede tenha uma memória
de eventos passados.

(Gilberto)

Redes recorrentes são redes com pelo menos uma célula recorrente, ou seja, uma
camada com memória. Essas células têm a seguinte estrutura:

Na imagem acima, temos uma camada de uma rede neural em azul que recebe um input
𝑥 e gera um output 𝑜, onde 𝑈 é o peso da camada de input e 𝑊 o peso da camada de
output. Além de propagar a informação para outras camadas, a célula transmite essa
informação para si mesma por meio de um loop com peso 𝑉. Esse “estado interno” da
rede, que flui de um instante para o próximo, é representado por ℎ.

Para entender melhor as dependências temporais, vamos desenrolar o loop:


Podemos pensar então que cada célula tem um estado que varia ao longo do tempo. Ou
seja, uma célula no estado ℎ(𝑡 − 1) recebe um input 𝑥 (𝑡 − 1) e, além de transmitir esse
output para 𝑜(𝑡 − 1) para a camada mais a frente, ela utiliza o input para atualizar seu
estado para ℎ(𝑡). Dessa maneira, quando a célula recebe o input 𝑥 (𝑡), ela “se lembra”
da entrada 𝑥 (𝑡 − 1), e o processo continua sucessivamente até que ela processe todo o
input.

É possível então representar o estado atual por meio da fórmula:

ℎ(𝑡) = 𝑓(ℎ(𝑡 − 1), 𝑥(𝑡))

Aplicando a função de ativação tanh(𝑥 ), teremos:

ℎ(𝑡) = tanh(𝑉 ∙ ℎ(𝑡 − 1) + 𝑈 ∙ 𝑥 (𝑡))

O estado ℎ(𝑡) pode ser visto como a memória da rede. Ele captura informações sobre o
que aconteceu em todas as etapas de tempo anteriores. A saída na etapa 𝑜 (𝑡) é calculada
exclusivamente com base na memória no tempo 𝑡. É um pouco mais complicado na
prática, uma vez que não é possível capturar informações de muitas etapas de tempo
anteriores.

Pergunta: É necessário que hajam saídas em cada etapa de tempo?

Resposta: Depende da tarefa. Por exemplo, ao prever o sentimento de uma frase,


podemos nos preocupar apenas com a saída final, não com o sentimento de cada
palavra. Da mesma forma, podemos não precisar de entradas em cada etapa de tempo.
Por exemplo: “Eu amo meus pais, mas hoje o dia está horrível”. Não é necessário
analisar toda a frase. Seu final já nos mostra que se trata de algo negativo.

Slides 6 e 7

Aprendizagem Sequencial

As RNNs conseguem lidar com entradas e saídas de tamanho variável. O objetivo das
redes neurais recorrentes é aprender a classificar com precisão uma entrada
sequencial.Para isso, contamos com retropropagação(o famoso backpropagation) do
erro e o gradiente descendente.
A retropropagação em redes retrocede do erro final através das saídas, pesos e entradas
de cada camada oculta, atribuindo a esses pesos a responsabilidade por uma parte do
erro, calculando as suas derivadas parciais −𝜕𝐸/𝜕𝑉, ou a relação entre suas taxas de
mudança. Essas derivadas são usadas pelo gradiente descendente para ajustar os pesos
para cima ou para baixo.

As redes recorrentes dependem de uma extensão da retropropagação, chamada


Backpropagation Through Time, ou BPTT. Em uma RNN, a saída de uma célula é
também a entrada dessa célula, então, o erro é propagado de uma célula para a própria
célula. Então, o erro se propaga no tempo.

Slide 8

Funcionamento do algoritmo BPTT

Considere que estamos criando uma RNN que seja capaz de prever a próxima palavra
em um texto. As equações básicas para o modelo são:

ℎ(𝑡) = tanh(𝑉 ∙ ℎ(𝑡 − 1) + 𝑈 ∙ 𝑥 (𝑡))

𝑜̂𝑡 = 𝑊ℎ𝑡
Onde 𝑜̂𝑡 se refere ao valor da predição e 𝑜(𝑡) se refere ao valor real. Estamos diante de
um problema de classificação. Definimos a nossa perda como a perda de entropia
cruzada.

𝐸𝑡 (𝑜𝑡 , 𝑜̂𝑡 ) = −𝑜𝑡 log(𝑜̂𝑡 )

Normalmente, tratamos a sequência completa, ou seja, a sentença, como um exemplo de


treinamento. Assim, o erro total é a soma dos erros em cada etapa de tempo (palavra).

𝐸(𝑜, 𝑜̂) = ∑ 𝐸𝑡 (𝑜𝑡 , 𝑜̂𝑡 ) = − ∑ 𝑜𝑡 log(𝑜̂𝑡 )


𝑡 𝑡

O nosso objetivo é calcular os gradientes do erro em relação aos nossos parâmetros U,


V e W e, em seguida, aprender bons parâmetros usando o Stochastic Gradient Descent
ou SGD. Assim como fizemos com o erro, somamos os gradientes em cada etapa de
tempo para um exemplo de treinamento:

𝜕𝐸 𝜕𝐸𝑡
=∑
𝜕𝑉 𝜕𝑉
𝑡

Para calcular os gradientes, usamos a regra da cadeia. Usando 𝐸3 como exemplo:

𝜕𝐸3 𝜕𝐸3 𝜕𝑜̂3 𝜕𝐸3 𝜕𝑜̂3 𝜕𝑧3


= = = (𝑜̂3 − 𝑜3 ) ⊗ ℎ3
𝜕𝑊 𝜕𝑜̂3 𝜕𝑊 𝜕𝑜̂3 𝜕𝑧3 𝜕𝑊

Onde 𝑧3 = 𝑊ℎ3 . Observe que 𝜕𝐸3 /𝜕𝑊 depende apenas dos valores no momento atual.
Tendo esses valores, calcular o gradiente é apenas uma multiplicação de tensores. Para
𝜕𝐸3 /𝜕𝑉, a história é diferente. Aplicando novamente a regra da cadeia, teremos:

𝜕𝐸3 𝜕𝐸3 𝜕𝑜̂3 𝜕𝐸3 𝜕𝑜̂3 𝜕ℎ3


= =
𝜕𝑉 𝜕𝑜̂3 𝜕𝑉 𝜕𝑜̂3 𝜕ℎ3 𝜕𝑉

Como vimos, ℎ(𝑡) = tanh(𝑉 ∙ ℎ(𝑡 − 1) + 𝑈 ∙ 𝑥 (𝑡)), ou seja, ℎ3 depende de ℎ2 , que


depende de 𝑉 e ℎ1 , e assim por diante. Ou seja, não podemos simplesmente tratar ℎ2
como constante em relação a 𝑉! Precisamos aplicar a regra da cadeia novamente e o que
teremos será a equação abaixo.
3
𝜕𝐸3 𝜕𝐸3 𝜕𝑜̂3 𝜕ℎ3 𝜕ℎ𝑘
=∑
𝜕𝑉 𝜕𝑜̂3 𝜕ℎ3 𝜕ℎ𝑘 𝜕𝑉
𝑘=0

Como 𝑉 é usado em todas as etapas até a saída que nos interessa, precisamos retroceder
gradientes na rede de 𝑡 = 3 até 𝑡 = 0.
A imagem acima ilustra todo o processo. A única diferença é a nomeação de cada
estado. No nosso caso, nomeamos os estados como ℎ𝑡 e na imagem os mesmos foram
nomeados como 𝑠𝑡 .

As RNNs, na forma como foram apresentadas até aqui, são difíceis de treinar na prática.
Imagine uma sequência longa de palavras. Você precisaria retroceder através de várias
camadas.

Slide 9

Como as redes recorrentes podem lidar tanto com entradas quanto com saídas de
tamanho variável, no que se refere à sua arquitetura, temos os seguintes tipos:

Observando que:

Azul: input layer

Verde: Hidden Layers

Vermelho: Output Layer

One-to-one: Ou seja, modelo de um para um, são as redes neurais clássicas que utilizam-
se de feedforward, utiliza-se um input e espera-se um output

One to many: a entrada não é uma sequência mas a saída é.

Many to one: a entrada é uma sequência mas a saída não é.

Many to many: entrada e saída são sequencias.


Entendendo cada uma:

Slide 10

One to many: Ou seja, modelo de um para muitos. são modelos que recebem apenas um
input e devolvem vários outputs, por exemplo, deseja-se legendar uma imagem com uma
palavra ou uma frase de tamanho não necessariamente fixo.

Slide 11

Modelos de muitos para um (many-to-one): são utilizados principalmente para


classificação de sentimentos de uma frase, onde o input são as palavras e o output é
devolvido apenas após o processamento de todas. Nesse caso de aplicação, o valor no
output corresponderia a probabilidade da frase possuir o sentimento requerido.

Slide 12

Modelos de muitos para muitos (many-to-many): em vídeos, onde o frame atual


depende do último frame e queremos uma resposta imediata para acontecimentos em tela
(para legendar simultaneamente, por exemplo) podemos nos utilizar dos modelo many-
to-many “alinhados” onde o output deve ocorrer simultaneamente ao input (Figura A).
CLASSIFICAR CADA FRAME COMO UM LABEL DANDO UM ROTULO PARA
UM FRAME

Slide 13

Os modelos de muitos para muitos são ideais para tradução de textos também, como
aqueles que vemos no Google tradutor. O input poderia ser uma frase em alguma língua,
possuindo tamanho variável, e o output seria a mesma sentença em outra língua, que não
necessariamente possuiria o mesmo tamanho.

PORQUE A REDE PRECISA LER O TEXTO TODO PARA CONSEGUIR


TRADUZIR O TEXTO, NÃO É PALAVRA POR PALAVRA POR ISSO O ATRASO

Slide 14 pra frente Redes LSTM (Gilberto)

Mas todo o contexto realmente importa?

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. 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”.

Há casos, no entanto, onde o contexto é importante. Na frase “Eu cresci no Brasil... Eu


falo fluentemente portuguê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 no Brasil. Agora repare nas reticências
colocadas entre as duas partes do texto. É possível que elas representem um texto
gigante. O gap entre a informação relevante e o ponto onde ela é requisitada pode se
tornar bem grande.

Conforme esse gap aumenta, 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 ocorre quando o gradiente desaparece conforme
ocorre o backpropagation ao longo do tempo. Se o valor de um gradiente se torna
muito pequeno, ele não contribui com o aprendizado. Em RNNs, as camadas que
recebem esse gradiente não aprendem. Esse é o problema que leva ao
“esquecimento” das informações mais antigas.

Redes LSTM

As redes Long Short-Term Memory (memória de curto e longo prazo) são um tipo
especial de rede neural recorrente. Elas são capazes de aprender conexões de longo
prazo. Primeiramente, vamos entender como o cérebro humano funciona. De forma
extremamente simplificada, nossa memória pode ser dividida em dois tipos:

• Memória de curto prazo: atua no momento em que a informação está sendo


adquirida. Retém a informação por alguns segundos e a destina para ser
guardada por períodos mais longos ou a descarta.
• Memória de longo prazo: Retém de forma definitiva a informação, permitindo
sua recuperação ou evocação.
As LSTM buscam seguir esse funcionamento. Para entender melhor, vamos rever
brevemente as camadas recorrentes básicas.

Nesse diagrama, cada célula recorrente (retângulos verdes) recebe uma entrada 𝑥 e o
estado do instante anterior e gera uma saída 𝑜. Podemos utilizar outro diagrama para
explicar como essa transformação da entrada para a saída é feita, olhando mais de
perto.

Observe que o input 𝑥 é combinado com o estado anterior ℎ(𝑡 − 1) e passado à


função de ativação 𝑡𝑎𝑛ℎ, gerando uma saída ℎ(𝑡). No caso da RNN, a única
informação passada de um instante de tempo para o próximo é a saída ℎ, 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 vimos, é necessária a adição de uma
memória de longo prazo. O desafio aqui é 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 portas que controlam a passagem de informações entre os
dois canais. O componente básico das portas é a estrutura abaixo.

A estrutura aplica a função sigmoide à entrada b e multiplica o resultado pelo sinal a.


Como a saída da sigmoide é um número entre 0 e 1, essa estrutura controla qual
porcentagem de cada valor deve passar pela porta.

Na LSTM temos 3 portas:

1. A forget gate, que decide quais partes do estado da célula continuam


importantes.
2. A remember gate, que decide quais informações da memória de curto prazo
devem ser adicionadas ao estado da célula.
3. A output gate, que decide quais partes do estado da célula são importantes no
instante atual para gerar o output.
O esquema completo de uma rede LSTM está ilustrado a seguir:

Primeiramente, observe que há duas linhas principais. A de cima, em laranja, é


chamada de célula de memória, pois armazena o estado da célula (a memória de longo
prazo). A de baixo, correspondente à memória de curto prazo, contém a entrada e o
hidden state. Entre essas linhas, estão as 3 portas que controlam a passagem de
informação.

A forget gate determina quais parte do estado da célula são importantes e quais
devem ser esquecidas, conforme figura abaixo.

Em seguida, determina-se quais novas informações da memória de curto prazo devem


ser colocadas no estado da célula, por meio da input gate. Para isso, são calculados um
vetor de ativações 𝐶 +, que contém as novas informações, e um vetor 𝑖 que determina
o quão importante cada informação é.
O último passo é utilizar o estado da célula para calcular a saída ℎ da rede.
Primeiramente, passa-se o estado 𝐶 por uma função de ativação 𝑡𝑎𝑛ℎ. Em seguida, a
memória de curto prazo é utilizada para determinar quais partes dessa saída são
realmente relevantes.

Observe que na célula de memória não é aplicada nenhuma função de ativação,


somente nas portas. Assim, eliminamos o problema do vanishing gradient.

Algumas aplicações da LSTM

Uma das mais famosas é a geração de texto. O modelo utiliza as palavras iniciais para
predizer a próxima com base na probabilidade de ela ocorrer.
Ainda no campo de textos, RNNs também podem ser usadas para a tradução de
sentenças de uma língua para outra. Nesses casos, não se pode simplesmente traduzir
cada palavra separadamente, pois o contexto é muito importante.

As RNN com células LSTM também 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.

Você também pode gostar