🧠FFVAcademy
📈

Como a IA Aprende (Machine Learning)

8 min de leitura·+40 XP
Pré-requisitos (0/1)0%

Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.

Machine Learning não é mágica — é matemática iterativa. O modelo começa chutando (pesos aleatórios), mede o quanto errou (loss function), calcula como ajustar cada peso (backpropagation), ajusta (gradiente descendente) e repete. Bilhões de vezes. Neste artigo, você vai entender cada peça desse ciclo e por que ele funciona.

Os três paradigmas de aprendizado

Antes de entrar em como o modelo treina, é preciso entender que tipo de problema ele resolve. Existem três paradigmas fundamentais:

ParadigmaDados de treinoO que aprendeExemplos reais
SupervisionadoPares (input, label correto)Mapear input → output corretoClassificação de imagem, previsão de preço, diagnóstico médico, tradução
Não-supervisionadoDados sem labelsEstrutura, clusters, representaçõesClustering de clientes, redução de dimensão, detecção de anomalias, autoencoders
Reinforcement LearningAmbiente + recompensasPolítica: sequência de ações que maximiza recompensaAlphaGo, robótica, RLHF em LLMs, jogos Atari
💡
LLMs como GPT e Claude usam os três: pré-treino é não-supervisionado (prever próximo token), fine-tuning é supervisionado (pares pergunta/resposta), e RLHF é reinforcement learning (recompensa por respostas úteis e seguras).

Loss function: medindo o erro

Para aprender, o modelo precisa de uma métrica numérica de quão errado está. Essa métrica é a loss function (função de perda). Objetivo: minimizá-la.

🗺️ Loss functions comuns
REGRESSÃO
Prever valores contínuos
MSE = (1/n) Σ (yᵢ - ŷᵢ)²
Previsão: 0.3 · Real: 1.0
MSE = (1.0 - 0.3)² = 0.49
Penaliza erros grandes exponencialmente
CLASSIFICAÇÃO
Prever categorias discretas
Cross-Entropy = -Σ yᵢ·log(ŷᵢ)
Pred [0.1, 0.7, 0.2] → loss 0.36
Pred [0.01, 0.98, 0.01] → loss 0.02
Quanto mais confiante e certo, menor a loss
LLMs
Prever próximo token
Cross-Entropy sobre ~100k tokens
Para cada posição: -log P(token correto)
GPT-3 final: loss ≈ 1.7 (perplexidade ≈ 5.5)
Dataset: internet inteira, sem labels humanos

A loss é um número único que resume o desempenho do modelo em um batch. Todo o treinamento se resume a: ajustar pesos para diminuir esse número.

Gradiente descendente: encontrando o mínimo

Imagine a loss function como uma paisagem montanhosa. Cada peso do modelo é uma dimensão. O modelo está em algum ponto dessa paisagem e quer chegar ao vale (mínimo da loss). Ele não enxerga a paisagem toda — só sente a inclinação onde está.

🗺️ Gradiente descendente — um passo de treino
🎲Pesos aleatóriosPonto inicial na paisagem de loss (alta, longe do mínimo)
📐Calcular gradiente ∂Loss/∂wDireção de maior subida da loss (via backprop)
⬇️Dar passo na direção opostaw_novo = w_atual − lr × gradiente
🔁Repetir por N iteraçõesCada passo reduz a loss — convergência rumo ao mínimo
🎯Mínimo (ou mínimo local)Gradiente ≈ 0: atualização quase nula, treino parou de progredir

O gradiente (∂Loss/∂w) é a derivada parcial da loss em relação a cada peso. Ele aponta na direção de aumento da loss. Movemos na direção oposta (por isso o sinal negativo).

Learning rate: o hiperparâmetro mais importante

A learning rate (lr) controla o tamanho do passo. É o hiperparâmetro mais impactante do treinamento:

Learning RateComportamentoResultado
Muito grande (ex: 0.1)Pesos oscilam violentamente, loss sobe e desceDivergência — modelo não aprende
Grande (ex: 0.01)Converge rápido no início, mas instável perto do mínimoPode funcionar com lr decay
Ideal (ex: 3e-4)Converge de forma suave e estávelO sweet spot — achar esse valor é arte + ciência
Muito pequena (ex: 1e-6)Convergência extremamente lentaDesperdiça compute; pode ficar preso em mínimo local
⚠️
Na prática, a learning rate não é fixa. Usamos schedulers: warmup (começa pequena, sobe), cosine decay (desce suavemente), step decay (corta a cada N épocas). LLMs modernos usam warmup + cosine decay quase universalmente.

