ฉันพบคำถามสองข้อที่นี่และที่นี่เกี่ยวกับปัญหานี้ แต่ยังไม่มีคำตอบหรือคำอธิบายที่ชัดเจนฉันบังคับใช้ปัญหาเดียวกันที่ข้อผิดพลาดในการตรวจสอบความถูกต้องน้อยกว่าข้อผิดพลาดการฝึกอบรมในเครือข่าย Convolution Neural นั่นหมายความว่าอย่างไร?
ฉันพบคำถามสองข้อที่นี่และที่นี่เกี่ยวกับปัญหานี้ แต่ยังไม่มีคำตอบหรือคำอธิบายที่ชัดเจนฉันบังคับใช้ปัญหาเดียวกันที่ข้อผิดพลาดในการตรวจสอบความถูกต้องน้อยกว่าข้อผิดพลาดการฝึกอบรมในเครือข่าย Convolution Neural นั่นหมายความว่าอย่างไร?
คำตอบ:
เป็นการยากที่จะแน่ใจโดยไม่ทราบวิธีการที่แท้จริงของคุณ (เช่นวิธีการตรวจสอบความถูกต้องข้ามตัวชี้วัดประสิทธิภาพวิธีแบ่งข้อมูลเป็นต้น)
แม้ว่าโดยทั่วไปแล้วข้อผิดพลาดในการฝึกอบรมจะประมาทข้อผิดพลาดในการตรวจสอบของคุณเกือบตลอดเวลา อย่างไรก็ตามข้อผิดพลาดในการตรวจสอบความถูกต้องอาจน้อยกว่าการฝึกอบรม คุณสามารถคิดได้สองวิธี:
นั่นเป็นเหตุผลว่าทำไมจึงสำคัญที่คุณต้องประเมินวิธีการฝึกอบรมแบบจำลองของคุณ หากคุณไม่แบ่งข้อมูลของคุณเพื่อการฝึกอบรมอย่างถูกต้องผลลัพธ์ของคุณจะนำไปสู่ความสับสนหากไม่ใช่ข้อสรุปที่ไม่ถูกต้อง
ฉันคิดถึงการประเมินแบบจำลองในสี่หมวดหมู่ที่แตกต่างกัน:
Underfitting - การตรวจสอบและการฝึกอบรมเกิดข้อผิดพลาดสูง
Overfitting - ข้อผิดพลาดในการตรวจสอบความถูกต้องสูงข้อผิดพลาดการฝึกอบรมต่ำ
แบบที่ดี - ข้อผิดพลาดการตรวจสอบต่ำต่ำกว่าข้อผิดพลาดการฝึกอบรมเล็กน้อย
ไม่ทราบแบบ - ข้อผิดพลาดในการตรวจสอบต่ำข้อผิดพลาดในการฝึกอบรม 'สูง'
ฉันบอกว่าพอดี 'ไม่ทราบ' เพราะผลลัพธ์นั้นตรงกันข้ามกับวิธีการเรียนรู้ของเครื่อง สาระสำคัญของ ML คือการทำนายสิ่งที่ไม่รู้ หากคุณคาดเดาสิ่งที่ไม่รู้จักได้ดีกว่าสิ่งที่คุณได้เรียนรู้แล้วให้ AFAIK ข้อมูลระหว่างการฝึกอบรมและการตรวจสอบความถูกต้องต้องแตกต่างกัน นี่อาจหมายความว่าคุณจำเป็นต้องประเมินวิธีการแยกข้อมูลของคุณใหม่เพิ่มข้อมูลเพิ่มเติมหรืออาจเปลี่ยนการวัดประสิทธิภาพของคุณ (คุณวัดประสิทธิภาพที่คุณต้องการจริงหรือไม่)
แก้ไข
เพื่อรับมือกับการอ้างอิง OP เพื่อหลามก่อนหน้าคำถามลาซานญ่า
สิ่งนี้ชี้ให้เห็นว่าคุณมีข้อมูลเพียงพอที่จะไม่ต้องการการตรวจสอบข้ามและเพียงแค่มีการฝึกอบรมการตรวจสอบและการทดสอบย่อยของคุณ ทีนี้ถ้าคุณดูการสอนแบบ lasagneคุณจะเห็นว่าพฤติกรรมแบบเดียวกันนั้นเห็นที่ด้านบนของหน้า ฉันคิดว่ามันยากที่จะเชื่อว่าผู้แต่งจะโพสต์ผลลัพธ์ดังกล่าวถ้ามันแปลก แต่แทนที่จะคิดว่าพวกเขาถูกต้องลองดูต่อไป ส่วนที่น่าสนใจที่สุดสำหรับเราที่นี่อยู่ในส่วนของลูปการฝึกอบรมซึ่งอยู่ด้านบนสุดด้านล่างคุณจะเห็นวิธีคำนวณพารามิเตอร์การสูญเสีย
การสูญเสียการฝึกอบรมที่มีการคำนวณมากกว่าชุดการฝึกอบรมทั้งหมด ในทำนองเดียวกันการสูญเสียการตรวจสอบมีการคำนวณมากกว่าชุดข้อมูลการตรวจสอบทั้งหมด โดยทั่วไปชุดฝึกอบรมจะมีขนาดใหญ่กว่าการตรวจสอบความถูกต้องอย่างน้อย 4 เท่า (80-20) เนื่องจากข้อผิดพลาดนั้นได้รับการคำนวณเหนือตัวอย่างทั้งหมดคุณสามารถคาดหวังได้ถึงประมาณ 4X ของการสูญเสียของชุดการตรวจสอบความถูกต้อง คุณจะสังเกตเห็นว่าการสูญเสียการฝึกอบรมและการสูญเสียการตรวจสอบกำลังเข้าหากันเมื่อการฝึกอบรมดำเนินต่อไป นี่เป็นเจตนาที่ว่าข้อผิดพลาดในการฝึกอบรมของคุณเริ่มลดลงจากข้อผิดพลาดในการตรวจสอบของคุณคุณจะเริ่มใช้โมเดลของคุณมากเกินไป !!!
ฉันหวังว่าสิ่งนี้จะชี้แจงข้อผิดพลาดเหล่านี้
ความเป็นไปได้หนึ่งอย่าง: หากคุณใช้เลเยอร์การทำให้เป็นมาตรฐานของการออกกลางคันในเครือข่ายของคุณมันมีเหตุผลว่า เพราะปกติการออกกลางคันจะเปิดใช้งานเมื่อการฝึกอบรม แต่ปิดใช้งานเมื่อประเมินชุดการตรวจสอบ คุณจะได้ฟังก์ชั่นที่นุ่มนวล (มักจะดีกว่า) ในกรณีหลัง
ฉันมีคะแนนไม่เพียงพอที่จะแสดงความคิดเห็นในคำตอบของ @ DK แต่ตอนนี้ได้รับคำตอบว่าเป็นคำถามที่พบบ่อยเกี่ยวกับเอกสารของ Keras:
"ทำไมการสูญเสียการฝึกจึงสูงกว่าการสูญเสียการทดสอบมาก
โมเดล Keras มีสองโหมด: การฝึกอบรมและการทดสอบ กลไกการทำให้เป็นมาตรฐานเช่นการออกกลางคันและการทำให้เป็นมาตรฐานน้ำหนัก L1 / L2 ถูกปิดในเวลาทดสอบ
นอกจากนี้การสูญเสียการฝึกอบรมเป็นค่าเฉลี่ยของการสูญเสียมากกว่าชุดข้อมูลการฝึกอบรมแต่ละชุด เนื่องจากโมเดลของคุณเปลี่ยนไปตามกาลเวลาการสูญเสียในชุดแรกของยุคมักจะสูงกว่าชุดที่ผ่านมา ในทางกลับกันการสูญเสียการทดสอบสำหรับยุคถูกคำนวณโดยใช้แบบจำลองเนื่องจากมันอยู่ที่ส่วนท้ายของยุคทำให้สูญเสียการทดสอบลดลง "
2 เซนต์ของฉัน: ฉันยังมีปัญหาเดียวกันแม้ว่าจะไม่มีเลเยอร์กลางคัน ในกรณีของฉันเลเยอร์แบบกลุ่มเป็นกลุ่มผู้กระทำผิด เมื่อฉันลบพวกเขา - การสูญเสียการฝึกอบรมคล้ายกับการสูญเสียการตรวจสอบ อาจเป็นไปได้ว่าเกิดขึ้นเพราะในระหว่างการฝึกอบรมแบทช์ - นอร์มใช้ค่าเฉลี่ยและความแปรปรวนของแบทช์อินพุทที่กำหนดซึ่งอาจแตกต่างจากแบทช์เป็นแบทช์ แต่ในระหว่างการประเมินแบทช์ - นอร์มใช้ค่าเฉลี่ยและความแปรปรวนซึ่งทั้งสองอย่างนี้สะท้อนคุณสมบัติของการฝึกอบรมทั้งชุดที่ดีกว่าค่าเฉลี่ยและความแปรปรวนของแบทช์เดี่ยวระหว่างการฝึกอบรม อย่างน้อยนั่นคือวิธีการนำแบทช์ไปปฏิบัติใน pytorch
ความเป็นไปได้อีกอย่างที่รวมทั้งคำตอบของ@cdetermanและ@DKในทางใดทางหนึ่งคือถ้าคุณใช้กลไกการเพิ่มข้อมูล การเสริมข้อมูลโดยปกติจะกระทำในชุดฝึกอบรมเท่านั้นไม่ใช่ในชุดการตรวจสอบความถูกต้อง (สำหรับชุดการออกกลางคัน) และสิ่งนี้อาจนำไปสู่ชุดการตรวจสอบที่ประกอบด้วยกรณี "ง่าย" ที่จะคาดการณ์ได้ดีกว่าชุดฝึกอบรม
ฉันได้ผลลัพธ์ที่คล้ายกัน (การสูญเสียการทดสอบต่ำกว่าการสูญเสียการฝึกอย่างมาก) เมื่อฉันลบการทำให้เป็นมาตรฐานการออกกลางคันแล้วความสูญเสียทั้งสองก็เกือบจะเท่ากัน
@cdeterman และ @DK มีคำอธิบายที่ดี ฉันต้องการเหตุผลอีกหนึ่งข้อ - data leakage
. บางส่วนของข้อมูลรถไฟของคุณ "สัมพันธ์กันอย่างใกล้ชิด" กับข้อมูลการทดสอบ
ตัวอย่างที่มีศักยภาพ: จินตนาการว่าคุณมีสุนัข 1,000 ตัวและแมว 1,000 ตัวที่มีรูปคล้ายกัน 500 รูปต่อสัตว์เลี้ยงหนึ่ง (เจ้าของบางคนชอบที่จะถ่ายภาพสัตว์เลี้ยงของพวกเขาในตำแหน่งที่คล้ายกันมาก) พูดบนพื้นหลัง ดังนั้นถ้าคุณแยก 70/30 สุ่มคุณจะได้รับข้อมูลการรั่วไหลของข้อมูลรถไฟลงในข้อมูลการทดสอบ
กล่าวง่ายๆว่าหากการคำนวณการสูญเสียการฝึกอบรมและการสูญเสียการตรวจสอบถูกต้องเป็นไปไม่ได้ที่การสูญเสียการฝึกอบรมจะสูงกว่าการสูญเสียการตรวจสอบ นี่เป็นเพราะการเผยแพร่กลับลดโดยตรงข้อผิดพลาดที่คำนวณบนชุดการฝึกอบรมและเฉพาะ INDIRECTLY (ไม่รับประกันแม้แต่!) ลดข้อผิดพลาดที่คำนวณในชุดการตรวจสอบความถูกต้อง
จะต้องมีปัจจัยเพิ่มเติมบางอย่างที่แตกต่างออกไปขณะฝึกอบรมและขณะตรวจสอบความถูกต้อง การออกกลางคันเป็นสิ่งที่ดี แต่อาจมีอย่างอื่น ตรวจสอบให้แน่ใจว่าได้ตรวจสอบเอกสารของห้องสมุดที่คุณใช้อยู่ โมเดลและเลเยอร์มักจะมีการตั้งค่าเริ่มต้นที่เราไม่สนใจ
การตรวจสอบความถูกต้องต่ำกว่าข้อผิดพลาดในการฝึกอบรมอาจเกิดจากความผันผวนที่เกี่ยวข้องกับการออกกลางคันหรืออย่างอื่น แต่หากยังคงมีอยู่ในระยะยาวสิ่งนี้อาจบ่งบอกว่าชุดข้อมูลการฝึกอบรมและการตรวจสอบความถูกต้องนั้น สิ่งนี้อาจเกิดขึ้นได้หากตัวอย่างของคุณมาจากชุดข้อมูลและหากคุณสุ่มชุดข้อมูลการฝึกอบรมและการตรวจสอบความถูกต้องไม่ถูกต้อง
ในเวลานี้วิธีการไล่ระดับสีแบบสุ่มมักจะเป็นอัลกอริทึมของตัวเลือกสำหรับการเรียนรู้อย่างลึกซึ้ง ซึ่งหมายความว่าข้อมูลมาเป็นแบตช์การไล่ระดับสีจะถูกคำนวณและพารามิเตอร์จะถูกอัพเดต ซึ่งหมายความว่าคุณสามารถคำนวณการสูญเสียข้อมูลได้เมื่อเลือกแต่ละแบทช์ ภายใต้กรอบการทำงานนี้มีสองวิธีในการคำนวณการสูญเสียที่ฉันสามารถคิดได้ซึ่งสามารถนำไปสู่ปรากฏการณ์นี้ว่าข้อผิดพลาดการฝึกอบรมมีค่ามากกว่าข้อผิดพลาดในการตรวจสอบความถูกต้อง ด้านล่างฉันแสดงให้เห็นว่าจริง ๆ แล้ว Keras ดูเหมือนจะคำนวณข้อผิดพลาดในตัวอย่างด้วยวิธีการเหล่านี้
1. ) ข้อผิดพลาดการฝึกอบรมมีค่าเฉลี่ยมากกว่าช่วงเวลาทั้งหมด แต่ทั้งหมดในคราวเดียวในตอนท้ายของยุค แต่ข้อผิดพลาดในการตรวจสอบความถูกต้องเป็นเพียงที่จุดสิ้นสุดของยุค โปรดทราบว่าข้อผิดพลาดในการตรวจสอบความได้เปรียบของการปรับปรุงอย่างเต็มที่ในขณะที่ข้อผิดพลาดการฝึกอบรมรวมถึงการคำนวณข้อผิดพลาดที่มีการปรับปรุงน้อยลง แน่นอนผลกระทบนี้โดยทั่วไปควรจะหายไป
2. ) การคำนวณข้อผิดพลาดการฝึกอบรมก่อนที่จะทำการอัพเดตเป็นชุด ในวิธีที่ใช้การไล่ระดับสีแบบสุ่ม ในขณะที่คนหนึ่งกำลังปีนเขามีความเป็นไปได้สูงที่จะลดการสูญเสียทั่วโลกซึ่งคำนวณจากตัวอย่างการฝึกอบรมทั้งหมด อย่างไรก็ตามเมื่อเข้าใกล้โหมดมากทิศทางการอัพเดทจะเป็นค่าลบเมื่อเทียบกับตัวอย่างในแบทช์ของคุณ แต่เนื่องจากเราถูกตีกลับมารอบโหมดนี้หมายความว่าโดยเฉลี่ยเราจะต้องเลือกทิศทางที่เป็นบวกเกี่ยวกับการตัวอย่างที่ออกของชุด ตอนนี้ถ้าเรากำลังจะอัพเดทตามตัวอย่างในแบทช์ที่กำหนดนั่นหมายความว่าพวกเขาถูกผลักดันโดยการอัพเดตแบตช์จำนวนมากที่พวกเขาไม่ได้รวมอยู่ในโดยการคำนวณการสูญเสียก่อนการอัพเดทนี่คือเมื่อสุ่ม วิธีการได้ผลักพารามิเตอร์มากที่สุดในความโปรดปรานของตัวอย่างอื่น ๆ ในชุดข้อมูลของคุณจึงทำให้เรามีอคติขึ้นเล็กน้อยในการสูญเสียที่คาดหวัง
โปรดทราบว่าในขณะที่ไม่มีอาการผลของ (1) จะหายไป (2) ไม่! ด้านล่างฉันแสดงให้เห็นว่า Keras ดูเหมือนจะทำทั้ง (1) และ (2)
(1) แสดงให้เห็นว่าการวัดมีค่าเฉลี่ยในแต่ละชุดในยุคมากกว่าทั้งหมดในคราวเดียวในตอนท้าย สังเกตุความแตกต่างอย่างมากของความแม่นยำในตัวอย่างเทียบกับ val_accuracy ที่นิยมใช้ val_accuracy ในช่วงแรก นี่เป็นเพราะข้อผิดพลาดในตัวอย่างบางส่วนที่คำนวณด้วยการอัพเดทแบบชุดน้อยมาก
>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = 100,
... validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 8s 176us/sample
- loss: 0.2320 - accuracy: 0.9216
- val_loss: 0.1581 - val_accuracy: 0.9636
Epoch 2/3
46580/46580 [==============================] - 8s 165us/sample
- loss: 0.1487 - accuracy: 0.9662
- val_loss: 0.1545 - val_accuracy: 0.9677
Epoch 3/3
46580/46580 [==============================] - 8s 165us/sample
- loss: 0.1471 - accuracy: 0.9687
- val_loss: 0.1424 - val_accuracy: 0.9699
<tensorflow.python.keras.callbacks.History object at 0x17070d080>
(2) การแสดงข้อผิดพลาดจะถูกคำนวณก่อนการอัพเดตสำหรับแต่ละชุด โปรดทราบว่าสำหรับยุค 1 เมื่อเราใช้batch_size = nRows
(เช่นข้อมูลทั้งหมดในชุดเดียว) ข้อผิดพลาดในตัวอย่างคือประมาณ 0.5 (การคาดเดาแบบสุ่ม) สำหรับยุค 1 แต่ข้อผิดพลาดในการตรวจสอบคือ 0.82 ดังนั้นข้อผิดพลาดในตัวอย่างจึงถูกคำนวณก่อนการอัพเดตแบบแบตช์ในขณะที่ข้อผิดพลาดในการตรวจสอบความถูกต้องคำนวณหลังจากการอัพเดทแบบแบตช์
>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = nRows,
... validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 9s 201us/sample
- loss: 0.7126 - accuracy: 0.5088
- val_loss: 0.5779 - val_accuracy: 0.8191
Epoch 2/3
46580/46580 [==============================] - 6s 136us/sample
- loss: 0.5770 - accuracy: 0.8211
- val_loss: 0.4940 - val_accuracy: 0.8249
Epoch 3/3
46580/46580 [==============================] - 6s 120us/sample
- loss: 0.4921 - accuracy: 0.8268
- val_loss: 0.4502 - val_accuracy: 0.8249