¿Cómo funciona la retropropagación a través de la capa Max Pooling cuando se hace un lote?


10

Supongamos que estamos utilizando un tamaño de lote de 100 muestras para el aprendizaje.

Entonces, en cada lote, el peso de cada neurona (y sesgo, etc.) se actualiza agregando el menos de la tasa de aprendizaje * el valor de error promedio que encontramos usando las 100 muestras * la derivada de la función de error con respecto a El peso neuronal actual que se está actualizando.

Ahora, cuando usamos una capa de Max Pool, ¿cómo podemos calcular la derivada sobre esta capa? En cada muestra que realizamos, se elige un píxel diferente (digamos) como máximo, por lo que cuando retropropagamos más de 100 muestras en las que cada vez que se elige un camino diferente, ¿cómo podemos hacerlo? Una solución que tengo en mente es recordar cada píxel que se eligió como máximo, y luego tal vez dividir la derivada en todos los píxeles máximos. ¿Es esto lo que se está haciendo?


Tengo la misma pregunta cuando BP con solo una muestra, está claro que solo la derivada del elemento más grande no es cero, pero cuando BP con muestras en lote, una muestra diferente puede causar una posición diferente del elemento más grande, ¿podemos calcular la derivada promedio de cada parámetro como de costumbre (solo agregar ∂L / ∂wi de cada muestra y dividir por tamaño de lote)?
Shaotao Li

Respuestas:


8

Cuando una red neuronal procesa un lote, todos los valores de activación para cada capa se calculan para cada ejemplo (tal vez en paralelo, por ejemplo, si la biblioteca y el hardware lo admiten). Esos valores se almacenan para un posible uso posterior, es decir, un valor por activación por ejemplo en el lote, no se agregan de ninguna manera

Durante la propagación hacia atrás, esos valores de activación se utilizan como una de las fuentes numéricas para calcular los gradientes, junto con los gradientes calculados hasta ahora trabajando hacia atrás y los pesos de conexión. Al igual que la propagación hacia adelante, la propagación hacia atrás se aplica por ejemplo, no funciona con valores promediados o sumados. Solo cuando se hayan procesado todos los ejemplos, trabajará con los gradientes sumados o promediados para el lote.

Esto se aplica igualmente a las capas de grupo máximo. No solo sabe cuál fue el resultado de la capa de agrupación para cada ejemplo en el lote, sino que puede ver la capa anterior y determinar qué entrada al grupo fue la máxima.

Matemáticamente, y evitando la necesidad de definir índices para capas NN y neuronas, la regla se puede expresar así

  • La función de avance es m=max(a,b)

  • Sabemos Jm para alguna función objetivo J (en la red neuronal que será la función de pérdida que queremos minimizar, y estamos asumiendo que ya nos hemos propagado hacia atrás a este punto)

  • Queremos saber Ja y Jb

  • Si a>b

    • Localmente , *m=a. EntoncesJa=Jm

    • Localmente , *m no depende de b. EntoncesJb=0

  • Por lo tanto Ja=Jm Si a>bde lo contrario Ja=0

  • y Jb=Jm Si b>ade lo contrario Jb=0

Cuando la propagación inversa atraviesa una capa de agrupación máxima, el gradiente se procesa por ejemplo y se asigna solo a la entrada de la capa anterior que era la máxima. Otras entradas obtienen gradiente cero. Cuando este lote no es diferente, solo se procesa por ejemplo, tal vez en paralelo. En todo un lote, esto puede significar que más de una, tal vez todas, las activaciones de entrada al grupo máximo obtienen una parte del gradiente, cada una de un subconjunto diferente de ejemplos en el lote.


* Localmente -> cuando se realizan solo cambios infinitesimales a m.

** Técnicamente, si a=b exactamente entonces tenemos una discontinuidad, pero en la práctica podemos ignorar eso sin problemas al entrenar una red neuronal.


3
No estoy seguro de entenderte. Lo que está diciendo funciona cuando retrocede después de un solo apoyo hacia adelante. Pero cuando tiene un lote, apoya 100 muestras para calcular una función de error promedio. El objetivo de un lote es poder producir gradientes más precisos, y luego solo lo hace una vez el backprop basado en la derivada de la función de error con respecto a W, en el valor de error promedio encontrado multiplicado por la tasa de aprendizaje. Por lo tanto, todavía no está claro cómo calcular el derivado de la función max, cuando cada vez que se seleccionó un nodo diferente como máximo. ¿Qué me estoy perdiendo?
Nadav B

44
@NadavB: Te estás perdiendo la secuencia de eventos. 1) El lote se calcula hacia adelante, artículo por artículo. 2) El lote se propaga hacia atrás, artículo por artículo. 3) Tome los promedios para gradientes. 4) Aplicar un paso de descenso de gradiente (quizás modificado por algo como Adagrad o RMSProp). Entonces, está poniendo el paso 3 fuera de secuencia y se pregunta cómo quitar los gradientes promedio sobre la capa de grupo máximo, pero nunca tiene que hacer esto, porque respalda cada ejemplo individualmente , solo agrega resultados para el lote después de eso
Neil Slater

1
Perfecto. Lo dejaste claro ahora.
Nadav B

@NeilSlater ¿La retropropagación solo se realiza elemento por elemento porque es necesaria para la capa de grupo máximo? En un MLP, primero promediar el error de todo el lote y luego calcular el gradiente en ese error promedio es idéntico a calcular el gradiente por artículo y luego ajustar los parámetros por el gradiente promedio * tasa de aprendizaje, ¿verdad? Sin embargo, la retropropagación del error promedio es mucho más rápida que la retropropagación de todos los errores individuales y luego la aplicación de las actualizaciones. Entonces, cuando sea posible, querrás hacerlo así y solo por artículo si es necesario ... como para el grupo máximo ¿Está bien?
lo tolmencre

@lotolmencre Está equivocado al calcular el error promedio en un lote. Debes volver a propagar individualmente, luego sumar gradientes al final. Los cálculos de gradiente no funcionarán correctamente de lo contrario a través de ninguna no linealidad. Si quieres saber más sobre eso, por favor haz una nueva pregunta
Neil Slater

2

Tengo la misma pregunta, pero probablemente lo resuelva revisando el código fuente de Caffe.

Por favor vea el código fuente de Caffe:

línea 620 y 631 de este código.

Calcula la derivada de cada parámetro agregando la derivada (de este parámetro) de cada entrada y luego la divide por tamaño de lote.

También vea la línea 137 de este código, simplemente escala derivada a 1 / iter_size, igual que el promedio.

Podemos ver que NO hay un tratamiento especial para la capa de Max Pooling cuando BP.

En cuanto a la derivada de Max Pooling, veamos nuevamente el código fuente de Caffe:

línea 272 de este código. Obviamente, solo la derivada del elemento más grande es 1*top_diff, la derivada de otros es 0*top_diff.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.