Mengapa kembali merambat melalui waktu dalam RNN?

14

Dalam jaringan saraf berulang, Anda biasanya akan maju merambat melalui beberapa langkah waktu, "membuka gulungan" jaringan, dan kemudian kembali merambat melintasi urutan input.

Mengapa Anda tidak hanya memperbarui bobot setelah masing-masing langkah dalam urutan? (setara dengan menggunakan panjang pemotongan 1, sehingga tidak ada yang membuka gulungan) Ini benar-benar menghilangkan masalah gradien menghilang, sangat menyederhanakan algoritma, mungkin akan mengurangi kemungkinan terjebak dalam minimum lokal, dan yang paling penting tampaknya berfungsi dengan baik . Saya melatih model dengan cara ini untuk menghasilkan teks dan hasilnya tampak sebanding dengan hasil yang saya lihat dari model yang dilatih BPTT. Saya hanya bingung tentang ini karena setiap tutorial tentang RNNs saya telah melihat mengatakan untuk menggunakan BPTT, hampir seolah-olah diperlukan untuk pembelajaran yang tepat, yang tidak terjadi.

Pembaruan: Saya menambahkan jawaban

Frobot
sumber
Arahan yang menarik untuk mengambil penelitian ini adalah membandingkan hasil yang telah Anda capai pada masalah Anda dengan tolok ukur yang diterbitkan dalam literatur tentang masalah RNN standar. Itu akan membuat artikel yang sangat keren.
Sycorax berkata Reinstate Monica
"Pembaruan: Saya menambahkan jawaban" menggantikan hasil edit sebelumnya dengan deskripsi arsitektur dan ilustrasi. Apakah itu disengaja?
Amuba mengatakan Reinstate Monica
Ya saya mengeluarkannya karena sepertinya tidak relevan dengan pertanyaan yang sebenarnya dan membutuhkan banyak ruang, tetapi saya dapat menambahkannya kembali jika itu membantu
Frobot
Yah orang-orang tampaknya memiliki masalah besar dengan memahami arsitektur Anda, jadi saya kira penjelasan tambahan apa pun berguna. Anda dapat menambahkannya ke jawaban Anda alih-alih pertanyaan Anda, jika mau.
Amuba mengatakan Reinstate Monica

Jawaban:

4

Sunting: Saya membuat kesalahan besar ketika membandingkan dua metode dan harus mengubah jawaban saya. Ternyata cara saya melakukannya, hanya kembali merambat pada langkah waktu saat ini, sebenarnya mulai belajar lebih cepat. Pembaruan cepat mempelajari pola paling dasar dengan sangat cepat. Tetapi pada kumpulan data yang lebih besar dan dengan waktu pelatihan yang lebih lama, BPTT sebenarnya keluar di atas. Saya menguji sampel kecil hanya untuk beberapa zaman dan berasumsi siapa pun yang memulai memenangkan perlombaan akan menjadi pemenang. Tapi ini memang membawa saya ke penemuan yang menarik. Jika Anda memulai pelatihan Anda kembali menyebarkan hanya satu langkah waktu, kemudian beralih ke BPTT dan perlahan-lahan meningkatkan seberapa jauh Anda menyebarkan, Anda mendapatkan konvergensi yang lebih cepat.

