ความแม่นยำของโมเดลไม่ได้แย่เพราะเลือกอัลกอริทึมผิด แต่เพราะยังไม่เคยปรับจูนเลยต่างหาก
หลายคนเทรนโมเดลด้วยค่าตั้งต้น เห็นความแม่นยำอยู่ราว ๆ 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
ความแม่นยำของโมเดลไม่ได้แย่เพราะเลือกอัลกอริทึมผิด แต่เพราะยังไม่เคยปรับจูนเลยต่างหาก
หลายคนเทรนโมเดลด้วยค่าตั้งต้น เห็นความแม่นยำอยู่ราว ๆ 80% แล้วสรุปว่าอัลกอริทึมไม่เหมาะกับงาน แต่ความจริงปัญหาไม่ใช่อัลกอริทึม โมเดล ML ทุกตัวมีพารามิเตอร์ที่คุมวิธีการเรียนรู้ ซึ่งถูกกำหนดก่อนเริ่มเทรน ถ้าตั้งได้ถูกต้อง ความแม่นยำอาจเพิ่มได้อีก 10–20% โดยใช้โมเดลและข้อมูลชุดเดิม
พารามิเตอร์เหล่านี้เรียกว่าไฮเปอร์พารามิเตอร์ การเลือกให้เหมาะจะทำให้โมเดลที่ “พอใช้” กลายเป็นโมเดลที่ “ตอบได้แม่น” การปรับจูนไฮเปอร์พารามิเตอร์คือกระบวนการค้นหาชุดค่าที่ให้ประสิทธิภาพดีที่สุด
บทความนี้จะพาไปดูว่าไฮเปอร์พารามิเตอร์ทูนิงคืออะไร กลยุทธ์การค้นหาที่ใช้ได้ผล วิธีประเมินผลโดยไม่หลอกตัวเอง และวิธีรันทั้งหมดใน Python และ R
หากเพิ่งเริ่มด้านดาต้าไซเอนซ์และแมชชีนเลิร์นนิง แนะนำเรียนคอร์ส พื้นฐานแมชชีนเลิร์นนิงด้วย Python ก่อนลงหัวข้อที่ซับซ้อนยิ่งขึ้น
ไฮเปอร์พารามิเตอร์ทูนิงคืออะไร?
การปรับจูนไฮเปอร์พารามิเตอร์คือการค้นหาค่าตั้งที่ทำให้โมเดลเรียนรู้ได้ดีที่สุด
โมเดล ML มีตัวเลขอยู่สองประเภท บางอย่างเรียนรู้จากข้อมูลระหว่างการเทรน เช่น เวตในโครงข่ายประสาทหรือจุดแบ่งในต้นไม้ตัดสินใจ อีกส่วนถูกกำหนดก่อนเริ่มเทรน นั่นคือไฮเปอร์พารามิเตอร์ ซึ่งคุมวิธีที่โมเดลเรียนรู้—เร็วแค่ไหน ลึกแค่ไหน ควรทวนจำหรือตีความให้กว้างเพียงใด
ค่าตั้งต้นของไฮเปอร์พารามิเตอร์มีไว้ให้โมเดลรันได้ ไม่ได้ออกแบบมาเพื่อให้ดีที่สุดกับชุดข้อมูลของคุณ อัตราการเรียนรู้ที่เหมาะกับ image classification มักใช้กับข้อมูลตารางได้ไม่ดี ความลึกของต้นไม้แบบตั้งต้นที่พอเหมาะกับข้อมูลสะอาดอาจโอเวอร์ฟิตเมื่อข้อมูลมีสัญญาณรบกวน เข้าใจตรงกันนะ
กระบวนการปรับจูนจะค้นหาชุดค่าของไฮเปอร์พารามิเตอร์หลายแบบ เทรนโมเดลในแต่ละชุด แล้วเก็บชุดที่ทำได้ดีที่สุดบนข้อมูลวาลิเดชันไว้
ผลลัพธ์ที่ได้มักดีกว่าการเปลี่ยนไปใช้อัลกอริทึมที่ “ดีกว่า” แต่ไม่ได้ปรับจูน
ไฮเปอร์พารามิเตอร์ vs พารามิเตอร์ของโมเดล
ต่างกันที่ “ใคร” เป็นคนตั้งค่าและ “เมื่อไหร่” ตั้ง
พารามิเตอร์ของโมเดล ถูกอัลกอริทึมเรียนรู้ระหว่างการเทรน คุณไม่ต้องตั้งเอง กระบวนการเทรนจะปรับโดยอาศัยข้อมูลและการมินิไมซ์ฟังก์ชันสูญเสีย ตัวอย่างเช่น:
ไฮเปอร์พารามิเตอร์ ตั้งโดยคุณก่อนเริ่มเทรน ควบคุมกลไกการเรียนรู้ แต่ตัวอัลกอริทึมจะไม่แก้ไขให้เอง หากไม่ตั้ง ไลบรารีจะใช้ค่าตั้งต้น ตัวอย่างเช่น:
สรุปเทียบกันแบบเคียงข้างกัน:
พารามิเตอร์ของโมเดลตอบว่าโมเดล “เรียนรู้อะไร” ไฮเปอร์พารามิเตอร์ตอบว่าโมเดล “เรียนรู้อย่างไร”
การทำงานของการปรับจูนไฮเปอร์พารามิเตอร์
การปรับจูนเป็นลูป
เริ่มจากเลือกไฮเปอร์พารามิเตอร์ที่จะค้นหาและกำหนดช่วงค่าของแต่ละตัว จากนั้นเทรนโมเดลด้วยหนึ่งชุดค่า วัดผลบนข้อมูลวาลิเดชัน และใช้ผลนั้นตัดสินใจว่าจะลองอะไรต่อ
ลูปมีหน้าตาแบบนี้:
วิธีอัปเดตระหว่างรอบคือสิ่งที่ทำให้แต่ละวิธีค้นหาแตกต่างกัน การจูนด้วยมือใช้สัญชาตญาณ กริดเสิร์ชไล่ตามลิสต์ที่กำหนดไว้ วิธีแบบเบย์เซียนจะสร้างโมเดลคาดการณ์ว่าชุดค่าไหนน่าจะเวิร์ก
ต่อไปมาดูวิธีเหล่านี้อย่างละเอียด
วิธีค้นหาไฮเปอร์พารามิเตอร์
วิธีค้นหาที่เลือกจะกำหนดทั้งปริมาณคอมพิวต์ที่ใช้ และโอกาสในการเจอค่าที่ดี
การค้นหาด้วยมือ
วิธีที่ง่ายที่สุด เลือกชุดค่า เทรน ดูผล แล้วปรับตามที่เห็น
ใช้ได้เมื่อโมเดลเล็ก ไฮเปอร์พารามิเตอร์ไม่กี่ตัว และมีประสบการณ์กับอัลกอริทึมนั้นอยู่แล้ว หากรู้ว่า 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 ที่รันหลายครั้งด้วยสัดส่วนงบต่างกัน จึงไม่ต้องเดาค่าตั้งต้นเอง
ทั้งสองวิธีเหมาะเมื่อเทรนช้าและพื้นที่ค้นหากว้าง ทำงานได้ดีเมื่อประสิทธิภาพช่วงแรกเป็นสัญญาณที่พอทำนายผลสุดท้ายได้ ซึ่งมักเป็นจริงสำหรับโครงข่ายประสาทและกราเดียนต์บูสติง
สรุปเปรียบเทียบวิธีต่าง ๆ ดังนี้:
การประเมินประสิทธิภาพของไฮเปอร์พารามิเตอร์
การจูนจะไปได้ไม่ไกลหากไม่กำหนดช่วงค่าที่ถูกต้อง
หากการประเมินคลาดเคลื่อน จะเลือกไฮเปอร์พารามิเตอร์ผิด มีสี่เรื่องที่ต้องทำให้ถูกต้อง—วิธีแบ่งข้อมูล วิธีวัดผล เมตริกที่ใช้ปรับให้เหมาะสม และการกันชุดทดสอบให้สะอาด
การแบ่งชุดเทรน วาลิเดชัน และเทสต์
แบ่งข้อมูลออกเป็นสามส่วนก่อนเริ่มจูน
ชุดเทรนใช้ให้โมเดลเรียนรู้ ชุดวาลิเดชันใช้ให้คะแนนแต่ละชุดไฮเปอร์พารามิเตอร์ระหว่างการจูน ชุดทดสอบใช้ครั้งเดียวท้ายสุดเพื่อวัดประสิทธิภาพโมเดลบนข้อมูลที่ไม่เคยเห็น
หากจูนกับชุดทดสอบ คุณจะได้ตัวเลขความแม่นยำที่ดูดี แต่โมเดลจะทำงานต่ำกว่าคาดในโปรดักชัน ทุกการตัดสินใจที่อิงกับชุดทดสอบคือการรั่วไหลของข้อมูลสู่โมเดล
สัดส่วนที่พบบ่อยคือ 60/20/20 สำหรับชุดข้อมูลขนาดกลาง หรือ 80/10/10 สำหรับชุดใหญ่
ครอสวาลิเดชัน
ครอสวาลิเดชันเหมาะกว่าเมื่อชุดวาลิเดชันมีขนาดเล็ก
แบ่งข้อมูลเทรนเป็น k โฟลด์—มักใช้ 5 หรือ 10 สำหรับแต่ละชุดไฮเปอร์พารามิเตอร์ เทรนบน k-1 โฟลด์และวัดผลบนโฟลด์ที่เหลือ แล้วหมุนจนครบ ค่าท้ายสุดคือค่าเฉลี่ยของทุกโฟลด์
ครอสวาลิเดชันให้ค่าประเมินที่นิ่งขึ้น เพราะไม่พึ่งพาการแบ่งวาลิเดชันเพียงครั้งเดียวที่อาจโชคดีหรือโชคร้าย ค่าใช้จ่ายคือคุณต้องเทรน k โมเดลต่อหนึ่งชุดค่า
ใช้ครอสวาลิเดชันเมื่อชุดข้อมูลเล็กจนการแบ่งครั้งเดียวไม่น่าเชื่อถือ และเมื่อรับภาระการเทรนเพิ่มได้
การเลือกเมตริกประเมินผล
เมตริกที่ปรับให้เหมาะสมควรตรงกับสิ่งที่สนใจจริง
Accuracy เหมาะกับคลาสที่สมดุล แต่ไม่เข้าท่าสำหรับปัญหาไม่สมดุล เช่น โมเดลตรวจจับทุจริตที่ทำนาย “ไม่ทุจริต” ทุกกรณีอาจได้ 99% แต่พลาดทั้งหมด สำหรับคลาสไม่สมดุล ใช้ precision, recall, F1 หรือ ROC-AUC สำหรับรีเกรสชัน ใช้ RMSE, MAE หรือ R squared ขึ้นกับความสำคัญของเอาต์ไลเออร์
เลือกเมตริกหลักตัวเดียวก่อนเริ่มจูน แล้วยึดตามนั้น
การหลีกเลี่ยงการรั่วไหลของข้อมูล
การรั่วไหลเกิดเมื่อข้อมูลจากชุดวาลิเดชันหรือเทสต์เล็ดลอดสู่การเทรน
ตัวอย่างที่พบบ่อย:
ฟิตขั้นตอน preprocessing ทั้งหมดบนชุดเทรนเท่านั้น แล้วค่อยนำไปใช้กับวาลิเดชันและเทสต์ ใน scikit-learn นี่คือหน้าที่ของ
Pipelineที่รวม preprocessing และโมเดลไว้ด้วยกันโดยเคารพการแบ่งชุดการนำการปรับจูนไฮเปอร์พารามิเตอร์ไปใช้
ไลบรารี ML ส่วนใหญ่มีเครื่องมือช่วยค้นหาและทำครอสวาลิเดชันอยู่แล้ว จึงไม่ต้องทำใหม่ตั้งแต่ต้น
การปรับจูนไฮเปอร์พารามิเตอร์ใน Python
Scikit-learn มาพร้อมคลาสสำหรับจูนสองตัวหลัก—
GridSearchCVสำหรับกริดเสิร์ช และRandomizedSearchCVสำหรับการสุ่มค้นหา ทั้งสองครอบตัวประมาณค่าใด ๆ ของ scikit-learn ทำครอสวาลิเดชันในแต่ละชุด และคืนโมเดลที่ดีที่สุดท้ายสุดGridSearchCVรับตัวประมาณค่า ดิกชันนารีของค่าพารามิเตอร์ และจำนวนโฟลด์ของครอสวาลิเดชัน เทรนทุกรายการและเก็บตัวที่สกอร์ดีที่สุดผลลัพธ์ GridSearchCV ใน Python
RandomizedSearchCVใช้อินเทอร์เฟซเดียวกัน แต่สุ่มจากการแจกแจงแทนการไล่ลิสต์ตายตัว ช่วยครอบคลุมช่วงกว้างขึ้นในจำนวนรอบคงที่ผลลัพธ์ RandomizedSearchCV ใน Python
สำหรับการเพิ่มประสิทธิภาพแบบเบย์เซียน Optuna คือมาตรฐาน มันเลือกชุดถัดไปบนพื้นฐานของผลก่อนหน้า จึงคอนเวอร์จเร็วกว่าการสุ่มเมื่อการเทรนมีต้นทุนสูง
ผลลัพธ์ Optuna ใน Python
เมธอด
trial.suggest_*ใช้กำหนดพื้นที่ค้นหา และ Optuna จะตัดสินใจว่าควรลองชุดใดต่อไปตามสกอร์ที่เห็นมาการปรับจูนไฮเปอร์พารามิเตอร์ใน R
R มีสองตัวเลือกที่ดี—
caretและtidymodelsทั้งคู่ทำงานคล้ายกัน—กำหนดกริด ทำครอสวาลิเดชัน คืนโมเดลที่ดีที่สุด—แต่tidymodelsเป็นค่าเริ่มต้นยุคใหม่กับ
caretให้ส่งกริดให้ฟังก์ชันtrain()และกำหนดวิธีรีแซมปลิงผลลัพธ์ Caret ใน R
tidymodelsแยกเวิร์กโฟลว์เป็นขั้นตอนชัดเจน—สเปคโมเดล สูตร preprocessing และกริดสำหรับจูน แม้จะยาวกว่าแต่ขยายได้ดีในทางปฏิบัติผลลัพธ์ Tidymodels ใน R
เวิร์กโฟลว์เหมือนกับใน Python ทุกประการ—กำหนดสิ่งที่จะค้นหา กำหนดวิธีให้คะแนน แล้วปล่อยให้ไลบรารีรันลูป
ควรจูนไฮเปอร์พารามิเตอร์ตัวไหนบ้าง?
ไม่ใช่ทุกไฮเปอร์พารามิเตอร์ที่คุ้มจูน เพราะมักมีเพียงไม่กี่ตัวที่กำหนดประสิทธิภาพส่วนใหญ่ ต่อไปนี้คือสิ่งที่มักสำคัญเป็นอันดับแรก แยกตามตระกูลโมเดล
ต้นไม้ตัดสินใจและแรนดอมฟอเรสต์
สามข้อนี้ควรจูนเสมอ:
โมเดลกราเดียนต์บูสติง
กราเดียนต์บูสติง (XGBoost, LightGBM, CatBoost) ไวต่อไฮเปอร์พารามิเตอร์มากกว่าแรนดอมฟอเรสต์ ให้ความสำคัญกับสิ่งเหล่านี้:
ซัพพอร์ตเวกเตอร์แมชชีน
สำหรับ SVM การเลือกไฮเปอร์พารามิเตอร์สำคัญมาก อาจมากกว่าระบบอื่น ๆ:
rbfสำหรับปัญหาไม่เชิงเส้น และlinearสำหรับข้อมูลสแปร์สมิติมิติสูงโครงข่ายประสาทเทียม
โครงข่ายประสาทมีพื้นที่ค้นหากว้างที่สุดในบรรดาตระกูลโมเดลทั่วไป เริ่มจูนสิ่งเหล่านี้ก่อน:
1e-4,1e-3,1e-2.ความท้าทายทั่วไปในการปรับจูนไฮเปอร์พารามิเตอร์
การจูนมีต้นทุนสูง โดยเฉพาะเมื่ออยากทดสอบหลายค่าในหลายพารามิเตอร์ ต่อไปนี้คือความท้าทายที่พบบ่อย
ต้นทุนคอมพิวต์ คือข้อจำกัดใหญ่ที่สุด ทุกชุดที่ลองหมายถึงเทรนโมเดลเต็มหนึ่งครั้ง และครอสวาลิเดชันจะคูณด้วยจำนวนโฟลด์ กริด 100 ชุดกับ 5 โฟลด์ เท่ากับฟิตโมเดล 500 ครั้ง ถ้าแต่ละครั้งใช้ 10 นาที ก็เกินสามวัน
พื้นที่ค้นหาขนาดใหญ่ โตแบบคูณทวี ไฮเปอร์พารามิเตอร์ 5 ตัว ตัวละ 5 ค่า ได้ 3,125 ชุด ตรงนี้กริดเสิร์ชใช้ไม่ได้ ต้องหันไปสุ่มค้นหาหรือวิธีเบย์เซียน
ผลตอบแทนที่ลดลง มักเห็นได้เร็วกว่าที่คิด การจูนไม่กี่รอบแรกให้กำไรสูงสุด อีก 50 รอบถัดไปอาจได้เพิ่มอีกเพียง 1% จุดหนึ่งแล้ว การใช้คอมพิวต์เพิ่มคุ้มกว่าหรือควรไปเก็บข้อมูลเพิ่ม/ปรับฟีเจอร์ดีกว่า
การแลกเปลี่ยนระหว่างความแม่นยำกับเวลา สำคัญกว่าในโปรดักชันมากกว่าช่วงพัฒนา โมเดลที่คะแนนสูงขึ้น 0.5% แต่ใช้เวลาเทรนเพิ่มเท่าตัว อาจไม่คุ้มถ้าต้องรีเทรนทุกวัน ควรกำหนดไว้ล่วงหน้าว่าความแม่นยำเพิ่มเท่าไรถึงคุ้มกับคอมพิวต์เท่าไร
แนวทางปฏิบัติที่ดีในการปรับจูนไฮเปอร์พารามิเตอร์
แนวทางที่ควรยึดเมื่อจูนไฮเปอร์พารามิเตอร์ของโมเดลแมชชีนเลิร์นนิง:
[0.001, 100]จะเสียเวลากับค่าที่ใช้ไม่ได้ เริ่มจากช่วงที่ทราบว่าพอเหมาะกับอัลกอริทึม แล้วค่อยแคบลงตามผลที่เห็นข้อผิดพลาดที่พบบ่อยในการปรับจูนไฮเปอร์พารามิเตอร์
การจูนล้มเหลวส่วนใหญ่มาจากข้อผิดพลาดที่หลีกเลี่ยงได้ง่าย ต่อไปนี้คือตัวอย่าง:
การปรับจูนไฮเปอร์พารามิเตอร์ vs ฟีเจอร์เอนจิเนียริง
ทั้งสองอย่างช่วยให้โมเดลดีขึ้น แต่แก้กันคนละส่วนของปัญหา
ฟีเจอร์เอนจิเนียริง ปรับปรุงข้อมูลอินพุต สร้างฟีเจอร์ใหม่จากของเดิม เข้ารหัสตัวแปรเชิงหมวด จัดการค่าว่าง และลดสัญญาณรบกวน ฟีเจอร์ที่ดีให้สัญญาณที่มีประโยชน์แก่โมเดล
การปรับจูนไฮเปอร์พารามิเตอร์ ปรับปรุงวิธีที่โมเดลเรียนรู้จากฟีเจอร์ที่มีอยู่ เปลี่ยนพฤติกรรมของอัลกอริทึมบนข้อมูล แทนที่จะเปลี่ยนข้อมูล
ทั้งสองอย่างเสริมกัน ฟีเจอร์เอนจิเนียริงมักให้กำไรมากที่สุดในช่วงต้นของโปรเจกต์เมื่อข้อมูลยังดิบและโมเดลพลาดสัญญาณชัด ๆ ส่วนการปรับจูนไฮเปอร์พารามิเตอร์ให้กำไรน้อยกว่าแต่อย่างสม่ำเสมอเมื่อฟีเจอร์ดีพอแล้ว
หากโมเดลติดเพดานและไม่แน่ใจว่าจะทำอะไรก่อน ให้ดูที่ข้อผิดพลาด หากโมเดลพลาดแพตเทิร์นที่ดูชัดจากข้อมูล แสดงว่ามีปัญหาฟีเจอร์ หากโอเวอร์ฟิตหรืออันเดอร์ฟิต แสดงว่ามีปัญหาการจูน
ทำไมการปรับจูนไฮเปอร์พารามิเตอร์จึงสำคัญในแมชชีนเลิร์นนิง
การจูนเป็นขั้นตอนมาตรฐานในเวิร์กโฟลว์ ML ใด ๆ
มักให้กำไรมากกว่าการเปลี่ยนอัลกอริทึม เช่น แรนดอมฟอเรสต์ที่จูนมาดีมักชนะกราเดียนต์บูสติงที่จูนไม่ดีบนข้อมูลชุดเดียวกัน แม้กราเดียนต์บูสติงจะซับซ้อนกว่า
การจูนยังช่วยเรื่องการทั่วไป ไฮเปอร์พารามิเตอร์อย่างความลึกสูงสุดและ dropout ควบคุมระดับโอเวอร์ฟิตโดยตรง การตั้งให้ถูกทำให้ต่างระหว่างโมเดลที่ท่องจำชุดเทรนกับโมเดลที่ทำงานได้ดีกับข้อมูลใหม่
ในโปรดักชัน การจูนช่วยยกระดับจากต้นแบบไปเป็นระบบที่ไว้ใจได้
ค่าตั้งต้นช่วยให้เริ่มได้ แต่ไม่ใช่ค่าที่จะทำให้โมเดลแข่งขันได้ท่ามกลางการรีเทรนและข้อกำหนดธุรกิจ ทีม ML ที่จริงจังถือว่าการจูนเป็นส่วนหนึ่งของกระบวนการ
สรุป
การปรับจูนไฮเปอร์พารามิเตอร์คือการวนลูป ค้นหา ประเมิน และบีบช่วงให้แคบลงตามสิ่งที่เวิร์กกับข้อมูลของคุณ
ผลลัพธ์ดีที่สุดมาจากสามอย่างรวมกัน—วิธีค้นหาที่สอดคล้องกับงบคอมพิวต์ การวาลิเดตที่ให้คะแนนสอดคล้องกับเป้าหมาย และการติดตามการทดลองที่ย้อนดูสิ่งที่เคยลองได้
เริ่มด้วยการสุ่มค้นหาหรือกริดเสิร์ช ขยับไปวิธีเบย์เซียนเมื่อการเทรนมีต้นทุนสูงจนจำนวนรอบสำคัญ ไม่ว่าวิธีใด จูนเฉพาะไฮเปอร์พารามิเตอร์ที่เกี่ยวกับโมเดลของคุณ รักษาชุดทดสอบให้สะอาด และล็อกทุกรอบ
หากกำลังพิจารณาอาชีพในสายแมชชีนเลิร์นนิง ลงทะเบียนหลักสูตร Machine Learning Engineer เพื่อเตรียมความพร้อมงานในปี 2026