พารามิเตอร์ใดที่ควรใช้ในการหยุดก่อนกำหนด


103

ฉันกำลังฝึกโครงข่ายประสาทเทียมสำหรับโครงการของฉันโดยใช้ Keras Keras ได้จัดเตรียมฟังก์ชันสำหรับการหยุดก่อนกำหนด ฉันขอทราบได้ไหมว่าควรปฏิบัติตามพารามิเตอร์ใดเพื่อหลีกเลี่ยงไม่ให้เครือข่ายประสาทเทียมของฉันติดตั้งมากเกินไปโดยใช้การหยุดก่อน

คำตอบ:


164

หยุดก่อน

การหยุดก่อนกำหนดเป็นการหยุดการฝึกเมื่อการสูญเสียของคุณเริ่มเพิ่มขึ้น (หรืออีกนัยหนึ่งความแม่นยำในการตรวจสอบความถูกต้องเริ่มลดลง) ตามเอกสารจะใช้ดังนี้

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

ค่าต่างๆขึ้นอยู่กับการนำไปใช้งานของคุณ (ปัญหาขนาดแบทช์ ฯลฯ ... ) แต่โดยทั่วไปเพื่อป้องกันการติดตั้งมากเกินไปฉันจะใช้;

  1. ตรวจสอบการสูญเสียการตรวจสอบ (จำเป็นต้องใช้การตรวจสอบข้ามหรืออย่างน้อยชุดรถไฟ / test) โดยการตั้งค่าอาร์กิวเมนต์monitor 'val_loss'
  2. min_deltaเป็นเกณฑ์ว่าจะประเมินปริมาณการสูญเสียในบางยุคว่าเป็นการปรับปรุงหรือไม่ หากความแตกต่างของการสูญเสียต่ำกว่าmin_deltaนั้นจะถูกนับเป็นปริมาณที่ไม่มีการปรับปรุง ดีกว่าที่จะปล่อยให้เป็น 0 เนื่องจากเราสนใจว่าเมื่อใดที่การสูญเสียแย่ลง
  3. patienceอาร์กิวเมนต์แสดงถึงจำนวนยุคก่อนที่จะหยุดเมื่อการสูญเสียของคุณเริ่มเพิ่มขึ้น (หยุดปรับปรุง) ขึ้นอยู่กับการใช้งานของคุณหากคุณใช้แบทช์ขนาดเล็กมาก หรืออัตราการเรียนรู้ที่มากการสูญเสียซิกแซกของคุณ (ความแม่นยำจะมีเสียงดังมากขึ้น) ดังนั้นควรตั้งค่าpatienceอาร์กิวเมนต์ขนาดใหญ่ หากคุณใช้แบทช์จำนวนมากและอัตราการเรียนรู้น้อยการสูญเสียของคุณจะราบรื่นขึ้นเพื่อให้คุณสามารถใช้patienceอาร์กิวเมนต์น้อยลงได้ ไม่ว่าจะด้วยวิธีใดฉันจะปล่อยให้เป็น 2 ดังนั้นฉันจะให้โอกาสนางแบบมากขึ้น
  4. verbose ตัดสินใจว่าจะพิมพ์อะไรปล่อยให้เป็นค่าเริ่มต้น (0)
  5. modeอาร์กิวเมนต์ขึ้นอยู่กับสิ่งทิศทางปริมาณการตรวจสอบของคุณได้ (มันควรจะลดลงหรือเพิ่มขึ้น) minเนื่องจากเราตรวจสอบการสูญเสียเราสามารถใช้ แต่ขอปล่อยให้ keras จัดการกับเราและตั้งค่าเป็นauto

ดังนั้นฉันจะใช้สิ่งนี้และทดลองโดยการวางแผนการสูญเสียข้อผิดพลาดโดยไม่ต้องหยุดก่อน

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

สำหรับความคลุมเครือที่อาจเกิดขึ้นเกี่ยวกับวิธีการโทรกลับฉันจะพยายามอธิบายเพิ่มเติม เมื่อคุณเรียกfit(... callbacks=[es])ใช้โมเดลของคุณ Keras จะเรียกใช้ฟังก์ชันที่กำหนดไว้ล่วงหน้าของวัตถุเรียกกลับ ฟังก์ชั่นเหล่านี้สามารถเรียกว่าon_train_begin, on_train_end, on_epoch_begin, on_epoch_endและ,on_batch_begin on_batch_endการหยุดการโทรกลับก่อนกำหนดจะถูกเรียกในทุกช่วงปลายเปรียบเทียบค่าที่ตรวจสอบได้ดีที่สุดกับค่าปัจจุบันและจะหยุดหากตรงตามเงื่อนไข (กี่ยุคที่ผ่านมานับตั้งแต่การสังเกตค่าที่ตรวจสอบดีที่สุดและเป็นมากกว่าการโต้แย้งความอดทนความแตกต่างระหว่าง ค่าสุดท้ายมากกว่า min_delta เป็นต้น .. )

