La normalización por lotes (batch normalization)
Índice de contenidos
- Puntos clave
- ¿Qué es la normalización por lotes?
- La fórmula (normalizar, escalar y desplazar)
- Gamma y beta, los parámetros aprendibles
- Por qué acelera el entrenamiento
- Entrenamiento frente a inferencia
- Preguntas frecuentes
- ¿En qué se diferencia de la normalización por capas?
- ¿Puedo usar lotes muy pequeños?
- ¿Sigue haciendo falta el sesgo en la capa anterior?
- Conclusión
- Fuentes
La normalización por lotes (batch normalization) es una técnica que normaliza las activaciones de cada capa usando la media y la varianza del minilote, y después las reescala con dos parámetros aprendibles, gamma y beta. Introducida en 2015, permite tasas de aprendizaje más altas, acelera el entrenamiento y estabiliza las redes profundas.
La normalización por lotes reescala las activaciones de cada capa para que tengan media cero y varianza uno dentro de cada minilote, y así el entrenamiento avanza más rápido y con menos tropiezos. Es una de las herramientas que convirtió las redes muy profundas en algo entrenable en la práctica. En esta guía verás qué hace, cuál es su fórmula, para qué sirven sus dos parámetros aprendibles y por qué se comporta de forma distinta al entrenar y al predecir. La misma explicación está disponible en inglés.
Puntos clave
- La normalización por lotes normaliza las activaciones de una capa restando la media del minilote y dividiendo por su desviación típica, y luego las reescala con dos parámetros aprendibles.
- La propusieron Sergey Ioffe y Christian Szegedy en 2015 para combatir lo que llamaron el desplazamiento interno de covariables.
- Sus parámetros gamma (escala) y beta (desplazamiento) devuelven a la red la capacidad de representar cualquier rango de valores, incluso deshacer la normalización si conviene.
- Permite usar tasas de aprendizaje más altas y hace el entrenamiento menos sensible a la inicialización de los pesos.
- Al entrenar usa la estadística del minilote; al predecir usa medias y varianzas acumuladas durante el entrenamiento.
¿Qué es la normalización por lotes?
En una red profunda, la distribución de las entradas de cada capa cambia constantemente mientras se ajustan los pesos de las capas anteriores. Ese vaivén obliga a bajar la tasa de aprendizaje y ralentiza la convergencia. La normalización por lotes ataca ese problema normalizando la entrada de cada capa por separado, no una sola vez al principio sino en cada paso del entrenamiento.
La idea la presentaron Sergey Ioffe y Christian Szegedy en el artículo de 2015 «Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift»[1]. En sus experimentos con la red Inception sobre ImageNet, alcanzaron la misma precisión que el modelo base con 14 veces menos pasos de entrenamiento, y un conjunto de modelos con normalización por lotes bajó el error top-5 hasta el 4,9 %, superando la precisión humana estimada en aquella tarea.
Como resumen los propios autores, «la normalización por lotes nos permite usar tasas de aprendizaje mucho más altas y ser menos cuidadosos con la inicialización, y en algunos casos elimina la necesidad de dropout».
La fórmula (normalizar, escalar y desplazar)
Dentro de un minilote, para cada activación $x$ la normalización se calcula en dos pasos: primero se estandariza usando la media y la varianza del propio lote, y después se reescala con dos parámetros aprendibles.
$$\hat{x} = \frac{x-\mu}{\sqrt{\sigma^2+\varepsilon}}, \qquad y = \gamma\hat{x}+\beta$$
En PyTorch los dos pasos están encapsulados en una sola capa:
import torch.nn as nn
bn = nn.BatchNorm1d(256, eps=1e-5, momentum=0.1) # normaliza 256 canales
y = bn(x) # y = gamma * x_norm + beta
En la estandarización, $\mu$ es la media del minilote, $\sigma^2$ su varianza y $\varepsilon$ una constante pequeña (por defecto 0,00001 en PyTorch) que evita dividir por cero. La reescala $y = \gamma\hat{x}+\beta$ constituye el segundo paso. Esta operación se inserta habitualmente entre la suma ponderada $z = \mathbf{W}x+b$ y la función de activación $a = f(z)$, aunque su posición exacta admite variantes. Puedes repasar la suma ponderada en el mapa de las matemáticas de redes neuronales.
La constante $\varepsilon$ solo entra en juego cuando la varianza del lote es diminuta: evita la división por cero sin alterar en la práctica el resultado, porque su valor por defecto de 0,00001 es mucho menor que cualquier varianza real.
Gamma y beta, los parámetros aprendibles
Si nos quedáramos solo con la estandarización, forzaríamos a todas las capas a tener media cero y varianza uno, lo que limitaría lo que la red puede representar. Por eso se añaden dos parámetros que la red aprende igual que los pesos: $\gamma$ (gamma) escala el resultado y $\beta$ (beta) lo desplaza.
La clave es que estos dos parámetros permiten deshacer la normalización cuando conviene. Si el valor óptimo fuese $\gamma = \sqrt{\sigma^2+\varepsilon}$ y $\beta = \mu$, la capa recuperaría exactamente la activación original. En otras palabras, la red no pierde capacidad expresiva: solo gana un camino más sencillo para llegar a la solución. Cada canal o característica tiene su propio par gamma y beta, así que una capa con 256 canales añade 512 parámetros aprendibles, una cantidad minúscula frente a los pesos.
Ver la derivación
Sustituyendo esos valores óptimos en la reescala: $y = \gamma\hat{x}+\beta = \sqrt{\sigma^2+\varepsilon}\cdot\dfrac{x-\mu}{\sqrt{\sigma^2+\varepsilon}}+\mu = (x-\mu)+\mu = x$. La capa reconstruye la entrada original, de modo que la normalización nunca resta capacidad expresiva a la red.
Por qué acelera el entrenamiento
El motivo por el que funciona sigue siendo objeto de debate. Ioffe y Szegedy lo atribuyeron a reducir el desplazamiento interno de covariables, es decir, la variación de la distribución de las activaciones capa a capa. En 2018, un equipo del MIT lo puso en duda en «How Does Batch Normalization Help Optimization?»[2]: mostraron que el efecto principal es suavizar la superficie de la función de pérdida, haciendo los gradientes más predecibles y estables, lo que permite pasos más grandes sin que el entrenamiento se descontrole.
Sea cual sea la explicación, los efectos prácticos son claros: converge en menos épocas, tolera tasas de aprendizaje mayores, reduce la dependencia de una inicialización fina y añade un ligero efecto de regularización porque el ruido del minilote actúa como perturbación. Ese efecto se relaciona con problemas como el gradiente explosivo, que la normalización ayuda a contener.
Entrenamiento frente a inferencia
Aquí está el detalle que más confunde. Durante el entrenamiento, la capa normaliza con la media y la varianza del minilote actual, que cambian en cada paso. Pero en inferencia muchas veces procesamos un único ejemplo, y no tendría sentido normalizar respecto a un lote de tamaño uno.
La solución es acumular durante el entrenamiento una media y una varianza móviles de toda la población. PyTorch las actualiza con un factor momentum de 0,1 por defecto y las guarda como estadísticas del modelo. Al llamar a model.eval(), la capa deja de usar el lote y aplica esas estadísticas fijas, de modo que la salida es determinista y no depende de con qué otros ejemplos viaje. Olvidar ese cambio de modo es una fuente habitual de resultados erráticos en producción. Los detalles del comportamiento están documentados en la referencia de PyTorch[3].
Preguntas frecuentes
¿En qué se diferencia de la normalización por capas?
La normalización por lotes calcula la media y la varianza sobre la dimensión del lote, para cada canal. La normalización por capas (layer normalization) las calcula sobre las características de un solo ejemplo, así que no depende del tamaño del lote. Por eso los transformadores, con secuencias de longitud variable, suelen preferir la normalización por capas.
¿Puedo usar lotes muy pequeños?
Con lotes de 2 o 4 ejemplos la media y la varianza se estiman con mucho ruido y la técnica pierde eficacia. En esos casos se recurre a alternativas como la normalización por grupos, pensada para tamaños de lote pequeños en visión por computador.
¿Sigue haciendo falta el sesgo en la capa anterior?
No. Como la normalización resta la media, cualquier sesgo $b$ de la capa previa se cancela. Por eso las capas seguidas de normalización por lotes suelen definirse sin sesgo: es un parámetro que no aportaría nada.
Conclusión
La normalización por lotes fue uno de los avances que hicieron entrenables las redes muy profundas: normaliza cada capa con la estadística del minilote, la reescala con gamma y beta, y cambia a estadísticas acumuladas en inferencia. Aunque el porqué exacto se sigue discutiendo, su efecto práctico de estabilizar y acelerar el entrenamiento está fuera de duda. El siguiente paso natural es entender cómo se relaciona con la inicialización de pesos y con el gradiente que se desvanece.