Konvolusi menggunakan prinsip pembagian berat yang akan menyulitkan matematika secara signifikan tetapi mari kita coba untuk melewati gulma. Saya menarik sebagian besar penjelasan saya dari sumber ini .
Maju terus
Ketika Anda mengamati lintasan ke depan dari lapisan konvolusional dapat dinyatakan sebagai
xli,j=∑m∑nwlm,nol−1i+m,j+n+bli,j
di mana dalam kasus kami k1 dan k2 adalah ukuran kernel, dalam kasus kami k1=k2=2 . Jadi ini mengatakan untuk output x0,0=0.25 seperti yang Anda temukan. m dan n iterate melintasi dimensi kernel.
Backpropagation
Dengan asumsi Anda menggunakan mean squared error (MSE) yang didefinisikan sebagai
E=12∑p(tp−yp)2,
kami ingin menentukan
∂E∂wlm′,n′ untuk memperbarui bobot. m′dann′adalah indeks dalam matriks kernel yang tidak dapat dikacaukan dengan iteratornya. Misalnyaw10,0=−0.13 dalam contoh kita. Kita juga dapat melihat bahwa untuk gambar inputH xK dimensi output setelah lapisan konvolusional
(H−k1+1) x (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′
Ini mengulangi seluruh ruang output, menentukan kesalahan bahwa output berkontribusi dan kemudian menentukan faktor kontribusi bobot kernel sehubungan dengan output itu.
Mari kita sebut kontribusi kesalahan dari delta ruang output untuk kesederhanaan dan untuk melacak kesalahan backpropagated,
∂E∂xli,j=δli,j
Kontribusi dari bobot
Konvolusi didefinisikan sebagai
xli,j=∑m∑nwlm,nol−1i+m,j+n+bli,j
jadi,
∂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′.
Then back in our error term
∂E∂wlm′,n′=∑H−k1i=0∑W−k2j=0δli,jol−1i+m′,j+n′.
Stochastic gradient descent
w(t+1)=w(t)−η∂E∂wlm′,n′
Let's calculate some of them
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')
array([[ 0.044606, 0.094061], [ 0.011262, 0.068288]])
Now you can put that into the SGD equation in place of ∂E∂w.
Please let me know if theres errors in the derivation.
Update: Corrected code