¿Cómo inicializar los elementos de la matriz de filtro?

24

Estoy tratando de entender mejor las redes neuronales convolucionales escribiendo mejor el código de Python que no depende de las bibliotecas (como Convnet o TensorFlow), y me estoy atascando en la literatura sobre cómo elegir valores para la matriz del núcleo, cuando realizando una convolución en una imagen.

Estoy tratando de entender los detalles de implementación en el paso entre mapas de características en la imagen a continuación que muestra las capas de una CNN.

Capas de redes neuronales convolucionales

De acuerdo con este diagrama:

Convolucionando una imagen

El núcleo de la matriz del núcleo "pasa" sobre la imagen, creando un mapa de características, donde cada píxel es la suma de todos los productos de elementos entre cada peso del núcleo (o matriz de filtro) y el valor de píxel correspondiente de la imagen de entrada.

Mi pregunta es: ¿cómo inicializamos los pesos de la matriz del núcleo (o filtro)?

En la demostración anterior, son simplemente 1s y 0s, pero supongo que esto se simplifica por el bien del diagrama.

¿Se entrenan estos pesos en algún paso de preprocesamiento? ¿O elegido explícitamente por el usuario?

Kai Kuspa
fuente

Respuestas:

19

Uno típicamente inicializa una red a partir de una distribución aleatoria, típicamente significa cero y se tiene cuidado con la elección de su varianza. En estos días, con los avances en las técnicas de optimización (SGD + Momentum, entre otros métodos) y las no linealidades de activación (ReLU y activaciones similares a ReLU permiten una mejor propagación hacia atrás de las señales de gradiente, incluso en redes más profundas), uno puede capacitar realmente convolucional de última generación. redes neuronales a partir de una inicialización aleatoria.

Las propiedades clave son las siguientes:

  • ¿Por qué al azar? ¿Por qué no inicializarlos todos a 0? Un concepto importante aquí se llama ruptura de simetría . Si todas las neuronas tienen los mismos pesos, producirán los mismos resultados y no aprenderemos características diferentes. No aprenderemos diferentes características porque durante el paso de propagación hacia atrás, todas las actualizaciones de peso serán exactamente las mismas. Entonces, comenzar con una distribución aleatoria nos permite inicializar las neuronas para que sean diferentes (con una probabilidad muy alta) y nos permite aprender una jerarquía de características rica y diversa.

  • ¿Por qué significa cero? Una práctica común en el aprendizaje automático es centrar a cero o normalizar los datos de entrada, de modo que las características de entrada sin procesar (para datos de imagen, estos serían píxeles) promedian a cero.

    Centramos nuestros datos en cero, e inicializaremos aleatoriamente los pesos de nuestra red (matrices como las mencionó). ¿Qué tipo de distribución deberíamos elegir? La distribución de los datos de entrada a nuestra red tiene una media de cero ya que estamos centrados en cero. Digamos que también inicializamos nuestros términos de sesgo para que sean cero. Cuando inicializamos el entrenamiento de nuestra red, no tenemos ninguna razón para favorecer una neurona sobre la otra, ya que todas son aleatorias. Una práctica es inicializar aleatoriamente nuestros pesos de manera que todos tengan una salida de activación cero en la expectativa. De esta forma, ninguna neurona se ve favorecida para "activarse" (tener un valor de salida positivo) que ninguna otra neurona mientras se rompe simultáneamente la simetría debido a la inicialización aleatoria. Bueno, una forma simple de lograr esto es elegir una distribución media cero.

  • ¿Cómo elegimos las variaciones? No desea elegir que la varianza sea demasiado grande, incluso si es media cero. Los valores extremos en pesos de redes profundas pueden dar como resultado salidas de activación que aumentan exponencialmente en magnitud, y este problema puede agravarse con la profundidad de la red. Esto puede causar estragos en la capacitación de nuestra red. Tampoco desea elegir que sea demasiado pequeño ya que esto puede ralentizar el aprendizaje ya que estamos calculando valores de gradiente muy pequeños. Entonces, hay un equilibrio aquí, especialmente cuando se trata de redes más profundas, ya que no queremos que nuestras propagaciones hacia adelante o hacia atrás aumenten o disminuyan exponencialmente en profundidad.

    Hay dos esquemas de inicialización de peso muy populares: Glorot Uniform ( Comprender la dificultad de entrenar redes neuronales de alimentación profunda ) y el inicializador He Normal ( Profundizar en los rectificadores: Superar el rendimiento a nivel humano en la clasificación de ImageNet ).

    Ambos están construidos con la intención de entrenar redes profundas con el siguiente principio básico en mente (la cita es del artículo Profundizando en Rectificadores):

    "Un método de inicialización adecuado debería evitar reducir o ampliar las magnitudes de las señales de entrada de manera exponencial".

    En términos generales, estos dos esquemas de inicialización inicializan la varianza de cada capa para que la distribución de salida de cada neurona sea la misma. La sección 2.2 de Profundizar en los rectificadores proporciona un análisis en profundidad.

Una nota final: a veces también verá que la gente usa Gaussian con una desviación estándar igual a .005 o .01, o alguna otra desviación estándar "pequeña", en todas las capas. Otras veces, verá personas que juegan con las variaciones a mano, básicamente realizando una validación cruzada para encontrar la mejor configuración.

AI independiente
fuente
1
Pero, ¿qué pasa con la forma de "X" (hecha por 1) del filtro amarillo en el GIF anterior? Entiendo que esto es lo que me gustaría usar para detectar formas de "X" en cualquier parte de la imagen, pero ¿cómo sé que "X" es la forma que quiero? Tengo la impresión de que la forma del filtro se aprende automáticamente, pero no sé cómo. ¿Quizás esta también era la pregunta del OP?
Felipe Almeida
2

No puedo comentar debido a la baja reputación, así que escribo esto en respuesta a la pregunta de Felipe Almeida. Después de la respuesta perfecta de Indie AI, no hay mucho que agregar. Si desea detectar formas específicas (como una X), puede definir previamente un filtro específico, como es el caso de la detección de bordes. Pero esta es la belleza del aprendizaje profundo, hay tantas capas, tantos filtros y tantas iteraciones que los filtros aprenden casi todas las formas de objeto necesarias por sí mismas. Entonces, teóricamente, si hay una X para detectar, uno de los filtros aprenderá a detectar una X (como el filtro amarillo)

código muerto
fuente