Dropout Layer
Uma camada de dropout zera aleatoriamente uma fração das ativações durante o treinamento, impedindo que a rede dependa de uma única unidade e reduzindo o sobreajuste.
Uma camada de dropout é um componente de regularização de uma rede neural que define aleatoriamente como zero uma fração p das entradas em cada passo de treino e, durante a inferência, transmite todos os valores sem alterações. Como qualquer unidade pode desaparecer em qualquer passo, a rede não pode depender de alguns neurónios específicos nem de coadaptações frágeis entre eles; assim, aprende características redundantes que generalizam melhor e sofre menos sobreajuste aos dados de treino. Geoffrey Hinton e os colegas introduziram a técnica em 2012, e Srivastava, Hinton et al. descreveram-na em detalhe em 2014. É uma camada integrada no PyTorch, no TensorFlow e na maioria das outras estruturas de aprendizagem profunda, usada em arquiteturas que vão desde cabeças de classificação totalmente ligadas até transformers.
Como funciona o dropout#
Durante o treino, a camada amostra uma nova máscara aleatória em cada passagem para a frente, mantendo cada elemento com probabilidade 1 − p e colocando-o a zero com probabilidade p. Assim, cada passo treina uma sub-rede diferente e reduzida, e a rede completa usada na fase de teste aproxima a média de um número exponencialmente grande de sub-redes que partilham os mesmos pesos, razão pela qual o dropout é muitas vezes descrito como treino de ensemble de baixo custo. Para manter a ativação esperada igual em ambas as fases, as frameworks modernas usam dropout invertido: durante o treino, os valores mantidos são multiplicados por 1 / (1 − p), pelo que a camada não faz nada durante a inferência. No PyTorch, nn.Dropout segue o modo de treino ou avaliação do módulo:
import torch
from torch import nn
torch.manual_seed(0)
dropout = nn.Dropout(p=0.5)
x = torch.ones(10)
# Modo de treino: cerca de metade dos valores são definidos como zero, e os restantes são multiplicados por 1 / (1 - p) = 2
dropout.train()
print("Train:", dropout(x))
# Modo de avaliação: a camada transmite todos os valores sem alterações
dropout.eval()
print("Eval: ", dropout(x))No modo de treino, seis dos dez valores são descartados e os quatro restantes passam a 2.0, mantendo o valor esperado em 1.0; no modo de avaliação, os dez valores permanecem em 1.0.
Variantes comuns de dropout#
- Dropout espacial: O
nn.Dropout2ddo PyTorch define como zero canais inteiros dos mapas de características, o que é adequado para redes convolucionais porque os píxeis vizinhos num canal estão fortemente correlacionados e descartar píxeis individuais quase não as regulariza. - Profundidade estocástica (DropPath): Em vez de ativações individuais, ramos residuais inteiros são ignorados aleatoriamente para cada amostra, uma técnica comum no treino de Vision Transformers e CNNs modernas.
- Dropout de Monte Carlo: O dropout permanece ativo durante a inferência, e o modelo executa várias passagens para a frente com a mesma entrada. A dispersão das previsões fornece uma estimativa de baixo custo da incerteza do modelo para sistemas críticos em termos de segurança, um método que Gal e Ghahramani interpretaram como inferência bayesiana aproximada.
- DropConnect: Os pesos individuais são definidos aleatoriamente como zero em vez das ativações, atribuindo uma máscara própria a cada ligação.
Dropout na prática#
As taxas de dropout são ajustadas como qualquer outro hiperparâmetro. Srivastava et al. descobriram que descartar unidades ocultas com probabilidade 0.5 funcionava bem numa grande variedade de redes e tarefas, enquanto as unidades de entrada têm melhores resultados com uma taxa de retenção mais próxima de 1; o Transformer original usava p = 0.1. Uma taxa demasiado elevada atrasa a convergência e pode causar subajuste, e colocar dropout imediatamente antes da normalização por lotes pode prejudicar a precisão devido a uma mudança de variância entre treino e teste. Muitas redes neurais convolucionais dependem sobretudo da normalização por lotes, do aumento de dados e da regularização de pesos, reservando o dropout para a cabeça do classificador. Os modelos de classificação do Ultralytics YOLO26 seguem esse padrão: incluem uma única camada de dropout, entre as características agrupadas de 1,280 canais e o classificador linear final, cuja taxa é definida pelo argumento de treino dropout (0.0 por predefinição).
from ultralytics import YOLO
# Carrega um modelo de classificação YOLO26, cuja cabeça contém a camada de dropout
model = YOLO("yolo26n-cls.pt")
# Treina com 10% de dropout na cabeça de classificação, usando um subconjunto pequeno de MNIST
results = model.train(data="mnist160", epochs=10, imgsz=64, dropout=0.1)Aplicações no mundo real#
- Análise de imagens médicas: Os exames rotulados são dispendiosos, por isso os classificadores de diagnóstico são muitas vezes ajustados a partir de uma base pré-treinada, usando alguns milhares de imagens. O dropout na cabeça do classificador limita o quanto esta memoriza casos individuais de um conjunto tão pequeno.
- Processamento de linguagem natural: Os codificadores Transformer, como o BERT, aplicam dropout com probabilidade 0.1 em todas as camadas, incluindo nos pesos de atenção, durante o pré-treino e o ajuste fino.
Dropout vs. técnicas relacionadas#
- Normalização por lotes: A normalização por lotes normaliza as entradas de cada camada para estabilizar o treino e acrescenta apenas um ligeiro ruído proveniente das estatísticas do lote, sem remover unidades.
- Suavização de rótulos: A suavização de rótulos regulariza os alvos de treino, suavizando os rótulos one-hot, e mantém todas as ativações intactas.
- Poda: A poda remove permanentemente os pesos de pouca importância para reduzir o tamanho do modelo, enquanto os valores definidos como zero pelo dropout só o são durante um passo de treino e não alteram o número de parâmetros.










