12 · Normalización por lotes (Batch Norm)
BatchNorm normaliza las activaciones a media cero y varianza unitaria en el mini-batch — estabilizando el entrenamiento y permitiéndote usar tasas de aprendizaje más altas.
BatchNorm normaliza las activaciones de cada capa a media cero y varianza unitaria en el mini-batch — estabilizando el entrenamiento y permitiendo tasas de aprendizaje más altas.
Sin esto:
El cambio de covarianza interno ralentiza el entrenamiento y fuerza tasas de aprendizaje diminutas; BatchNorm lo soluciona.
A medida que el entrenamiento progresa, la distribución de entrada de cada capa cambia porque las capas por debajo de ella siguen cambiando. Este "cambio de covarianza interno" significa que cada capa se adapta constantemente a un objetivo en movimiento — lo que exige tasas de aprendizaje pequeñas e inicialización cuidadosa.
Batch Normalisation (Ioffe & Szegedy, 2015) ataca esto directamente: antes de la función de activación, normaliza los valores pre-activación en el mini-batch a media cero y varianza unitaria. Luego aplica dos parámetros aprendibles — escala (γ) y desplazamiento (β) — que permiten a la red deshacer la normalización si lo desea.
La fórmula para una dimensión de característica única en un batch de tamaño B:
mu_B = (1/B) sum(x_i) # media del batch
var_B = (1/B) sum((x_i - mu_B)^2) # varianza del batch
x_hat = (x_i - mu_B) / sqrt(var_B + e) # normalizar (e = 1e-5)
y_i = gamma * x_hat + beta # escalar + desplazar
El efecto neto: las activaciones que entran a cada capa siempre tienen estadísticas consistentes, haciendo el paisaje de pérdida más suave y permitiendo tasas de aprendizaje mucho más altas.
Hay una complicación sutil: durante el entrenamiento, BatchNorm usa las estadísticas del mini-batch actual. Durante la inferencia, no hay batch — usamos un promedio móvil de las estadísticas del batch acumuladas durante el entrenamiento. PyTorch las almacena como running_mean y running_var. Llamar a model.eval() cambia la capa a usar estas estadísticas en ejecución.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Read-along de PyTorch: nn.BatchNorm2d y nn.BatchNorm1d
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Punto sutil: por qué BatchNorm usa estadísticas diferentes en entrenamiento vs inferencia
¿Por qué BatchNorm usa estadísticas diferentes en entrenamiento vs inferencia?
- BatchNorm normaliza las activaciones de cada capa a media~0, std~1 en el mini-batch — luego aplica gamma (escala) y beta (desplazamiento) aprendibles.
- El entrenamiento usa estadísticas del batch en tiempo real; la inferencia usa promedios móviles acumulados durante el entrenamiento — SIEMPRE llama model.eval() antes de la inferencia.
- BatchNorm permite tasas de aprendizaje 10x más altas y actúa como regularización — habilitando redes 10x más profundas (era ResNet, 2015+).
- Para tamaños de batch <8 o modelos de secuencia, usa LayerNorm (Transformers) o GroupNorm en su lugar — no dependen de las estadísticas del batch.
Toda CNN desde 2015 usa BatchNorm. Todo Transformer usa LayerNorm (una variante relacionada pero independiente del batch). Conocer la diferencia depura el 90% de los bugs '¿por qué mi modelo se comporta diferente en la inferencia?'.
Si lo quitas: Entrenar CNNs profundas requiere tasas de aprendizaje órdenes de magnitud más pequeñas, converge mucho más lentamente y es mucho más sensible a la inicialización de pesos.