Overfitting e Regularização

Visão geral: o que “sobreajuste (overfitting)” realmente significa

Sobreajuste acontece quando um modelo aprende padrões que funcionam bem nos dados de treinamento (training data), mas não generalizam para dados novos, não vistos. Na prática, isso costuma aparecer como o modelo capturando ruído, correlações espúrias ou idiossincrasias do conjunto de treinamento, em vez do sinal subjacente.

Um modelo mental útil:

  • Erro de treinamento (training error) mede o quão bem o modelo se ajusta ao que ele já viu.
  • Erro de generalização (generalization error) mede o quão bem ele se sai em novas amostras do mesmo processo gerador de dados.
  • Sobreajuste é a lacuna entre os dois: um modelo que é “bom demais” no conjunto de treinamento em comparação com validação/teste.

Isso está intimamente ligado às trocas descritas em Generalização & Viés/Variância (Generalization & Bias/Variance): sobreajuste é tipicamente um regime de alta variância (high-variance) (as previsões do modelo variam demais com pequenas mudanças nos dados de treinamento).

Memorização vs generalização

As pessoas frequentemente descrevem sobreajuste como “memorização”, mas há nuances:

  • Memorização benigna (benign memorization): o modelo armazena alguns exemplos de treinamento enquanto ainda aprende padrões generalizáveis (comum em grandes redes neurais (neural networks)).
  • Memorização prejudicial (harmful memorization): o modelo depende de peculiaridades de instâncias do treinamento (por exemplo, pixels de fundo, artefatos do conjunto de dados) que não se transferem.
  • Memorização relevante para privacidade (privacy-relevant memorization): o modelo retém informação suficiente para vazar exemplos de treinamento (por exemplo, por meio de inferência de pertencimento (membership inference) ou ataques de extração de dados (data extraction attacks)). Regularização e boas práticas de manuseio de dados reduzem o risco, mas privacidade frequentemente exige técnicas adicionais.

Uma definição prática: um modelo está “memorizando” quando seu desempenho depende de características que não são estáveis entre diferentes amostragens da distribuição de dados, ou quando ele falha sob pequenas mudanças de distribuição e perturbações que um conceito realmente aprendido suportaria.

Por que o sobreajuste acontece: capacidade, dados e otimização

Sobreajuste não é apenas “modelo grande demais”. Ele emerge de uma interação de:

  • Capacidade do modelo (número de parâmetros, complexidade da classe de hipóteses (hypothesis class))
  • Tamanho e diversidade dos dados (cobertura do espaço de entrada; ruído nos rótulos)
  • Procedimento de treinamento (otimização, número de épocas (epochs), aumento de dados)
  • Desenho de avaliação (vazamento pode se passar por generalização)

A teoria do aprendizado formaliza isso: se sua classe de hipóteses é muito rica, você consegue ajustar muitas funções consistentes com os dados de treinamento. O desafio é selecionar uma que generalize. Medidas de complexidade como Dimensão VC (VC Dimension) e arcabouços como Aprendizado PAC (PAC Learning) conectam capacidade à complexidade amostral (sample complexity) e a limites de generalização (generalization bounds).

O aprendizado profundo (deep learning) moderno adiciona um detalhe: mesmo modelos superparametrizados (overparameterized) podem generalizar bem, dependendo da otimização e de vieses indutivos (por exemplo, o viés implícito da descida de gradiente estocástica (SGD)). Ainda assim, sobreajuste segue comum, especialmente com conjuntos de dados pequenos, ruído nos rótulos ou vazamento.

Como diagnosticar sobreajuste na prática

1) Use divisões adequadas de dados (e evite vazamento)

Uma configuração padrão:

  • Treino: ajustar parâmetros
  • Validação (validation): ajustar hiperparâmetros / selecionar checkpoints
  • Teste: avaliação final, única

Fontes comuns de vazamento:

  • Pré-processamento (normalização, PCA) ajustado no conjunto completo em vez de apenas no treino
  • Duplicatas ou quase-duplicatas entre as divisões
  • Dados de séries temporais divididos aleatoriamente em vez de cronologicamente
  • Vazamento por paciente em dados médicos (mesmo paciente em treino e teste)
  • Aumentos aplicados antes da divisão (criando cópias correlacionadas entre divisões)