Backpropagation: como calcular bilhões de gradientes

Um modelo com 7 bilhões de parâmetros precisa de 7 bilhões de gradientes a cada passo. Calcular cada um individualmente seria inviável. Backpropagation resolve isso usando a regra da cadeia do cálculo.

🗺️ Forward Pass + Backward Pass
Forward Passcalcular predição
Input passa por cada camada sequencialmente. Cada camada aplica pesos + ativação. No final, temos a predição e a loss.
LOSS CALCULADA
Backward Pass (backprop)calcular gradientes
O erro (loss) é propagado de trás para frente. Regra da cadeia: ∂Loss/∂w₁ = ∂Loss/∂out × ∂out/∂hidden × ∂hidden/∂w₁. Cada camada recebe o gradiente da próxima e calcula o seu.
GRADIENTES PRONTOS
🔧Atualização de pesosotimizador
O otimizador (SGD, Adam, AdamW) usa os gradientes para atualizar cada peso: w = w - lr × gradiente. Pesos novos → próximo forward pass.
🗺️ Regra da cadeia — rede de 3 camadas
FORWARD PASS
x → [W₁] → h₁
h₁ → [W₂] → h₂
h₂ → [W₃] → ŷ
ŷ → Loss calculada
Cada camada grava saída intermediária
BACKWARD PASS
∂Loss/∂W₃ = ∂Loss/∂ŷ × ∂ŷ/∂W₃
∂Loss/∂W₂ = … × ∂h₂/∂W₂
∂Loss/∂W₁ = … × ∂h₁/∂W₁
Reutiliza gradientes já computados
Custo O(n) — não O(n²)
POR QUÊ É EFICIENTE
Cada gradiente calculado 1× apenas
Armazenado e reutilizado pelas camadas anteriores
7B params = 7B gradientes em O(7B) ops
Sem backprop: O(49B²) — inviável
A regra da cadeia é o que torna DL possível

Épocas, batches e iterações

O treinamento não processa todos os dados de uma vez. Três conceitos definem a granularidade:

ConceitoDefiniçãoExemplo (100k amostras, batch 256)
Iteração1 forward + backward + update em 1 mini-batch1 iteração = 256 amostras processadas
Época1 passagem completa pelo dataset inteiro100k / 256 ≈ 390 iterações = 1 época
Mini-batchSubconjunto dos dados processado de uma vezTamanhos comuns: 32, 64, 128, 256, 512
🗺️ Batch GD vs Mini-Batch GD vs SGD
BATCH GD
Processa 100k exemplos de uma vez
→ 1 atualização por época
✓ Gradiente matematicamente preciso
✗ Não cabe na VRAM da GPU
✗ Convergência lenta (poucas updates)
Inviável em datasets reais
MINI-BATCH GD ← PADRÃO
batch_size = 32-512 exemplos
→ ~390 atualizações por época
✓ Cabe na VRAM da GPU
✓ Ruído ajuda a escapar mínimos rasos
✓ Melhor trade-off velocidade/precisão
PyTorch/JAX/TF: default em 95% dos casos
SGD ESTOCÁSTICO
batch_size = 1 exemplo
→ 100k atualizações por época
✓ Atualiza com frequência máxima
✗ Gradiente extremamente ruidoso
✗ Não usa paralelismo da GPU
Raramente usado em produção moderna

Otimizadores: além do SGD

SGD (Stochastic Gradient Descent) é o algoritmo base, mas tem limitações: a mesma learning rate para todos os parâmetros, sem memória de gradientes anteriores. Otimizadores modernos resolvem isso:

OtimizadorIdeia centralUsado em
SGDw = w - lr × g. Simples, sem estado.Baseline, CNNs com fine-tuning
SGD + MomentumMantém velocidade (média móvel do gradiente). Suaviza oscilações.CNNs, ResNets
RMSPropDivide lr pela média móvel de g². Normaliza a escala por parâmetro.RNNs (historicamente)
AdamCombina Momentum + RMSProp. lr adaptativa por parâmetro.Default na maioria dos cenários
AdamWAdam + weight decay desacoplado. Regularização mais correta.LLMs (GPT, LLaMA, Claude)
python
# Adam em pseudocódigo:
# m = média móvel do gradiente (momento)
# v = média móvel do gradiente² (variância)
# beta1=0.9, beta2=0.999, eps=1e-8

