Mengapa laju pembelajaran menyebabkan bobot jaringan saraf saya meroket?

9

Saya menggunakan tensorflow untuk menulis jaringan saraf sederhana untuk sedikit riset dan saya punya banyak masalah dengan bobot 'nan' saat pelatihan. Saya mencoba banyak solusi berbeda seperti mengubah pengoptimal, mengubah kehilangan, ukuran data, dll. Tetapi tanpa hasil. Akhirnya, saya perhatikan bahwa perubahan dalam tingkat pembelajaran membuat perbedaan yang luar biasa dalam bobot saya.

Menggunakan tingkat pembelajaran 0,001 (yang saya pikir cukup konservatif), fungsi meminimalkan sebenarnya akan meningkatkan kerugian secara eksponensial. Setelah satu zaman, kerugian bisa melonjak dari angka ribuan menjadi satu triliun dan kemudian hingga tak terbatas ('nan'). Ketika saya menurunkan tingkat belajar menjadi .0001, semuanya bekerja dengan baik.

1) Mengapa satu urutan besarnya memiliki efek seperti itu?

2) Mengapa fungsi meminimalkan benar-benar melakukan kebalikan dari fungsinya dan memaksimalkan kerugian? Menurut saya itu seharusnya tidak terjadi, tidak peduli tingkat pembelajarannya.

abeoliver
sumber
Bisakah Anda memberi tahu bagaimana Anda menginisialisasi bobot Anda?
Himanshu Rai
Saya sarankan mencoba pemecah Adam. Tampaknya berperilaku lebih baik dan default yang lebih baik, dan Anda mungkin dapat menggunakan tarif pembelajaran default untuk itu.
DW

Jawaban:

9

Anda mungkin menemukan Bab 8 Pembelajaran Mendalam sangat membantu. Di dalamnya, penulis membahas pelatihan model jaringan saraf. Ini sangat rumit, jadi saya tidak terkejut Anda mengalami kesulitan.

Satu kemungkinan (selain kesalahan pengguna) adalah bahwa masalah Anda sangat buruk. Metode keturunan gradien hanya menggunakan informasi turunan (gradien) pertama saat menghitung pembaruan. Ini dapat menyebabkan masalah ketika turunan kedua (Hessian) tidak dikondisikan.

Mengutip dari penulis:

Beberapa tantangan muncul bahkan ketika mengoptimalkan fungsi cembung. Dari jumlah tersebut, yang paling menonjol adalah sakit-conditioning dari matriks Hessian . Ini adalah masalah yang sangat umum dalam kebanyakan optimasi numerik, cembung atau lainnya, dan dijelaskan secara lebih rinci di bagian 4.3.1.H

Masalah pengondisian umumnya diyakini ada dalam masalah pelatihan jaringan saraf. Pengkondisian dapat bermanifestasi dengan menyebabkan SGD “macet” dalam arti bahwa langkah yang sangat kecil pun meningkatkan fungsi biaya. [penekanan saya menambahkan]

Para penulis memberikan derivasi sederhana untuk menunjukkan bahwa ini bisa terjadi. Menggunakan gradient descent, fungsi biaya harus berubah (ke urutan kedua) oleh

ε22gTHg-εgTg

di mana adalah gradien, adalah Hessian, dan adalah tingkat belajar. Jelas, jika turunan kedua besar, maka istilah pertama dapat membanjiri yang kedua, dan fungsi biaya akan meningkat, bukan menurun. Karena skala istilah pertama dan kedua berbeda dengan , salah satu cara untuk mengatasi masalah ini adalah dengan mengurangi (walaupun, tentu saja, ini dapat mengakibatkan belajar terlalu lambat).gHεεε

vbox
sumber
2
Tampaknya bagi saya bahwa jawaban kuora ini menawarkan penjelasan yang cukup intuitif untuk pengkondisian Hessian.
Oren Milman
3

1) Mengapa satu urutan besarnya memiliki efek seperti itu?

2) Mengapa fungsi meminimalkan benar-benar melakukan kebalikan dari fungsinya dan memaksimalkan kerugian? Menurut saya itu seharusnya tidak terjadi, tidak peduli tingkat pembelajarannya.

Ada dua alasan utama. Yang pertama Anda tidak menggunakan data yang sama di langkah pertama daripada di yang kedua. Jika pada langkah pertama model mempelajari nilai-nilai tersebut dan jatuh ke minimum lokal maka sangat mungkin memberikan kerugian yang lebih besar untuk nilai-nilai baru.

Alasan kedua adalah bentuk fungsi biaya. Anda mencoba meminimalkan nilai dengan langkah-langkah kecil, panjang langkah-langkah itu diberikan oleh dua faktor: gradien dan tingkat pembelajaran. Gambar fungsi Anda seperti x ^ 2. Jika nilai Anda mendekati 0, gradien akan menjadi kecil daripada jika lebih jauh, tetapi jika tingkat pembelajaran Anda besar, alih-alih semakin mendekati 0, Anda sebenarnya meningkatkan kesalahan karena titik baru Anda didasarkan pada penilaian dan tingkat belajar lebih jauh ke 0 dari langkah sebelumnya Dan ini bisa terjadi beberapa kali.

Lihatlah tautan ini: http://www.statisticsviews.com/details/feature/5722691/Getting-to-the-Bottom-of-Regression-with-Gradient-Descent.html

Jika Anda melihat angka-angka dengan alpha 0,01 dan alpha 0,12, Anda akan melihat bagaimana pada gambar pertama laju pembelajaran kecil dan gradien semakin mendekati minimum tetapi dalam kasus kedua laju pembelajaran sangat besar sehingga gradien bergerak lebih jauh dalam setiap langkah.

jorgemf
sumber
1
Berkenaan dengan alasan kedua - jawaban ini menunjukkan (menggunakan fungsi sederhana) ketika penurunan gradien mungkin berbeda. Jawaban itu juga memiliki kode Python sehingga Anda dapat bereksperimen dan melihat bagaimana gradient descent berperilaku dalam skenario yang berbeda ..
Oren Milman