Parameter mana yang harus digunakan untuk penghentian awal?


100

Saya melatih jaringan saraf untuk proyek saya menggunakan Keras. Keras telah menyediakan fungsi untuk berhenti lebih awal. Bolehkah saya mengetahui parameter apa yang harus diperhatikan untuk menghindari jaringan saraf saya overfitting dengan menggunakan penghentian awal?

Jawaban:


160

penghentian awal

Penghentian awal pada dasarnya menghentikan pelatihan setelah kerugian Anda mulai meningkat (atau dengan kata lain keakuratan validasi mulai menurun). Menurut dokumen itu digunakan sebagai berikut;

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

Nilai tergantung pada implementasi Anda (masalah, ukuran batch, dll ...) tetapi secara umum untuk mencegah overfitting, saya akan menggunakan;

  1. Pantau kerugian validasi (perlu menggunakan validasi silang atau setidaknya set pelatihan / pengujian) dengan menyetel monitor argumen ke 'val_loss'.
  2. min_deltaadalah ambang untuk mengukur apakah kerugian pada beberapa periode sebagai perbaikan atau tidak. Jika selisih kerugian di bawah min_delta, itu dihitung sebagai tidak ada perbaikan. Lebih baik biarkan 0 karena kita tertarik ketika kerugian menjadi lebih buruk.
  3. patienceArgumen mewakili jumlah periode sebelum berhenti setelah kerugian Anda mulai meningkat (berhenti meningkat). Hal ini bergantung pada penerapan Anda, jika Anda menggunakan batch yang sangat kecil atau kecepatan pemelajaran yang besar kerugian Anda zig-zag (akurasi akan lebih berisik) jadi lebih baik setel patienceargumen yang besar . Jika Anda menggunakan batch besar dan kecepatan pemelajaran kecil, kerugian Anda akan lebih lancar sehingga Anda dapat menggunakan patienceargumen yang lebih kecil . Bagaimanapun saya akan membiarkannya sebagai 2 jadi saya akan memberi model lebih banyak kesempatan.
  4. verbose memutuskan apa yang akan dicetak, biarkan default (0).
  5. modeArgumen tergantung pada arah mana kuantitas yang Anda pantau (apakah itu seharusnya menurun atau meningkat), karena kami memantau kerugian, kami dapat menggunakan min. Tapi mari kita biarkan keras menangani itu untuk kita dan setel keauto

Jadi saya akan menggunakan sesuatu seperti ini dan bereksperimen dengan merencanakan kerugian kesalahan dengan dan tanpa penghentian awal.

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=2,
                              verbose=0, mode='auto')

Untuk kemungkinan ambiguitas tentang cara kerja callback, saya akan mencoba menjelaskan lebih lanjut. Setelah Anda memanggil fit(... callbacks=[es])model Anda, Keras memanggil objek callback yang diberi fungsi yang telah ditentukan sebelumnya. Fungsi-fungsi ini dapat disebut on_train_begin, on_train_end, on_epoch_begin, on_epoch_enddan on_batch_begin, on_batch_end. Callback penghentian awal dipanggil pada setiap akhir epoch, membandingkan nilai terbaik yang dipantau dengan yang saat ini dan berhenti jika kondisi terpenuhi (berapa banyak epoch yang telah berlalu sejak pengamatan nilai terbaik yang dipantau dan apakah itu lebih dari argumen kesabaran, perbedaan antara nilai terakhir lebih besar dari min_delta dll ..).

Seperti yang ditunjukkan oleh @BrentFaust dalam komentar, pelatihan model akan berlanjut hingga kondisi Penghentian Awal terpenuhi atau epochsparameter (default = 10) di fit()terpenuhi. Menyetel callback Penghentian Awal tidak akan membuat model berlatih melampaui epochsparameternya. Jadi memanggil fit()fungsi dengan epochsnilai yang lebih besar akan mendapatkan keuntungan lebih dari callback Penghentian Awal.


3
Tutup @AizuddinAzman, min_deltaadalah ambang untuk mengukur apakah perubahan nilai yang dipantau sebagai perbaikan atau tidak. Jadi ya, jika kami memberikan monitor = 'val_loss'maka itu akan mengacu pada perbedaan antara kerugian validasi saat ini dan kerugian validasi sebelumnya. Dalam prakteknya, jika Anda memberikan min_delta=0.1penurunan kerugian validasi (saat ini - sebelumnya) lebih kecil dari 0,1 tidak akan dihitung, sehingga akan menghentikan pelatihan (jika Anda punya patience = 0).
umutto

3
Perhatikan bahwa callbacks=[EarlyStopping(patience=2)]tidak berpengaruh, kecuali waktu diberikan model.fit(..., epochs=max_epochs).
Brent Faust

1
@BrentFaust Itulah pemahaman saya juga, saya telah menulis jawaban dengan asumsi bahwa model sedang dilatih dengan setidaknya 10 periode (sebagai default). Setelah komentar Anda, saya menyadari bahwa mungkin ada kasus yang pemrogram memanggil fit dengan epoch=1loop for (untuk berbagai kasus penggunaan) di mana callback ini akan gagal. Jika ada ambiguitas dalam jawaban saya, saya akan mencoba menjelaskannya dengan lebih baik.
umutto

4
@AdmiralWen Sejak saya menulis jawabannya, kode telah berubah sedikit. Jika Anda menggunakan Keras versi terbaru, Anda dapat menggunakan restore_best_weightsargumen (belum di dokumentasinya), yang memuat model dengan bobot terbaik setelah pelatihan. Tapi, untuk tujuan Anda, saya akan menggunakan ModelCheckpointcallback dengan save_best_onlyargumen. Anda dapat memeriksa dokumentasinya, langsung digunakan tetapi Anda perlu memuat beban terbaik secara manual setelah pelatihan.
umutto

1
@umutto Halo terima kasih atas saran restore_best_weights, namun saya tidak dapat menggunakannya, `es = EarlyStopping (monitor = 'val_acc', min_delta = 1e-4, patience = patience_, verbose = 1, restore_best_weights = True) TypeError: __init __ () mendapat argumen kata kunci yang tidak terduga 'restore_best_weights'`. Ada ide? keras 2.2.2, tf, 1.10 apa versi Anda?
Haramoz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.