บทความที่แล้ว เราได้คุยกันถึงเรื่อง Overfitting ของโมเดล Machine Learning (ML) และ ความสำคัญระดับสุดยอดของมันกันไปแล้ว วันนี้เราจะมาคุยกันถึงเรื่องวิธีการป้องกันการเกิด Overfitting อย่างง่ายๆ กันค่ะ ขอให้ผู้อ่านใส่ใจในเรื่องนี้ให้มาก ท่องไว้เลยค่ะ โมเดล ML ไม่ว่าจะเป็นโมเดลพื้นฐาน หรือ โมเดลระดับที่มีความซับซ้อนสูง ถ้าเกิด Overfitting ขึ้นแล้วก็พังไม่เป็นท่าได้เหมือนกันค่ะ แถมเป็นการพังพินาศแบบที่ผู้สร้างไม่ทันตั้งตัวด้วย
เกริ่นนำกันไปพอสมควรแล้ว เรามาดูกันดีกว่า ว่าวิธีการง่ายๆ ที่สามารถนำมาใช้ในการป้องกันปัญหาการ Overfitting นี้มีอะไรบ้าง แต่ก่อนอื่น ถ้าผู้อ่านท่านใด ยังไม่แน่ใจว่า Overfitting คืออะไร และ เกิดขึ้นได้อย่างไร สามารถกลับไปอ่านบทความก่อนหน้าที่เราเขียนไว้ก่อนได้ที่
Overfitting vs. Underfitting อธิบายด้วยตัวอย่าง ฉบับเข้าใจง่ายที่สุดในโลก
1. Hold Out
วิธีการแรกในการป้องกันการเกิด Overfitting วิธีแรกเลยก็คือ การแบ่งข้อมูลออกเป็น ชุดข้อมูลสอน (Train set) และ ชุดข้อมูลทดสอบ (Test set) โดยชุดข้อมูลสอนจะถูกนำมาใช้ในการเรียนรู้ของโมเดล จากนั้นจึงนำโมเดลที่สอนเรียบร้อยแล้วมาทดสอบด้วยชุดข้อมูลทดสอบ โมเดลที่ดีนั้น จะต้องมีประสิทธิภาพในการทำงานกับทั้งสองชุดข้อมูล ถ้าโมเดลสามารถทำงานได้ดีบนชุดข้อมูลทดสอบที่โมเดลไม่เคยเห็น นั่นแสดงว่า โมเดลนั้นมีความเป็น Generalization มากพอที่จะทำงานกับข้อมูลที่เป็น Unseen ได้ ซึ่งแสดงให้เห็นว่าโมเดลนั้นไม่ได้ Overfitting กับชุดข้อมูลสอนนั้นเอง

2. Cross validation
วิธีนี้เป็นวิธีการที่มีการทำการแบ่งข้อมูลเป็นชุดสอน (Train set) และ ชุดทดสอบ (Test set) เช่นเดียวกับวิธีการ Hold-out ในข้อแรก แต่มีความซับซ้อนมากกว่า คือ ชุดข้อมูลจะถูกแบ่งออกเป็นชุดย่อยๆ จำนวน k ชุด และ ในการทำงานจะทำงานทั้งหมด k รอบ โดยในแต่ละรอบ ชุดข้อมูล Test จะมีการสับเปลี่ยนกัน ทำให้เมื่อทำการสอนครบทั้ง k รอบ ชุดข้อมูลทุกส่วนจะมีโอกาสเป็นทั้งชุดข้อมูลสอน และทดสอบ วิธีการนี้สามารถใช้เพื่อหลีกเลี่ยงสถานการณ์การ Overfitting ของโมเดลต่อข้อมูลส่วนใดส่วนหนึ่งได้

3. Data Augmentation
หนึ่งในวิธีการง่ายๆ ที่จะช่วยลดปัญหาการเกิด Overfitting ได้ก็คือ การเพิ่มจำนวนของชุดข้อมูลสอน (Train set) เนื่องจากเป็นการเพิ่มความหลากหลายในการเรียนรู้ของโมเดล Machine Learning ซึ่งจะลดโอกาสการ Overfitting หรือ การพยายามรู้จำชุดข้อมูลส่วนใดส่วนหนึ่งมากเกินไป แต่ในความเป็นจริง เราอาจจะไม่สามารถหาชุดข้อมูลสอนเพิ่มเติมได้ เนื่องจากข้อจำกัดในการเก็บข้อมูล ซึ่งอาจจะมีความยากลำบาก และ ใช้เวลานาน วิธีการที่ง่ายและรวดเร็วที่สุดคือ การทำ Data Augmentation กับชุดข้อมูลสอน ซึ่งสามารถทำได้โดยการเพิ่มจำนวนของชุดข้อมูลสอนขึ้น โดยการปรับแต่งจากข้อมูลเดิม เช่น การเพิ่มข้อมูลจากการ กลับด้านรูป การหมุนรูป การปรับขนาด หรือ โฟกัสของรูป เป็นต้น ทำให้เราสามารถเพิ่มจำนวนของข้อมูลสอนได้ โดยไม่ได้ดำเนินเก็บข้อมูลจริงนั่นเอง

