01-02-02 — Forward Pass e Backward Pass (Conceitual)
TL;DR
Treinamento é um loop: os dados entram, a rede faz uma previsão (forward pass), você mede o quão errada foi a previsão (loss function), e o erro propaga de volta ajustando os pesos (backward pass / backpropagation). O gradient descent é a bússola que indica qual direção ajustar. Repita milhões de vezes.
A Analogia: Aprender a Arremessar
Imagine aprender a arremessar uma bola numa cesta às cegas. Você arremessa (forward pass), alguém diz "errou por 2 metros à direita e 1 metro acima" (loss function), você ajusta o ângulo e força para a próxima tentativa (backward pass + gradient descent). Repetindo milhares de vezes, você calibra os parâmetros do arremesso sem ninguém explicar explicitamente a física.
Redes neurais aprendem exatamente assim — sem que ninguém explique as regras. Só feedback sobre o erro.
Forward Pass: Dados Fluindo
O forward pass é a direção "normal" de computação. Você entra com dados, eles percorrem a rede da esquerda para a direita, e no final você tem uma previsão.
Durante o forward pass, cada camada recebe os valores da camada anterior, aplica seus pesos e função de ativação, e passa o resultado adiante. O modelo não aprende nada ainda — está só "pensando".
Loss Function: Medir o Erro
A loss function (função de perda) transforma a diferença entre o que o modelo previu e o que era correto num único número. Quanto maior o número, pior o modelo está.
Exemplos sem matemática:
- Classificação (spam/não-spam): a loss mede quão confiante o modelo estava na resposta errada. Se ele disse "99% spam" e era legítimo, a perda é enorme
- Regressão (prever preço): a loss mede a distância entre o preço previsto e o real — como a "régua do erro"
- Geração de texto: a loss mede quão surpreso o modelo ficou com a palavra correta — se ele previu "banco" com 1% de probabilidade e era "banco", alta perda
Backward Pass: O Erro Volta
O backward pass (ou backpropagation) usa o erro calculado pela loss function e o propaga de trás para frente — da saída de volta para a entrada. Cada peso na rede recebe uma indicação de "quanto ele contribuiu para o erro" e "em que direção deve mudar para reduzir o erro".
A intuição: se um peso alto numa certa conexão resultou em erro, esse peso deveria diminuir um pouco. Se um peso estava na direção certa, deveria aumentar um pouco.
O algoritmo que faz esse cálculo de trás para frente se chama backpropagation, desenvolvido por Rumelhart, Hinton e Williams em 1986. Foi o breakthrough que tornou o treinamento de redes profundas viável.
Gradient Descent: A Bússola do Aprendizado
Imagine que os pesos da rede formam uma paisagem montanhosa. A loss é a altitude — você quer chegar no vale mais baixo (mínimo da loss). O gradient descent é o algoritmo de descer essa montanha um passo de cada vez, sempre na direção que desce mais rápido.
- Learning rate: o tamanho de cada passo. Muito grande: você pula o vale. Muito pequeno: leva eternidade
- Epoch: uma passagem completa pelo dataset de treino
- Batch: quantos exemplos você processa antes de atualizar os pesos
O Loop de Treinamento
Treinamento vs. Inference: A Diferença de Custo
Entender esse loop explica por que treinamento é caro e inference é barato:
- Treinamento: requer forward pass + backward pass + atualização de pesos. Para cada exemplo do dataset. Por milhares de epochs. GPT-3 custou ~US$4 milhões só em compute para treinar
- Inference: só o forward pass. Você passa os dados e pega a resposta. 100x–1000x mais barato que treinamento
Quando você usa a API do GPT-4, está pagando pela inference — o treinamento já aconteceu uma vez, custou muito, e a OpenAI amortiza esse custo em milhões de requisições.
Exemplo Prático: O Loop de Treino em Pseudo-Código
# Pseudocódigo conceitual — não precisa rodar
for epoch in range(num_epochs):
for batch in training_data:
# 1. Forward pass — dados fluem pela rede
predictions = model(batch.inputs)
# 2. Loss — mede o erro
loss = loss_function(predictions, batch.labels)
# 3. Backward pass — calcula gradientes
loss.backward()
# 4. Gradient descent — atualiza pesos
optimizer.step()
optimizer.zero_grad() # limpa gradientes para o próximo batch
print(f"Epoch {epoch}, Loss: {loss.item():.4f}")
# Esperamos ver esse número cair a cada epoch
Desafio
🎯 Desafio 01-02-02
Volte ao TensorFlow Playground e observe o processo de treinamento em ação:
- Escolha o dataset "Circle" e uma rede com 2 camadas ocultas
- Observe o gráfico de "Training Loss" e "Test Loss" conforme treina
- Deixe treinar por muitas iterações — o test loss começa a subir enquanto training loss cai? Se sim, você observou overfitting — memorizar em vez de aprender
- O que acontece quando você aumenta o Regularization? Como isso afeta o overfitting?
Como isso se conecta
- 🔗 01-02-01 — Os pesos ajustados durante o backward pass são os que foram descritos no tópico de neurônios e camadas
- 🔗 01-03-02 — Self-supervised learning usa esse mesmo loop, mas com uma loss function especial que não precisa de labels humanos
- 🔗 01-05-01 — "Training" e "inference" do glossário são as duas faces deste loop
Fontes
- Wikipedia — Backpropagation — Rumelhart, Hinton, Williams (1986) e fundamentos
- Wikipedia — Gradient Descent — Algoritmo, variantes e intuição geométrica
- Wikipedia — Loss Function — Tipos de loss e quando usar cada uma
- Microsoft Learn — Train Models with Azure ML — Como o treinamento funciona na prática no Azure