Penjelasan tentang Spike dalam kehilangan pelatihan vs iterasi dengan Adam Optimizer

15

Saya melatih jaringan saraf menggunakan i) SGD dan ii) Adam Optimizer. Saat menggunakan SGD normal, saya mendapatkan loss pelatihan yang mulus vs kurva iterasi seperti terlihat di bawah ini (yang merah) Namun, ketika saya menggunakan Adam Optimizer, kurva kehilangan pelatihan memiliki beberapa lonjakan. Apa penjelasan dari paku-paku ini?

Detail Model:

14 node input -> 2 lapisan tersembunyi (100 -> 40 unit) -> 4 unit output

Saya menggunakan parameter default untuk Adam beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-8dan batch_size = 32.

i) Dengan SGD ii) Dengan AdamDengan SGD Dengan Adam

Abdul Fatir
sumber
Untuk pemberitahuan di masa mendatang, menurunkan tingkat pembelajaran awal Anda dapat membantu menghilangkan lonjakan dalam Adam
tebal

Jawaban:

12

Paku adalah konsekuensi yang tidak dapat dihindari dari Mini-Batch Gradient Descent di Adam ( batch_size=32). Beberapa mini-batch memiliki data tidak beruntung 'kebetulan' untuk optimasi, mendorong lonjakan yang Anda lihat dalam fungsi biaya Anda menggunakan Adam. Jika Anda mencoba penurunan gradien stokastik (sama seperti menggunakan batch_size=1), Anda akan melihat bahwa ada lebih banyak lonjakan dalam fungsi biaya. Hal yang sama tidak terjadi pada (Penuh) Batch GD karena menggunakan semua data pelatihan (yaitu ukuran batch sama dengan kardinalitas set pelatihan Anda) setiap zaman optimasi. Seperti pada grafik pertama Anda biaya monoton berkurang dengan lancar sepertinya judul ( i) Dengan SGD ) salah dan Anda menggunakan (Penuh) Batch Gradient Descent, bukan SGD.

Pada-Nya yang besar tentu saja Jauh Belajar di Coursera , Andrew Ng menjelaskan secara rinci besar ini menggunakan gambar di bawah ini:

Fungsi biaya

xboard
sumber
2
'SGD ... menggunakan semua data pelatihan'-apakah Anda yakin akan hal ini? Ini berarti bobot diperbarui setelah semua data dimasukkan ke depan, tetapi ini disebut gd batch penuh, bukan sgd. Stochastic menyiratkan minibatch
Alex
Terima kasih @Alex untuk menunjukkan kesalahan saya, saya sudah memperbaikinya dan meningkatkan jawabannya dengan referensi untuk informasi lebih lanjut.
xboard
@ xboard - Tidak, saya menggunakan gradient descent mini-batch untuk yang pertama.
Abdul Fatir
6

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=(xu)/(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).

ragulpr
sumber