Inicialización de pesos, Xavier/Glorot y He
Índice de contenidos
- Puntos clave
- Por qué importa la inicialización
- El problema de la varianza de las activaciones
- Inicialización Xavier/Glorot
- Inicialización He (Kaiming) para ReLU
- Reglas prácticas
- Preguntas frecuentes
- ¿Por qué no puedo inicializar todos los pesos a cero?
- ¿Cuándo uso Xavier y cuándo uso He?
- ¿Sigue importando la inicialización con normalización por lotes?
- Conclusión
- Fuentes
La inicialización de pesos fija la escala de los valores iniciales de la matriz W antes de entrenar. Xavier/Glorot, de 2010, reparte la varianza entre entradas y salidas y sirve para sigmoide y tanh; He, de 2015, la duplica para ReLU, que anula la mitad de las activaciones. Elegir mal frena o rompe el aprendizaje.
La inicialización de pesos decide con qué números arranca una red antes de ver un solo dato, y esa elección determina si el entrenamiento avanza o se atasca. Cuando los pesos iniciales tienen la escala equivocada, la señal que atraviesa las capas se apaga hasta desaparecer o crece sin control. Xavier/Glorot y He son dos recetas sencillas que fijan la varianza correcta para cada tipo de activación. Esta guía explica de dónde salen y cuándo usar cada una. La misma explicación está disponible en inglés.
Puntos clave
- La inicialización de pesos consiste en elegir los valores iniciales de la matriz
Wantes de entrenar; el objetivo es mantener estable la varianza de las activaciones capa a capa. - Poner todos los pesos a cero rompe el aprendizaje: todas las neuronas de una capa calcularían lo mismo y recibirían el mismo gradiente.
- La inicialización Xavier/Glorot, publicada en 2010, usa $\operatorname{Var}(W) = \tfrac{2}{n{\text{in}} + n{\text{out}}}$ y está pensada para activaciones simétricas como la sigmoide y la tangente hiperbólica.
- La inicialización He, de 2015, duplica ese valor a $\operatorname{Var}(W) = \tfrac{2}{n_{\text{in}}}$ para compensar que la ReLU anula la mitad de las activaciones.
- La regla práctica es directa: ReLU y sus variantes piden He; sigmoide y tanh piden Xavier; los sesgos
bse ponen a 0.
Por qué importa la inicialización
Una red neuronal encadena muchas capas donde cada una calcula $z = Wx + b$ y luego aplica una activación $a = f(z)$. Si al empezar los pesos son demasiado pequeños, cada capa reduce la magnitud de la señal y, tras 10 o 20 capas, las activaciones quedan prácticamente en cero. Si son demasiado grandes, ocurre lo contrario y los valores se disparan. En ambos extremos, el gradiente que vuelve hacia atrás durante la retropropagación se vuelve inútil, un fenómeno que tratamos a fondo en el problema del gradiente que se desvanece.
Hay un caso que conviene descartar de inmediato: inicializar todos los pesos con el mismo valor, por ejemplo 0. Si dos neuronas de una capa arrancan idénticas y reciben la misma entrada, producen la misma salida y el mismo gradiente, así que se actualizan igual para siempre. La red no rompe esa simetría y desperdicia neuronas. Por eso los pesos se sortean al azar a partir de una distribución con media 0 y una varianza cuidadosamente calculada.
El problema de la varianza de las activaciones
La clave está en controlar cómo cambia la varianza al pasar de una capa a la siguiente. Supongamos entradas y pesos independientes, con media 0. Para la suma ponderada $z = Wx$, la varianza de cada salida vale $\operatorname{Var}(z) = n{\text{in}} \cdot \operatorname{Var}(W) \cdot \operatorname{Var}(x)$, donde $n{\text{in}}$ es el número de entradas de la neurona (el fan-in).
Si queremos que la varianza de la salida se parezca a la de la entrada, necesitamos que $n{\text{in}} \cdot \operatorname{Var}(W) = 1$, es decir $\operatorname{Var}(W) = \tfrac{1}{n{\text{in}}}$. Esa es la intuición de LeCun de 1998. El problema es que una red también propaga gradientes hacia atrás, y ahí manda el número de salidas $n{\text{out}}$ (el fan-out): para que el gradiente no se encoja hace falta $n{\text{out}} \cdot \operatorname{Var}(W) = 1$. Rara vez $n{\text{in}}$ y $n{\text{out}}$ coinciden, así que hay que buscar un compromiso.
Ver la derivación
Para la suma ponderada $z = \sum_{i=1}^{n_{\text{in}}} W_i x_i$ con pesos y entradas independientes y de media 0, la varianza de una suma de productos independientes es la suma de las varianzas, así que $\operatorname{Var}(z) = n_{\text{in}} \cdot \operatorname{Var}(W) \cdot \operatorname{Var}(x)$. Para que la varianza no cambie al atravesar la capa imponemos $\operatorname{Var}(z) = \operatorname{Var}(x)$, lo que exige $n_{\text{in}} \cdot \operatorname{Var}(W) = 1$ y, por tanto, $\operatorname{Var}(W) = \tfrac{1}{n_{\text{in}}}$. Xavier promedia esa condición con la del paso hacia atrás, $n_{\text{out}} \cdot \operatorname{Var}(W) = 1$, para llegar a $\tfrac{2}{n_{\text{in}} + n_{\text{out}}}$.
Inicialización Xavier/Glorot
Xavier Glorot y Yoshua Bengio propusieron en 2010 promediar las dos condiciones anteriores. En lugar de satisfacer solo el paso hacia delante o solo el paso hacia atrás, toman la media de $n{\text{in}}$ y $n{\text{out}}$ y llegan a la fórmula que da título a esta guía:
$$\operatorname{Var}(W) = \frac{2}{n{\text{in}} + n{\text{out}}}$$
En la práctica se usan dos variantes equivalentes. La normal sortea los pesos de una gaussiana con esa varianza. La uniforme los reparte en el intervalo $[-r, r]$ con $r = \sqrt{6/(n{\text{in}} + n{\text{out}})}$, cuyo valor produce exactamente la misma varianza. Glorot y Bengio mostraron que, con esta escala, las activaciones de una red con tangente hiperbólica mantienen una varianza sana a lo largo de decenas de capas, mientras que la inicialización clásica de la época las hacía colapsar. Es la opción por defecto para activaciones centradas en cero como la sigmoide o la tanh, y sigue siendo la que eligen bibliotecas como Keras para sus capas densas.
Las variantes normal y uniforme de Xavier producen la misma varianza: la uniforme solo cambia la forma de la distribución, no su escala. Por eso puedes intercambiarlas sin retocar el resto de la red.
Inicialización He (Kaiming) para ReLU
La ReLU cambió las reglas. Al descartar todos los valores negativos, $f(z) = \max(0, z)$ deja pasar de media solo la mitad de las activaciones, lo que reduce la varianza a la mitad en cada capa. Kaiming He y sus coautores lo analizaron en 2015 y corrigieron el factor: como la ReLU se queda con la mitad, hay que compensar duplicando la varianza de los pesos.
$$\operatorname{Var}(W) = \frac{2}{n_{\text{in}}}$$
Esa es la inicialización He, también llamada Kaiming. Con ella, He y su equipo consiguieron entrenar desde cero una red convolucional de 30 capas sobre ImageNet, algo que con Xavier no convergía. Como resumen los autores del artículo de 2015, su método «permite entrenar modelos rectificados extremadamente profundos directamente desde cero». Para variantes de la ReLU con fuga, como Leaky ReLU, la fórmula incorpora un pequeño ajuste según la pendiente negativa, pero el factor 2 sigue siendo la referencia. Es la opción por defecto de PyTorch para las capas lineales y convolucionales.
Reglas prácticas
Con dos recetas y un puñado de matices, casi cualquier red queda bien inicializada:
- Activación ReLU o variante (ELU, GELU, Leaky ReLU): usa He con $\operatorname{Var}(W) = \tfrac{2}{n_{\text{in}}}$.
- Activación sigmoide o tanh: usa Xavier/Glorot con $\operatorname{Var}(W) = \tfrac{2}{n{\text{in}} + n{\text{out}}}$.
- Sesgos: inicialízalos a 0; no sufren el problema de simetría porque los pesos ya son distintos.
- Red autonormalizada con SELU: usa la variante de LeCun con $\operatorname{Var}(W) = \tfrac{1}{n_{\text{in}}}$.
- Si dudas: parte de He, mide la varianza de las activaciones en las primeras capas y ajusta.
En código, elegir la receta correcta ocupa una línea:
import torch.nn as nn
layer = nn.Linear(256, 128)
nn.init.kaiming_normal_(layer.weight, mode="fan_in", nonlinearity="relu")
nn.init.zeros_(layer.bias)
Estas recetas conviven con técnicas posteriores, como la normalización por lotes, que reducen la sensibilidad a la inicialización pero no la sustituyen. Si quieres situar este tema dentro del recorrido completo, consulta el mapa de las matemáticas de las redes neuronales.
Preguntas frecuentes
¿Por qué no puedo inicializar todos los pesos a cero?
Porque las neuronas de una capa quedarían idénticas: con la misma entrada calculan la misma salida y reciben el mismo gradiente, así que se actualizan igual en cada paso. La red no rompe esa simetría y muchas neuronas se vuelven redundantes. Un sorteo aleatorio con media 0 evita el problema.
¿Cuándo uso Xavier y cuándo uso He?
Depende de la activación. Si la capa usa una función simétrica como la sigmoide o la tangente hiperbólica, Xavier/Glorot reparte bien la varianza con $\tfrac{2}{n{\text{in}} + n{\text{out}}}$. Si usa ReLU o alguna de sus variantes, He la duplica a $\tfrac{2}{n_{\text{in}}}$ para compensar la mitad de activaciones que la ReLU pone a cero.
¿Sigue importando la inicialización con normalización por lotes?
Sí, aunque menos. La normalización por lotes reescala las activaciones dentro de la red y amortigua una mala elección inicial, pero una escala razonable de partida acelera la convergencia y evita las primeras iteraciones inestables, sobre todo en redes muy profundas o sin normalización.
Conclusión
La inicialización de pesos es un ajuste barato con un impacto enorme: dos fórmulas, $\tfrac{2}{n{\text{in}} + n{\text{out}}}$ para Xavier y $\tfrac{2}{n_{\text{in}}}$ para He, deciden si una red profunda arranca o se queda muda. La regla que conviene recordar es que la elección sigue a la activación: He para la familia ReLU y Xavier para las funciones simétricas. Con esa base resuelta, el siguiente paso natural es entender cómo se propaga el error hacia atrás en el problema del gradiente que se desvanece.