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?
Respuestas:
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 esm=max(a,b)
Sabemos∂J∂m 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∂J∂a y ∂J∂b
Sia>b
Localmente , *m=a . Entonces∂J∂a=∂J∂m
Localmente , *m no depende de b . Entonces∂J∂b=0
Por lo tanto∂J∂a=∂J∂m Si a>b de lo contrario ∂J∂a=0
y∂J∂b=∂J∂m Si b>a de lo contrario ∂J∂b=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 am .
** Técnicamente, sia=b exactamente entonces tenemos una discontinuidad, pero en la práctica podemos ignorar eso sin problemas al entrenar una red neuronal.
fuente
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 es0*top_diff
.fuente