Regularização

O que é regularização?

Regularização é qualquer técnica que reduz o sobreajuste (overfitting) — a tendência de um modelo ter bom desempenho nos dados de treinamento, mas ir mal em dados novos, não vistos. Em aprendizado profundo (deep learning), a regularização geralmente funciona por meio de:

  • Limitar a capacidade efetiva do modelo (por exemplo, penalizar pesos grandes, descartar unidades aleatoriamente)
  • Injetar ruído durante o treinamento (por exemplo, descarte (dropout), aumento de dados (data augmentation))
  • Adicionar restrições ou preferências que favoreçam soluções “mais simples” (por exemplo, suavidade, esparsidade)
  • Interromper o treinamento antes da memorização (parada antecipada (early stopping))

A regularização está intimamente ligada à dinâmica de treinamento e à otimização; escolhas em Otimizadores, Agendamentos da Taxa de Aprendizado e Inicialização e Normalização também influenciam a generalização.

Sobreajuste vs. generalização (intuição)

Um modelo entra em sobreajuste quando aprende padrões específicos do conjunto de treinamento (incluindo ruído ou coincidências), em vez do sinal subjacente. Sintomas comuns:

  • A perda de treinamento continua diminuindo enquanto a perda de validação estabiliza ou aumenta
  • Grande diferença entre a acurácia de treinamento e a de validação
  • Sensibilidade a pequenas mudanças na entrada ou na divisão do conjunto de dados

A regularização busca reduzir essa diferença ao enviesar o aprendizado em direção a soluções que generalizam.

Fundamentos teóricos (por que a regularização funciona)

Controle de capacidade e o trade-off viés–variância

O erro de generalização pode ser decomposto, de forma aproximada, em:

  • Viés (bias): erro por suposições excessivamente simples (subajuste (underfitting))
  • Variância (variance): erro por sensibilidade a flutuações nos dados (sobreajuste)

A regularização tipicamente aumenta um pouco o viés enquanto reduz a variância, melhorando o desempenho em dados não vistos.

Redes profundas podem ter capacidade extremamente alta, então o controle de variância costuma ser crucial.

Minimização regularizada do risco empírico

A maior parte do treinamento minimiza o risco empírico (perda de treinamento):

[ \min_\theta \ \frac{1}{N}\sum_{i=1}^N \mathcal{L}(f_\theta(x_i), y_i) ]

Uma forma regularizada comum adiciona uma penalidade:

[ \min_\theta \ \frac{1}{N}\sum_{i=1}^N \mathcal{L}(f_\theta(x_i), y_i) + \lambda , \Omega(\theta) ]

  • (\Omega(\theta)) é um regularizador (por exemplo, (|\theta|_2^2))
  • (\lambda) controla a força da regularização

Essa é a lente para decaimento de pesos (weight decay), L1, restrições de norma máxima (max-norm), etc.

Interpretação bayesiana (estimação MAP)

Se você enxergar o treinamento como inferência probabilística, a regularização corresponde a impor um prior sobre os parâmetros. Por exemplo:

  • Regularização L2 corresponde a um prior Gaussiano (Gaussian prior) sobre os pesos
  • Regularização L1 corresponde a um prior de Laplace (Laplace prior) (incentivando esparsidade)

Minimizar “perda + penalidade” pode ser interpretado como estimação máxima a posteriori (MAP).

Regularização implícita

Mesmo sem penalidades explícitas, procedimentos de treinamento podem regularizar:

  • Ruído do SGD (amostragem por mini-batches) pode enviesar em direção a mínimos mais “planos”
  • Parada antecipada restringe o quanto a otimização avança
  • Alguns métodos de normalização e escolhas arquiteturais reduzem a capacidade efetiva

Essa é uma das razões pelas quais o aprendizado profundo pode generalizar apesar da sobreparametrização.

Decaimento de pesos (regularização L2) na prática

O que faz

