Fundamentos

Backpropagation, visualizado

Backpropagation aplica diferenciação reversa a um grafo e reutiliza derivadas locais para obter gradientes dos parâmetros.

Atualizada em

1

Conceito

Backpropagation é uma aplicação eficiente da regra da cadeia a um grafo computacional. Ela responde: para a loss escalar produzida neste forward, quão sensível é a loss a cada intermediário e parâmetro? Não escolhe a loss, coleta dados nem atualiza pesos. Essas responsabilidades são separadas.

Considere a=wx+ba=wx+b, h=ReLU(a)h=\operatorname{ReLU}(a) e L=(hy)2L=(h-y)^2. O forward pass avalia operações em ordem e salva valores necessários às derivadas. O grafo tem variáveis e operações conectadas. Para uma entrada, produz uma loss numérica e um registro de como ela foi construída.

O backward começa com L/L=1\partial L/\partial L=1. Para o quadrado, a derivada local é 2(hy)2(h-y), produzindo L/h\partial L/\partial h. ReLU passa esse gradiente quando a>0a>0 e o bloqueia quando a<0a<0. A operação afim gera L/w=(L/a)x\partial L/\partial w=(\partial L/\partial a)x, L/x=(L/a)w\partial L/\partial x=(\partial L/\partial a)w e L/b=L/a\partial L/\partial b=\partial L/\partial a.

O padrão é gradiente upstream vezes derivada local. Cada operação sabe como suas saídas mudam com as entradas. Reverse-mode autodiff visita operações na ordem topológica inversa, aplicando produtos vetor-Jacobiano. Não precisa materializar um Jacobiano completo gigantesco para uma loss escalar. Isso torna reverse mode eficiente com muitos parâmetros e um objetivo.

Grafos ramificam. Se xx influencia a loss por dois caminhos, sua derivada é a soma das duas contribuições. Por isso frameworks acumulam gradientes. Também por isso gradientes de parâmetros em PyTorch acumulam entre chamadas de backward até serem limpos: somar é o padrão matemático correto para vários usos, enquanto o loop decide onde termina o batch.

Memória é um compromisso central. Backward precisa de activations do forward, então o treino as guarda até calcular gradientes. Gradient checkpointing salva apenas alguns estados e recalcula intermediários no backward, trocando compute por memória. Mutação in-place pode destruir valores esperados pelo grafo; frameworks detectam alguns casos, mas código disciplinado evita aliasing surpreendente.

Gradient checking valida implementação pequena por diferenças finitas: perturba um parâmetro por +ϵ+\epsilon e ϵ-\epsilon, estima a inclinação e compara com backprop. A verificação exige precisão e passo adequados e pode falhar perto de pontos não diferenciáveis. É cara demais para treinar, mas excelente ao testar uma operação customizada.

Em redes profundas, produtos de derivadas locais podem encolher ou crescer, gerando gradientes que desaparecem ou explodem. Activation, inicialização, normalização, residual connections, clipping e arquitetura influenciam o caminho. Backprop relata fielmente a derivada da computação recebida; gradiente inútil pode refletir geometria ruim, não bug. A imagem durável é um fluxo reverso de responsabilidade, com regras locais compondo sensibilidade global.

Autodiff segue o grafo realmente executado, inclusive branches e valores destacados. Converter um tensor para número comum, mutar estado salvo ou rodar uma região em no_grad pode cortar um caminho. Inspecionar se os parâmetros esperados recebem gradientes finitos e não nulos valida o programa, não apenas a performance. Para operações customizadas, compare gradientes em vários inputs e direções, pois um único ponto pode coincidir por acaso.

Teste também o caso em que uma variável alimenta duas branches, confirmando que ambas contribuem para o gradiente acumulado.

2

Como explicar para uma criança de cinco anos

Uma padaria registra cada transformação da farinha ao pão. Quando o pão fica denso, uma revisora percorre o registro ao contrário. Em cada estação, combina a reclamação recebida com a sensibilidade local: como sovar afetou o crescimento, como água afetou a massa e como farinha absorveu água. Ingredientes compartilhados recebem contribuições de todos os caminhos. A auditoria atribui responsabilidade sem assar um pão novo para cada botão.

3

Ensine de volta

Explique forward pass, grafo, gradiente upstream, derivada local, acumulação e por que backprop não é um optimizer.

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

Salvo somente neste dispositivo.

Ver uma resposta-modelo

O forward calcula intermediários e loss escalar, formando um grafo. Reverse mode começa com dL/dL=1. Cada nó multiplica o gradiente upstream por sua derivada local e envia contribuições aos pais; contribuições somam quando um valor influencia a loss por vários caminhos. Isso obtém gradientes dos parâmetros. Backprop apenas diferencia a computação atual. O optimizer usa esses gradientes separadamente para atualizar parâmetros.

4

Teste seu entendimento

1. Por que contribuições de gradiente somam num ponto de ramificação?
Resposta e explicação

A variável afeta a loss por vários caminhos — A regra da cadeia multivariada soma todos os caminhos que ligam a variável à saída.

2. O que backpropagation muda por si só?
Resposta e explicação

Calcula gradientes; o optimizer muda parâmetros — Diferenciação e update são fases distintas.

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

Fontes

  1. David E. Rumelhart, Geoffrey E. Hinton e Ronald J. Williams (1986). Learning representations by back-propagating errors.