>> ต่อจาก
บทที่ ๑๖ ในบทที่แล้วได้กล่าวถึงปัญหา
การเรียนรู้เกิน (过学习, overlearning) ไปแล้ว
บทนี้จะพูดถึงวิธีการ
ดรอปเอาต์ (dropout) ซึ่งนิยมใช้ในการลดปัญหาการเรียนรู้เกินของโครงข่ายประสาทเทียม
ดรอปเอาต์ คือการสร้างชั้นกรองชั้นหนึ่งสำหรับสุ่มเลือกให้ข้อมูลจากเซลล์ประสาทแค่บางเซลล์เท่านั้นผ่านไปได้
ตัวอย่างภาพแสดงการไหลของข้อมูล กรณีที่ดรอปเอาต์ของแต่ละชั้นเป็น 0.5 คือสุ่มตัดไปครึ่งนึง
แต่ละรอบจะสุ่มไม่เหมือนกัน รอบต่อไปอาจไหลแบบนี้
ในแต่ละรอบของการฝึกเรียนรู้จะสุ่มเลือกไม่ซ้ำกัน ทำให้แต่ละรอบโครงข่ายใช้คนละเซลล์กันในการคำนวณ โดยรวมแล้วทุกเซลล์ก็ยังจะได้รับการฝึกอย่างทั่วถึง
เพียงแต่ว่าการสุ่มเอาเซลล์ออกนี้จะทำเฉพาะตอนที่กำลังฝึกแบบจำลองอยู่เท่านั้น แต่ตอนที่ใช้งานเพื่อทำการทำนายจริงๆจะเปิดใช้หมดทุกเซลล์พร้อมกัน
ชั้นดรอปเอาต์จะวางไว้ที่ก่อนหรือหลังชั้นฟังก์ชันกระตุ้นในแต่ละชั้นก็ได้
ตัวอย่างผังโครงสร้างเพอร์เซปตรอน ๔ ชั้นเมื่อวางดรอปเอาต์ไว้ก่อนฟังก์ชันกระตุ้น
แล้วทำไมวิธีการแบบนี้ถึงป้องกันการเรียนรู้เกินได้?
เพราะสาเหตุของการเรียนรู้เกินนั้นเกิดจากการที่ตัดสินอะไรแบบสุดขั้วไปจากข้อมูลด้านหนึ่งมากเกินไป
การสร้างดรอปเอาต์เป็นการเปิดโอกาสให้แต่ละรอบที่ทำการคำนวณนั้นข้อมูลถูกคำนวณด้วยเซลล์ที่ต่างกันไปตลอด แต่ละเซลล์นั้นทำหน้าที่คิดในคนละด้านต่างๆไม่ซ้ำกัน ทำให้ในแต่ละรอบเป็นการพิจารณาปัญหาด้วยมุมมองที่ต่างกันไป แต่ไม่ว่าจะพิจารณาแบบไหนก็จะต้องมุ่งสู่คำตอบแบบเดียวกัน
และเมื่อถึงคราวใช้งานจริง เซลล์ทั้งหมดจะถูกนำมาใช้ ทำให้วิธีการพิจารณาปัญหาทั้งหมดทุกรูปแบบถูกนำมาใช้พร้อมกัน ผลลัพธ์จึงออกมามีประสิทธิภาพ
ที่จริงแล้วแนวคิดของดรอปเอาต์นั้นเหมือนกับเทคนิคที่เรียกว่า
การเรียนรู้แบบอ็องซ็องบล์ (集成学习, ensemble learning) ซึ่งเป็นวิธีการที่สร้างแบบจำลองสำหรับทำนายขึ้นมาหลายๆตัวแล้วให้เรียนรู้ข้อมูลเดียวกัน แล้วสุดท้ายเวลาทำนายก็เอาแบบจำลองเหล่านี้มาพิจารณาร่วมกัน ซึ่งจะได้ประสิทธิภาพมากกว่าการพิจารณาด้วยแบบจำลองตัวเดียว
สำหรับโครงข่ายประสาทเทียม แค่สร้างชั้นดรอปเอาต์ขึ้นก็มีผลเทียบเท่ากับการเรียนรู้แบบอ็องซ็องบล์แล้ว นี่เป็นการอาศัยประโยชน์จากการที่โครงข่ายประสาทเทียมประกอบด้วยเซลล์จำนวนมาก แต่ละเซลล์ก็ทำหน้าพิจารณาต่างกันเสมือนกับการสร้างแบบจำลองขึ้นหลายแบบในการเรียนรู้แบบอ็องซ็องบล์
เราจะทำการสร้างคลาสของชั้นดรอปเอาต์ขึ้นในลักษณะเดียวกันกับชั้นของฟังก์ชันกระตุ้นซึ่งสร้างมาในบทก่อนๆ
แต่ว่ามีสิ่งที่จะต่างกันไปซึ่งต้องระวังก็คือ ชั้นของดรอปเอาต์จะต้องมีการแยกกรณีระหว่างตอนที่ฝึกกับตอนที่ใช้งานจริง เพราะตอนที่ฝึกจะให้ข้อมูลผ่านแค่บางส่วน แต่ตอนใช้งานจริงจะให้ไหลทั้งหมด
ดังนั้นเราจะทำการเพิ่มแอตทริบิวต์ให้กับชั้นเพื่อแสดงว่ากำลังฝึกอยู่หรือไม่ เพื่อจะแยกกรณี
ก่อนอื่น ให้ทำการดึงคลาสที่จำเป็นต้องใช้ในบทนี้จาก
unagi.py
ชั้นดรอปเอาต์อาจนิยามดังนี้
ค่า .fuekyu มีไว้แบ่งกรณีว่ากำลังอยู่ในโหมดฝึกอยู่หรือเปล่า ถ้าฝึกอยู่จะมีค่าเป็น 1 และจะมีการกรองเพื่อตัดค่าขาเข้าส่วนหนึ่งทิ้งไป ถ้าไม่ได้ฝึกอยู่ก็จะมีค่าเป็น 0 ก็จะไม่มีการกรองแต่ปล่อยให้ค่าทั้งหมดไหลผ่านไป
แต่ว่าการที่มีการกรองตัดค่าส่วนหนึ่งทิ้งไปนั้นย่อมทำให้ค่าที่ไหลผ่านลดลงกว่าเวลาที่ไม่มีการกรอง ดังนั้นเมื่อไม่กรองจำเป็นต้องคูณกับสัดส่วนการดรอปเอาต์ด้วย เพื่อให้ค่าที่ได้ออกมาเท่ากัน
หรือจะทำในทางตรงกันข้ามก็ได้ คือให้ค่าเวลาฝึกมีค่าเพิ่มขึ้นเพื่อชดเชยส่วนที่ถูกกรองทิ้งไป แล้วให้เวลาที่ไม่มีการกรองมีค่าไหลผ่านไปตามปกติ
จะทำแบบไหนผลก็ไม่ต่างกันนัก
ที่สำคัญคือ อย่าลืมปรับโหมดให้ถูกต้อง คือตอนฝึกให้ตั้ง .fuekyu=1 แต่พอจะใช้ทดสอบทำนายจริงให้ตั้ง .fuekyu=0
ต่อไปเป็นตัวอย่างการนำมาใช้ เราอาจสร้างคลาสโครงข่ายประสาทเทียมโดยใส่ดรอปเอาต์ด้วยได้ในลักษณะแบบนี้
เมธอด .ha_entropy() ใช้คำนวนไปข้างหน้าในตอนฝึก จึงมีการปรับโหมดให้เป็นโหมดฝึก fuekyu=1
พอทำแบบนี้ค่า .fuekyu นี้จะถูกป้อนให้กับทุกชั้น แต่สำหรับชั้นอื่นนอกจากชั้นดรอปเอาต์แล้วไม่ได้มีผลอะไร
ส่วนเมธอด .thamnai() สำหรับใช้ทำนายผลนั้นตั้งให้ปกติเป็น fuekyu=0 เพราะเป็นการใช้งานจริง
ลองนำมาใช้เพื่อวิเคราะห์ข้อมูลรูปร่างต่างๆเช่นเดียวกับบทที่แล้ว >>
https://phyblas.hinaboshi.com/triamhai/ruprang-raisi-25x25x1000x5.rar เพื่อให้เห็นปัญหาเรื่องการเรียนรู้เกินชัดเจนคราวนี้จะใช้ข้อมูลแค่ 1/10 ของทั้งหมด คือแค่ 500 รูปเท่านั้น โดยแบ่ง 400 รูปเป็นข้อมูลฝึก ส่วนอีก 100 รูปเป็นข้อมูลตรวจสอบ
เปรียบเทียบผลระหว่างมีดรอปเอาต์ใส่อยู่ในแต่ละชั้นโดยมีอัตราดรอปเป็น 0.2 กับไม่มีดรอปเอาต์
จะเห็นว่าเมื่อไม่มีดรอปเอาต์แล้วความแม่นในการทำนายข้อมูลฝึกเพิ่มขึ้นอย่างรวดเร็วจนแทบเต็ม 100% ในขณะที่ความแม่นสำหรับข้อมูลตรวจสอบไม่ได้เพิ่มขนาดนั้น แต่พอมีดรอปเอาต์แล้วความแตกต่างระหว่างข้อมูลฝึกและข้อมูลตรวจสอบก็ลดลง
อาจลองปรับแบบจำลองโดยเปลี่ยนอัตราดรอปหรือจำนวนชั้นแล้วลองใหม่ดูได้
>> อ่านต่อ
บทที่ ๑๘