Una convolución emplea un principio de distribución de peso que complicará las matemáticas de manera significativa, pero tratemos de superar las malezas. Estoy sacando la mayor parte de mi explicación de esta fuente .
Pase adelantado
Como observó, el paso hacia adelante de la capa convolucional se puede expresar como
xli,j=∑m∑nwlm,nol−1i+m,j+n+bli,j
k1k2k1=k2=2x0,0=0.25mn
Propagación hacia atrás
Suponiendo que está utilizando el error cuadrático medio (MSE) definido como
E=12∑p(tp−yp)2
queremos determinar
∂E∂wlm′,n′m′n′w10,0=−0.13HK
(H−k1+1)(W−k2+1)
44w10,0=−0.13x10,0=0.25
∂E∂wlm′,n′=∑H−k1i=0∑W−k2j=0∂E∂xli,j∂xli,j∂wlm′,n′
Esto itera en todo el espacio de salida, determina el error que la salida está contribuyendo y luego determina el factor de contribución del peso del núcleo con respecto a esa salida.
Llamemos a la contribución al error desde el delta del espacio de salida para simplificar y realizar un seguimiento del error propagado hacia atrás,
∂E∂xli,j=δli,j
El aporte de los pesos
La convolución se define como
xli,j=∑m∑nwlm,nol−1i+m,j+n+bli,j
así,
∂xli,j∂wlm′,n′=∂∂wlm′,n′(∑m∑nwlm,nol−1i+m,j+n+bli,j)
m=m′n=n′
∂xli,j∂wlm′,n′=ol−1i+m′,j+n′
Luego de vuelta en nuestro término de error
∂E∂wlm′,n′=∑H−k1i=0∑W−k2j=0δli,jol−1i+m′,j+n′
Descenso de gradiente estocástico
w(t+1)=w(t)−η∂E∂wlm′,n′
Vamos a calcular algunos de ellos.
import numpy as np
from scipy import signal
o = np.array([(0.51, 0.9, 0.88, 0.84, 0.05),
(0.4, 0.62, 0.22, 0.59, 0.1),
(0.11, 0.2, 0.74, 0.33, 0.14),
(0.47, 0.01, 0.85, 0.7, 0.09),
(0.76, 0.19, 0.72, 0.17, 0.57)])
d = np.array([(0, 0, 0.0686, 0),
(0, 0.0364, 0, 0),
(0, 0.0467, 0, 0),
(0, 0, 0, -0.0681)])
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
matriz ([[0.044606, 0.094061], [0.011262, 0.068288]])
∂E∂w
Avíseme si hay errores en la derivación.
Actualización: código corregido