LSTMs e GRUs

Demonstrações interativas da aula de LSTMs e GRUs

Quatro visualizações que acompanham os slides: as três portas da LSTM controladas manualmente, o motivo de o caminho aditivo de ct preservar o gradiente, a comparação passo a passo entre LSTM e GRU na mesma sequência (com os pesos do exemplo numérico da aula) e uma tarefa sintética de memória de longo prazo. Notação dos slides: ct = ft ⊙ ct−1 + it ⊙ c̃t, ht = ot ⊙ tanh(ct) e, na GRU, ht = (1 − zt) ⊙ ht−1 + zt ⊙ h̃t.

1 · As portas da LSTM em ação

A célula LSTM carrega dois sinais ao longo do tempo: o estado oculto ht e a memória de longo prazo ct. Três portas com sigmoid (saída em [0, 1]) regulam o fluxo: ct = ft ⊙ ct−1 + it ⊙ c̃t e ht = ot ⊙ tanh(ct). Aqui você faz o papel das portas: os sliders fixam f, i e o para todos os passos, e o candidato é simplificado para t = tanh(xt) (na LSTM real cada um desses valores sai de uma camada densa sobre [ht−1, xt]). A sequência de entrada tem pulsos esparsos: avance passo a passo e veja a memória absorver, reter e expor cada pulso.

Sequência: entradas xt (barras), memória ct e estado oculto ht

Decomposição do passo atual: ct = f·ct−1 + i·c̃t

💡 Com f = 1 e i = 0.3 a célula vira um integrador: nada é esquecido e os pulsos se acumulam. Com f = 0.5 a memória decai pela metade a cada passo e some em poucos passos. Com i = 0 nenhum pulso entra, e com o = 0 a célula continua lembrando (ct evolui) mas não expõe nada em ht.

2 · A esteira do estado de célula

Na RNN vanilla o gradiente entre passos distantes acumula o produto k θhh·(1 − tanh²(zk)): como 1 − tanh² ≤ 1, ele tende a desaparecer (ou, com θhh grande, explodir). Na LSTM o caminho direto da memória não tem tanh nem multiplicação por matriz: ∂ct/∂ct−1 = ft, então o produto vira k fk (o constant error carousel). Na GRU, com ht = (1 − zt) ⊙ ht−1 + zt ⊙ h̃t, o caminho direto contribui k (1 − zk). Abaixo, três células de uma unidade rodam sobre a mesma sequência aleatória e mostramos o fator de cada passo e o produto acumulado em escala log. O slider de bias empurra as portas de memória para perto de 1 (bf na LSTM e −bf em z na GRU).

Produto acumulado |∂(estadok)/∂(estado1)| em escala log10

Fator de cada passo k (linha tracejada: fator 1, gradiente preservado)

💡 Com θhh = 0.9 a curva ciano da RNN despenca: em T = 50 o gradiente já caiu várias ordens de magnitude. Suba para θhh = 1.5 e ela explode. Agora mexa no bias: com bf = 4 as portas ficam fk ≈ 0.98 e a curva laranja quase não cai (é por isso que inicializar o forget bias alto é prática comum). Com bf = −1 até a LSTM esquece rápido: a esteira só preserva o gradiente se a porta aprender a ficar aberta.

3 · LSTM × GRU na mesma sequência

Aqui as duas células rodam de verdade, com os pesos do exemplo numérico dos slides: na LSTM, θf = [0.5, −0.5], θi = [0.3, −0.4], θc = [0.1, −0.3], θo = [−0.5, 0.4] com seus bias; na GRU, θr = [0.5, −0.4], θz = [−0.3, 0.6], θh = [0.4, 0.5]. Estados iniciais c0 = 0.5 e h0 = −0.6, primeira entrada x1 = 0.8: o primeiro passo reproduz exatamente as contas da aula. Observe a diferença estrutural: a LSTM carrega ct e ht com três portas (f, i, o), a GRU carrega só ht e a mesma porta zt decide quanto manter e quanto trocar.

LSTM: memória ct, estado ht e portas f, i, o (linhas finas)

GRU: estado ht e portas r, z (linhas finas)

💡 Dê um passo e confira o readout com os slides: f ≈ 0.401, i = 0.500, o ≈ 0.754, c ≈ 0.391 e h ≈ 0.280 na LSTM; r ≈ 0.397, z ≈ 0.681 e h ≈ 0.010 na GRU. Depois rode a sequência inteira: a curva laranja de ct muda devagar (memória de longo prazo) enquanto ht reage a cada pulso; na GRU um único vetor faz os dois papéis. Note nos pulsos como zt sobe (troca o estado) e como ft e it se movem juntas em direções opostas.

4 · Memória de longo prazo: lembrar um bit

A tarefa sintética clássica de memória: no passo t = 1 chega um bit (x1 = ±1, barra roxa) acompanhado de um marcador de escrita; nos passos seguintes chegam apenas distratores ruidosos, e no final a rede precisa responder qual era o bit. É a versão controlada do exemplo do filme da aula: lembrar o "péssimo" do começo da frase até o fim. A LSTM abaixo tem portas dirigidas pelo marcador: no passo de escrita o input gate abre (i ≈ 1) e o forget gate fecha para apagar a memória velha; nos demais passos i ≈ 0 bloqueia o ruído e f = σ(bf) segura o bit na esteira de ct. A RNN vanilla (ht = tanh(0.9·ht−1 + xt)) vê a mesma sequência, mas seu estado é sobrescrito a cada passo.

Bit (roxo), distratores (ciano), memória ct da LSTM e estado ht da RNN

Portas da LSTM ao longo do tempo: ft e it

💡 Com bf = 4 (f ≈ 0.98) a LSTM segura o bit até T = 80 mesmo com ruído alto: o sinal laranja decai pouco e mantém o sinal correto. Baixe para bf = 1.5 e veja a memória escoar (0.82T vai a zero rápido). A RNN rosa esquece em poucos passos com qualquer ruído: aumente o ruído para 1.0 e o estado dela vira função só dos últimos distratores. Aperte 🎲 algumas vezes e confira no readout quem ainda sabe o bit no passo final.