Courses
ความแม่นยำของโมเดลไม่ได้แย่เพราะเลือกอัลกอริทึมผิด แต่เพราะยังไม่เคยปรับจูนเลยต่างหาก
หลายคนเทรนโมเดลด้วยค่าตั้งต้น เห็นความแม่นยำอยู่ราว ๆ 80% แล้วสรุปว่าอัลกอริทึมไม่เหมาะกับงาน แต่ความจริงปัญหาไม่ใช่อัลกอริทึม โมเดล ML ทุกตัวมีพารามิเตอร์ที่คุมวิธีการเรียนรู้ ซึ่งถูกกำหนดก่อนเริ่มเทรน ถ้าตั้งได้ถูกต้อง ความแม่นยำอาจเพิ่มได้อีก 10–20% โดยใช้โมเดลและข้อมูลชุดเดิม
พารามิเตอร์เหล่านี้เรียกว่าไฮเปอร์พารามิเตอร์ การเลือกให้เหมาะจะทำให้โมเดลที่ “พอใช้” กลายเป็นโมเดลที่ “ตอบได้แม่น” การปรับจูนไฮเปอร์พารามิเตอร์คือกระบวนการค้นหาชุดค่าที่ให้ประสิทธิภาพดีที่สุด
บทความนี้จะพาไปดูว่าไฮเปอร์พารามิเตอร์ทูนิงคืออะไร กลยุทธ์การค้นหาที่ใช้ได้ผล วิธีประเมินผลโดยไม่หลอกตัวเอง และวิธีรันทั้งหมดใน Python และ R
หากเพิ่งเริ่มด้านดาต้าไซเอนซ์และแมชชีนเลิร์นนิง แนะนำเรียนคอร์ส พื้นฐานแมชชีนเลิร์นนิงด้วย Python ก่อนลงหัวข้อที่ซับซ้อนยิ่งขึ้น
ไฮเปอร์พารามิเตอร์ทูนิงคืออะไร?
การปรับจูนไฮเปอร์พารามิเตอร์คือการค้นหาค่าตั้งที่ทำให้โมเดลเรียนรู้ได้ดีที่สุด
โมเดล ML มีตัวเลขอยู่สองประเภท บางอย่างเรียนรู้จากข้อมูลระหว่างการเทรน เช่น เวตในโครงข่ายประสาทหรือจุดแบ่งในต้นไม้ตัดสินใจ อีกส่วนถูกกำหนดก่อนเริ่มเทรน นั่นคือไฮเปอร์พารามิเตอร์ ซึ่งคุมวิธีที่โมเดลเรียนรู้—เร็วแค่ไหน ลึกแค่ไหน ควรทวนจำหรือตีความให้กว้างเพียงใด
ค่าตั้งต้นของไฮเปอร์พารามิเตอร์มีไว้ให้โมเดลรันได้ ไม่ได้ออกแบบมาเพื่อให้ดีที่สุดกับชุดข้อมูลของคุณ อัตราการเรียนรู้ที่เหมาะกับ image classification มักใช้กับข้อมูลตารางได้ไม่ดี ความลึกของต้นไม้แบบตั้งต้นที่พอเหมาะกับข้อมูลสะอาดอาจโอเวอร์ฟิตเมื่อข้อมูลมีสัญญาณรบกวน เข้าใจตรงกันนะ
กระบวนการปรับจูนจะค้นหาชุดค่าของไฮเปอร์พารามิเตอร์หลายแบบ เทรนโมเดลในแต่ละชุด แล้วเก็บชุดที่ทำได้ดีที่สุดบนข้อมูลวาลิเดชันไว้
ผลลัพธ์ที่ได้มักดีกว่าการเปลี่ยนไปใช้อัลกอริทึมที่ “ดีกว่า” แต่ไม่ได้ปรับจูน
ไฮเปอร์พารามิเตอร์ vs พารามิเตอร์ของโมเดล
ต่างกันที่ “ใคร” เป็นคนตั้งค่าและ “เมื่อไหร่” ตั้ง
พารามิเตอร์ของโมเดล ถูกอัลกอริทึมเรียนรู้ระหว่างการเทรน คุณไม่ต้องตั้งเอง กระบวนการเทรนจะปรับโดยอาศัยข้อมูลและการมินิไมซ์ฟังก์ชันสูญเสีย ตัวอย่างเช่น:
- เวตและไบแอสในโครงข่ายประสาท
- ค่าสัมประสิทธิ์ในรีเกรสชันเชิงเส้น
- เกณฑ์การแยกในต้นไม้ตัดสินใจ
- ซัพพอร์ตเวกเตอร์ใน SVM
ไฮเปอร์พารามิเตอร์ ตั้งโดยคุณก่อนเริ่มเทรน ควบคุมกลไกการเรียนรู้ แต่ตัวอัลกอริทึมจะไม่แก้ไขให้เอง หากไม่ตั้ง ไลบรารีจะใช้ค่าตั้งต้น ตัวอย่างเช่น:
- อัตราการเรียนรู้ในเกรเดียนต์ดีเซนต์
- จำนวนต้นไม้ในแรนดอมฟอเรสต์
- ความแรงของรีกูลาไรเซชันในโลจิสติกรีเกรสชัน
- ชนิดเคอร์เนลใน SVM
สรุปเทียบกันแบบเคียงข้างกัน:
| พารามิเตอร์ของโมเดล | ไฮเปอร์พารามิเตอร์ | |
|---|---|---|
| ผู้ตั้งค่า | อัลกอริทึมระหว่างเทรน | คุณ |
| ตั้งเมื่อ | ระหว่างการเทรน | ก่อนการเทรน |
| เรียนรู้จากข้อมูล | ใช่ | ไม่ใช่ |
| ตัวอย่าง | เวต ค่าสัมประสิทธิ์ จุดแบ่ง | อัตราการเรียนรู้ ความลึกของต้นไม้ ความแรงรีกูลาไรเซชัน |
| เปลี่ยนทุกครั้งที่รันใหม่ | ทุกครั้งที่รีเทรน | เฉพาะเมื่อคุณเปลี่ยนเอง |
พารามิเตอร์ของโมเดลตอบว่าโมเดล “เรียนรู้อะไร” ไฮเปอร์พารามิเตอร์ตอบว่าโมเดล “เรียนรู้อย่างไร”
การทำงานของการปรับจูนไฮเปอร์พารามิเตอร์
การปรับจูนเป็นลูป
เริ่มจากเลือกไฮเปอร์พารามิเตอร์ที่จะค้นหาและกำหนดช่วงค่าของแต่ละตัว จากนั้นเทรนโมเดลด้วยหนึ่งชุดค่า วัดผลบนข้อมูลวาลิเดชัน และใช้ผลนั้นตัดสินใจว่าจะลองอะไรต่อ
ลูปมีหน้าตาแบบนี้:
- เลือกไฮเปอร์พารามิเตอร์ ที่จะจูนและตั้งช่วงค่าของแต่ละตัว
- เทรนโมเดล ด้วยชุดค่าที่กำหนด
- ประเมินประสิทธิภาพ บนชุดวาลิเดชันด้วยเมตริกที่ตรงกับงาน
- อัปเดตไฮเปอร์พารามิเตอร์ ตามสิ่งที่เรียนรู้—จะเดินไปชุดถัดไปในลิสต์ที่เตรียมไว้ หรือใช้ผลล่าสุดชี้นำการเลือกครั้งต่อไป
- ทำซ้ำ จนกว่าประสิทธิภาพจะไม่ดีขึ้นต่อ หรือทรัพยากรคอมพิวต์หมด
วิธีอัปเดตระหว่างรอบคือสิ่งที่ทำให้แต่ละวิธีค้นหาแตกต่างกัน การจูนด้วยมือใช้สัญชาตญาณ กริดเสิร์ชไล่ตามลิสต์ที่กำหนดไว้ วิธีแบบเบย์เซียนจะสร้างโมเดลคาดการณ์ว่าชุดค่าไหนน่าจะเวิร์ก
ต่อไปมาดูวิธีเหล่านี้อย่างละเอียด
วิธีค้นหาไฮเปอร์พารามิเตอร์
วิธีค้นหาที่เลือกจะกำหนดทั้งปริมาณคอมพิวต์ที่ใช้ และโอกาสในการเจอค่าที่ดี
การค้นหาด้วยมือ
วิธีที่ง่ายที่สุด เลือกชุดค่า เทรน ดูผล แล้วปรับตามที่เห็น
ใช้ได้เมื่อโมเดลเล็ก ไฮเปอร์พารามิเตอร์ไม่กี่ตัว และมีประสบการณ์กับอัลกอริทึมนั้นอยู่แล้ว หากรู้ว่า XGBoost มักชอบอัตราการเรียนรู้ราว 0.05 และความลึกของต้นไม้ 6 ก็เริ่มตรงนั้นแล้วปรับตามที่สังเกต
แต่จะใช้ไม่ได้เมื่อพื้นที่ค้นหาใหญ่ขึ้น ไฮเปอร์พารามิเตอร์ 3 ตัว แต่ละตัวมีค่าเหมาะสม 5 ค่า ก็ได้ 125 ชุดแล้ว ไม่มีใครมานั่งจูนทีละชุดขนาดนั้น
กริดเสิร์ช
กริดเสิร์ชตรวจทุกชุดค่าจากลิสต์ที่กำหนดไว้ล่วงหน้า
คุณกำหนดกริด—เช่น อัตราการเรียนรู้ [0.01, 0.05, 0.1] และความลึกของต้นไม้ [3, 5, 7] แล้วกริดเสิร์ชจะเทรนโมเดลทั้ง 9 ชุดที่เป็นไปได้ วิธีนี้ครบถ้วนและทำซ้ำได้
ปัญหาคือค่าใช้จ่ายด้านคอมพิวต์
เพิ่มไฮเปอร์พารามิเตอร์อีกหนึ่งตัวที่มี 5 ค่า จำนวนการเทรนจะคูณห้า กริดเสิร์ชยังสิ้นเปลืองกับค่าที่ไม่ค่อยมีผล—ถ้าความลึกของต้นไม้แทบไม่กระทบสกอร์ ก็ยังต้องเทรนทุกรายการที่ระบุไว้
กริดเสิร์ชเป็นตัวเลือกเริ่มต้นที่ดีเมื่อมีไฮเปอร์พารามิเตอร์เพียง 2–3 ตัว
การสุ่มค้นหา
การสุ่มค้นหาจะสุ่มชุดค่าจากช่วงที่กำหนด แทนการไล่ตามกริดตายตัว
คุณกำหนดการแจกแจงสำหรับแต่ละไฮเปอร์พารามิเตอร์ แล้วการสุ่มค้นหาจะสุ่มชุดค่าจากการแจกแจงเหล่านั้น มีประสิทธิภาพกว่ากริดเสิร์ชเพราะไม่เสียรันกับค่าที่ไม่สำคัญ—ถ้ามีเพียง 1 ใน 3 ไฮเปอร์พารามิเตอร์ที่ส่งผลต่อประสิทธิภาพ การสุ่มค้นหาจะยังสำรวจค่าของตัวสำคัญได้กว้าง