m = beta1 * m + (1 - beta1) * g          # atualiza momento
v = beta2 * v + (1 - beta2) * g**2       # atualiza variância
m_hat = m / (1 - beta1**t)          # correção de bias
v_hat = v / (1 - beta2**t)          # correção de bias
w = w - lr * m_hat / (sqrt(v_hat) + eps)  # atualiza peso

# Intuição: parâmetros com gradientes grandes e consistentes
# recebem steps menores. Parâmetros com gradientes pequenos
# recebem steps proporcionalmente maiores.

📋 Qual otimizador usar?

AdamW

Default seguro para 90% dos casos. lr=3e-4 com warmup + cosine decay é o ponto de partida mais testado. Todos os LLMs modernos usam AdamW.

Alt: SGD + MomentumQuando você tem compute sobrando e quer explorar a paisagem de loss com mais cuidado (pesquisa, fine-tuning delicado).

O ciclo completo: treinamento end-to-end

🗺️ Loop de treinamento
📦Datasetpreparação
Dividir em train/val/test. Shuffle. Criar DataLoader com mini-batches.
PARA CADA ÉPOCA
Forward Passinferência
Input passa pelas camadas → predição → loss calculada.
BACKPROP
Backward Passgradientes
Loss propagada de trás para frente. Gradiente de cada peso calculado via regra da cadeia.
OTIMIZADOR
🔧AtualizaçãoAdam/AdamW
Pesos atualizados usando os gradientes. lr ajustada pelo scheduler.
REPETIR
📊Validaçãoa cada N steps
Avaliar no val set sem atualizar pesos. Se val loss parar de cair: early stopping ou reduzir lr.

Quando parar? Underfitting vs Overfitting

🗺️ As duas falhas do treinamento
UNDERFITTING
Train loss alta — modelo não aprendeu
Val loss alta — não generaliza
Gap pequeno (ambas altas)
Causa: modelo pequeno demais, poucas épocas, lr baixa, features ruins
Fix: modelo maior, mais épocas, features melhores
OVERFITTING
Train loss baixa — modelo decorou treino
Val loss sobe após certo ponto
Gap grande (train ≠ val)
Causa: modelo grande, dataset pequeno, sem regularização
Fix: mais dados, dropout, weight decay, early stopping
ProblemaSintomaSolução
UnderfittingTrain loss alta, val loss altaModelo maior, mais épocas, lr maior, features melhores
OverfittingTrain loss baixa, val loss sobeMais dados, dropout, weight decay, early stopping, data augmentation
Bom fitAmbas baixas, gap pequenoManter — esse é o objetivo

Perguntas e respostas

Pré-treino de LLMs usa qual paradigma?

Não-supervisionado (self-supervised, mais precisamente). O modelo recebe texto e tenta prever o próximo token. O “label” é o próprio texto deslocado uma posição. Não precisa de anotação humana — o dataset é a internet inteira. Depois vem fine-tuning (supervisionado) e RLHF (reinforcement learning).

O que é gradient clipping e por que LLMs precisam?

Gradient clipping limita a magnitude do gradiente antes da atualização. Se a norma de g excede um threshold, escala g proporcionalmente. Em modelos profundos (96+ camadas), gradientes podem explodir durante backprop (exploding gradients). Clipping estabiliza o treinamento. Valor típico: max_norm=1.0.

Por que não usar learning rate alta com scheduler e pronto?

Porque com lr muito alta, os primeiros passos são destrutivos — os pesos divergem antes do scheduler ter chance de reduzir. Por isso usamos warmup: lr começa próxima de zero e sobe linearmente por ~1-5% dos steps, então o cosine decay começa a partir do pico. Isso dá tempo para o modelo “se orientar” antes de acelerar.
O que você aprendeu: os três paradigmas de ML (supervisionado, não-supervisionado, RL), como loss functions medem o erro, como gradiente descendente minimiza a loss, o papel crítico da learning rate e dos schedulers, como backpropagation calcula bilhões de gradientes eficientemente, a diferença entre batch/mini-batch/SGD, e otimizadores modernos (Adam, AdamW). Próximo passo: entender a estrutura que torna tudo isso possível — as redes neurais.
🧩

Quiz rápido

4 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito

Continue lendo