Mari kita asumsikan bahwa kita menggunakan ukuran batch 100 sampel untuk belajar.
Jadi dalam setiap batch, berat setiap neuron (dan bias, dll) sedang diperbarui dengan menambahkan minus dari tingkat pembelajaran * nilai kesalahan rata-rata yang kami temukan menggunakan 100 sampel * turunan dari fungsi kesalahan sehubungan dengan berat neuron saat ini yang sedang diperbarui.
Sekarang, ketika kita menggunakan layer Max Pool, bagaimana kita bisa menghitung turunan dari layer ini? Dalam setiap sampel yang kami makan maju, piksel yang berbeda (katakanlah) dipilih sebagai maks, jadi ketika kami melakukan backpropagate lebih dari 100 sampel di mana setiap kali jalur yang berbeda dipilih, bagaimana kita bisa melakukannya? Solusi yang ada dalam pikiran saya adalah untuk mengingat setiap piksel yang dipilih sebagai maksimum, dan kemudian mungkin membagi turunannya ke semua max-piksel. Apakah ini yang sedang dilakukan?
Jawaban:
Ketika jaringan saraf memproses batch, semua nilai aktivasi untuk setiap lapisan dihitung untuk setiap contoh (mungkin secara paralel per contoh jika perpustakaan dan perangkat keras mendukungnya). Nilai-nilai tersebut disimpan untuk kemungkinan digunakan nanti - yaitu satu nilai per aktivasi per contoh dalam batch, mereka tidak dikumpulkan dengan cara apa pun
Selama propagasi balik, nilai aktivasi tersebut digunakan sebagai salah satu sumber numerik untuk menghitung gradien, bersama dengan gradien yang dihitung sejauh ini bekerja mundur dan bobot penghubung. Seperti propagasi maju, propagasi balik diterapkan per contoh, itu tidak bekerja dengan nilai rata-rata atau dijumlahkan. Hanya ketika semua contoh telah diproses Anda bekerja dengan gradien dijumlahkan atau rata-rata untuk batch.
Ini berlaku sama untuk lapisan lapisan maks. Anda tidak hanya tahu apa output dari layer pooling untuk setiap contoh dalam batch, tetapi Anda dapat melihat layer sebelumnya dan menentukan input mana ke pool yang maksimum.
Secara matematis, dan menghindari kebutuhan untuk menentukan indeks untuk lapisan NN dan neuron, aturannya dapat dinyatakan seperti ini
Fungsi maju adalahm = m a x ( a , b )
Kita tahu∂J∂m untuk beberapa fungsi target J (dalam jaringan saraf yang akan menjadi fungsi kerugian yang kita ingin meminimalkan, dan kami mengasumsikan kita telah dipropagasi ke titik ini sudah)
Kami ingin tahu∂J∂a dan ∂J∂b
Jikaa>b
Secara lokal , *m=a . Begitu∂J∂a=∂J∂m
Secara lokal , *m tidak bergantung pada b . Begitu∂J∂b=0
Karena itu∂J∂a=∂J∂m jika a>b , lain ∂J∂a=0
dan∂J∂b=∂J∂m jika b>a , lain ∂J∂b=0
Ketika propagasi balik melewati lapisan pengumpulan max, gradien diproses per contoh dan hanya ditugaskan untuk input dari lapisan sebelumnya yang maksimum. Input lain mendapatkan gradien nol. Ketika batch ini tidak berbeda, hanya diproses per contoh, mungkin secara paralel. Di seluruh batch ini dapat berarti bahwa lebih dari satu, mungkin semua, dari aktivasi input ke kumpulan max mendapatkan beberapa bagian dari gradien - masing-masing dari subset contoh yang berbeda dalam batch.
* Lokal -> ketika membuat perubahan sangat kecil kem .
** Secara teknis, jikaa=b tepat saat itu kami memiliki diskontinuitas, tetapi dalam praktiknya kami dapat mengabaikan itu tanpa masalah saat melatih jaringan saraf.
sumber
Saya memiliki pertanyaan yang sama, tetapi saya mungkin mengetahuinya dengan meninjau kode sumber Caffe.
Silakan lihat kode sumber Caffe:
baris 620 & 631 dari kode ini .
Ini menghitung turunan dari setiap parameter dengan menambahkan turunan (dari parameter ini) dari setiap input kemudian membaginya dengan ukuran batch.
Juga lihat baris 137 dari kode ini , itu hanya skala turunan ke 1 / iter_size, sama seperti rata-rata.
Kita bisa melihat tidak ada perlakuan khusus untuk lapisan Max Pooling ketika BP.
Mengenai turunan dari Max Pooling, mari kita lihat kode sumber Caffe lagi:
baris 272 dari kode ini . Jelas, hanya turunan elemen terbesar, turunan
1*top_diff
lainnya adalah0*top_diff
.sumber