O decaimento de pesos desencoraja pesos grandes adicionando uma penalidade proporcional ao quadrado da norma dos pesos:

[ \Omega(\theta)=|\theta|_2^2 ]

Isso tende a:

  • Suavizar a função (pequenas mudanças na entrada levam a mudanças menores na saída)
  • Reduzir a sensibilidade a ruído
  • Melhorar robustez e generalização

“Regularização L2” vs. “decaimento de pesos” (distinção importante)

Para SGD “puro”, regularização L2 e decaimento de pesos são efetivamente a mesma coisa. Mas para otimizadores adaptativos como Adam, eles diferem:

  • Regularização L2 adiciona (\lambda \theta) ao gradiente.
  • Decaimento de pesos desacoplado (decoupled weight decay) (por exemplo, AdamW) encolhe diretamente os pesos a cada passo, independentemente do escalonamento do gradiente.

No aprendizado profundo moderno, AdamW geralmente é preferido porque se comporta de forma mais consistente entre parâmetros.

Exemplo prático em PyTorch (AdamW)

import torch
import torch.nn as nn

model = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Linear(256, 10)
)

# Decoupled weight decay (recommended with Adam-like optimizers)
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=1e-2)

Quais parâmetros devem receber decaimento de pesos?

Uma boa prática comum é:

  • Aplicar decaimento de pesos a matrizes de pesos
  • Não aplicar decaimento de pesos a vieses e parâmetros de normalização (escala e deslocamento do BatchNorm/LayerNorm)

Muitas bases de código de treinamento implementam “grupos de parâmetros” para controlar isso.

Valores típicos

  • Modelos de visão frequentemente usam 1e-4 a 1e-2
  • Transformers comumente usam 0.01 a 0.1 (mas depende fortemente do tamanho do batch, do conjunto de dados e da taxa de aprendizado)

O decaimento de pesos interage com a otimização; veja Otimizadores e Agendamentos da Taxa de Aprendizado.

Regularização L1 e esparsidade

Regularização L1 adiciona (\lambda |\theta|_1). Em comparação com L2, ela tende a produzir parâmetros esparsos (muitos pesos se tornam exatamente ou quase zero), o que pode ajudar em:

  • Seleção de atributos (features) em modelos lineares
  • Compressão / restrições de esparsidade

Em redes profundas grandes, L1 “pura” é menos comum do que decaimento de pesos, mas variantes como rede elástica (elastic net) (L1 + L2) aparecem em alguns cenários.

Descarte (regularização estocástica)

Ideia central

Descarte “derruba” (zera) aleatoriamente uma fração das ativações durante o treinamento. Isso impede coadaptação: neurônios não podem depender de neurônios específicos estarem presentes, o que promove redundância e robustez.

Se (p) é a probabilidade de descarte, cada unidade é mantida com probabilidade (1-p).

Comportamento em treino vs. avaliação

  • Treinamento: zera ativações aleatoriamente
  • Avaliação: usa a rede completa, com escalonamento aplicado para que a ativação esperada corresponda à do treinamento

A maioria dos frameworks implementa descarte invertido (inverted dropout), que escala as ativações durante o treinamento para que a avaliação não exija escalonamento.

Exemplo em PyTorch

import torch.nn as nn

class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(784, 512),
            nn.ReLU(),
            nn.Dropout(p=0.5),
            nn.Linear(512, 10)
        )

    def forward(self, x):
        return self.net(x)

Onde o descarte ajuda (e onde pode não ajudar)

  • Frequentemente útil em MLPs e em alguns componentes de atenção/Transformer (dropout de atenção, dropout residual).
  • Em CNNs modernas, aumento de dados pesado + decaimento de pesos às vezes torna o descarte menos necessário.
  • Descarte excessivo pode desacelerar a convergência ou causar subajuste.

Variantes relacionadas

  • DropConnect: descarta pesos em vez de ativações
  • Profundidade estocástica / DropPath (Stochastic Depth / DropPath): descarta ramificações residuais inteiras (comum em ResNets e Vision Transformers)
  • Descarte MC (MC Dropout): mantém o descarte ativo na inferência para aproximar incerteza (mais uma técnica de incerteza, mas baseada em descarte)

Parada antecipada

O que é

Parada antecipada interrompe o treinamento quando o desempenho na validação para de melhorar. É um dos regularizadores mais simples e eficazes, especialmente quando modelos conseguem memorizar.

Ela funciona porque muitos modelos primeiro aprendem padrões gerais e, depois, gradualmente ajustam ruído.

Padrão prático (com paciência)

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

for epoch in range(100):
    train_one_epoch(model, optimizer, train_loader)

    val_loss = evaluate(model, val_loader)
    if val_loss < best_val - 1e-4:
        best_val = val_loss
        bad_epochs = 0
        torch.save(model.state_dict(), "best.pt")
    else:
        bad_epochs += 1
        if bad_epochs >= patience:
            break

A parada antecipada interage fortemente com taxas de aprendizado e agendamentos; veja Agendamentos da Taxa de Aprendizado.

Aumento de dados (regularização via invariâncias)

Aumento de dados melhora a generalização ao treinar o modelo em transformações que preservam o rótulo, efetivamente aumentando o tamanho do conjunto de dados e impondo invariâncias (translação, recorte, mudanças de cor, etc.).

Exemplos comuns (visão):

  • Recorte/redimensionamento aleatório
  • Espelhamento horizontal
  • Perturbação de cor (color jitter)
  • RandAugment / AugMix
  • MixUp / CutMix (regularizadores fortes; modificam tanto entradas quanto rótulos)

Texto e áudio também usam aumento (substituição por sinônimos, injeção de ruído, mascaramento temporal, etc.), mas devem ser aplicados com cuidado para preservar o significado do rótulo.

Aumento de dados costuma ser um dos regularizadores de maior ROI (retorno sobre investimento), especialmente em visão.

Suavização de rótulos

O que faz

Para classificação, suavização de rótulos (label smoothing) substitui alvos one-hot “duros” por uma distribuição suavizada:

  • A classe verdadeira recebe (1-\epsilon)
  • As demais classes compartilham (\epsilon)

Isso desencoraja previsões excessivamente confiantes e pode melhorar calibração e generalização, particularmente em modelos grandes.

Exemplo

Se houver (K) classes e suavização (\epsilon):

[ y'{true} = 1-\epsilon,\quad y'{other} = \frac{\epsilon}{K-1} ]

Exemplo em PyTorch

import torch.nn as nn

criterion = nn.CrossEntropyLoss(label_smoothing=0.1)

A suavização de rótulos está intimamente ligada ao desenho da perda; veja Ativações e Funções de Perda.

Injeção de ruído (entradas, ativações, gradientes)

Adicionar ruído pode regularizar ao tornar o modelo robusto a perturbações.

Formas comuns:

  • Ruído de entrada: ruído Gaussiano em atributos (útil para entradas tabulares/contínuas)
  • Ruído nas ativações: espírito semelhante ao descarte
  • Ruído nos gradientes: menos comum hoje, mas relacionado à estocasticidade do SGD

Muitos pipelines de aumento podem ser vistos como injeção de ruído estruturada.

Restrições e regularização baseada em normas

Além de penalidades adicionadas à perda, você pode restringir parâmetros diretamente:

  • Restrição de norma máxima (max-norm constraint): “clipar” vetores de peso a uma norma máxima
  • Normalização espectral (spectral normalization): restringir a constante de Lipschitz (popular em GANs, robustez)
  • Amarração de pesos / compartilhamento de parâmetros (weight tying / parameter sharing): reduz graus de liberdade (por exemplo, embeddings amarrados)

Isso é especialmente útil quando você precisa de garantias de estabilidade ou propriedades de robustez.

Regularização a partir de camadas de normalização (e dinâmica de treinamento)

