Bagaimana cara backpropagation bekerja melalui lapisan Max Pooling saat melakukan batch?

10

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?

Nadav B
sumber
Saya punya pertanyaan yang sama. ketika BP dengan hanya satu sampel, jelas bahwa hanya turunan elemen terbesar tidak nol, tetapi ketika BP dengan sampel dalam batch, sampel yang berbeda dapat menyebabkan posisi berbeda dari elemen terbesar, dapatkah kita menghitung turunan rata-rata dari setiap parameter seperti biasa (hanya tambahkan ∂L / ∂wi dari setiap sampel dan dibagi dengan ukuran batch)?
Shaotao Li

Jawaban:

8

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 adalah m=max(a,b)

  • Kita tahu Jm 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 Ja dan Jb

  • Jika a>b

    • Secara lokal , *m=a. BegituJa=Jm

    • Secara lokal , *m tidak bergantung pada b. BegituJb=0

  • Karena itu Ja=Jm jika a>b, lain Ja=0

  • dan Jb=Jm jika b>a, lain Jb=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 ke m.

** Secara teknis, jika a=b tepat saat itu kami memiliki diskontinuitas, tetapi dalam praktiknya kami dapat mengabaikan itu tanpa masalah saat melatih jaringan saraf.

Neil Slater
sumber
3
Tidak yakin saya mengerti Anda. Apa yang Anda katakan bekerja ketika Anda mundur setelah satu penyangga maju. Tetapi ketika Anda memiliki batch, Anda menopang 100 sampel, untuk menghitung fungsi kesalahan rata-rata. Seluruh titik batch adalah untuk dapat menghasilkan gradien yang lebih akurat, dan kemudian Anda hanya melakukan backprop berdasarkan pada turunan dari fungsi kesalahan sehubungan dengan W, pada nilai kesalahan rata-rata yang ditemukan dikalikan dengan tingkat pembelajaran. Jadi masih belum jelas bagaimana Anda menghitung turunan dari fungsi max, ketika setiap kali node yang berbeda dipilih sebagai maksimum. Apa yang saya lewatkan?
Nadav B
4
@NadavB: Anda melewatkan urutan acara. 1) Batch dihitung maju, item demi item. 2) Batch dipropagasi, item demi item. 3) Ambil rata-rata untuk gradien. 4) Menerapkan langkah penurunan gradien (mungkin dimodifikasi oleh sesuatu seperti Adagrad atau RMSProp). Jadi Anda meletakkan langkah 3 di luar urutan dan bertanya-tanya bagaimana cara membongkar gradien rata-rata di atas layer pool max - tetapi Anda tidak perlu melakukan ini, karena Anda mundur setiap contoh secara individual - Anda hanya mengumpulkan hasil untuk batch setelah itu
Neil Slater
1
Sempurna. Anda membuatnya jelas sekarang.
Nadav B
@ NeilSlater Apakah backpropagation hanya dilakukan item demi item karena itu diperlukan untuk lapisan max pool? Dalam MLP pertama rata-rata kesalahan seluruh batch dan kemudian menghitung gradien pada kesalahan rata-rata identik dengan menghitung gradien per item dan kemudian menyesuaikan parameter dengan rata-rata gradien * tingkat pembelajaran, kan? Namun, melakukan backpropagating kesalahan rata-rata jauh lebih cepat daripada backpropagating semua kesalahan individu dan kemudian menerapkan pembaruan. Jadi, jika memungkinkan Anda ingin melakukannya seperti ini dan hanya per item jika perlu ... seperti untuk max pool. Apakah itu benar?
lo tolmencre
@ lotolmencre Anda salah menghitung kesalahan rata-rata pada suatu batch. Anda harus kembali merambat secara individual, lalu menjumlahkan gradien di akhir. Perhitungan gradien tidak akan berfungsi dengan benar jika tidak melalui nonlinier. Jika Anda ingin tahu lebih banyak tentang itu, silakan ajukan pertanyaan baru
Neil Slater
2

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_difflainnya adalah 0*top_diff.

Shaotao Li
sumber