Demonstrações interativas da aula de redes recorrentes
Quatro visualizações que acompanham os slides: a célula recorrente desenrolada no tempo processando uma sequência com a regra ht = tanh(xt·θih + ht−1·θhh + bh) e ŷt = ht·θho + bo, a dinâmica do estado oculto quando a recorrência é iterada muitas vezes, o exemplo numérico de Backpropagation Through Time visto em aula (x = [1, 2], y = 3) e o produto de fatores θhh·(1 − tanh²(zk)) que faz o gradiente desaparecer ou explodir em sequências longas. Notação dos slides: θih (entrada para estado), θhh (estado para estado), θho (estado para saída), ht (estado interno).
A mesma célula é aplicada a cada elemento da sequência, com os mesmos pesos em todos os passos de tempo. Além da entrada xt, a célula recebe o estado interno ht−1, que resume tudo o que a rede viu até o passo anterior: ht = tanh(xt·θih + ht−1·θhh) e ŷt = ht·θho (com bh = bo = 0, como no exemplo da aula). Arraste as barras azuis para editar a sequência de entrada e avance o tempo passo a passo para ver o estado fluir de uma célula para a seguinte.
Rede desenrolada: xt embaixo (arraste as barras), células tanh no meio, ht nas setas e ŷt em cima
Estado ht (laranja) e saída ŷt (rosa) ao longo do tempo
💡 Com θhh = 0 a memória some: cada ht depende só de xt, exatamente o MLP aplicado palavra a palavra dos slides. Suba para θhh = 1.0 e zere as últimas entradas arrastando as barras: o estado continua carregando informação dos primeiros passos. Com θhh = −1.0 o estado alterna de sinal a cada passo. Os valores iniciais reproduzem o exemplo da aula: x1 = 1, x2 = 2 dão h1 ≈ 0.462 e h2 ≈ 0.843.
O que acontece com a memória quando a recorrência é iterada muitas vezes sem novas entradas? O estado obedece ao mapa ht = tanh(θhh·ht−1) (aba tanh) ou à versão sem ativação ht = θhh·ht−1 (aba linear). O diagrama de teia de aranha mostra a iteração: de ht sobe até a curva (aplica o mapa) e vai até a diagonal (vira a entrada do próximo passo). Arraste no gráfico para escolher h0 e varie θhh para ver o estado decair, persistir ou saturar.
Teia de aranha: curva do mapa, diagonal ht = ht−1 e a trajetória (arraste para mudar h0)
ht por passo de tempo t
💡 Na aba linear, θhh = 0.5 faz o estado cair pela metade a cada passo (a memória evapora em poucos passos) e θhh = 1.5 faz o estado explodir. Na aba tanh a explosão é contida pela saturação: com θhh = 1.5 o estado converge a um ponto fixo ±h* (bolinhas verdes) e a rede "trava" numa memória persistente. Teste θhh = −1.5 e veja o estado oscilar de sinal. É essa mesma multiplicação repetida por θhh que vai reaparecer no gradiente da seção 4.
Reproduzimos o exemplo dos slides: a menor RNN possível, com x = [1, 2], meta y = 3, h0 = 0 e parâmetros iniciais θih = θhh = 0.5, θho = 1, bh = bo = 0. A loss é J(θ) = ½(ŷ2 − y)² e o Backpropagation Through Time soma as contribuições do gradiente ao longo dos passos de tempo: o caminho de θih, por exemplo, atravessa h1 para chegar em h2. Cada clique em ⏭ faz um ciclo completo de forward, backward e passo do optimizer θ ← θ − η·∂J/∂θ.
Gradientes ∂J/∂θ nos parâmetros atuais (a barra é o que o próximo passo do optimizer vai aplicar)
Loss J por iteração k, escala log
💡 Em k = 0 as barras reproduzem a tabela da aula: ∂J/∂θho ≈ −1.818, ∂J/∂bo ≈ −2.157, ∂J/∂θih ≈ −1.493, ∂J/∂bh ≈ −0.870 e ∂J/∂θhh ≈ −0.288. Dê uma iteração com η = 0.1 e confira J: 2.326 → 1.404, como no slide. Depois deixe ▶ rodar até convergir e repare que os gradientes vão a zero. Com η = 0.6 a loss oscila antes de assentar: o passo fica grande demais para este vale.
Em sequências longas a RNN é profunda no tempo: para chegar aos primeiros passos, o gradiente atravessa um produto de Jacobianos ∏k θhh·(1 − tanh²(zk)). Se cada fator é menor que 1 o produto decai exponencialmente (vanishing gradient); se é maior que 1, cresce exponencialmente (exploding gradient). Abaixo, uma RNN escalar processa uma sequência de entradas aleatórias e medimos |∂J/∂ht| ao retropropagar a loss do último passo até cada instante t. A curva tracejada mostra a linearização em que cada fator vale exatamente θhh (como se 1 − tanh² = 1); na rede tanh real a saturação reduz os fatores. À direita, a magnitude do gradiente total |∂J/∂θih| em função do comprimento da sequência, com o efeito do gradient clipping by norm: se ‖g‖ > c, então g ← c·g/‖g‖, preservando a direção.
log₁₀ |∂J/∂ht| ao retropropagar do passo T até t (ciano: rede tanh; tracejado cinza: fatores θhh sem saturação)
log₁₀ |∂J/∂θih| vs comprimento T da sequência (verde: curva sem saturação após clipping com limiar c)
💡 Com θhh = 0.5 e T = 60 o gradiente que chega em t = 1 é da ordem de 10⁻²⁰: os primeiros passos da sequência ficam impossíveis de treinar. Com θhh = 2.0 a curva tracejada explode e cruza o limiar do clipping: a linha verde mostra a norma efetivamente usada na atualização. Repare na curva ciano que, com θhh > 1, o estado satura e o fator θhh·(1 − tanh²(zk)) fica menor que 1: na rede tanh real o gradiente volta a desaparecer (confira o fator médio no painel). O clipping resolve a explosão mas não o desaparecimento, que motiva as arquiteturas com portas (LSTM e GRU) da próxima aula.