Frobot
sumber
Terima kasih atas pembaruan Anda. Dalam sumber gambar terakhir itu, dia mengatakan ini tentang pengaturan satu ke satu : "mode pemrosesan vanilla tanpa RNN, dari input berukuran tetap ke output berukuran tetap (misalnya klasifikasi gambar)." Jadi itu yang kami katakan. Jika seperti yang Anda gambarkan, ia tidak memiliki status dan itu bukan RNN. "Maju merambat melalui input tunggal sebelum merambat kembali" - Saya akan menyebutnya ANN. Tetapi ini tidak akan berfungsi dengan baik dengan teks sehingga ada sesuatu dan saya tidak tahu apa karena saya tidak memiliki kode
ragulpr
Saya tidak membaca bagian itu dan Anda benar. Model yang saya gunakan sebenarnya adalah "banyak ke banyak" di paling kanan. Saya berasumsi di bagian "satu ke satu" ada benar-benar banyak dari semua yang terhubung dan gambar hanya meninggalkannya. tapi itu sebenarnya adalah salah satu opsi di paling kanan yang tidak saya perhatikan (aneh untuk memilikinya di blog tentang RNNs, jadi saya berasumsi mereka semua berulang). Saya akan mengedit bagian dari jawaban itu agar lebih masuk akal
Frobot
Saya membayangkan itu yang terjadi, itu sebabnya saya bersikeras melihat fungsi kerugian Anda. Jika itu banyak ke banyak kerugian Anda adalah mirip dengan dan itu identik dengan RNN dan Anda menyebarkan sedang / penginputan seluruh urutan tapi kemudian hanya truncating BPTT yaitu Anda' d menghitung bagian merah di posting saya tetapi tidak berulang lagi. errHair=t(yt-y^t)2
ragulpr
Fungsi kerugian saya tidak bertambah seiring waktu. Saya mengambil satu input, mendapatkan satu output, lalu menghitung kerugian, dan memperbarui bobot, lalu beralih ke t +1, jadi tidak ada yang dijumlahkan. Saya akan menambahkan fungsi kerugian yang tepat ke posting asli
Frobot
Cukup kirim kode Anda, saya tidak lagi menebak, ini konyol.
ragulpr
2

RNN adalah Deep Neural Network (DNN) di mana setiap layer dapat mengambil input baru tetapi memiliki parameter yang sama. BPT adalah kata yang bagus untuk Back Propagation pada jaringan yang seperti itu sendiri adalah kata yang bagus untuk Gradient Descent.

Mengatakan bahwa RNN output y t dalam setiap langkah dan e r r o r t = ( y t - y t ) 2y^t

errort=(yty^t)2

Untuk mempelajari bobot, kita memerlukan gradien untuk fungsi untuk menjawab pertanyaan "berapa perubahan parameter yang mempengaruhi fungsi kerugian?" dan pindahkan parameter ke arah yang diberikan oleh:

errort=2(yty^t)y^t

Yaitu kami memiliki DNN di mana kami mendapatkan umpan balik tentang seberapa bagus prediksi di setiap lapisan. Karena perubahan parameter akan mengubah setiap lapisan dalam DNN (timestep) dan setiap lapisan berkontribusi pada output yang akan datang, ini perlu diperhitungkan.

Ambil satu jaringan neuron-satu lapisan sederhana untuk melihatnya secara semi-eksplisit:

y^t+1=f(a+bxt+cy^t)ay^t+1=f(a+bxt+cy^t)cay^tby^t+1=f(a+bxt+cy^t)(xt+cby^t)cy^t+1=f(a+bxt+cy^t)(y^t+ccy^t)y^t+1=f(a+bxt+cy^t)([0xty^t]+cy^t)

δ

[a~b~c~][abc]+δ(yty^t)y^t

y^t+1y^tt

error=t(yty^t)2

Mungkin setiap langkah kemudian akan memberikan kontribusi arah kasar yang cukup dalam agregasi? Ini bisa menjelaskan hasil Anda tetapi saya benar-benar tertarik mendengar lebih banyak tentang fungsi metode / kerugian Anda! Juga akan tertarik pada perbandingan dengan JST berjendela dua timestep.

sunting4: Setelah membaca komentar sepertinya arsitektur Anda bukan RNN.

ht Statefull

Model Anda: Stateless - status tersembunyi dibangun kembali di setiap langkah stateless edit2: menambahkan lebih banyak referensi ke DNNs edit3: memperbaiki gradstep dan beberapa notasi edit5: Memperbaiki interpretasi model Anda setelah jawaban / klarifikasi Anda.