กริดเสิร์ชกับการสุ่มค้นหา
การสุ่มค้นหาเป็นค่าเริ่มต้นที่ดีกว่าสำหรับกรณีที่มีไฮเปอร์พารามิเตอร์มากกว่าสองตัว
การเพิ่มประสิทธิภาพแบบเบย์เซียน
วิธีเบย์เซียนใช้ผลลัพธ์จากรอบก่อน ๆ เพื่อตัดสินใจว่าจะลองชุดใดต่อไป
มันสร้างโมเดลเชิงความน่าจะเป็นที่แมปชุดไฮเปอร์พารามิเตอร์กับประสิทธิภาพ แล้วเลือกชุดถัดไปที่คาดว่าคะแนนจะสูงสุดหรือมีความไม่แน่นอนสูงสุด นี่คือการแลกเปลี่ยนระหว่างสำรวจ (exploration) กับใช้ประโยชน์ (exploitation) กล่าวคือสำรวจพื้นที่ใหม่ที่อาจดี หรือขุดลึกในพื้นที่ที่รู้ว่าดีแล้ว
วิธีเบย์เซียนหาค่าดี ๆ ได้ในจำนวนรอบที่น้อยกว่าการสุ่มหรือกริดเสิร์ช ข้อแลกเปลี่ยนคือแต่ละรอบจะช้ากว่าเล็กน้อยเพราะต้องฟิตโมเดลภายในก่อนเลือกจุดถัดไป ไลบรารีอย่าง Optuna และ Hyperopt ช่วยจัดการให้
ใช้การเพิ่มประสิทธิภาพแบบเบย์เซียนเมื่อการเทรนมีต้นทุนสูงและมีงบประมาณรอบทดลองจำกัด
Successive halving และ Hyperband
สองวิธีนี้ลดเวลาคอมพิวต์โดยหยุดรันที่แย่ตั้งแต่เนิ่น ๆ
Successive halving เริ่มด้วยชุดค่าจำนวนมากพร้อมงบเทรนน้อย ตัดครึ่งที่แย่ที่สุดออก เพิ่มงบให้ผู้รอด แล้วทำซ้ำ
Hyperband เป็นตัวครอบ successive halving ที่รันหลายครั้งด้วยสัดส่วนงบต่างกัน จึงไม่ต้องเดาค่าตั้งต้นเอง
ทั้งสองวิธีเหมาะเมื่อเทรนช้าและพื้นที่ค้นหากว้าง ทำงานได้ดีเมื่อประสิทธิภาพช่วงแรกเป็นสัญญาณที่พอทำนายผลสุดท้ายได้ ซึ่งมักเป็นจริงสำหรับโครงข่ายประสาทและกราเดียนต์บูสติง
สรุปเปรียบเทียบวิธีต่าง ๆ ดังนี้:
| ต้นทุนคอมพิวต์ | ประสิทธิภาพการค้นหา | เหมาะสำหรับ | |
|---|---|---|---|
| การค้นหาด้วยมือ | ต่ำ | ต่ำ | โมเดลเล็ก มีประสบการณ์ล่วงหน้า |
| กริดเสิร์ช | สูง | ต่ำ | 2–3 ไฮเปอร์พารามิเตอร์ ช่วงแคบ |
| การสุ่มค้นหา | ปานกลาง | ปานกลาง | 4+ ไฮเปอร์พารามิเตอร์ ความสำคัญไม่ชัดเจน |
| การเพิ่มประสิทธิภาพแบบเบย์เซียน | ปานกลาง | สูง | การเทรนมีต้นทุนสูง งบจำกัด |
| Successive halving / Hyperband | ต่ำถึงปานกลาง | สูง | พื้นที่ค้นหากว้าง การเทรนช้า |
การประเมินประสิทธิภาพของไฮเปอร์พารามิเตอร์
การจูนจะไปได้ไม่ไกลหากไม่กำหนดช่วงค่าที่ถูกต้อง
หากการประเมินคลาดเคลื่อน จะเลือกไฮเปอร์พารามิเตอร์ผิด มีสี่เรื่องที่ต้องทำให้ถูกต้อง—วิธีแบ่งข้อมูล วิธีวัดผล เมตริกที่ใช้ปรับให้เหมาะสม และการกันชุดทดสอบให้สะอาด
การแบ่งชุดเทรน วาลิเดชัน และเทสต์
แบ่งข้อมูลออกเป็นสามส่วนก่อนเริ่มจูน
ชุดเทรนใช้ให้โมเดลเรียนรู้ ชุดวาลิเดชันใช้ให้คะแนนแต่ละชุดไฮเปอร์พารามิเตอร์ระหว่างการจูน ชุดทดสอบใช้ครั้งเดียวท้ายสุดเพื่อวัดประสิทธิภาพโมเดลบนข้อมูลที่ไม่เคยเห็น
หากจูนกับชุดทดสอบ คุณจะได้ตัวเลขความแม่นยำที่ดูดี แต่โมเดลจะทำงานต่ำกว่าคาดในโปรดักชัน ทุกการตัดสินใจที่อิงกับชุดทดสอบคือการรั่วไหลของข้อมูลสู่โมเดล
สัดส่วนที่พบบ่อยคือ 60/20/20 สำหรับชุดข้อมูลขนาดกลาง หรือ 80/10/10 สำหรับชุดใหญ่
ครอสวาลิเดชัน
ครอสวาลิเดชันเหมาะกว่าเมื่อชุดวาลิเดชันมีขนาดเล็ก
แบ่งข้อมูลเทรนเป็น k โฟลด์—มักใช้ 5 หรือ 10 สำหรับแต่ละชุดไฮเปอร์พารามิเตอร์ เทรนบน k-1 โฟลด์และวัดผลบนโฟลด์ที่เหลือ แล้วหมุนจนครบ ค่าท้ายสุดคือค่าเฉลี่ยของทุกโฟลด์
ครอสวาลิเดชันให้ค่าประเมินที่นิ่งขึ้น เพราะไม่พึ่งพาการแบ่งวาลิเดชันเพียงครั้งเดียวที่อาจโชคดีหรือโชคร้าย ค่าใช้จ่ายคือคุณต้องเทรน k โมเดลต่อหนึ่งชุดค่า
ใช้ครอสวาลิเดชันเมื่อชุดข้อมูลเล็กจนการแบ่งครั้งเดียวไม่น่าเชื่อถือ และเมื่อรับภาระการเทรนเพิ่มได้
การเลือกเมตริกประเมินผล
เมตริกที่ปรับให้เหมาะสมควรตรงกับสิ่งที่สนใจจริง
Accuracy เหมาะกับคลาสที่สมดุล แต่ไม่เข้าท่าสำหรับปัญหาไม่สมดุล เช่น โมเดลตรวจจับทุจริตที่ทำนาย “ไม่ทุจริต” ทุกกรณีอาจได้ 99% แต่พลาดทั้งหมด สำหรับคลาสไม่สมดุล ใช้ precision, recall, F1 หรือ ROC-AUC สำหรับรีเกรสชัน ใช้ RMSE, MAE หรือ R squared ขึ้นกับความสำคัญของเอาต์ไลเออร์
เลือกเมตริกหลักตัวเดียวก่อนเริ่มจูน แล้วยึดตามนั้น
การหลีกเลี่ยงการรั่วไหลของข้อมูล
การรั่วไหลเกิดเมื่อข้อมูลจากชุดวาลิเดชันหรือเทสต์เล็ดลอดสู่การเทรน
ตัวอย่างที่พบบ่อย:
- สเกลหรือทำ normalization กับทั้งชุดก่อนแบ่ง ทำให้สถิติของวาลิเดชันรั่วไปสู่เทรน
- ฟีเจอร์เอนจิเนียริงที่ใช้ค่าเป้าหมายจากทั้งชุดข้อมูล
- จูนโดยอิงชุดทดสอบแทนที่จะใช้วาลิเดชันแยก
- ใช้ข้อมูลอนุกรมเวลาโดยไม่คำนึงลำดับเวลาในการแบ่ง
ฟิตขั้นตอน preprocessing ทั้งหมดบนชุดเทรนเท่านั้น แล้วค่อยนำไปใช้กับวาลิเดชันและเทสต์ ใน scikit-learn นี่คือหน้าที่ของ Pipeline ที่รวม preprocessing และโมเดลไว้ด้วยกันโดยเคารพการแบ่งชุด
การนำการปรับจูนไฮเปอร์พารามิเตอร์ไปใช้
ไลบรารี ML ส่วนใหญ่มีเครื่องมือช่วยค้นหาและทำครอสวาลิเดชันอยู่แล้ว จึงไม่ต้องทำใหม่ตั้งแต่ต้น
การปรับจูนไฮเปอร์พารามิเตอร์ใน Python
Scikit-learn มาพร้อมคลาสสำหรับจูนสองตัวหลัก—GridSearchCV สำหรับกริดเสิร์ช และ RandomizedSearchCV สำหรับการสุ่มค้นหา ทั้งสองครอบตัวประมาณค่าใด ๆ ของ scikit-learn ทำครอสวาลิเดชันในแต่ละชุด และคืนโมเดลที่ดีที่สุดท้ายสุด
GridSearchCV รับตัวประมาณค่า ดิกชันนารีของค่าพารามิเตอร์ และจำนวนโฟลด์ของครอสวาลิเดชัน เทรนทุกรายการและเก็บตัวที่สกอร์ดีที่สุด
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, random_state=42)
param_grid = {
"n_estimators": [100, 200, 500],
"max_depth": [5, 10, 20],
"min_samples_leaf": [1, 5, 10],
}
grid = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5)
grid.fit(X, y)
print(grid.best_params_)
print(grid.best_score_)

