Cómo derivar la propagación hacia atrás desde la segunda capa de convolución

Gracias por A2A, aquí hay un blog para una derivación matemática directa del backprop para una capa dada Redes neuronales convolucionales

Sin embargo, creo que es mucho más fácil de entender si alguien comienza a visualizar lo que realmente sucede. Me costó mucho entender esto, así que no te preocupes si no lo entiendes a primera vista.

Perdóneme por estos dibujos en bruto, pero no tuve tiempo para armar esto en algún programa elegante, espero que ayude

Primero comience con la inferencia de la capa conv, para acordar una notación

Lo que sucede allí es que haces una convolución por partes con cada filtro que producirá el mismo número de correlación de características de salida que la cantidad de filtros que tienes. Tenga en cuenta que cada filtro combina toda la información de la capa anterior. Por lo tanto, en general, tiene un tamaño de filtro general de [W, H, IN, OUT] donde IN es el número de canales de entrada y OUT es el número de mapas / canales de características de la salida descritos anteriormente.

Ahora veamos el verdadero problema. Se le da el error de la enésima capa, y su tarea es derivar lo que causó el error de esta capa en el lado de entrada de la capa: propaga de nuevo la [matemática] \ delta ^ N [/ matemática].

Básicamente, puede comenzar a evaluar todos los errores de los canales de entrada simultáneamente aplicando nuevamente la convolución por partes. Lo único que cambia es que los núcleos que usamos ahora son los núcleos invertidos horizontal y verticalmente.

Para esta transposición no tengo una explicación intuitiva, que se desprende de la derivación, y solo suma el resultado después de haber evaluado toda la propagación hacia atrás para cada filtro. Ahora nuestros filtros se pueden representar mediante una matriz [W, H, IN, OUT].

Alternativamente, podría evaluar un canal como este:

Basado en el último método, puede acelerar este proceso mediante la transposición, descrita en el último dibujo:

Aquí no solo giramos los ejes horizontal y vertical, sino que también transponemos nuestros canales IN y OUT, pasando de las dimensiones [H, W, IN, OUT] a [W, H, OUT, IN].

Estoy seguro de que todavía hay algunos defectos en mi descripción, corrígeme si encuentras uno. De todos modos, espero que de esta manera sea más fácil entender cómo funcionan las ConvNets 🙂