4. Feature Selection
ถ้าจำนวนข้อมูลสอนมีน้อย แต่ในขณะเดียวกันกลับมีจำนวนฟีเจอร์ (Features) ที่มาก (จำนวนฟีเจอร์ในที่นี้คือจำนวนคอลัมน์ของ X) จะทำให้มีความเสี่ยงสูงอยู่ 2 ประเภทคือ 1) โมเดลไม่สามารถเรียนรู้ได้ เนื่องจากมีข้อมูลน้อยเกินไป ไม่สามารถหาความสัมพันธ์ภายในข้อมูลได้อย่างมีประสิทธิภาพ 2) โมเดลพยายามจำรูปแบบข้อมูลมากเกินไป จากจำนวนข้อมูลที่มีอยู่อย่างจำกัด ทำให้เกิด Overfitting
การแก้ไขปัญหานี้คือ การทำ Feature selection หรือ การเลือกฟีเจอร์บางฟีเจอร์เท่านั้นในการสอนโมเดล และทำการตัดฟีเจอร์ส่วนหนึ่งทิ้งไป ในขั้นตอนนี้มักมีการใช้ขั้นตอนวิธีทางสถิติเข้ามาช่วยในการระบุฟีเจอร์ที่มีความสำคัญเพื่อนำมาใช้ในการพัฒนา หรือสอนโมเดลต่อไป หรือ อาจจะกระทำได้โดยการทดลองตัดฟีเจอร์บางตัวทิ้งไป และทำการทดสอบผลกระทบที่เกิดขึ้นกับการสอนโมเดล ทำซ้ำเช่นนี้โดยการตัดฟีเจอร์ที่แตกต่างกันออกไปเรื่อยๆ และนำผลลัพธ์ที่ได้มาวิเคราะห์ความสำคัญของฟีเจอร์ และเลือกฟีเจอร์ที่สำคัญออกจากจำนวนฟีเจอร์ที่มีอยู่จำนวนมาก

5. L1 / L2 regularization
L1 และ L2 regularization เป็นเทคนิคที่สำคัญในการในการควบคุมการเรียนรู้ของโมเดล โดยเฉพาะอย่างยิ่งเมื่อโมเดลมีระดับความซับซ้อนที่สูง (โมเดลที่มีความซับซ้อนสูง จะมีความเสี่ยงต่อการ overfitting มากขึ้น) การใช้วิธีการ L1 หรือ L2 regularization เป็นการระบุส่วนการลงโทษ (Penalty) เข้าไปใน Cost function ในระหว่างการเรียนรู้ของโมเดล ทำให้ค่า Coefficients ของฟังก์ชันมีค่าเข้าใกล้ 0 ซึ่งจะส่งผลให้โมเดลสามารถหลีกเลี่ยงการ Overfitting ได้ โดยเฉพาะอย่างย่ิงการ Overfit กับค่าสุดโต่ง หรือ Noise ต่างๆ
6. Remove layers / number of units per layer
อย่างที่ได้ระบุไปแล้วในข้อที่ 5 ว่า โมเดลที่มีความซับซ้อนสูง จะมีความเสี่ยงต่อการเกิดภาวะ Overfitting ได้มากกว่าโมเดลที่มีความซับซ้อนน้อยกว่า ดังนั้นการลดความซับซ้อนของโมเดลลง จะเป็นอีกหนึ่งวิธีในการช่วยป้องกันการเกิด Overfitting ได้ ตัวอย่างเช่น ในการใช้งาน Deep Learning ที่มีโครงสร้างโครงข่ายประสาทเทียม (Artificial Neural Network) ที่ซับซ้อน ประกอบไปด้วยหลายชั้น (Layer) และ แต่ละชั้น ก็ประกอบด้วยจำนวนนิวรอนหลายนิวรอล ถ้าเราเจอสถานการณ์ Overfitting กับโมเดลที่มีลักษณะของความซับซ้อนแบบนี้ สิ่งง่ายๆ ที่ควรทดลองก็คือ การลดจำนวนชั้นของนิวรอลเน็ตเวิร์กลง ควบคู่ไปกับ การลดจำนวนนิวรอลในแต่ละชั้นการทำงานลงไปด้วย