ผลลัพธ์ GridSearchCV ใน Python
RandomizedSearchCV ใช้อินเทอร์เฟซเดียวกัน แต่สุ่มจากการแจกแจงแทนการไล่ลิสต์ตายตัว ช่วยครอบคลุมช่วงกว้างขึ้นในจำนวนรอบคงที่
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_dist = {
"n_estimators": randint(100, 500),
"max_depth": randint(3, 20),
"min_samples_leaf": randint(1, 10),
}
random_search = RandomizedSearchCV(
RandomForestClassifier(random_state=42),
param_dist,
n_iter=30,
cv=5,
random_state=42,
)
random_search.fit(X, y)
print(random_search.best_params_)

ผลลัพธ์ RandomizedSearchCV ใน Python
สำหรับการเพิ่มประสิทธิภาพแบบเบย์เซียน Optuna คือมาตรฐาน มันเลือกชุดถัดไปบนพื้นฐานของผลก่อนหน้า จึงคอนเวอร์จเร็วกว่าการสุ่มเมื่อการเทรนมีต้นทุนสูง
import optuna
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
def objective(trial):
params = {
"n_estimators": trial.suggest_int("n_estimators", 100, 500),
"max_depth": trial.suggest_int("max_depth", 3, 20),
"min_samples_leaf": trial.suggest_int("min_samples_leaf", 1, 10),
}
model = RandomForestClassifier(**params, random_state=42)
return cross_val_score(model, X, y, cv=5).mean()
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=30)
print(study.best_params)

