01-02-02 — Forward Pass e Backward Pass (Conceitual)

⏱ 10 min Fontes validadas em: 2026-04-29

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.

flowchart LR D["Dados de Entrada\n(imagem, texto, números)"] --> L1["Camada 1\n(transformação)"] L1 --> L2["Camada 2\n(transformação)"] L2 --> L3["Camada 3\n(transformação)"] L3 --> P["Previsão\n(ŷ)"] P --> LF["Loss Function\nCompara ŷ com y real\n→ número = 'quanto errei'"] style D fill:#1a3a5c style P fill:#2d5a27 style LF fill:#5c1a1a

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
💡
Insight: A escolha da loss function define o que o modelo otimiza. Um modelo de linguagem treinado para minimizar "surpresa com a próxima palavra" automaticamente aprende gramática, fatos, raciocínio — não porque foi instruído, mas porque é o que ajuda a prever bem. A loss function molda o comportamento emergente.

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.

flowchart RL LF["Loss = 0.87\n(erro alto)"] -->|"quanto cada camada\ncontribuiu para o erro"| L3["Camada 3\nAjusta pesos ↑↓"] L3 -->|"propaga gradiente"| L2["Camada 2\nAjusta pesos ↑↓"] L2 -->|"propaga gradiente"| L1["Camada 1\nAjusta pesos ↑↓"] style LF fill:#5c1a1a style L3 fill:#3a2a1a style L2 fill:#3a2a1a style L1 fill:#3a2a1a

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
⚠️
Pegadinha — Local Minimum: A paisagem tem muitos vales. O gradient descent pode se prender num vale local — não o mais baixo possível. Modelos modernos usam técnicas como momentum, Adam optimizer, e learning rate schedules para evitar isso. Mas não é garantido encontrar o mínimo global — e paradoxalmente, muitos "mínimos bons" são suficientemente bons na prática.

O Loop de Treinamento

flowchart TD A["Inicializa pesos\naleatoriamente"] --> B["Pega um batch\nde dados"] B --> C["Forward Pass\n→ Calcula previsão"] C --> D["Calcula Loss\n(quanto errou)"] D --> E["Backward Pass\n→ Calcula gradientes"] E --> F["Atualiza pesos\n(gradient descent)"] F --> G{{"Mais epochs?"}} G -->|"Sim"| B G -->|"Não"| H["Modelo Treinado ✓"] style A fill:#1a2a4a style H fill:#1a4a2a style D fill:#5c1a1a

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.

🏢
Aplicação Microsoft: Azure Machine Learning gerencia esse loop de treinamento via training runs, experiments, e pipelines. Para a maioria dos casos de uso da Impar, você vai usar modelos já treinados (inference) via Azure OpenAI — não vai treinar do zero. Fine-tuning (ajustar um modelo existente) é o meio-termo.

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:

  1. Escolha o dataset "Circle" e uma rede com 2 camadas ocultas
  2. Observe o gráfico de "Training Loss" e "Test Loss" conforme treina
  3. 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
  4. O que acontece quando você aumenta o Regularization? Como isso afeta o overfitting?
📚
Para aprofundar: Wikipedia — Backpropagation cobre a história e intuição matemática. Para o gradient descent, Wikipedia — Gradient Descent tem visualizações úteis sem nível universitário de cálculo.

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

  1. Wikipedia — Backpropagation — Rumelhart, Hinton, Williams (1986) e fundamentos
  2. Wikipedia — Gradient Descent — Algoritmo, variantes e intuição geométrica
  3. Wikipedia — Loss Function — Tipos de loss e quando usar cada uma
  4. Microsoft Learn — Train Models with Azure ML — Como o treinamento funciona na prática no Azure