Essencial

RNNs, estado de tamanho fixo e o vanishing gradient

Uma rede recorrente é a resposta de estado fixo da lição 3.1 — o projeto que perdeu para attention na treinabilidade e que o Qwen3.8-27B hoje roda em 48 das suas 64 camadas.

Atualizada em

01 · Conceito

Conceito

A lição 3.1 formulou a pergunta do estado e esboçou duas respostas extremas. Esta lição leva a sério a resposta de tamanho fixo, descobre exatamente por que ela perdeu a discussão de 2017 e então reporta algo surpreendente: o projeto que perdeu roda hoje em três quartos das camadas do modelo deste curso.

Uma rede neural recorrente é a implementação mínima de um estado carregado e limitado:

ht=ϕ(Whhht1+Wxhxt+b),yt=Whyht+c.h_t=\phi(W_{hh}h_{t-1}+W_{xh}x_t+b),\qquad y_t=W_{hy}h_t+c.

Uma transição, reutilizada em toda posição. Leia isso como um misturador de sequência: informação da posição 12 só chega à posição 40.000 tendo sobrevivido dentro de hh por 39.988 aplicações da mesma função. A memória é constante, o trabalho por token é constante, e nada é armazenado por posição. A aritmética da lição 3.1 já disse o preço — o canal limitado — então esta lição trata do segundo preço, que acabou sendo pior.

Desenrole as equações e algo importante fica visível: uma RNN sobre uma sequência de comprimento TT é uma rede de profundidade TT cujas camadas compartilham parâmetros. Tempo de sequência e profundidade de rede são o mesmo eixo. Tudo o que a lição 2.8 disse sobre efeitos que se compõem ao longo de 64 camadas vale aqui ao longo de 40.000 passos.

Para aprender que um token inicial causou um erro tardio, o treino usa backpropagation through time: desenrolar o grafo, diferenciar e acumular as contribuições de gradiente de cada uso das matrizes compartilhadas. A derivada do estado hTh_T de volta até o estado hkh_k contém uma jacobiana por passo intermediário, todas multiplicadas.

Ponha números nisso, no cenário mais simples possível. Tome uma recorrência escalar ht=tanh(wht1+xt)h_t=\tanh(w\,h_{t-1}+x_t). Cada passo contribui com um fator wtanh()w\cdot\tanh'(\cdot), e como tanh\tanh' é no máximo um, o fator é no máximo w|w|. Faça w=0.5w=0.5 e olhe ao longo de 50 passos: o produto é no máximo 0.5508.9×10160.5^{50}\approx8.9\times10^{-16}. Esse valor continua representável em bf16, cuja faixa de expoentes coincide com a do float32, mas é um sinal de aprendizagem relativo extremamente pequeno e pode ser encoberto quando acumulado com contribuições muito maiores. O estado inicial recebe pouquíssima informação utilizável sobre como deveria mudar para reduzir uma loss cinquenta passos adiante — é o problema do vanishing gradient. Agora faça w=1.5w=1.5. O produto chega a 1.5506.4×1081.5^{50}\approx6.4\times10^{8}, então uma atualização pode ficar grande o bastante para desestabilizar o treino: exploding gradients. Entre os dois há uma faixa estreita, e o tanh\tanh a estreita ainda mais, porque uma unidade saturada contribui com derivada perto de zero e puxa o produto para baixo mesmo com um ww bem escolhido.

Repare com cuidado no que falhou e no que não falhou. O estado para a frente ainda pode carregar informação utilizável sobre o passado distante. O que quebra é a atribuição de crédito: o treino não consegue descobrir qual computação inicial mudar. É por isso que o problema é invisível num diagrama de forward pass e fatal na prática.

Aqui vem o desvio clássico, e ele é quase universal entre quem encontra essas duas falhas pela primeira vez. O treino explode, você adiciona gradient clipping, o treino estabiliza, e você conclui que a patologia do gradiente está resolvida. Não está. Gradient clipping reescala um gradiente cuja norma passa de um limiar — ele age depois da diferenciação, sobre a magnitude. No clipping de norma padrão, o fator de escala é limitado a um: gradientes grandes encolhem, enquanto gradientes pequenos permanecem inalterados. Isso controla a explosão e é prática padrão por bons motivos, mas não faz nada pelo vanishing porque não consegue reconstruir informação já atenuada pelo produto longo de jacobianas. O diagnóstico que separa os dois casos: rode uma tarefa sintética com um único marcador relevante posicionado a distâncias crescentes da previsão, e trace tanto a acurácia quanto a norma do gradiente no marcador contra a distância. Se a curva desaba na direção do acaso com clipping ligado, o crédito distante nunca foi restaurado, e nenhum ajuste de limiar de clipping vai mudar isso.