ragulpr
sumber
1
Terima kasih atas jawaban Anda. Saya pikir Anda mungkin salah mengerti apa yang saya lakukan. Dalam propagasi maju saya hanya melakukan satu langkah, sehingga pada propagasi belakang juga hanya satu langkah. Saya tidak meneruskan menyebarkan beberapa input dalam urutan pelatihan. Saya mengerti maksud Anda tentang arah kasar yang cukup dalam agregasi untuk memungkinkan pembelajaran, tetapi saya telah memeriksa gradien saya dengan gradien yang dihitung secara numerik dan cocok dengan 10+ tempat desimal. Penyangga belakang bekerja dengan baik. Saya menggunakan cross entropy loss.
Frobot
1
Saya berupaya mengambil model yang sama dan melatihnya kembali dengan BPTT karena kami berbicara untuk memiliki perbandingan yang jelas. Saya juga telah melatih model menggunakan algoritma "satu langkah" ini untuk memprediksi apakah harga saham akan naik atau turun untuk hari berikutnya, yang mendapatkan akurasi yang layak, jadi saya akan memiliki dua model yang berbeda untuk membandingkan BPTT vs satu langkah mundur.
Frobot
y^t+1=f(xt,xt1)
1
Saya menggunakan jendela geser ukuran 1, tetapi hasilnya sangat berbeda dari membuat jendela geser ukuran 2 JST dengan input (xt, xt − 1). Saya sengaja dapat membiarkannya sesuai ketika mempelajari tubuh besar teks dan dapat mereproduksi seluruh teks dengan 0 kesalahan, yang membutuhkan mengetahui ketergantungan jangka panjang yang tidak mungkin jika Anda hanya memiliki (xt, xt − 1) sebagai input. satu-satunya pertanyaan yang saya miliki adalah jika menggunakan BPTT akan memungkinkan ketergantungan menjadi lebih lama, tapi jujur ​​tidak seperti itu.
Frobot
y^t2y^t=0
1

dF(g(x),h(x),m(x))dx=Fgdgdx+Fhdhdx+Fmdmdx

tHtθxtHt1HttLθ

θxtθa(xt,θ)θHt1θθHt1xt1θHt2Ht2θ

Matthew Hampsey
sumber
Saya mengerti mengapa Anda kembali menyebarkan melalui waktu dalam RNN tradisional. Saya mencoba mencari tahu mengapa RNN tradisional menggunakan beberapa input sekaligus untuk pelatihan, ketika menggunakan hanya satu per satu waktu jauh lebih sederhana dan juga berfungsi
Frobot
Satu-satunya pengertian di mana Anda dapat memasukkan banyak input sekaligus ke dalam RNN adalah memberi makan dalam banyak contoh pelatihan, sebagai bagian dari satu batch. Ukuran bets adalah arbitrer, dan konvergensi dijamin untuk ukuran apa pun, tetapi ukuran bets yang lebih tinggi dapat menyebabkan estimasi gradien yang lebih akurat dan konvergensi yang lebih cepat.
Matthew Hampsey
Bukan itu yang saya maksud dengan "beberapa input sekaligus". Saya tidak mengatakannya dengan baik. Maksud saya, Anda biasanya meneruskan merambat melalui beberapa input dalam urutan pelatihan, lalu kembali merambat kembali melalui semuanya, lalu memperbarui bobot. Jadi pertanyaannya adalah, mengapa menyebar melalui seluruh urutan ketika melakukan hanya satu input pada suatu waktu jauh lebih mudah dan masih berfungsi
Frobot
Saya pikir diperlukan klarifikasi di sini. Ketika Anda mengatakan "input", apakah Anda merujuk pada beberapa contoh pelatihan, atau apakah Anda merujuk pada beberapa langkah waktu dalam satu contoh pelatihan?
Matthew Hampsey
1
Saya akan mengirim jawaban untuk pertanyaan ini pada akhir hari ini. Saya selesai membuat versi BPTT, hanya perlu melatih dan membandingkan. Setelah itu jika Anda masih ingin melihat beberapa kode, beri tahu saya apa yang ingin Anda lihat dan saya kira saya masih bisa mempostingnya
Frobot