Se sua acurácia de validação estiver suspeitamente alta, primeiro assuma vazamento.

2) Compare curvas de treino vs validação

Plote perda/acurácia vs época:

  • Padrão de sobreajuste: a perda de treino segue diminuindo, a perda de validação atinge um mínimo e depois aumenta.
  • Padrão de subajuste (underfitting): tanto a perda de treino quanto a de validação permanecem altas.

Este é um dos diagnósticos mais confiáveis e agnósticos ao modelo.

3) Curvas de aprendizado (learning curves) vs tamanho do conjunto de dados

Treine com quantidades crescentes de dados:

  • Se o desempenho de validação melhora continuamente com mais dados, você provavelmente tem problemas de variância / escassez de dados.
  • Se tanto treino quanto validação são ruins, você pode ter viés / incompatibilidade do modelo.

4) Checagens de sensibilidade (sondagens de robustez)

Modelos com sobreajuste frequentemente quebram sob:

  • Pequenas perturbações na entrada (ruído, desfoque, compressão)
  • Pequenas mudanças de distribuição (iluminação, fundos diferentes)
  • Avaliação por subpopulação (desempenho colapsa para uma fatia dos dados)

5) “Testes de sanidade” para vazamento de rótulos/características

Tente:

  • Treinar com rótulos embaralhados: um modelo de alta capacidade muitas vezes consegue ajustá-los; se conseguir, indica que a capacidade é grande o suficiente para memorizar.
  • Remover características suspeitas: se o desempenho colapsar, o modelo pode ter explorado artefatos.

A ideia central da regularização (regularization)

Regularização é qualquer técnica que envies(a) o aprendizado em direção a soluções “mais simples” ou mais estáveis e para longe de ajustar ruído. A formulação mais clássica é:

[ \min_{\theta}; \underbrace{\frac{1}{n}\sum_{i=1}^n \ell(f_\theta(x_i), y_i)}{\text{risco empírico}} ;+;\lambda \underbrace{\Omega(\theta)}{\text{penalidade de regularização}} ]

  • (\ell) é a perda (por exemplo, entropia cruzada (cross-entropy), erro quadrático médio (MSE))
  • (\Omega(\theta)) mede complexidade (por exemplo, normas dos pesos)
  • (\lambda) controla a força da regularização

Você também pode interpretar regularização como:

  • Restringir o espaço de hipóteses (por exemplo, limitar a profundidade de uma árvore)
  • Adicionar ruído (por exemplo, dropout)
  • Parar antecipadamente (early stopping) antes de ajustar ruído (parada antecipada)
  • Injetar conhecimento prévio (priors bayesianos / estimação MAP)

Métodos clássicos de regularização explícita

Regularização L2 (Ridge / decaimento de pesos (weight decay))

Adiciona (\lambda |\theta|_2^2). Efeitos:

  • Encolhe pesos de forma suave
  • Incentiva representações distribuídas
  • Frequentemente melhora a estabilidade e reduz a sensibilidade ao ruído

Em aprendizado profundo, o decaimento de pesos é amplamente usado; com otimizadores adaptativos, o decaimento de pesos desacoplado correto (por exemplo, AdamW) costuma ser preferível.

Exemplo (regressão Ridge do scikit-learn):

from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

model = make_pipeline(StandardScaler(), Ridge(alpha=1.0))
model.fit(X_train, y_train)
print(model.score(X_val, y_val))

Regularização L1 (Lasso)

Adiciona (\lambda |\theta|_1). Efeitos:

  • Produz soluções esparsas (muitos pesos se tornam exatamente zero)
  • Funciona como seleção de características em modelos lineares
  • Útil quando muitas características são irrelevantes

Exemplo:

from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

model = make_pipeline(StandardScaler(), Lasso(alpha=1e-3, max_iter=20000))
model.fit(X_train, y_train)

Rede Elástica (Elastic Net)

Combina L1 e L2; frequentemente funciona melhor do que L1 puro quando as características são correlacionadas.

