Bagaimana cara menghitung jangka waktu delta dari Lapisan Konvolusional, mengingat syarat dan berat delta dari Lapisan Konvolusional sebelumnya?

10

Saya mencoba untuk melatih jaringan saraf tiruan dengan dua lapisan convolutional (c1, c2) dan dua lapisan tersembunyi (c1, c2). Saya menggunakan pendekatan backpropagation standar. Dalam pass mundur saya menghitung istilah kesalahan lapisan (delta) berdasarkan kesalahan lapisan sebelumnya, bobot lapisan sebelumnya dan gradien aktivasi sehubungan dengan fungsi aktivasi lapisan saat ini. Lebih khusus delta layer l terlihat seperti ini:

delta(l) = (w(l+1)' * delta(l+1)) * grad_f_a(l)

Saya dapat menghitung gradien c2, yang terhubung ke layer biasa. Saya hanya mengalikan bobot h1 dengan delta itu. Kemudian saya membentuk kembali matriks itu ke dalam bentuk output dari c2, kalikan dengan gradien fungsi aktivasi dan saya selesai.

Sekarang saya memiliki istilah delta c2 - Yang merupakan matriks ukuran 4D (featureMapSize, featureMapSize, filterNum, patternNum). Selanjutnya saya memiliki bobot c2, yang merupakan matriks ukuran 3D (filterSize, filterSize, filterNum).

Dengan dua istilah ini dan gradien aktivasi c1 saya ingin menghitung delta c1.

Singkat cerita:

Mengingat istilah delta dari lapisan konvolusional sebelumnya dan bobot dari lapisan itu, bagaimana cara saya menghitung istilah delta dari lapisan konvolusional?

cdwoelk
sumber

Jawaban:

6

Saya pertama-tama menurunkan kesalahan untuk lapisan konvolusional di bawah ini untuk kesederhanaan untuk array satu dimensi (input) yang dapat dengan mudah ditransfer ke multidimensi lalu:

Kami berasumsi di sini bahwa panjang adalah input dari konv. lapisan, adalah kernel-ukuran bobot yang menunjukkan masing-masing berat badan dengan dan output adalah . Maka kita dapat menulis (perhatikan penjumlahan dari nol): mana dan fungsi aktivasi (misalnya sigmoidal). Dengan ini, kita sekarang dapat mempertimbangkan beberapa fungsi kesalahan dan fungsi kesalahan pada lapisan konvolusional (salah satu lapisan sebelumnya) yang diberikan olehyl1Nl1mwwixl

xil=a=0m1waya+il1
yil=f(xil)fEE/yil. Kami sekarang ingin mengetahui ketergantungan kesalahan pada salah satu bobot pada lapisan sebelumnya: mana kita memiliki jumlah atas semua ekspresi di mana terjadi, yaitu . Perhatikan juga bahwa kita tahu istilah terakhir muncul dari fakta bahwa yang dapat Anda lihat dari persamaan pertama. Untuk menghitung gradien kita perlu mengetahui istilah pertama, yang dapat dihitung dengan:
Ewa=a=0NmExilxilwa=a=0NmEwayi+al1

waNmxilwa=yi+al1
Exil=Eyilyilxil=Eyilxilf(xil)
di mana lagi istilah pertama adalah kesalahan dalam lapisan sebelumnya dan fungsi aktivasi nonlinier.f

Dengan memiliki semua entitas yang diperlukan, kini kami dapat menghitung kesalahan dan menyebarkannya kembali secara efisien ke lapisan berharga: Perhatikan bahwa langkah terakhir dapat mudah dimengerti saat menuliskan -s wrt -s. The mengacu pada maxtrix berat dialihkan ( ).

δal1=Eyil1=a=0m1Exialxialyil1=a=0m1Exialwaflipped
xilyil1flippedT

Oleh karena itu Anda bisa menghitung kesalahan di lapisan berikutnya dengan (sekarang dalam notasi vektor):

δl=(wl)Tδl+1f(xl)

yang menjadi untuk lapisan convolutional dan subsampling: mana Operasi menyebarkan kesalahan melalui lapisan pengumpulan max.u p s a m p l e

δl=upsample((wl)Tδl+1)f(xl)
upsample

Silakan tambahkan atau koreksi saya!

Untuk referensi lihat:

http://ufldl.stanford.edu/tutorial/supervised/ConvolutionalNeuralNetwork/ http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

dan untuk implementasi C ++ (tanpa persyaratan untuk menginstal): https://github.com/nyanp/tiny-cnn#supported-networks

LeoW.
sumber