Trilha 19 · Machine Learning

Redes neurais e backpropagation

Empilhe perceptrons em camadas, adicione não-linearidades e ensine tudo com a regra da cadeia. É a arquitetura por trás do reconhecimento de imagem, da tradução e dos modelos de linguagem.

① Intuição

Camadas que dobram o espaço

Vimos que um perceptron só traça uma reta — e falha no XOR. A saída é empilhar neurônios em camadas. Cada neurônio da primeira camada aprende uma fronteira simples; as camadas seguintes combinam essas fronteiras em formas cada vez mais complexas. É como dobrar uma folha de papel várias vezes: o que era inseparável com um corte reto passa a ser separável.

O ingrediente mágico é a função de ativação não-linear (tanh, ReLU) entre as camadas. Sem ela, empilhar camadas seria inútil — várias transformações lineares em sequência equivalem a uma só. A não-linearidade é o que dá às redes seu poder de aproximar qualquer função.

Teorema da aproximação universal: uma rede com uma única camada oculta suficientemente larga pode aproximar qualquer função contínua com a precisão desejada. Na prática, redes profundas (muitas camadas) aprendem hierarquias de features — bordas → texturas → objetos, em visão — de forma muito mais eficiente que uma camada gigante.
② Visualização interativa

Uma rede aprende o XOR ao vivo

Clique em "treinar" e observe: as arestas (pesos) mudam de cor e espessura, a perda cai, a tabela XOR vai ficando verde e a fronteira aprendida (à esquerda) curva-se para separar os cantos. Se a rede travar num mínimo ruim, "↺ novo" reinicializa os pesos para outra trajetória.

FRONTEIRA APRENDIDA
REDE 2 → 4 → 1 (espessura = |peso|)
x1x2ŷ
x1 x2 → alvo : previsto
0  0  →  0 : 0.49
0  1  →  1 : 0.33
1  0  →  1 : 0.46
1  1  →  0 : 0.33
PERDA (loss) ↓ — época 0
loss = 0.2500

A camada oculta dobra o espaço até o XOR virar separável. As arestas mudam de cor e espessura conforme o backprop ajusta cada peso para reduzir a perda. Às vezes a rede fica presa num mínimo ruim — clique ↺ novo para reinicializar os pesos e ver outra trajetória.

③ Explicação técnica

Forward pass: da entrada à previsão

// Rede neural: camadas de neurônios + ativações não-lineares

// Forward pass de uma rede 2 → 4 → 1 (resolvendo XOR):
def forward(x):
    // camada oculta: soma ponderada + tanh (não-linearidade)
    z1 = W1 @ x + b1          // 4 somas ponderadas
    a1 = tanh(z1)             // ativação → "dobra" o espaço

    // camada de saída: + sigmoide → probabilidade em [0,1]
    z2 = W2 @ a1 + b2
    saida = sigmoid(z2)
    return saida

// A ativação é o segredo: SEM ela (a1 = z1), empilhar camadas
// colapsa numa única transformação linear — inútil para XOR.
// Com tanh/ReLU, a rede aprende fronteiras curvas arbitrárias.

Backpropagation: como os gradientes fluem para trás

// Backpropagation: a regra da cadeia em escala

// 1. Forward: calcula a saída e a perda L = (saída − alvo)²
// 2. Backward: propaga o erro da saída para trás, camada a camada,
//    usando a REGRA DA CADEIA para achar ∂L/∂w de CADA peso.

// camada de saída
dz2 = (saida - alvo) * saida * (1 - saida)   // erro · sigmoid'
dW2 = dz2 * a1
// propaga para a camada oculta
da1 = W2.T * dz2
dz1 = da1 * (1 - a1**2)               // · tanh'
dW1 = outer(dz1, x)

// 3. Atualiza todos os pesos com gradiente descendente:
//    W -= alpha * dW   (igual à lição de regressão!)

// Backprop só calcula gradientes de forma eficiente —
// quem de fato "aprende" é o gradiente descendente.
Por que demorou para decolar? Backpropagation foi popularizado em 1986, mas redes profundas só dominaram após ~2012 com três ingredientes juntos: dados em massa (ImageNet), GPUs para paralelizar a multiplicação de matrizes, e truques como ReLU, dropout e melhor inicialização que resolveram o problema do gradiente que desaparece em redes muito profundas.
④ Projeto para programar

Construindo e treinando uma rede

Mini projeto: implemente uma rede 2→2→1 em NumPy que aprende o XOR — forward, backward e a atualização dos pesos, exatamente como na visualização. Plote a curva de perda. Experimente sem a ativação (rede puramente linear) e confirme que ela nunca resolve o XOR (a perda estaciona em ~0.25).

Projeto principal: use PyTorch ou Keras para classificar dígitos manuscritos (MNIST) com uma rede densa (ex: 784→128→10). Treine com mini-batches e o otimizador Adam, e acompanhe acurácia de treino e validação por época. Você deve passar de ~97% de acurácia. Depois visualize alguns erros — quais dígitos a rede mais confunde?

Desafio extra: implemente backpropagation totalmente do zero (sem autograd) para uma rede com camadas e profundidade configuráveis, suportando ReLU e sigmoide. Valide os gradientes por gradient checking (comparando com a derivada numérica). Depois adicione mini-batches e compare a velocidade de convergência com batch completo no MNIST.

⑤ Exercícios rápidos

Teste sua intuição

Por que funções de ativação não-lineares são essenciais?
O que a backpropagation calcula?
Por que o deep learning só decolou por volta de 2012, décadas após o backprop?
⑥ Aplicações no mundo real

Onde você encontra isso

👁️

Visão computacional

Redes convolucionais (CNNs) reconhecem objetos, leem placas em carros autônomos e detectam doenças em exames de imagem. Aprendem hierarquias de features: as primeiras camadas detectam bordas, as profundas detectam olhos, rodas, tumores — tudo treinado por backpropagation.

💬

Modelos de linguagem

GPT, Claude e tradutores são redes neurais (Transformers) com bilhões de parâmetros, treinadas com gradiente descendente sobre enormes quantidades de texto. O princípio é o desta lição — forward, perda, backprop, passo — só que numa escala que exige milhares de GPUs por semanas.

🎨

Geração de imagem e áudio

Modelos de difusão (Stable Diffusion, DALL·E) e de áudio geram conteúdo aprendendo a reverter ruído. Todos treinados com backpropagation. A mesma matemática que ajusta 9 pesos para o XOR ajusta bilhões para gerar uma imagem fotorrealista a partir de texto.

← Anterior: k-means ✓ Concluir trilha: Machine Learning