Katakanlah saya menggunakan RNN / LSTM untuk melakukan analisis sentimen, yang merupakan pendekatan banyak-ke-satu (lihat blog ini ). Jaringan dilatih melalui backpropagation terpotong terpotong (BPTT), di mana jaringan dibuka untuk hanya 30 langkah terakhir seperti biasa.
Dalam kasus saya, masing-masing bagian teks yang ingin saya klasifikasikan jauh lebih panjang daripada 30 langkah yang belum dibuka (~ 100 kata). Berdasarkan pengetahuan saya, BPTT hanya menjalankan satu waktu untuk satu bagian teks, yaitu ketika telah melewati seluruh bagian teks dan menghitung target klasifikasi biner, , yang kemudian dibandingkan dengan fungsi kerugian untuk menemukan kesalahan.
Gradien kemudian tidak akan pernah dihitung sehubungan dengan kata-kata pertama dari setiap bagian teks. Bagaimana RNN / LSTM kemudian dapat menyesuaikan bobotnya untuk menangkap pola tertentu yang hanya terjadi dalam beberapa kata pertama? Misalnya, katakan bahwa semua kalimat yang ditandai sebagai awal dengan "Saya suka ini" dan semua kalimat yang ditandai dimulai dengan "Saya benci ini". Bagaimana RNN / LSTM menangkap bahwa ketika itu hanya dibuka untuk 30 langkah terakhir ketika menyentuh akhir dari urutan panjang 100 langkah?n e g a t i v e
Jawaban:
Memang benar bahwa membatasi propagasi gradien Anda hingga 30 langkah waktu akan mencegahnya mempelajari segala sesuatu yang mungkin dalam dataset Anda. Namun, itu sangat bergantung pada dataset Anda apakah itu akan mencegahnya mempelajari hal-hal penting tentang fitur dalam model Anda!
Membatasi gradien selama pelatihan lebih seperti membatasi jendela di mana model Anda dapat mengasimilasi fitur input dan keadaan tersembunyi dengan kepercayaan tinggi. Karena pada saat pengujian Anda menerapkan model Anda ke seluruh urutan input, itu masih akan dapat memasukkan informasi tentang semua fitur input ke dalam keadaan tersembunyi. Mungkin tidak tahu persis bagaimana menyimpan informasi itu sampai membuat prediksi akhir untuk kalimat itu, tetapi mungkin ada beberapa (yang diakui lebih lemah) koneksi yang masih dapat dibuat.
Pikirkan dulu tentang contoh yang dibuat-buat. Misalkan jaringan Anda menghasilkan 1 jika ada 1 di mana saja di inputnya, dan 0 sebaliknya. Misalkan Anda melatih jaringan pada urutan panjang 20 dan membatasi lalu gradien menjadi 10 langkah. Jika dataset pelatihan tidak pernah berisi angka 1 dalam 10 langkah terakhir input, maka jaringan akan mengalami masalah dengan input uji konfigurasi apa pun. Namun, jika set pelatihan memiliki beberapa contoh seperti [1 0 0 ... 0 0 0] dan yang lainnya seperti [0 0 0 ... 1 0 0], maka jaringan akan dapat mengambil "kehadiran dari fitur 1 "di mana saja di inputnya.
Kembali ke analisis sentimen. Katakanlah selama pelatihan model Anda menghadapi kalimat negatif yang panjang seperti "Saya benci ini karena ... di sekitar dan di sekitar" dengan, katakanlah, 50 kata dalam ellipsis. Dengan membatasi propagasi gradien ke 30 langkah waktu, model tidak akan menghubungkan "Aku benci ini karena" ke label output, sehingga tidak akan mengambil "I", "benci", atau "ini" dari pelatihan ini contoh. Tapi itu akan menangkap kata-kata yang berada dalam 30 langkah waktu dari akhir kalimat. Jika rangkaian pelatihan Anda berisi contoh-contoh lain yang berisi kata-kata yang sama, mungkin bersama dengan "benci" maka ia memiliki peluang untuk mengambil tautan antara "benci" dan label sentimen negatif. Juga, jika Anda memiliki contoh pelatihan yang lebih singkat, katakan, "Kami benci ini karena ini mengerikan!" maka model Anda akan dapat menghubungkan fitur "benci" dan "ini" ke label target. Jika Anda memiliki cukup banyak contoh pelatihan ini, maka model tersebut harus dapat mempelajari koneksi secara efektif.
Pada waktu ujian, misalkan Anda mempresentasikan model dengan kalimat panjang lain seperti "Saya benci ini karena ... pada tokek!" Masukan model akan dimulai dengan "Aku benci ini", yang akan diteruskan ke keadaan tersembunyi model dalam beberapa bentuk. Status tersembunyi ini digunakan untuk memengaruhi status tersembunyi masa depan model, jadi meskipun mungkin ada 50 kata sebelum akhir kalimat, keadaan tersembunyi dari kata-kata awal tersebut memiliki peluang teoretis untuk mempengaruhi keluaran, meskipun tidak pernah ada. dilatih pada sampel yang mengandung jarak sangat jauh antara "Aku benci ini" dan akhir kalimat.
sumber
@ Imjohns3 benar, jika Anda memproses urutan panjang (ukuran N) dan membatasi backpropagation untuk langkah K terakhir, jaringan tidak akan mempelajari pola di awal.
Saya telah bekerja dengan teks panjang dan menggunakan pendekatan di mana saya menghitung kerugian dan melakukan backpropagation setelah setiap langkah K. Mari kita asumsikan bahwa urutan saya memiliki N = 1000 token, proses RNN saya pertama K = 100 kemudian saya mencoba melakukan prediksi (menghitung kerugian) dan backpropagate. Selanjutnya sambil mempertahankan status RNN rem rantai gradien (dalam pytorch-> detach) dan mulai k = 100 langkah lainnya.
Contoh yang baik dari teknik ini dapat Anda temukan di sini: https://github.com/ksopyla/pytorch_neural_networks/blob/master/RNN/lstm_imdb_tbptt.py
sumber