Fundamentos

Retropropagação, visualizada

Diferenciação em modo reverso obtém o gradiente de todo parâmetro numa única varredura cujo custo é da mesma ordem de avaliar o grafo — a única razão pela qual um modelo de 27 bilhões de parâmetros pode ser treinado.

Atualizada em

01 · Conceito

Conceito

A lição 2.4 produziu um único número: a loss. Para melhorar o modelo você precisa saber, para cada parâmetro, se cutucá-lo para cima ou para baixo tornaria aquele número menor. Existe uma forma óbvia de descobrir. Perturbe um parâmetro por uma quantidade minúscula, rode o modelo de novo, veja quanto a loss se moveu, e divida. Repita para o parâmetro seguinte.

Precifique esse plano honestamente, porque ele é o erro no qual vale entrar. Uma estimativa cuidadosa de dois lados precisa de dois forward passes por parâmetro. Para uma rede pequena com dez mil parâmetros isso são vinte mil forward passes por gradiente — lento, mas suportável. Para o Qwen3.8-27B, com aproximadamente 27 bilhões de parâmetros (Qwen3.8-27B Model Card, 2026), são 54 bilhões de forward passes para obter o gradiente de um único passo de treinamento. Se um forward pass levasse um milissegundo, um passo levaria cerca de vinte meses. Diferenças finitas não escalam mal; elas simplesmente não escalam.

A retropropagação é o que a substitui, e a melhoria não é incremental. Uma varredura para trás produz o gradiente de todo parâmetro de uma vez, a um custo da mesma ordem de avaliar o grafo. Um modelo maior ainda encarece as duas passagens; a economia é que o modo reverso não exige uma avaliação separada para cada parâmetro.

O mecanismo é a regra da cadeia aplicada a um grafo registrado. O forward pass avalia operações em ordem, salvando os valores intermediários de que as derivadas vão precisar. O backward pass começa no fim com L/L=1\partial L/\partial L=1 e percorre as operações ao contrário, e em toda operação a regra é a mesma: gradiente de jusante vezes derivada local. Cada operação só precisa saber como suas próprias saídas respondem às suas próprias entradas; ela nunca precisa saber nada sobre o resto da rede.

Faça um à mão, usando a loss da lição 2.4. Tome três logits z=(2.0,1.0,0.1)z=(2.0,\,1.0,\,0.1) com a classe observada sendo a primeira. Para frente: as exponenciais são cerca de 7.3897.389, 2.7182.718 e 1.1051.105, somando 11.21211.212, então p(0.659,0.242,0.099)p\approx(0.659,\,0.242,\,0.099) e L=ln0.6590.417L=-\ln 0.659\approx0.417. Para trás: para softmax seguido de cross-entropy o gradiente em relação aos logits colapsa no belíssimo e simples L/z=py\partial L/\partial z=p-y, que aqui é (0.6591,  0.2420,  0.0990)=(0.341,0.242,0.099)(0.659-1,\;0.242-0,\;0.099-0)=(-0.341,\,0.242,\,0.099). Leia isso como uma instrução. A classe correta carrega gradiente negativo, então o gradient descent vai elevar o logit dela. As duas classes erradas carregam gradientes positivos em proporção exata à probabilidade que tomaram, então seus logits são empurrados para baixo, a mais confiantemente errada com mais força. Agora suponha que esses logits vieram de z=Wh+bz=Wh+b para um vetor oculto hh. A mesma regra continua: L/b=py\partial L/\partial b=p-y, L/W=(py)h\partial L/\partial W=(p-y)h^{\top}, e L/h=W(py)\partial L/\partial h=W^{\top}(p-y) — esta última é a mensagem entregue à camada de baixo, que vai aplicar o procedimento idêntico com a própria derivada local.

Grafos se ramificam, e a ramificação é onde as implementações ficam sutis. Se um valor influencia a loss por dois caminhos, seu gradiente é a soma das duas contribuições, porque é isso que a regra da cadeia multivariada diz. É por isso que frameworks de autodiff acumulam em buffers de gradiente em vez de sobrescrevê-los, e consequentemente por que um loop de treinamento precisa zerar esses buffers nas fronteiras de batch: a soma é o padrão matematicamente correto para uso repetido, e só o loop sabe onde um batch termina.