Norma máxima (max-norm) / restrições de norma

Em vez de adicionar uma penalidade, restringe diretamente (|\theta|\le c). Comum em redes neurais para estabilidade.

Regularização limitando a capacidade do modelo

Nem toda regularização é um termo de penalidade; muitos modelos têm controles estruturais que regulam a complexidade.

Árvores de decisão (decision trees) e boosting

  • Limitar max_depth
  • Aumentar min_samples_leaf
  • Usar subamostragem (subsampling) (Florestas Aleatórias (Random Forests), gradient boosting estocástico (stochastic gradient boosting))
  • Usar encolhimento (shrinkage) / taxa de aprendizado (learning rate) em boosting

Isso reduz variância e evita ajustar divisões idiossincráticas.

k-vizinhos mais próximos (k-NN)

  • (k) menor → mais variância (mais sobreajuste)
  • (k) maior → fronteira de decisão mais suave (mais viés)

Redes neurais

  • Reduzir largura/profundidade (às vezes)
  • Usar gargalos (bottlenecks) ou embeddings menores
  • Usar vieses indutivos arquiteturais (por exemplo, localidade de redes neurais convolucionais (CNN), restrições de atenção (attention))

Regularização via o procedimento de treinamento (muito comum em aprendizado profundo)

Parada antecipada

Pare o treinamento quando a perda de validação parar de melhorar. Isso funciona porque modelos frequentemente aprendem padrões simples primeiro e, depois, ajustam ruído.

Esboço de parada antecipada no estilo PyTorch:

best_val = float("inf")
patience = 5
bad = 0

for epoch in range(100):
    train_one_epoch(model, train_loader, optimizer)
    val_loss = evaluate(model, val_loader)

    if val_loss < best_val - 1e-4:
        best_val = val_loss
        bad = 0
        best_state = {k: v.cpu().clone() for k, v in model.state_dict().items()}
    else:
        bad += 1
        if bad >= patience:
            break

model.load_state_dict(best_state)

Dropout

Zera ativações aleatoriamente durante o treinamento, forçando redundância e desestimulando coadaptação. Frequentemente eficaz para:

  • conjuntos de dados pequenos/médios
  • camadas totalmente conectadas

Menos universalmente benéfico em arquiteturas modernas, onde outros regularizadores e grandes volumes de dados dominam, mas ainda é uma ferramenta útil.

Aumento de dados (data augmentation)

Uma das ferramentas anti-sobreajuste mais poderosas em visão/áudio e, às vezes, em processamento de linguagem natural (NLP):

  • Visão: recortes aleatórios, espelhamentos, jitter de cor, RandAugment
  • Áudio: mascaramento temporal, mascaramento de frequência (SpecAugment)
  • Texto: aumento cauteloso (back-translation, corrupção de trechos)

O aumento de dados eleva a diversidade efetiva do conjunto de dados e incentiva invariâncias que você deseja.

Suavização de rótulos (label smoothing)

Substitui rótulos one-hot por uma distribuição suavizada (por exemplo, 0,9 na classe verdadeira, 0,1 distribuído entre as demais). Benefícios:

  • reduz previsões excessivamente confiantes
  • pode melhorar calibração e generalização

Mixup / CutMix (visão, às vezes além)

Crie exemplos sintéticos misturando entradas e rótulos:

  • Mixup: combinação convexa de duas amostras
  • CutMix: colar um patch de uma imagem em outra; misturar rótulos pela área

Isso pode reduzir significativamente a memorização em conjuntos de dados pequenos/médios.

Injeção de ruído

Adicione ruído às entradas, pesos ou gradientes. Isso desencoraja soluções frágeis e pode aproximar certos efeitos bayesianos.

Regularização implícita (conceito importante)

Mesmo sem penalidades explícitas, o treinamento pode enviesar para soluções mais simples:

  • SGD frequentemente prefere mínimos “mais planos” que generalizam melhor (heuristicamente)
  • Restrições arquiteturais (convoluções, pooling) incorporam viés indutivo
  • Escolhas de otimização (tamanho do lote (batch size), agendamentos de taxa de aprendizado (learning rate schedules)) alteram a generalização

