ฉันกำลังฝึกโครงข่ายประสาทเทียมสำหรับโครงการของฉันโดยใช้ Keras Keras ได้จัดเตรียมฟังก์ชันสำหรับการหยุดก่อนกำหนด ฉันขอทราบได้ไหมว่าควรปฏิบัติตามพารามิเตอร์ใดเพื่อหลีกเลี่ยงไม่ให้เครือข่ายประสาทเทียมของฉันติดตั้งมากเกินไปโดยใช้การหยุดก่อน
ฉันกำลังฝึกโครงข่ายประสาทเทียมสำหรับโครงการของฉันโดยใช้ Keras Keras ได้จัดเตรียมฟังก์ชันสำหรับการหยุดก่อนกำหนด ฉันขอทราบได้ไหมว่าควรปฏิบัติตามพารามิเตอร์ใดเพื่อหลีกเลี่ยงไม่ให้เครือข่ายประสาทเทียมของฉันติดตั้งมากเกินไปโดยใช้การหยุดก่อน
คำตอบ:
การหยุดก่อนกำหนดเป็นการหยุดการฝึกเมื่อการสูญเสียของคุณเริ่มเพิ่มขึ้น (หรืออีกนัยหนึ่งความแม่นยำในการตรวจสอบความถูกต้องเริ่มลดลง) ตามเอกสารจะใช้ดังนี้
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
ค่าต่างๆขึ้นอยู่กับการนำไปใช้งานของคุณ (ปัญหาขนาดแบทช์ ฯลฯ ... ) แต่โดยทั่วไปเพื่อป้องกันการติดตั้งมากเกินไปฉันจะใช้;
monitor
'val_loss'
min_delta
เป็นเกณฑ์ว่าจะประเมินปริมาณการสูญเสียในบางยุคว่าเป็นการปรับปรุงหรือไม่ หากความแตกต่างของการสูญเสียต่ำกว่าmin_delta
นั้นจะถูกนับเป็นปริมาณที่ไม่มีการปรับปรุง ดีกว่าที่จะปล่อยให้เป็น 0 เนื่องจากเราสนใจว่าเมื่อใดที่การสูญเสียแย่ลงpatience
อาร์กิวเมนต์แสดงถึงจำนวนยุคก่อนที่จะหยุดเมื่อการสูญเสียของคุณเริ่มเพิ่มขึ้น (หยุดปรับปรุง) ขึ้นอยู่กับการใช้งานของคุณหากคุณใช้แบทช์ขนาดเล็กมาก
หรืออัตราการเรียนรู้ที่มากการสูญเสียซิกแซกของคุณ (ความแม่นยำจะมีเสียงดังมากขึ้น) ดังนั้นควรตั้งค่าpatience
อาร์กิวเมนต์ขนาดใหญ่ หากคุณใช้แบทช์จำนวนมากและอัตราการเรียนรู้น้อยการสูญเสียของคุณจะราบรื่นขึ้นเพื่อให้คุณสามารถใช้patience
อาร์กิวเมนต์น้อยลงได้ ไม่ว่าจะด้วยวิธีใดฉันจะปล่อยให้เป็น 2 ดังนั้นฉันจะให้โอกาสนางแบบมากขึ้นverbose
ตัดสินใจว่าจะพิมพ์อะไรปล่อยให้เป็นค่าเริ่มต้น (0)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
ค่ามากขึ้นจะได้รับประโยชน์มากขึ้นจากการโทรกลับก่อนหยุด
callbacks=[EarlyStopping(patience=2)]
ไม่มีผลเว้นแต่ epochs model.fit(..., epochs=max_epochs)
จะได้รับการ
epoch=1
ในลูป (สำหรับกรณีการใช้งานที่หลากหลาย) ซึ่งการเรียกกลับนี้จะล้มเหลว หากคำตอบของฉันมีความคลุมเครือฉันจะพยายามอธิบายให้ดีขึ้น
restore_best_weights
อาร์กิวเมนต์ (ยังไม่ได้อยู่ในเอกสารประกอบ) ซึ่งจะโหลดแบบจำลองด้วยน้ำหนักที่ดีที่สุดหลังการฝึกอบรม แต่สำหรับจุดประสงค์ของคุณฉันจะใช้การModelCheckpoint
เรียกกลับด้วยการsave_best_only
โต้แย้ง คุณสามารถตรวจสอบเอกสารได้ทันทีที่จะใช้ แต่คุณต้องโหลดน้ำหนักที่ดีที่สุดด้วยตนเองหลังการฝึกอบรม
min_delta
เป็นเกณฑ์ว่าจะวัดปริมาณการเปลี่ยนแปลงของมูลค่าที่ตรวจสอบว่าเป็นการปรับปรุงหรือไม่ ใช่ถ้าเราให้monitor = 'val_loss'
มันจะอ้างถึงความแตกต่างระหว่างการสูญเสียการตรวจสอบความถูกต้องในปัจจุบันและการสูญเสียการตรวจสอบความถูกต้องก่อนหน้านี้ ในทางปฏิบัติหากคุณmin_delta=0.1
ลดการสูญเสียการตรวจสอบความถูกต้อง (ปัจจุบัน - ก่อนหน้า) ที่น้อยกว่า 0.1 จะไม่สามารถหาปริมาณได้ดังนั้นจะหยุดการฝึกอบรม (ถ้าคุณมีpatience = 0
)