Saya telah menghabiskan banyak waktu debugging meledak gradien dan perilaku serupa. Jawaban Anda akan tergantung pada fungsi kerugian, data, arsitektur, dll. Ada ratusan alasan. Saya akan menyebutkan beberapa.
- Rugi-tergantung. Loglikelihood-losses perlu dipotong, jika tidak, ia dapat mengevaluasi dekat
log(0)
untuk prediksi / outlier yang buruk dalam dataset, menyebabkan meledaknya gradien. Sebagian besar paket (obor, tensorflow dll) mengimplementasikan kliping per default untuk kerugiannya.
- Pencilan dalam dataset.
- BatchNorm dengan batchsize kecil dan epsilon besar (hyperparameter). Dengan batchnorm sebagai , maka dengan kecil dan Anda bisa mendapatkan besaranϵy=(x−u)/(s+ϵ)sϵy
- Batch akhir dalam suatu zaman mungkin kecil jika dataset tidak dapat dibagi secara batch. Di dataloader obor ada bendera
drop_last
. Batchsize kecil = varian tinggi
Sekarang mengapa Anda melihatnya dengan Adam dan bukan dengan SGD? Jelas Anda mencapai kerugian yang lebih rendah dengan Adam. Seperti disebutkan sebelumnya, Jika 99,9% dari dataset memiliki optima pada satu titik kecuali beberapa pengamatan, ini mungkin pengamatan yang berteriak "TIDAK" dan melompat keluar dari minimum lokal ketika dipilih secara acak ke batch. Jika Anda melihatnya setiap langkah dataset_size//batch_size+1
, itu mungkin karena batchsize terakhir kecil. Saya yakin Anda akan melihat lonjakan SGD juga jika Anda membiarkannya mencapai kerugian yang lebih rendah.
Bonus: Penurunan Anda yang sangat cepat dengan pengoptimal momentum (Adam) dapat berarti bahwa beberapa lapisan (lapisan input? Lapisan keluaran?) Diinisialisasi dengan cara keluar dari skala (ke bobot besar / kecil).