A conta chega em forma de memória, não de tempo. O backward pass precisa de valores que o forward computou, então o treinamento mantém ativações vivas desde o momento em que são produzidas até que seus gradientes sejam consumidos. Multiplique isso por 64 camadas, pela largura intermediária de 17.408 dentro de cada bloco feed-forward, por toda posição de token no batch, e a memória de ativações rivaliza ou supera a memória de parâmetros. Gradient checkpointing recompra memória guardando apenas fronteiras selecionadas e recomputando o resto durante o backward — mais computação por menos memória, e uma alavanca que a lição 5.10 puxa explicitamente.

Dois hábitos mantêm isso honesto. Para qualquer operação customizada nova, faça gradient-check contra diferenças finitas numa entrada minúscula — o método que falha em escala é perfeitamente bom como teste unitário, dada precisão e tamanho de passo sensatos, longe de pontos não diferenciáveis. E antes de uma execução longa, confirme que todo parâmetro que você espera treinar tem gradiente finito e não nulo após uma loss. A imagem duradoura é um fluxo reverso de responsabilidade por um grafo registrado, onde regras puramente locais se compõem em sensibilidade global, e onde o otimizador da lição 2.7 ainda não fez absolutamente nada.

02 · Analogia

Analogia

Uma padaria registra cada transformação da farinha até os pães prontos. Quando o pão final sai denso demais, um revisor percorre o registro de trás para frente. Em cada estação ele combina a reclamação que chega de jusante com a sensibilidade local daquela estação: como a sova afetou o crescimento, como a água afetou a massa, e como a farinha afetou a absorção de água. Ingredientes compartilhados recebem reclamações de todos os caminhos. A auditoria reversa atribui responsabilidade de forma eficiente, sem assar um pão novo por botão.

03 · Explique de volta

Explique de volta

Explique forward pass, grafo computacional, gradiente de jusante, derivada local e acumulação — e depois diga por que o modo reverso, em vez de diferenças finitas, é o que torna viável treinar um modelo de 27B parâmetros.

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

Aguardando sua explicação.

Comparar com uma resposta-modelo

O forward pass computa valores intermediários e uma loss escalar, registrando um grafo de operações. O modo reverso parte de dL/dL=1, e cada nó multiplica o gradiente de jusante que chega pela sua própria derivada local antes de passar contribuições aos seus pais; quando um valor alimenta vários consumidores, as contribuições se somam. A varredura reversa inteira custa um pequeno múltiplo constante de avaliar aquele grafo, em vez de uma nova avaliação por parâmetro; um grafo maior ainda custa mais. Estimar os mesmos gradientes por diferenças finitas exigiria dois forward passes por parâmetro — dezenas de bilhões deles num modelo como o Qwen3.8-27B — e é por isso que o modo reverso não é uma otimização e sim uma precondição.

04 · Teste seu entendimento

Teste seu entendimento

01Para softmax com cross-entropy, da lição 2.4, qual é o gradiente da loss em relação aos logits?
Resposta e explicação

A distribuição prevista menos o alvo one-hot, p − y — Essa forma incomumente limpa é a razão pela qual bibliotecas fundem softmax e cross-entropy: a classe correta recebe um empurrão negativo, e toda outra classe um empurrão positivo proporcional à probabilidade que ela indevidamente tomou.

02Por que contribuições de gradiente são somadas num ponto de ramificação?
Resposta e explicação

O valor afeta a loss por múltiplos caminhos de jusante, e a regra da cadeia multivariada soma sobre todos eles — É também por isso que frameworks de autodiff acumulam em buffers de gradiente existentes em vez de sobrescrevê-los, e por que loops de treinamento precisam limpá-los nas fronteiras de batch.

03O que a retropropagação em si muda?
Resposta e explicação

Nada — ela computa gradientes, e um otimizador separado muda parâmetros — Diferenciação e atualização de parâmetros são fases distintas; confundi-las esconde qual das duas está se comportando mal.

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

◎ · Marcador de evidência

Fontes

  1. David E. Rumelhart, Geoffrey E. Hinton e Ronald J. Williams (1986). Learning representations by back-propagating errors.
  2. JAX Team (2026). Forward- and reverse-mode autodiff in JAX.
  3. Qwen Team (2026). Qwen3.8-27B Model Card.