7. Dropout
วิธีการนี้จะคล้ายคลึงกับวิธีการในข้อที่ 6 แต่จะเป็นการสุ่มตัดนิวรอลบางตัวออกไปในระหว่างการเรียนรู้ของโมเดล ทำให้ในแต่ละรอบการทำงาน นิวรอลบางตัวจะถูกกำหนดให้มีน้ำหนักเป็น 0 โดยการสุ่ม ซึ่งนิวรอลที่มีน้ำหนักเป็น 0 จะไม่ส่งผลต่อการทำงาน การทำซ้ำเช่นนี้ไปเรื่อยๆ ในกระบวนการสอน จะทำให้นิวรอลเน็ตเวิร์กพยายามไม่ขึ้นอยู่กับ (Dependent) นิวรอนใดนิวรอนหนึ่งมากเกินไป ทำให้ส่งผลต่อการลดโอกาสการเกิด Overfitting ได้นั่นเอง

8. Early stopping (model)
ในปกติการเรียนรู้ของโมเดลจะกระทำโดยการสอนโมเดลด้วยชุดข้อมูลสอนเป็นจำนวนหลายรอบ เพื่อให้ค่า Error ที่เกิดจากชุดข้อมูลสอนลดลงน้อยที่สุดเท่าที่จะทำได้ แต่การสอนซ้ำๆ กันหลายรอบเพื่อให้ได้ค่า Error ที่ต่ำนั้น มีความเสี่ยงสูงมากที่จะเกิดการรู้จำข้อมูลสอนมากเกินไป หรือ ที่เรียกว่า Overfitting นั่นเอง วิธีการลดโอกาสการเกิด Overfitting วิธีการหนึ่งที่สามารถทำได้ คือ การหยุดการสอนก่อนเวลา หรือ ก่อนจำนวนรอบที่กำหนด วิธีนี้จะทำให้โมเดลหยุดการเรียน ก่อนที่ค่า Error จะลดลงไปถึงค่าต่ำที่สุด แต่โมเดลก็จะไม่เกิด Overfitting นั่นเอง
วิธีการง่ายๆ ในการทำ Early Stopping คือ การแบ่งข้อมูลส่วนเล็กๆ ส่วนหนึ่งออกมาจากชุดข้อมูลสอน โดยปกติเราจะเรียกข้อมูลชุดนี้ว่า Validation set และ ในทุกรอบการสอนโมเดลด้วยชุดข้อมูลทดสอบ เมื่อเสร็จการสอน จะทำการทดสอบโมเดลทันทีด้วยชุดข้อมูล Validation set เมื่อไหร่ก็ตามที่ค่า Error ของชุดข้อมูล Validation เริ่มเพิ่มสูงขึ้น เราจะทำการหยุดการสอนโมเดลทันที โดยไม่สนใจว่าค่า Error ของชุดข้อมูลสอนจะยังไม่ลดลงต่ำที่สุด แต่เราหยุดการสอนเพราะถือว่า เราได้สอนโมเดลจนถึงจุดสมดุลของการเรียนรู้ ที่โมเดลมีความฉลาดเพียงพอ และ ไม่รู้จำข้อมูลสอนมากจนเกินไป (ไม่เกิดการ Overfitting) นั่นเอง

จบกันไปแล้วนะคะ กับ 8 วิธีง่ายๆ ในการป้องการการเกิดการ Overfitting ในกระบวนการเรียนรู้ของโมเดล แต่ละวิธีสามารถทำได้ง่ายๆ โดยใช้ฟังก์ชันพื้นฐานต่างๆ ต้องลองแล้วจะรู้ว่า เพียงแค่วิธีง่ายๆ แค่นี้ ก็มีส่วนช่วยให้โมเดลของเราทำงานได้อย่างมีประสิทธิภาพเพิ่มมากขึ้นแล้วล่ะค่ะ อย่าลืมนะคะ โมเดลไม่ว่าจะระดับพื้นฐาน หรือ ระดับซับซ้อน ก็สามารถตกม้าตายเพราะ Overfitting ได้ ดังนั้น เราจึงไม่ควรมองข้ามปัญหาในข้อนี้ไปค่ะ