Esse é um dos motivos pelos quais redes profundas podem generalizar apesar de conseguirem ajustar perfeitamente os dados de treinamento. Ainda assim, confiar apenas em efeitos implícitos é arriscado quando os dados são poucos ou ruidosos.

Um exemplo didático concreto: regressão polinomial

Uma ilustração clássica: ajustar um polinômio de alto grau a amostras ruidosas.

  • Grau 1–3: pode subajustar (alto viés)
  • Grau 10–20: pode interpolar ruído (alta variância)

Regularização (por exemplo, L2) ou validação cruzada pode selecionar um grau/penalidade que generalize.

Lição-chave: sobreajuste é relativo aos seus dados. Um modelo complexo pode estar ok com dados suficientes, e um modelo simples pode ter sobreajuste se houver vazamento de dados.

Escolhendo a força da regularização: validação e validação cruzada

Regularização adiciona hiperparâmetros (por exemplo, (\lambda), taxa de dropout). Eles devem ser selecionados usando um conjunto de validação ou validação cruzada (cross-validation).

Fluxo de trabalho típico:

  1. Definir um espaço de busca (escala log para (\lambda))
  2. Treinar modelos na divisão de treino
  3. Escolher os melhores hiperparâmetros na validação
  4. Retreinar (opcional) e avaliar uma vez no teste

Para conjuntos de dados pequenos, validação cruzada k-fold (k-fold cross-validation) costuma ser mais confiável do que uma única divisão de validação.

Regularização em aprendizado profundo moderno: receitas comuns

Decaimento de pesos + aumento de dados + parada antecipada

Uma linha de base robusta para muitas tarefas:

  • Use AdamW ou SGD com momento (momentum)
  • Use decaimento de pesos moderado
  • Use aumento de dados forte e apropriado à tarefa
  • Use parada antecipada ou seleção de checkpoint pela métrica de validação

Quando o dropout ajuda (e quando não ajuda)

Dropout pode ajudar quando:

  • o conjunto de dados é pequeno
  • o modelo é propenso à coadaptação
  • você está usando grandes camadas densas

Pode ser menos útil (ou prejudicial) quando:

  • o modelo já tem regularização/aumento de dados fortes
  • o treinamento é muito ajustado e os dados são grandes
  • certas arquiteturas são sensíveis (frequentemente é substituído por outros métodos)

Normalização por lote (batch normalization) não é “regularização”, mas pode se comportar como tal

BatchNorm estabiliza principalmente a otimização, mas o ruído de minilote (mini-batch) pode ter um efeito colateral regularizador. Não confie nele como sua principal defesa contra sobreajuste.

Como evitar memorização: um checklist prático

Higiene de dados e avaliação (maior alavancagem)

  • Garanta que não há vazamento no pré-processamento (ajuste transformações apenas no treino)
  • Deduplicate amostras quase idênticas entre divisões
  • Use divisões por grupo/tempo quando apropriado
  • Mantenha um conjunto de teste realmente intocado

Compatibilize capacidade aos dados

  • Comece com um modelo mais simples ou um backbone pré-treinado (pretrained backbone) com uma cabeça (head) pequena
  • Reduza parâmetros ou restrinja a estrutura se você tiver dados limitados

Use aumento de dados forte e apropriado à tarefa

  • Codifique invariâncias conhecidas (translação, iluminação, ruído)
  • Prefira transformações realistas

Adicione regularização explícita

  • Decaimento de pesos (L2) é um padrão forte
  • Considere dropout, suavização de rótulos, mixup dependendo do domínio

Use parada antecipada e checkpointing

  • Monitore a perda de validação e pare antes de treinar em excesso
  • Salve o melhor modelo na validação, não o da última época

Melhore a qualidade dos dados

  • Corrija ruído nos rótulos, se possível
  • Remova amostras ambíguas ou corrompidas
  • Use diretrizes de rotulagem melhores

Regularização como prior bayesiano (perspectiva teórica)

Muitas penalidades correspondem a priors na inferência bayesiana:

  • Penalidade L2 ↔ prior Gaussiano nos pesos
  • Penalidade L1 ↔ prior de Laplace (promove esparsidade)

