¿Cómo inicializar los pesos y los sesgos (por ejemplo, con la inicialización de He o Xavier) en una red en PyTorch?
python
neural-network
deep-learning
pytorch
Fábio Pérez
fuente
fuente
reset_parameters
método en el código fuente de muchos módulos. ¿Debo anular el método para la inicialización del peso?Comparamos diferentes modos de inicialización de peso utilizando la misma arquitectura de red neuronal (NN).
Todos ceros o unos
Si sigue el principio de la navaja de Occam , podría pensar que establecer todos los pesos en 0 o 1 sería la mejor solución. Este no es el caso.
Con todos los pesos iguales, todas las neuronas de cada capa producen la misma salida. Esto hace que sea difícil decidir qué pesos ajustar.
Inicialización uniforme
Una distribución uniforme tiene la misma probabilidad de elegir cualquier número de un conjunto de números.
Veamos qué tan bien se entrena la red neuronal usando una inicialización de peso uniforme, dónde
low=0.0
yhigh=1.0
.A continuación, veremos otra forma (además del código de la clase Net) para inicializar los pesos de una red. Para definir pesos fuera de la definición del modelo, podemos:
Regla general para configurar pesos
La regla general para establecer los pesos en una red neuronal es establecerlos cerca de cero sin que sean demasiado pequeños.
a continuación, comparamos el rendimiento de NN, pesos inicializados con distribución uniforme [-0.5,0.5) frente a aquel cuyo peso se inicializa usando la regla general
distribución normal para inicializar los pesos
A continuación mostramos el desempeño de dos NN, uno inicializado usando distribución uniforme y el otro usando distribución normal
fuente
Para inicializar capas, normalmente no es necesario hacer nada.
PyTorch lo hará por ti. Si lo piensas, esto tiene mucho sentido. ¿Por qué deberíamos inicializar capas, cuando PyTorch puede hacerlo siguiendo las últimas tendencias?
Compruebe, por ejemplo, la capa Lineal .
En el
__init__
método llamará a la función init de Kaiming He .Lo mismo ocurre con otros tipos de capas. Por
conv2d
ejemplo, consulte aquí .Nota: La ganancia de una inicialización adecuada es la velocidad de entrenamiento más rápida. Si su problema merece una inicialización especial, puede hacerlo posteriormente.
fuente
xavier_uniform
inicialización para los pesos (con sesgos inicializados a 0), en lugar de usar la inicialización predeterminada, mi precisión de validación después de 30 las épocas de RMSprop aumentaron del 82% al 86%. También obtuve una precisión de validación del 86% al usar el modelo VGG16 incorporado de Pytorch (no entrenado previamente), así que creo que lo implementé correctamente. (fuente
Perdón por llegar tan tarde, espero que mi respuesta ayude.
Para inicializar pesos con un
normal distribution
uso:O para usar una
constant distribution
escritura:O para usar un
uniform distribution
:Puede consultar otros métodos para inicializar tensores aquí
fuente
Si desea un poco de flexibilidad adicional, también puede configurar los pesos manualmente .
Digamos que tiene información de todos:
Y desea hacer una capa densa sin sesgo (para que podamos visualizar):
Establezca todos los pesos en 0.5 (o cualquier otra cosa):
Los pesos:
Todos sus pesos ahora son 0.5. Pasar los datos a través de:
Recuerde que cada neurona recibe 8 entradas, todas las cuales tienen un peso de 0.5 y un valor de 1 (y sin sesgo), por lo que suma 4 para cada una.
fuente
Iterar sobre los parámetros
Si no puede usar,
apply
por ejemplo, si el modelo no se implementaSequential
directamente:Igual para todos
Dependiendo de la forma
Puede probar con
torch.nn.init.constant_(x, len(x.shape))
para comprobar que estén correctamente inicializados:fuente
Si ve una advertencia de desaprobación (@ Fábio Perez) ...
fuente
Porque no he tenido suficiente reputación hasta ahora, no puedo agregar un comentario debajo
Pero quiero señalar que en realidad conocemos algunas suposiciones en el artículo de Kaiming He , Profundizando en los rectificadores: superando el desempeño a nivel humano en la clasificación de ImageNet. , no son apropiadas, aunque parece que el método de inicialización diseñado deliberadamente es un éxito en la práctica. .
Por ejemplo, dentro de la subsección de Caso de propagación hacia atrás , asumen que $ w_l $ y $ \ delta y_l $ son independientes entre sí. Pero como todos sabemos, tomemos el mapa de puntuación $ \ delta y ^ L_i $ como ejemplo, a menudo es $ y_i-softmax (y ^ L_i) = y_i-softmax (w ^ L_ix ^ L_i) $ si usamos un objetivo de función de pérdida de entropía cruzada.
Así que creo que la verdadera razón subyacente por la que la inicialización de He funciona bien sigue sin resolverse. Porque todos han sido testigos de su poder para impulsar el entrenamiento de aprendizaje profundo.
fuente