ในฐานะที่เป็นแหลมโดย @BrentFaust ในความคิดเห็นการฝึกอบรมรุ่นจะดำเนินต่อไปจนกว่าเงื่อนไขอย่างใดอย่างหนึ่งในช่วงต้นจะได้พบกับการหยุดหรือepochsพารามิเตอร์ (default = 10) ในการfit()เป็นที่พอใจ การตั้งค่าการโทรกลับก่อนหยุดจะไม่ทำให้โมเดลฝึกเกินepochsพารามิเตอร์ ดังนั้นfit()ฟังก์ชันการโทรที่มีepochsค่ามากขึ้นจะได้รับประโยชน์มากขึ้นจากการโทรกลับก่อนหยุด


3
@AizuddinAzman close min_deltaเป็นเกณฑ์ว่าจะวัดปริมาณการเปลี่ยนแปลงของมูลค่าที่ตรวจสอบว่าเป็นการปรับปรุงหรือไม่ ใช่ถ้าเราให้monitor = 'val_loss'มันจะอ้างถึงความแตกต่างระหว่างการสูญเสียการตรวจสอบความถูกต้องในปัจจุบันและการสูญเสียการตรวจสอบความถูกต้องก่อนหน้านี้ ในทางปฏิบัติหากคุณmin_delta=0.1ลดการสูญเสียการตรวจสอบความถูกต้อง (ปัจจุบัน - ก่อนหน้า) ที่น้อยกว่า 0.1 จะไม่สามารถหาปริมาณได้ดังนั้นจะหยุดการฝึกอบรม (ถ้าคุณมีpatience = 0)
umutto

3
โปรดทราบว่าcallbacks=[EarlyStopping(patience=2)]ไม่มีผลเว้นแต่ epochs model.fit(..., epochs=max_epochs)จะได้รับการ
Brent Faust

1
@BrentFaust นั่นคือความเข้าใจของฉันเช่นกันฉันได้เขียนคำตอบโดยสันนิษฐานว่าโมเดลกำลังได้รับการฝึกฝนอย่างน้อย 10 ยุค (เป็นค่าเริ่มต้น) หลังจากความคิดเห็นของคุณฉันได้ตระหนักว่าอาจมีบางกรณีที่โปรแกรมเมอร์กำลังเรียกพอดีกับepoch=1ในลูป (สำหรับกรณีการใช้งานที่หลากหลาย) ซึ่งการเรียกกลับนี้จะล้มเหลว หากคำตอบของฉันมีความคลุมเครือฉันจะพยายามอธิบายให้ดีขึ้น
umutto

4
@ แอดมิรัลเวนเนื่องจากฉันได้เขียนคำตอบรหัสจึงเปลี่ยนไปเล็กน้อย หากคุณใช้ Keras เวอร์ชันล่าสุดคุณสามารถใช้restore_best_weightsอาร์กิวเมนต์ (ยังไม่ได้อยู่ในเอกสารประกอบ) ซึ่งจะโหลดแบบจำลองด้วยน้ำหนักที่ดีที่สุดหลังการฝึกอบรม แต่สำหรับจุดประสงค์ของคุณฉันจะใช้การModelCheckpointเรียกกลับด้วยการsave_best_onlyโต้แย้ง คุณสามารถตรวจสอบเอกสารได้ทันทีที่จะใช้ แต่คุณต้องโหลดน้ำหนักที่ดีที่สุดด้วยตนเองหลังการฝึกอบรม
umutto

1
@umutto สวัสดีขอบคุณสำหรับข้อเสนอแนะของ restore_best_weights อย่างไรก็ตามฉันไม่สามารถใช้งานได้ `es = EarlyStopping (monitor = 'val_acc', min_delta = 1e-4, ความอดทน = ความอดทน _, verbose = 1, restore_best_weights = True) TypeError: __init __ () ได้รับอาร์กิวเมนต์คำหลักที่ไม่คาดคิด 'restore_best_weights'` ความคิดใด ๆ ? keras 2.2.2, tf, 1.10 เวอร์ชันของคุณคืออะไร?
Haramoz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.