ผลลัพธ์ Optuna ใน Python
เมธอด trial.suggest_* ใช้กำหนดพื้นที่ค้นหา และ Optuna จะตัดสินใจว่าควรลองชุดใดต่อไปตามสกอร์ที่เห็นมา
การปรับจูนไฮเปอร์พารามิเตอร์ใน R
R มีสองตัวเลือกที่ดี—caret และ tidymodels ทั้งคู่ทำงานคล้ายกัน—กำหนดกริด ทำครอสวาลิเดชัน คืนโมเดลที่ดีที่สุด—แต่ tidymodels เป็นค่าเริ่มต้นยุคใหม่
กับ caret ให้ส่งกริดให้ฟังก์ชัน train() และกำหนดวิธีรีแซมปลิง
library(caret)
data <- iris
ctrl <- trainControl(method = "cv", number = 5)
grid <- expand.grid(
mtry = c(2, 3, 4)
)
model <- train(
Species ~ .,
data = data,
method = "rf",
trControl = ctrl,
tuneGrid = grid
)
print(model$bestTune)

ผลลัพธ์ Caret ใน R
tidymodels แยกเวิร์กโฟลว์เป็นขั้นตอนชัดเจน—สเปคโมเดล สูตร preprocessing และกริดสำหรับจูน แม้จะยาวกว่าแต่ขยายได้ดีในทางปฏิบัติ
library(tidymodels)
data <- iris
split <- initial_split(data, prop = 0.8)
train_data <- training(split)
rf_spec <- rand_forest(
mtry = tune(),
trees = tune(),
min_n = tune()
) |>
set_engine("ranger") |>
set_mode("classification")
grid <- grid_regular(
mtry(range = c(2, 4)),
trees(range = c(100, 500)),
min_n(range = c(1, 10)),
levels = 3
)
folds <- vfold_cv(train_data, v = 5)
results <- tune_grid(
rf_spec,
Species ~ .,
resamples = folds,
grid = grid
)
show_best(results, metric = "accuracy")

