Redes Neurais: o Cérebro Artificial
- ⬜📈 Como a IA Aprende (Machine Learning)(Fundamentos da IA)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Redes neurais são inspiradas (vagamente) no cérebro humano. Mas não se deixe enganar pela analogia — o que realmente importa é a matemática por trás. Um neurônio artificial é uma função: recebe números, multiplica por pesos, soma e passa por uma não-linearidade. Empilhe milhões desses e você tem o sistema que reconhece rostos, traduz idiomas e gera texto. Neste módulo, vamos abrir essa caixa preta: do neurônio individual até backpropagation, loss functions, overfitting e as técnicas de regularização que fazem tudo funcionar.
O neurônio artificial, de verdade
Pesos (w) são os números que o modelo aprende durante o treino. Bias (b) é um deslocamento que permite ao neurônio ativar mesmo quando todas as entradas são zero. A função de ativação (f) introduz não-linearidade — sem ela, empilhar 100 camadas seria o mesmo que ter uma só (composição de lineares é linear).
Arquitetura: camadas empilhadas
A profundidade (número de hidden layers) dá nome ao deep learning. Camadas iniciais aprendem features simples (bordas, texturas); camadas profundas compõem essas features em representações abstratas (rostos, objetos, conceitos). Cada camada faz a mesma coisa: multiplicação matricial + bias + ativação.
Forward pass e loss function
O forward pass é simplesmente passar os dados pela rede da entrada até a saída, camada por camada. O resultado é uma previsão. A loss function mede quão longe essa previsão está do valor correto:
| Loss Function | Quando usar | Fórmula (intuição) |
|---|---|---|
| MSE (Mean Squared Error) | Regressão (prever um número) | Média de (predição - real)². Penaliza erros grandes mais que pequenos. |
| Cross-Entropy | Classificação (prever uma classe) | -Σ(y_real × log(y_pred)). Se a rede diz 90% gato e era gato, loss baixa. Se diz 10%, loss altíssima. |
| Binary Cross-Entropy | Classificação binária (sim/não) | Caso especial da cross-entropy com 2 classes. |
A loss é o único número que a rede tenta minimizar. Tudo que o modelo "aprende" durante o treino é ajustar os pesos para reduzir essa loss. A escolha da loss function errada pode fazer o modelo convergir para algo inútil.
Backpropagation: como o modelo aprende
Backpropagation é o algoritmo que calcula quanto cada peso contribuiu para o erro e em que direção ajustá-lo. Funciona em 3 passos:
A chain rule do cálculo é o coração: o gradiente de cada camada depende do gradiente da camada seguinte, multiplicado pelas derivadas locais. Assim o erro se propaga da saída até a entrada — cada peso sabe exatamente quanto e em que direção se mover.
Learning rate: o passo do aprendizado
O learning rate (lr) controla o tamanho do passo em cada atualização.lr = 0.001 é um ponto de partida comum. Alto demais: o treino oscila e diverge. Baixo demais: converge tão devagar que parece não aprender. Otimizadores modernos (Adam, AdamW) adaptam o learning rate por parâmetro, mas o valor inicial ainda importa muito.
Funções de ativação comparadas
| Ativação | Fórmula | Range | Gradiente | Quando usar |
|---|---|---|---|---|
| Sigmoid | 1 / (1 + e^(-x)) | (0, 1) | Máx 0.25 — satura | Saída binária (probabilidade) |
| Tanh | (e^x - e^(-x)) / (e^x + e^(-x)) | (-1, 1) | Máx 1.0 — satura | Saída centrada em zero (raro hoje) |
| ReLU | max(0, x) | [0, ∞) | 0 ou 1 — sem saturação | Default para hidden layers ✅ |
| Leaky ReLU | max(0.01x, x) | (-∞, ∞) | 0.01 ou 1 | Quando dying ReLU é problema |
| GELU | x × Φ(x) | (-∞, ∞) | Suave | Transformers (GPT, BERT) |
| Softmax | e^xᵢ / Σe^xⱼ | (0, 1) soma=1 | — | Última camada de classificação multi-classe |
Skip connections: o segredo das redes profundas
Redes muito profundas (100+ camadas) sofriam com um problema fundamental: o gradiente desaparecia antes de chegar às camadas iniciais (vanishing gradient), e as camadas extras não ajudavam — ou até pioravam o desempenho. A ResNet (2015) resolveu isso com uma ideia elegante: skip connections (ou residual connections).
A insight: em vez do bloco aprender a transformação completa H(x), ele aprende apenas o resíduo F(x) = H(x) - x. Se o bloco não for necessário,F(x) → 0 e a rede simplesmente passa o input adiante (identidade). Com isso, o gradiente tem um caminho direto da saída até as camadas iniciais — sem multiplicações que o encolhem.
Normalização: BatchNorm vs LayerNorm
Durante o treino, as distribuições das ativações mudam a cada batch (covariate shift interno). Isso instabiliza o treino e exige learning rates menores. Normalização resolve: padroniza as ativações para média≈0, desvio≈1 em um determinado eixo.
| Batch Normalization (BN) | Layer Normalization (LN) | |
|---|---|---|
| Normaliza ao longo de | Dimensão do batch (ex: 32 exemplos) | Dimensão das features (dentro de 1 exemplo) |
| Funciona bem com | Batch grande (CNNs, redes densas) | Batch pequeno ou tamanho variável (Transformers, NLP) |
| Durante inferência | Usa estatísticas do treino (rolling mean/var) | Sem diferença — só usa o exemplo atual |
| Usado em | ResNet, VGG, MobileNet | GPT, BERT, LLaMA, toda arquitetura Transformer |
| Problema com | Batch size 1 ou sequências variáveis | Menos eficaz com features altamente correlacionadas |
Overfitting: o inimigo número 1
Overfitting é quando o modelo decora o dataset de treino — incluindo o ruído — e perde a capacidade de generalizar para dados novos. É a diferença entre um estudante que entende a matéria e um que decora as respostas da prova anterior.
Diagnóstico: loss de treino cai mas loss de validação sobe (ou estagna). Soluções:
| Técnica | Como funciona | Quando usar |
|---|---|---|
| Dropout | Desativa aleatoriamente X% dos neurônios em cada batch de treino — força redundância | Default em redes densas (p=0.2–0.5) |
| Regularização L2 (weight decay) | Adiciona penalidade λ×Σw² à loss — pesos grandes são punidos | Quase sempre, especialmente AdamW |
| Regularização L1 | Adiciona λ×Σ|w| — empurra pesos pra zero (sparsity) | Quando quer feature selection automática |
| Early stopping | Para o treino quando validation loss começa a subir | Sempre — é grátis |
| Data augmentation | Gera variações artificiais dos dados (rotação, flip, crop) | Quando tem poucos dados |
| Batch normalization | Normaliza ativações entre camadas — estabiliza treino | Redes convolucionais, redes profundas |
Train, Validation e Test: os 3 conjuntos
Nunca use o test set pra tomar decisões durante o treino. Se fizer isso, está implicitamente overfittando no test — e o número final não vale nada. O validation set existe exatamente pra isso: tomar decisões (learning rate, quando parar, qual modelo é melhor) sem contaminar a avaliação final.
Parâmetros vs hiperparâmetros
| Parâmetros | Hiperparâmetros | |
|---|---|---|
| O que são | Pesos e biases da rede | Learning rate, batch size, dropout rate, nº de camadas |
| Quem define | O treino (backprop) | Você (humano ou search automático) |
| Quantidade | Milhões a trilhões | Dezenas |
| Exemplos | w₁, w₂, b₁, b₂ | lr=0.001, dropout=0.3, epochs=100, batch=32 |
Tipos de rede neural
📋 Classificar imagens (gato, cachorro, carro)
CNNs têm camadas convolucionais que detectam padrões espaciais (bordas, texturas, formas) sem precisar de cada pixel como input independente. Muito mais eficiente que MLP para imagens.
Alt: MLP (fully connected) — funciona mas é extremamente ineficiente — trata cada pixel como feature independente, ignora vizinhança.
📋 Prever próxima palavra em uma sequência
Transformers processam toda a sequência em paralelo com mecanismo de atenção — superam RNNs em escala e qualidade. São a base de todos os LLMs.
Alt: RNN/LSTM — processa sequencialmente (lento), sofre com vanishing gradient em sequências longas.
Na prática: treino em Python
import torch
import torch.nn as nn
# Rede simples: 784 inputs → 256 hidden → 10 classes
model = nn.Sequential(
nn.Linear(784, 256), # camada 1: 784×256 + 256 = 200.960 params
nn.ReLU(), # ativação
nn.Dropout(0.3), # regularização: desliga 30% por batch
nn.Linear(256, 10), # camada de saída: 256×10 + 10 = 2.570 params
)
loss_fn = nn.CrossEntropyLoss() # loss pra classificação
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 1 epoch de treino
for images, labels in train_loader:
pred = model(images) # forward pass
loss = loss_fn(pred, labels) # calcula loss
loss.backward() # backpropagation (calcula gradientes)
optimizer.step() # atualiza pesos
optimizer.zero_grad() # limpa gradientes pro próximo batchSão 14 linhas. É isso que acontece debaixo de todo framework de ML. loss.backward() é o backpropagation. optimizer.step() é w = w - lr × grad.
Perguntas típicas (Q&A)
❓ Mais camadas é sempre melhor?
❓ Batch normalization e dropout podem ser usados juntos?
❓ Qual a diferença entre epoch, batch e iteration?
Quiz rápido
4 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito