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:
- Comece com decaimento de pesos + aumento (se aplicável)
Em geral, são padrões robustos. - 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. - Ajuste o decaimento de pesos em escala logarítmica
Tente valores como1e-5, 3e-5, 1e-4, 3e-4, 1e-3, .... - Ajuste o descarte com cautela
Taxas típicas de descarte: 0.1–0.5 dependendo da arquitetura e do tamanho do conjunto de dados. - 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.