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
Var(W) = 2 / (n_in + n_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
Var(W) = 2 / n_inpara 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 Var(z) = n_in · Var(W) · Var(x), donde n_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_in · Var(W) = 1, es decir Var(W) = 1 / n_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_out (el fan-out): para que el gradiente no se encoja hace falta n_out · Var(W) = 1. Rara vez n_in y n_out coinciden, así que hay que buscar un compromiso.
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_in y n_out y llegan a la fórmula que da título a esta guía:
Var(W) = 2 / (n_in + n_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_in + n_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.
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.
Var(W) = 2 / n_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
Var(W) = 2 / n_in. - Activación sigmoide o tanh: usa Xavier/Glorot con
Var(W) = 2 / (n_in + n_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
Var(W) = 1 / n_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 2 / (n_in + n_out). Si usa ReLU o alguna de sus variantes, He la duplica a 2 / n_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, 2 / (n_in + n_out) para Xavier y 2 / n_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.