11 · Dropout: regularización estocástica
Dropout pone a cero activaciones aleatoriamente durante el entrenamiento — forzando representaciones redundantes y combatiendo el sobreajuste sin un solo parámetro extra.
Dropout pone a cero una fracción aleatoria de activaciones durante el entrenamiento — forzando a la red a aprender características redundantes y previniendo la co-adaptación.
Sin esto:
Las redes profundas memorizan los datos de entrenamiento; dropout es uno de los regularizadores más simples que realmente funciona.
Las redes profundas tienen millones de parámetros y con gusto memorizarán el conjunto de entrenamiento si se lo permites. La solución textual es más datos, pero la solución práctica es la regularización — penalizar al modelo por ser demasiado astuto con ejemplos individuales.
Dropout (Srivastava et al., 2014) es gloriosamente directo: en cada paso de entrenamiento, pone aleatoriamente la salida de cada neurona a cero con probabilidad p. Las neuronas restantes tienen sus salidas escaladas por 1/(1-p) (dropout invertido) para que la magnitud esperada coincida con el tiempo de inferencia.
¿Por qué funciona?
- Rompe la co-adaptación: las neuronas no pueden depender de que compañeras específicas siempre estén presentes, por lo que cada una aprende características más independientemente útiles.
- Ensemble implícito: con
Nneuronas, cada paso de entrenamiento entrena una de2^Nsubredes posibles. La inferencia promedia entre todas ellas. - Sin parámetros extra: dropout no agrega parámetros aprendibles — es pura estocasticidad.
En el tiempo de inferencia, dropout se desactiva y todas las neuronas están activas. Como usamos dropout invertido durante el entrenamiento, no se necesita ajuste en el tiempo de prueba — la activación esperada ya es correcta.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Modelo mental: dropout como entrenamiento de un ensemble de 2^N subredes
Read-along de PyTorch: nn.Dropout — modo train vs modo eval
¿Por qué el dropout invertido escala las activaciones por `1/(1-p)` durante el entrenamiento?
- Dropout pone a cero una fracción p de activaciones en cada paso de entrenamiento — cada paso entrena una subred aleatoria diferente.
- El dropout invertido escala los supervivientes por 1/(1-p) durante el entrenamiento para que la inferencia funcione sin cambios — no se necesita ajuste de escala en el tiempo de prueba.
- SIEMPRE llama model.eval() antes de la inferencia — olvidarlo deja dropout activo y produce predicciones ruidosas e impredecibles.
- Valores típicos: p=0.5 para cabezas FC (estilo AlexNet), p=0.1-0.3 para capas transformer. Nunca aplicar dropout después de la capa de salida.
Dropout p=0.1-0.3 es estándar en transformers; p=0.5 fue la configuración de AlexNet para cabezas CNN; casi toda arquitectura de PyTorch usa algún dropout.
Si lo quitas: Tu modelo memoriza el conjunto de entrenamiento, logra una pérdida de entrenamiento casi nula y generaliza mal — la pérdida de validación sube mientras la pérdida de entrenamiento se desploma.