Minimizar “perda + penalidade” é equivalente à estimação de máximo a posteriori (MAP) sob esses priors. Essa visão esclarece por que a regularização ajuda: ela injeta crenças prévias como “pesos devem ser pequenos a menos que os dados sugiram fortemente o contrário”.

Complicações modernas: descida dupla (double descent) e interpolação (interpolation)

A intuição clássica de viés/variância diz que o erro de teste diminui e depois aumenta à medida que a complexidade do modelo cresce. Cenários modernos podem exibir descida dupla: depois que o modelo se torna poderoso o suficiente para interpolar os dados de treinamento, o erro de teste pode cair novamente.

Implicação: “ajustar perfeitamente os dados de treinamento” não significa automaticamente generalização ruim. No entanto:

  • isso frequentemente significa quando os dados são pequenos/ruidosos,
  • e o risco de memorização relevante para privacidade pode aumentar.

Então você ainda precisa de diagnósticos (curvas de validação, checagens de robustez) e estratégias de regularização apropriadas ao seu domínio e às suas restrições de risco.

Exemplo prático: decaimento de pesos e parada antecipada em PyTorch

import torch
import torch.nn as nn

model = nn.Sequential(
    nn.Linear(100, 256),
    nn.ReLU(),
    nn.Dropout(p=0.2),
    nn.Linear(256, 10)
)

optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=1e-2)
criterion = nn.CrossEntropyLoss(label_smoothing=0.1)

best_val = float("inf")
patience, bad = 3, 0

for epoch in range(50):
    model.train()
    for x, y in train_loader:
        logits = model(x)
        loss = criterion(logits, y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    model.eval()
    val_loss = 0.0
    with torch.no_grad():
        for x, y in val_loader:
            val_loss += criterion(model(x), y).item()
    val_loss /= len(val_loader)

    if val_loss < best_val:
        best_val = val_loss
        bad = 0
        best_state = {k: v.cpu().clone() for k, v in model.state_dict().items()}
    else:
        bad += 1
        if bad >= patience:
            break

model.load_state_dict(best_state)

Isso combina vários regularizadores:

  • weight_decay (tipo L2)
  • dropout
  • label smoothing
  • early stopping via perda de validação

Em projetos reais, você também adicionaria aumento de dados forte (quando aplicável) e uma lógica robusta de divisão de dados.

Modos comuns de falha (e como identificá-los)

  • Validação melhora, teste falha: provável vazamento por ajuste (tuning) ou incompatibilidade de distribuição; verifique a divisão e se o teste realmente reflete a implantação.
  • Acurácia de treino ~100%, validação estagnada: sobreajuste clássico; aumente dados/aumento de dados, adicione regularização, reduza capacidade ou pare mais cedo.
  • Treino e validação ruins: subajuste; aumente capacidade, treine por mais tempo, melhore características ou reduza regularização.
  • Alta variância entre sementes aleatórias: sugere instabilidade; considere mais dados, regularização mais forte, técnicas de ensemble (ensembling) ou uma otimização mais conservadora.

Resumo

  • Sobreajuste é uma falha de generalização: o modelo ajusta padrões dos dados de treinamento que não se transferem.
  • Diagnosticar sobreajuste depende de divisões adequadas, curvas treino–validação e checagens de robustez; sempre descarte primeiro vazamento de dados.
  • Regularização é qualquer mecanismo que vies(a) o aprendizado em direção a soluções que generalizam: penalidades explícitas (L1/L2), controle de capacidade, parada antecipada, dropout, aumento de dados, suavização de rótulos e mais.
  • O aprendizado profundo moderno complica o quadro (por exemplo, regularização implícita, descida dupla), mas as defesas práticas permanecem consistentes: boa higiene de avaliação, capacidade de modelo apropriada, aumento de dados forte e controle do treinamento orientado por validação.

Para o contexto teórico mais amplo de por que essas trocas surgem, veja Generalização & Viés/Variância, e para fundamentos de aprendibilidade/capacidade veja Aprendizado PAC e Dimensão VC.