ผลลัพธ์ Tidymodels ใน R
เวิร์กโฟลว์เหมือนกับใน Python ทุกประการ—กำหนดสิ่งที่จะค้นหา กำหนดวิธีให้คะแนน แล้วปล่อยให้ไลบรารีรันลูป
ควรจูนไฮเปอร์พารามิเตอร์ตัวไหนบ้าง?
ไม่ใช่ทุกไฮเปอร์พารามิเตอร์ที่คุ้มจูน เพราะมักมีเพียงไม่กี่ตัวที่กำหนดประสิทธิภาพส่วนใหญ่ ต่อไปนี้คือสิ่งที่มักสำคัญเป็นอันดับแรก แยกตามตระกูลโมเดล
ต้นไม้ตัดสินใจและแรนดอมฟอเรสต์
สามข้อนี้ควรจูนเสมอ:
- ความลึกสูงสุดคุมว่าต้นไม้จะเติบโตได้ลึกแค่ไหน ต้นไม้ตื้นไปจะอันเดอร์ฟิต ลึกไปจะโอเวอร์ฟิต มักเป็นสิ่งแรกที่ต้องจูน
- จำนวนตัวอย่างขั้นต่ำต่อใบกำหนดว่าปมใบต้องมีข้อมูลอย่างน้อยเท่าไร ค่าที่สูงบังคับให้ต้นไม้ทั่วไปมากขึ้นแทนการจำแถวเดี่ยว ๆ
- จำนวนต้นไม้ในแรนดอมฟอเรสต์ ต้นไม้มากขึ้นทำให้โมเดลนิ่งขึ้น แต่ให้ผลตอบแทนลดลงหลังจากสองสามร้อยต้น จูนอันนี้ทีหลัง
โมเดลกราเดียนต์บูสติง
กราเดียนต์บูสติง (XGBoost, LightGBM, CatBoost) ไวต่อไฮเปอร์พารามิเตอร์มากกว่าแรนดอมฟอเรสต์ ให้ความสำคัญกับสิ่งเหล่านี้:
- อัตราการเรียนรู้คุมว่าต้นไม้ใหม่แต่ละต้นจะปรับแก้ต้นก่อนหน้าแค่ไหน ค่าต่ำแม่นขึ้นแต่ต้องใช้ต้นไม้มากขึ้น นี่คือไฮเปอร์พารามิเตอร์ที่สำคัญที่สุด
- จำนวนเอสติมเมเตอร์คือจำนวนรอบบูสติง ผูกกับอัตราการเรียนรู้—ลดอันหนึ่งต้องเพิ่มอีกอัน
- ความลึกของต้นไม้คุมความซับซ้อนของต้นไม้แต่ละต้น บูสติงมักชอบต้นไม้ตื้นกว่าแรนดอมฟอเรสต์ โดยทั่วไป 3 ถึง 8
ซัพพอร์ตเวกเตอร์แมชชีน
สำหรับ SVM การเลือกไฮเปอร์พารามิเตอร์สำคัญมาก อาจมากกว่าระบบอื่น ๆ:
- C คุมการแลกเปลี่ยนระหว่างมาร์จินกว้างกับการจัดประเภทตัวอย่างเทรนให้ถูกต้อง ค่า C สูงหมายถึงรีกูลาไรเซชันน้อยลง
- Gamma คุมระยะอิทธิพลของตัวอย่างหนึ่งตัว ค่า gamma ต่ำหมายถึงไกล สูงหมายถึงใกล้
- เคอร์เนลกำหนดรูปทรงของเส้นแบ่งการตัดสินใจที่ SVM เรียนรู้ได้ เริ่มที่
rbfสำหรับปัญหาไม่เชิงเส้น และlinearสำหรับข้อมูลสแปร์สมิติมิติสูง
โครงข่ายประสาทเทียม
โครงข่ายประสาทมีพื้นที่ค้นหากว้างที่สุดในบรรดาตระกูลโมเดลทั่วไป เริ่มจูนสิ่งเหล่านี้ก่อน:
- อัตราการเรียนรู้ คือไฮเปอร์พารามิเตอร์สำคัญที่สุดในดีพลอยน์นิง สูงไปเทรนไม่คงที่ ต่ำไปก็ไม่คอนเวอร์จ ลองค่าข้ามลำดับความสำคัญ เช่น
1e-4,1e-3,1e-2. - ขนาดแบตช์ ส่งผลทั้งความเร็วการเทรนและความแม่นยำปลายทาง แบตช์ใหญ่เทรนต่อ epoch เร็วขึ้นแต่บ่อยครั้งทั่วไปได้แย่ลง
- ตัวปรับเหมาะ (Adam, SGD พร้อมโมเมนตัม, AdamW) เปลี่ยนวิธีอัปเดตเวตของเน็ตเวิร์ก Adam เป็นค่าตั้งต้นที่ดี
- จำนวน epoch คือจำนวนรอบที่โมเดลเห็นชุดเทรนครบ ใช้ early stopping แทนการจูนด้วยมือ
ความท้าทายทั่วไปในการปรับจูนไฮเปอร์พารามิเตอร์
การจูนมีต้นทุนสูง โดยเฉพาะเมื่ออยากทดสอบหลายค่าในหลายพารามิเตอร์ ต่อไปนี้คือความท้าทายที่พบบ่อย
ต้นทุนคอมพิวต์ คือข้อจำกัดใหญ่ที่สุด ทุกชุดที่ลองหมายถึงเทรนโมเดลเต็มหนึ่งครั้ง และครอสวาลิเดชันจะคูณด้วยจำนวนโฟลด์ กริด 100 ชุดกับ 5 โฟลด์ เท่ากับฟิตโมเดล 500 ครั้ง ถ้าแต่ละครั้งใช้ 10 นาที ก็เกินสามวัน
พื้นที่ค้นหาขนาดใหญ่ โตแบบคูณทวี ไฮเปอร์พารามิเตอร์ 5 ตัว ตัวละ 5 ค่า ได้ 3,125 ชุด ตรงนี้กริดเสิร์ชใช้ไม่ได้ ต้องหันไปสุ่มค้นหาหรือวิธีเบย์เซียน
ผลตอบแทนที่ลดลง มักเห็นได้เร็วกว่าที่คิด การจูนไม่กี่รอบแรกให้กำไรสูงสุด อีก 50 รอบถัดไปอาจได้เพิ่มอีกเพียง 1% จุดหนึ่งแล้ว การใช้คอมพิวต์เพิ่มคุ้มกว่าหรือควรไปเก็บข้อมูลเพิ่ม/ปรับฟีเจอร์ดีกว่า
การแลกเปลี่ยนระหว่างความแม่นยำกับเวลา สำคัญกว่าในโปรดักชันมากกว่าช่วงพัฒนา โมเดลที่คะแนนสูงขึ้น 0.5% แต่ใช้เวลาเทรนเพิ่มเท่าตัว อาจไม่คุ้มถ้าต้องรีเทรนทุกวัน ควรกำหนดไว้ล่วงหน้าว่าความแม่นยำเพิ่มเท่าไรถึงคุ้มกับคอมพิวต์เท่าไร
แนวทางปฏิบัติที่ดีในการปรับจูนไฮเปอร์พารามิเตอร์
แนวทางที่ควรยึดเมื่อจูนไฮเปอร์พารามิเตอร์ของโมเดลแมชชีนเลิร์นนิง:
- เริ่มจูนตัวที่มีอิทธิพลมากที่สุดก่อน: อัตราการเรียนรู้สำหรับบูสติงและโครงข่ายประสาท ความลึกสูงสุดสำหรับต้นไม้ C และ gamma สำหรับ SVM จับช่วงให้ถูกก่อนค่อยไปอย่างอื่น
- เริ่มจากการสุ่มค้นหาสำหรับพื้นที่กว้าง: กริดเสิร์ชสิ้นเปลืองกับตัวที่ไม่สำคัญ การสุ่มค้นหาครอบคลุมพื้นที่ได้ดีกว่า และเหมาะกับกรณีที่มีไฮเปอร์พารามิเตอร์มากกว่าสองหรือสามตัว
- ใช้ครอสวาลิเดชัน: การแบ่งวาลิเดชันครั้งเดียวอาจโชคดีหรือโชคร้าย ห้าโฟลด์ให้ค่าประเมินการทั่วไปที่ซื่อสัตย์กว่า
- กำหนดช่วงค้นหาให้สมจริง: ถ้าช่วงอัตราการเรียนรู้คือ
[0.001, 100]จะเสียเวลากับค่าที่ใช้ไม่ได้ เริ่มจากช่วงที่ทราบว่าพอเหมาะกับอัลกอริทึม แล้วค่อยแคบลงตามผลที่เห็น - ติดตามการทดลองของคุณ: ล็อกค่าไฮเปอร์พารามิเตอร์ สกอร์ และซีดของทุกรอบ ใช้ MLflow, Weights & Biases หรือแม้แต่ไฟล์ CSV ก็ได้ มิฉะนั้นคุณจะทำซ้ำผลไม่ได้
- ตั้งงบคอมพิวต์: ตัดสินใจจำนวนรอบที่ทำได้ก่อนเริ่ม ไม่ใช่หลังเริ่ม วิธีนี้บังคับให้เลือกวิธีค้นหาที่สอดคล้องกับงบ และหยุดจูนเมื่อถึงจุดพอดี
ข้อผิดพลาดที่พบบ่อยในการปรับจูนไฮเปอร์พารามิเตอร์
การจูนล้มเหลวส่วนใหญ่มาจากข้อผิดพลาดที่หลีกเลี่ยงได้ง่าย ต่อไปนี้คือตัวอย่าง:
- สับสนระหว่างไฮเปอร์พารามิเตอร์กับพารามิเตอร์ของโมเดล เวตและค่าสัมประสิทธิ์เรียนรู้ระหว่างเทรน ไม่ต้องตั้งเองและไม่ต้องจูน หากจูนสิ่งที่อัลกอริทึมควรเรียนรู้เอง แปลว่าสับสนสองอย่างนี้
- จูนโดยดูจากชุดทดสอบ ทุกการตัดสินใจที่อิงกับคะแนนเทสต์ทำให้ข้อมูลรั่วสู่โมเดล ตัวเลขสุดท้ายจะมองโลกสวยเกินจริง และโมเดลโปรดักชันจะทำได้ต่ำกว่า ใช้วาลิเดชันแยกหรือครอสวาลิเดชัน
- ค้นหากริดที่ใหญ่เกินจำเป็น กริดที่มี 7 ไฮเปอร์พารามิเตอร์ ตัวละ 10 ค่า มีสิบล้านชุด ค้นหาไม่ไหว ตัดทอนก่อนเริ่มด้วยการเลือก 2–3 ตัวที่สำคัญที่สุดและให้ช่วงที่สมจริง
- ปรับเหมาะเมตริกผิดตัว Accuracy บนข้อมูลไม่สมดุลจะได้โมเดลที่ทายคลาสใหญ่เสมอ เลือกเมตริกที่สะท้อนสิ่งที่สนใจจริง และเลือกก่อนเริ่มจูน
- เปลี่ยนหลายไฮเปอร์พารามิเตอร์พร้อมกันระหว่างการจูนด้วยมือ หากปรับทั้งอัตราการเรียนรู้และขนาดแบตช์พร้อมกัน คุณจะไม่รู้ว่าอะไรทำให้ผลเปลี่ยน ขยับทีละตัวเมื่อจูนด้วยมือ
การปรับจูนไฮเปอร์พารามิเตอร์ vs ฟีเจอร์เอนจิเนียริง
ทั้งสองอย่างช่วยให้โมเดลดีขึ้น แต่แก้กันคนละส่วนของปัญหา
ฟีเจอร์เอนจิเนียริง ปรับปรุงข้อมูลอินพุต สร้างฟีเจอร์ใหม่จากของเดิม เข้ารหัสตัวแปรเชิงหมวด จัดการค่าว่าง และลดสัญญาณรบกวน ฟีเจอร์ที่ดีให้สัญญาณที่มีประโยชน์แก่โมเดล
การปรับจูนไฮเปอร์พารามิเตอร์ ปรับปรุงวิธีที่โมเดลเรียนรู้จากฟีเจอร์ที่มีอยู่ เปลี่ยนพฤติกรรมของอัลกอริทึมบนข้อมูล แทนที่จะเปลี่ยนข้อมูล
ทั้งสองอย่างเสริมกัน ฟีเจอร์เอนจิเนียริงมักให้กำไรมากที่สุดในช่วงต้นของโปรเจกต์เมื่อข้อมูลยังดิบและโมเดลพลาดสัญญาณชัด ๆ ส่วนการปรับจูนไฮเปอร์พารามิเตอร์ให้กำไรน้อยกว่าแต่อย่างสม่ำเสมอเมื่อฟีเจอร์ดีพอแล้ว
หากโมเดลติดเพดานและไม่แน่ใจว่าจะทำอะไรก่อน ให้ดูที่ข้อผิดพลาด หากโมเดลพลาดแพตเทิร์นที่ดูชัดจากข้อมูล แสดงว่ามีปัญหาฟีเจอร์ หากโอเวอร์ฟิตหรืออันเดอร์ฟิต แสดงว่ามีปัญหาการจูน
ทำไมการปรับจูนไฮเปอร์พารามิเตอร์จึงสำคัญในแมชชีนเลิร์นนิง
การจูนเป็นขั้นตอนมาตรฐานในเวิร์กโฟลว์ ML ใด ๆ
มักให้กำไรมากกว่าการเปลี่ยนอัลกอริทึม เช่น แรนดอมฟอเรสต์ที่จูนมาดีมักชนะกราเดียนต์บูสติงที่จูนไม่ดีบนข้อมูลชุดเดียวกัน แม้กราเดียนต์บูสติงจะซับซ้อนกว่า
การจูนยังช่วยเรื่องการทั่วไป ไฮเปอร์พารามิเตอร์อย่างความลึกสูงสุดและ dropout ควบคุมระดับโอเวอร์ฟิตโดยตรง การตั้งให้ถูกทำให้ต่างระหว่างโมเดลที่ท่องจำชุดเทรนกับโมเดลที่ทำงานได้ดีกับข้อมูลใหม่
ในโปรดักชัน การจูนช่วยยกระดับจากต้นแบบไปเป็นระบบที่ไว้ใจได้
ค่าตั้งต้นช่วยให้เริ่มได้ แต่ไม่ใช่ค่าที่จะทำให้โมเดลแข่งขันได้ท่ามกลางการรีเทรนและข้อกำหนดธุรกิจ ทีม ML ที่จริงจังถือว่าการจูนเป็นส่วนหนึ่งของกระบวนการ
สรุป
การปรับจูนไฮเปอร์พารามิเตอร์คือการวนลูป ค้นหา ประเมิน และบีบช่วงให้แคบลงตามสิ่งที่เวิร์กกับข้อมูลของคุณ
ผลลัพธ์ดีที่สุดมาจากสามอย่างรวมกัน—วิธีค้นหาที่สอดคล้องกับงบคอมพิวต์ การวาลิเดตที่ให้คะแนนสอดคล้องกับเป้าหมาย และการติดตามการทดลองที่ย้อนดูสิ่งที่เคยลองได้
เริ่มด้วยการสุ่มค้นหาหรือกริดเสิร์ช ขยับไปวิธีเบย์เซียนเมื่อการเทรนมีต้นทุนสูงจนจำนวนรอบสำคัญ ไม่ว่าวิธีใด จูนเฉพาะไฮเปอร์พารามิเตอร์ที่เกี่ยวกับโมเดลของคุณ รักษาชุดทดสอบให้สะอาด และล็อกทุกรอบ
หากกำลังพิจารณาอาชีพในสายแมชชีนเลิร์นนิง ลงทะเบียนหลักสูตร Machine Learning Engineer เพื่อเตรียมความพร้อมงานในปี 2026
คำถามที่พบบ่อย
การปรับจูนไฮเปอร์พารามิเตอร์ในแมชชีนเลิร์นนิงคืออะไร?
การปรับจูนไฮเปอร์พารามิเตอร์คือกระบวนการค้นหาค่าตั้งที่ทำให้โมเดลเรียนรู้ได้ดีที่สุดบนข้อมูลของคุณ ไฮเปอร์พารามิเตอร์เป็นค่าที่ตั้งก่อนการเทรน เช่น อัตราการเรียนรู้หรือความลึกของต้นไม้ และคุมวิธีที่โมเดลเรียนรู้แทนที่จะคุมสิ่งที่เรียนรู้ การจูนจะค้นหาชุดค่าที่แตกต่างกันและเลือกชุดที่ให้ประสิทธิภาพดีที่สุดบนชุดวาลิเดชัน
ทำไมการปรับจูนไฮเปอร์พารามิเตอร์จึงสำคัญ?
ค่าตั้งต้นของไฮเปอร์พารามิเตอร์ช่วยให้โมเดลรันได้ แต่ไม่ถูกปรับให้เหมาะกับปัญหาเฉพาะของคุณ การจูนมักให้กำไรด้านความแม่นยำมากกว่าการเปลี่ยนไปใช้อัลกอริทึมที่ซับซ้อนกว่า และยังควบคุมความสามารถในการทั่วไปกับข้อมูลใหม่ของโมเดลโดยตรง
ความแตกต่างระหว่างไฮเปอร์พารามิเตอร์กับพารามิเตอร์ของโมเดลคืออะไร?
พารามิเตอร์ของโมเดลถูกอัลกอริทึมเรียนรู้ระหว่างเทรน เช่น เวตในโครงข่ายประสาทหรือจุดแบ่งในต้นไม้ตัดสินใจ ส่วนไฮเปอร์พารามิเตอร์ตั้งโดยคุณก่อนเทรนและคุมวิธีการเรียนรู้ เช่น อัตราการเรียนรู้หรือจำนวนต้นไม้ คุณจะไม่จูนพารามิเตอร์ของโมเดลด้วยมือ และอัลกอริทึมก็จะไม่ไปแตะไฮเปอร์พารามิเตอร์ของคุณ
ควรใช้กริดเสิร์ชหรือการสุ่มค้นหา?
กริดเสิร์ชเหมาะกับพื้นที่ค้นหาเล็กที่มีไฮเปอร์พารามิเตอร์สองหรือสามตัวและมีค่าไม่กี่ค่า เมื่อมีพารามิเตอร์มากขึ้น การสุ่มค้นหาครอบคลุมพื้นที่ได้ดีกว่าด้วยงบคอมพิวต์เท่าเดิม เพราะไม่เสียรันกับค่าที่ไม่สำคัญ ตามหลักแล้ว ใช้กริดเสิร์ชเมื่อรู้ดีว่าควรลองค่าใด และใช้การสุ่มค้นหาเมื่อยังไม่รู้
ควรใช้การเพิ่มประสิทธิภาพแบบเบย์เซียนแทนการสุ่มค้นหาเมื่อใด?
วิธีเบย์เซียนคุ้มค่ากว่าเมื่อการเทรนมีต้นทุนสูงและแต่ละรอบมีราคา เพราะใช้ผลจากรอบก่อน ๆ เพื่อตัดสินใจว่าจะลองอะไรต่อ จึงหาค่าที่ดีได้ในจำนวนรอบน้อยกว่าการสุ่ม หากทำร้อยรอบเร็ว ๆ ได้ การสุ่มค้นหาง่ายกว่าและมักเพียงพอ เลือกวิธีเบย์เซียนเมื่อจำกัดรอบได้เพียงหลักสิบ