As mitigações que de fato atacam o vanishing atacam o produto em si, não a saída dele. Inicialização ortogonal mantém a jacobiana recorrente perto de preservar norma no começo. Backpropagation truncado encurta a janela desenrolada, o que poupa memória e computação enquanto limita explicitamente até onde o crédito pode viajar — uma limitação real, que pertence ao modelo reportado e não é uma otimização de graça. Caminhos aditivos de estado, que a lição 3.3 constrói com gates, deixam um componente atravessar passos sem passar por uma transformação não linear completa a cada vez. E attention, que chega na lição 3.5, contorna a cadeia inteira criando uma aresta direta entre posições distantes.

Attention venceu, e venceu por dois motivos ao mesmo tempo: removeu o produto longo do caminho do gradiente e tornou o treino paralelo entre posições, já que a representação de cada posição pode ser calculada simultaneamente em vez de esperar pela anterior. A execução sequencial foi possivelmente a derrota mais decisiva — um projeto que não consegue saturar um acelerador moderno durante o treino perde independentemente dos seus outros méritos.

A aritmética que torna o reparo valioso é a da lição 3.1. Um estado de tamanho fixo custa o mesmo no token um e no token 262.144; no Qwen3.8-27B as camadas recorrentes somam cerca de 144 MiB de estado float32 de referência no total, constante no comprimento da sequência, enquanto as keys e values armazenadas das camadas de attention chegam a 16 GiB no contexto completo, como a lição 7.2 deriva. Esse abismo é a razão pela qual alguém se deu ao trabalho de consertar a RNN, e vale levá-lo para as próximas quatro lições.

02 · Analogia

Analogia

Um recado atravessa cinquenta pessoas numa corrente de sussurros. Cada uma aplica o mesmo hábito: suaviza as palavras fortes, enfatiza as familiares e passa adiante um resumo encurtado. Se cada repasse retém oitenta por cento de um detalhe, depois de muitos passos ele praticamente desaparece; se cada repasse o amplifica, o recado explode. O sinal que volta pela rede numa RNN atravessa transformações repetidas do mesmo jeito, então a atribuição de crédito a longa distância depende de um produto de sensibilidades locais.

03 · Explique de volta

Explique de volta

Descreva a RNN como resposta à pergunta do estado, mostre por que backpropagation through time produz um produto de jacobianas, e distinga o que o clipping conserta do que ele não consegue consertar.

Mínimo: 80 caracteres e 15 palavras. Seu texto fica somente neste navegador.

Aguardando sua explicação.

Comparar com uma resposta-modelo

Uma RNN calcula h_t = φ(W_hh h_{t−1} + W_xh x_t + b) com uma única transição compartilhada, então o estado que ela carrega é um vetor de tamanho fixo e o custo por token é constante no comprimento. Aprender que um token inicial causou um erro tardio exige backpropagation through time, cuja derivada de um estado tardio até um estado inicial é um produto de uma jacobiana por passo intermediário. Se os fatores relevantes ficam abaixo de um, o produto decai geometricamente até zero e o crédito distante desaparece; acima de um, ele cresce e o treino desestabiliza. Gradient clipping limita a magnitude depois da diferenciação, então controla a explosão mas não recria um sinal já atenuado na direção de zero — as duas falhas precisam de correções diferentes, e é por isso que gates e caminhos aditivos de estado vieram em seguida.

04 · Teste seu entendimento

Teste seu entendimento

01A lição 3.1 organizou as arquiteturas por quanto estado carregam entre tokens. Onde fica uma RNN simples nesse eixo?
Resposta e explicação

No extremo do tamanho fixo — um vetor limitado levado adiante, memória constante e trabalho constante por token em qualquer comprimento de sequência — Essa constância é todo o atrativo, e é também o que impõe o teto informacional que a lição 3.1 calculou.

02Por que o gradiente de uma loss tardia até um estado inicial da RNN envolve muitas multiplicações?
Resposta e explicação

O hidden state passa pela mesma transição uma vez por passo, e a regra da cadeia multiplica uma jacobiana por passo — Desenrolar transforma comprimento de sequência em profundidade, então tempo e profundidade criam produtos idênticos de derivadas locais.

03O que o gradient clipping de fato resolve?
Resposta e explicação

Apenas a magnitude do exploding gradient — ele limita uma atualização grande, mas não restaura uma que desapareceu — O clipping é aplicado depois da diferenciação, então um sinal já multiplicado até perto de zero continua minúsculo depois do clipping.

Conclua o teach-back e acerte o quiz para finalizar a aula.

◎ · Marcador de evidência

Fontes

  1. Yoshua Bengio, Patrice Simard e Paolo Frasconi (1994). Learning long-term dependencies with gradient descent is difficult.
  2. Qwen Team (2026). Qwen3.8-27B Model Card.
  3. Google Cloud (2026). bfloat16 floating-point format.
  4. PyTorch (2026). torch.nn.utils.clip_grads_with_norm_.