CNN xavier peso inicialización

14

En algunos tutoriales descubrí que se decía que la inicialización del peso "Xavier" (documento: Comprender la dificultad de entrenar redes neuronales de alimentación profunda ) es una forma eficiente de inicializar los pesos de las redes neuronales.

Para las capas completamente conectadas, había una regla general en esos tutoriales:

Var(W)=2nin+nout,simpler alternative:Var(W)=1nin

donde es la varianza de los pesos para una capa, inicializada con una distribución normal y , es la cantidad de neuronas en el padre y en la capa actual.Var(W)ninnout

¿Existen reglas generales similares para las capas convolucionales?

Estoy luchando por descubrir qué sería lo mejor para inicializar los pesos de una capa convolucional. Por ejemplo, en una capa donde está la forma de los pesos (5, 5, 3, 8), por lo que el tamaño del núcleo es 5x5, filtrar tres canales de entrada (entrada RGB) y crear 8mapas de características ... ¿se 3consideraría la cantidad de neuronas de entrada? ¿O más bien 75 = 5*5*3, porque la entrada son 5x5parches para cada canal de color?

Aceptaría ambas, una respuesta específica que aclare el problema o una respuesta más "genérica" ​​que explique el proceso general de encontrar la inicialización correcta de los pesos y, preferiblemente, vincular las fuentes.

daniel451
fuente

Respuestas:

13

En este caso, la cantidad de neuronas debería ser 5*5*3.

Lo encontré especialmente útil para capas convolucionales. A menudo, una distribución uniforme durante el intervalo funciona. [c/(in+out),c/(in+out)]

Se implementa como una opción en casi todas las bibliotecas de redes neuronales. Aquí puede encontrar el código fuente de la implementación de Keras de la inicialización de Xavier Glorot.

dontloo
fuente
1
Hmm ... ¿tienes algún consejo adicional? Por ejemplo, una de mis redes tiene una capa totalmente conectada con 480,000 neuronas. Si aplico la inicialización de Xavier termino con una variación de aproximadamente y mi red solo aprende algunos patrones extraños de interferencia. Supongo que cae en algún mínimo local. Quiero decir que los pesos son realmente pequeños entonces. Principalmente experimento un aprendizaje razonable con algo en el intervalo . ¿Alguna idea sobre eso? ¿Creo que la inicialización de Xavier no se aplica a capas realmente grandes? 1106[0.1,0.01]
daniel451
@ascenator lo siento, no sé mucho sobre cómo cambian los pesos durante el entrenamiento. Sin embargo, a veces los resultados extraños pueden provenir de tasas de aprendizaje demasiado grandes / pequeñas.
dontloo
Muchas bibliotecas DL toman un término de desviación estándar, no un término de varianza, como parámetro para sus métodos de generación de números aleatorios. Entonces, para una varianza de , necesitaría una desviación estándar de , lo que podría explicar sus resultados. 106103
eric.mitchell
0

Secundo la respuesta de Eric aquí. También tomo el "sqrt" del término y no solo ese término. A pesar de eso, cuando conecta sigmoide en su red a la salida "RelU" ... puede causar que el entrenamiento se detenga. Esto se debe a la salida "Relu" ilimitada que puede hacer que el gradiente en sigmoide caiga a 0 y no se produce ningún aprendizaje. Entonces, en los casos, tengo un factor "scaleDown" para mi red que reducirá la desviación de inicialización por ese factor. Sigo ajustando empíricamente los pesos hasta que ocurre el aprendizaje. Una manera simple de encontrar es guardar el modelo inmediatamente después de 1 iteración y echar un vistazo a la salida RELU (que está conectada a sigmoid). Siga ajustando los pesos hasta que esta salida RELU sea razonable. Y luego usa esos pesos para entrenar. Es un buen comienzo. Si aún se derrumba después de algunas iteraciones, péselos un poco más hasta alcanzar la estabilidad. Es solo un truco que usé. Me funcionó para mi configuración. Entonces compartiendo mi experiencia. Diferentes cosas funcionan para diferentes configuraciones.

¡Buena suerte!

Sarnath K
fuente