Camadas de normalização são principalmente para estabilidade de otimização, mas podem ter efeitos colaterais de regularização:

  • BatchNorm adiciona ruído devido às estatísticas do batch durante o treinamento (regularização implícita)
  • LayerNorm é mais determinística, mas ainda altera a geometria da otimização

Normalização é coberta em Inicialização e Normalização, mas vale notar que desligar o BatchNorm ou alterar o tamanho do batch pode mudar a generalização.

Juntando tudo: receitas comuns

Na prática, regularização raramente é uma técnica única. Combinações típicas:

Para CNNs de visão

  • Aumento de dados forte
  • Decaimento de pesos (frequentemente 1e-4 a 1e-2)
  • Às vezes suavização de rótulos
  • Às vezes profundidade estocástica para redes residuais muito profundas
  • Parada antecipada se o orçamento de treinamento for flexível

Para Transformers (NLP/visão)

  • AdamW com decaimento de pesos desacoplado
  • Descarte em blocos de atenção e MLP
  • Suavização de rótulos (dependente da tarefa)
  • Treinamento em larga escala frequentemente depende de agendamentos cuidadosos (aquecimento + decaimento); veja Agendamentos da Taxa de Aprendizado

Para conjuntos pequenos/tabulares

  • Modelos mais simples ou redes menores
  • Decaimento de pesos mais forte
  • Ruído de entrada / descarte em atributos
  • Parada antecipada costuma ser crucial
  • Considere comitês (ensembling) ou validação cruzada para seleção de modelo confiável

Como escolher e ajustar a regularização

A força da regularização é um problema de otimização de hiperparâmetros. Dicas práticas:

  1. Comece com decaimento de pesos + aumento (se aplicável)
    Em geral, são padrões robustos.
  2. Use um conjunto de validação e acompanhe a lacuna de generalização
    Regularização que ajuda costuma reduzir a lacuna e melhorar métricas de validação.
  3. Ajuste o decaimento de pesos em escala logarítmica
    Tente valores como 1e-5, 3e-5, 1e-4, 3e-4, 1e-3, ....
  4. Ajuste o descarte com cautela
    Taxas típicas de descarte: 0.1–0.5 dependendo da arquitetura e do tamanho do conjunto de dados.
  5. Fique atento ao subajuste
    Regularização demais produz alta perda de treinamento e baixa acurácia de treinamento.

Armadilhas e equívocos comuns

  • “Mais regularização é sempre melhor.”
    Excesso causa subajuste e pode piorar o desempenho tanto em treino quanto em validação.
  • Confundir L2 com decaimento de pesos no Adam.
    Prefira decaimento de pesos desacoplado no estilo AdamW no aprendizado profundo moderno.
  • Aplicar decaimento de pesos a parâmetros de normalização.
    Frequentemente prejudica o desempenho; muitas receitas os excluem.
  • Usar descarte em todo lugar.
    O posicionamento importa (por exemplo, dentro de blocos residuais, probabilidades de atenção, MLPs). Descarte excessivo pode desestabilizar o treinamento.
  • Tratar parada antecipada como opcional em dados pequenos.
    Em conjuntos pequenos, pode ser um dos regularizadores mais poderosos.

Resumo

Regularização é o conjunto de ferramentas para melhorar a generalização ao controlar capacidade, injetar ruído e enviesar a otimização em direção a soluções robustas. As técnicas mais usadas em aprendizado profundo incluem:

  • Decaimento de pesos (especialmente AdamW) para controlar a magnitude dos pesos
  • Descarte e suas variantes para robustez estocástica
  • Aumento de dados para impor invariâncias e aumentar os dados efetivos
  • Parada antecipada para evitar memorização em estágios tardios
  • Suavização de rótulos para reduzir excesso de confiança e melhorar calibração

Uma regularização eficaz é altamente contextual: arquitetura, tamanho do conjunto de dados, nível de ruído e escolhas de otimização afetam o que funciona melhor.