Courses
คุณฝึกโมเดลจนทำนายตัวอย่างฝึกได้แทบสมบูรณ์แบบ แต่พอลองกับข้อมูลใหม่กลับล้มเหลวใช่ไหม? เรื่องแบบนี้เกิดขึ้นกับทุกคน
นั่นคือคำอธิบายระดับสูงของการฟิตเกิน (overfitting) โมเดลไม่ได้เรียนรู้รูปแบบที่แท้จริง แต่กลับท่องจำข้อมูลฝึกแทน ในสภาพแวดล้อมการใช้งานจริงที่มีข้อมูลใหม่และไม่เคยเห็นมาก่อน โมเดลจะทำนายได้ไม่น่าไว้วางใจ ยิ่งข้อมูลจริงเบี่ยงเบนจากตัวอย่างฝึกมากเท่าไร ปัญหานี้ยิ่งแย่ลงเท่านั้น
Regularization แก้ปัญหานี้โดยเพิ่มโทษ (penalty) เข้าไปในฟังก์ชันการสูญเสีย โทษดังกล่าวทำให้โมเดลที่ซับซ้อนถูกกดดันให้น้อยลง กล่าวอีกนัยหนึ่ง มันเป็นกลไกที่ป้องกันไม่ให้โมเดลฟิตกับทุกจุดข้อมูล และบังคับให้โมเดลเกิดการเหมาทั่ว (generalize) แทน
ในบทความนี้ จะพาไปรู้จักสัญชาตญาณเบื้องหลังการทำให้เป็นปกติ วิธีที่พบบ่อยที่สุดอย่าง L1, L2 และ Elastic Net และวิธีเลือกให้เหมาะกับกรณีการใช้งาน
หากต้องการเข้าใจว่าเหตุใดและอย่างไรโมเดลแมชชีนเลิร์นนิงจึงล้มเหลวในสภาพแวดล้อมจริง โปรดอ่านบล็อกโพสต์เรื่อง ความสมดุลระหว่างอคติและความแปรปรวน (Bias-Variance Tradeoff) ของเรา
Regularization ในแมชชีนเลิร์นนิงคืออะไร
Regularization เป็นเทคนิคที่เพิ่มพจน์โทษเข้าไปในฟังก์ชันการสูญเสียของโมเดลเพื่อยับยั้งความซับซ้อน
หากไม่มีพจน์โทษ โมเดลจะยืดหยุ่นพอที่จะฟิตกับข้อมูลฝึกได้ตามต้องการ รวมถึงสัญญาณรบกวนและค่าผิดปกติด้วย Regularization เพิ่มต้นทุนให้กับความยืดหยุ่นนั้น ยิ่งโมเดลพยายามซับซ้อนมากเท่าไร ก็ยิ่งถูกลงโทษมากเท่านั้น
โดยปกติฟังก์ชันการสูญเสียจะวัดความแตกต่างระหว่างค่าที่ทำนายกับค่าจริง Regularization จะเพิ่มพจน์พิเศษเข้าไป ซึ่งจะเติบโตตามขนาดสัมประสิทธิ์ของโมเดล โมเดลจึงต้องสร้างสมดุลระหว่างสองวัตถุประสงค์ที่ขัดแย้งกัน: ฟิตข้อมูลฝึก และคงค่าสัมประสิทธิ์ให้เล็กไว้
สมดุลนั้นเองที่ควบคุมความยืดหยุ่นของโมเดล
โมเดลที่ยืดหยุ่นมากสามารถบิดตัวเป็นรูปใดก็ได้เพื่อฟิตกับข้อมูลฝึก Regularization จะปรับให้กลับมาเป็นรูปแบบที่เรียบง่ายขึ้น ซึ่งมีแนวโน้มจะใช้ได้ดีกับข้อมูลที่โมเดลไม่เคยเห็นมาก่อน
ทำไมต้องมี Regularization
ทุกโมเดลที่คุณฝึกจะอยู่ระหว่างสองขั้วที่ใช้การไม่ได้: อย่างหนึ่งเรียบง่ายเกินไป และอีกอย่างซับซ้อนเกินไป
โมเดลที่ง่ายเกินไปไม่ “เข้าใจ” รูปแบบจริงในข้อมูล พลาดสัญญาณ นั่นคือการฟิตไม่พอ (underfitting) — ทำผลงานได้แย่ทั้งบนข้อมูลฝึกและข้อมูลใหม่
โมเดลที่ซับซ้อนเกินไปตรงกันข้าม ฟิตทุกรายละเอียดในข้อมูลฝึก รวมถึงสัญญาณรบกวน นั่นคือการฟิตเกิน (overfitting) — ทำได้ดีเยี่ยมบนข้อมูลฝึก แต่ล้มเหลวบนข้อมูลใหม่เพราะดันท่องจำสิ่งที่ไม่ควร
ลองดูตัวอย่างเชิงรูปธรรมของการถดถอยพหุนาม ถ้าฟิตพหุนามดีกรี 3 กับข้อมูลที่เป็นเส้นโค้งอ่อน ๆ ก็มักได้รูปแบบที่ถูกต้อง แต่ถ้าใช้ดีกรี 15 กับข้อมูลเดียวกันจะนำไปสู่การฟิตเกิน — เส้นโค้งผ่านทุกจุดข้อมูล แต่ทำนายสุ่มไปมาในช่วงระหว่างจุด
แผนภูมิด้านล่างแสดงให้เห็นภาพจริง

โมเดลที่พอดีเทียบกับโมเดลที่ซับซ้อนเกินไป
นี่คือความสมดุลระหว่างอคติและความแปรปรวน
โมเดลที่เรียบง่ายมีอคติสูง — ทำสมมติฐานแรงจนพลาดรูปแบบจริง โมเดลที่ซับซ้อนมีความแปรปรวนสูง — ไวต่อชุดข้อมูลฝึกมากเกินไป เปลี่ยนข้อมูลนิดเดียวก็ได้โมเดลที่ต่างกันมาก
Regularization ช่วยให้ได้สิ่งที่ดีที่สุดจากทั้งสองฝั่ง มันไม่ได้กำจัดความซับซ้อน แต่ลงโทษความซับซ้อน ส่งผลให้โมเดลมีโอกาสเรียนรู้สัญญาณจริงได้ดีกว่า
Regularization ทำงานอย่างไร
ทุกโมเดลเรียนรู้ด้วยการทำให้ฟังก์ชันการสูญเสียต่ำสุด — ตัวชี้วัดว่าการทำนายผิดเพียงใด หากไม่มี Regularization งานของโมเดลมีแค่ว่าต้องลดความผิดพลาดให้ต่ำสุดเท่านั้น มันจะทำทุกอย่าง รวมถึงเพิ่มค่าสัมประสิทธิ์ให้ใหญ่เพื่อฟิตข้อมูลฝึก แม้จะไม่เหมาทั่วก็ตาม
Regularization เปลี่ยนวัตถุประสงค์ จากเดิมที่ลดความผิดพลาดเพียงอย่างเดียว มาเป็นลดสิ่งนี้แทน:

กลไกการทำงานของ Regularization
พจน์โทษเป็นฟังก์ชันของค่าสัมประสิทธิ์ของโมเดล ค่าสัมประสิทธิ์ที่ใหญ่ทำให้โทษสูงขึ้น เพื่อคงต้นทุนรวมให้ต่ำ โมเดลจึงถูกบังคับให้ค่าสัมประสิทธิ์เล็กลง — นำไปสู่คำตอบที่เรียบง่ายและเหมาทั่วได้ดีกว่า
ค่า λ (แลมบ์ดา) ควบคุมความสำคัญของโทษ ยิ่ง λ สูง โมเดลยิ่งถูกกดดันให้เรียบง่าย ยิ่ง λ ต่ำ โมเดลยิ่งเน้นฟิตข้อมูลมากขึ้น จะเห็นวิธีปรับค่านี้ในหัวข้อ การเลือกความแรงของ Regularization ด้านล่าง
ประเภทของ Regularization ในแมชชีนเลิร์นนิง
มีหลายวิธีในการลงโทษความซับซ้อนของโมเดล แต่ละวิธีกดดันค่าสัมประสิทธิ์ต่างกัน จึงเหมาะกับสถานการณ์ต่างกัน
L2 regularization (การถดถอยแบบ Ridge)
L2 ลงโทษค่ากำลังสองของแต่ละสัมประสิทธิ์ ยิ่งค่าสัมประสิทธิ์ใหญ่ ยิ่งมีส่วนต่อโทษมาก และโมเดลจะพยายามหดมันลงอย่างหนัก

L2 regularization
คำสำคัญคือ “หด” L2 ผลักค่าสัมประสิทธิ์ทั้งหมดให้เข้าใกล้ศูนย์ แต่ไม่เป็นศูนย์จริง ทุกฟีเจอร์ยังอยู่ในโมเดล เพียงแต่น้ำหนักเล็กลง จึงทำให้ Ridge เป็นค่าตั้งต้นที่ดีเมื่อเชื่อว่าฟีเจอร์ส่วนใหญ่เกี่ยวข้องและต้องการโมเดลที่นิ่งและเป็นระเบียบ
L1 regularization (การถดถอยแบบ Lasso)
L1 ลงโทษค่าขั้นสัมบูรณ์ของแต่ละสัมประสิทธิ์แทนที่จะเป็นกำลังสอง

L1 regularization
ความต่างเล็กน้อยนี้ส่งผลใหญ่ L1 สามารถผลักค่าสัมประสิทธิ์ให้เป็นศูนย์ได้จริง หมายความว่าสามารถตัดฟีเจอร์ออกจากโมเดลได้ มองได้ว่าเป็นการคัดเลือกฟีเจอร์อัตโนมัติ กล่าวคือ Lasso สามารถทำให้โมเดลเรียบง่ายขึ้นด้วยการตัดฟีเจอร์
L1 เทียบกับ L2 regularization
แก่นของความต่างอยู่ที่ความเบาบาง (sparsity) L1 ให้โมเดลเบาบาง — มีเพียงบางส่วนของฟีเจอร์ที่เหลืออยู่ L2 ให้โมเดลหนาแน่น — ฟีเจอร์ทั้งหมดอยู่ครบแต่น้ำหนักเล็กลง
เรื่องการตีความก็ได้รับผลกระทบด้วย โมเดล Lasso ที่มีฟีเจอร์ทำงาน 5 ตัวอธิบายง่ายกว่าโมเดล Ridge ที่มี 50 ฟีเจอร์ซึ่งต่างก็มีส่วนเล็กน้อย แต่ Ridge มักนิ่งกว่าเมื่อฟีเจอร์มีสหสัมพันธ์กัน เพราะกระจายน้ำหนักข้ามฟีเจอร์เหล่านั้นแทนที่จะเลือกตัวใดตัวหนึ่งแบบตามใจ
สรุปความแตกต่างแบบรวดเร็ว:

L1 เทียบกับ L2 regularization
หากอยากเห็นการเปรียบเทียบในภาษา Python ลองดู บทเรียน Lasso และ Ridge Regression ใน Python ของเรา
Elastic Net regularization
Elastic Net ผสาน L1 และ L2 เข้าด้วยกันเป็นพจน์โทษเดียว

Elastic Net regularization
แนวคิดคือได้ข้อดีทั้งคู่: การคัดเลือกฟีเจอร์ของ L1 และความนิ่งของ L2 เหมาะเมื่อมีฟีเจอร์ที่มีสหสัมพันธ์กันและยังอยากให้บางตัวถูกตัดออก Lasso เพียงอย่างเดียวมักเลือกหนึ่งฟีเจอร์จากกลุ่มที่มีสหสัมพันธ์และเพิกเฉยที่เหลือ Elastic Net มีแนวโน้มเก็บไว้บางตัว ขณะเดียวกันก็ตัดตัวที่ไม่เกี่ยวข้องออก
Regularization ในโมเดลต่าง ๆ
Regularization ปรากฏในโมเดลแมชชีนเลิร์นนิงมากมาย แต่ในรูปแบบต่างกัน ต่อไปนี้คือตัวอย่าง
การถดถอยเชิงเส้นคือที่ที่คนส่วนใหญ่เห็น Regularization ครั้งแรก เมื่อนำ L2 ไปใช้กับการถดถอยเชิงเส้นจะได้ Ridge และเมื่อนำ L1 ไปใช้จะได้ Lasso คณิตศาสตร์เหมือนที่อธิบายไว้ข้างต้น คือเพิ่มพจน์โทษเข้าไปในการสูญเสียแบบกำลังสองน้อยที่สุด
การถดถอยโลจิสติกก็ทำงานแบบเดียวกัน ฟังก์ชันการสูญเสียต่างกัน — ใช้ครอสเอนโทรปีแทนกำลังสองของข้อผิดพลาด — แต่พจน์โทษเหมือนกัน ไลบรารีแมชชีนเลิร์นนิงส่วนใหญ่มักใช้ L2 เป็นค่าตั้งต้นสำหรับโลจิสติกรีเกรสชัน ซึ่งเป็นเหตุผลที่เห็นพารามิเตอร์ชื่อ C ใน scikit-learn มันเป็นผกผันของ λ ดังนั้น C ที่เล็กกว่าหมายถึงการทำให้เป็นปกติที่แรงกว่า
โครงข่ายประสาทเทียมใช้หลายแนวทาง:
- Weight decay: L2 regularization ที่ใช้กับน้ำหนักของโครงข่าย — หลักการเหมือนเดิม เพียงแต่ขนาดใหญ่กว่า
- Dropout: ระหว่างการฝึก จะสุ่มปิดการทำงานของบางนิวรอนในแต่ละรอบ เพื่อป้องกันไม่ให้เครือข่ายพึ่งพาเส้นทางใดเส้นทางหนึ่งมากเกินไปผ่านเลเยอร์ต่าง ๆ
ทั้งสองช่วยลดการฟิตเกิน แต่ใช้วิธีต่างกัน
โมเดลแบบต้นไม้ไม่ใช้พจน์โทษเลย แต่ควบคุมความซับซ้อนผ่านการตัดแต่งกิ่ง (pruning) — จำกัดความลึกของต้นไม้ หรือเอากิ่งที่ไม่ช่วยพยากรณ์มากพอออก ไฮเปอร์พารามิเตอร์อย่าง max_depth และ min_samples_split ใน scikit-learn ถือเป็นพารามิเตอร์ของ Regularization แม้จะไม่เรียกแบบนั้นก็ตาม
Regularization กับความสมดุลอคติ–ความแปรปรวน
Regularization คือเรื่องของการประนีประนอม
เมื่อเพิ่มพจน์โทษ คุณกำลังจำกัดสิ่งที่โมเดลทำได้ มันไม่สามารถฟิตข้อมูลฝึกได้แนบชิดอย่างที่ต้องการ ข้อจำกัดนั้นทำให้เกิดอคติ — โมเดลทำสมมติฐานที่คลาดเคลื่อนเล็กน้อยโดยตั้งใจ เพราะคุณสั่งให้มันเรียบง่าย
แต่ข้อจำกัดเดียวกันนั้นลดความแปรปรวน โมเดลที่ฟิตกับทุกจุดข้อมูลไม่ได้ จะไวต่อชุดตัวอย่างที่ฝึกมาน้อยลง เมื่อฝึกกับชุดข้อมูลที่ต่างกันเล็กน้อย ผลลัพธ์จะคล้ายกัน ความนิ่งนั่นแหละที่ต้องการ เพื่อไม่ให้โมเดลล้มเหลวเมื่อใช้งานจริง
หากไม่มี Regularization คุณจะได้โมเดลที่ยืดหยุ่นสูง มีอคติต่ำ (สมมติฐานน้อยและฟิตข้อมูลฝึกได้ดี) แต่มีความแปรปรวนสูง (เปลี่ยนข้อมูลฝึกเล็กน้อยก็ได้โมเดลต่างกันมาก จึงเชื่อถือไม่ได้กับข้อมูลใหม่)
Regularization คือการขยับสมดุล เพิ่มอคติอีกเล็กน้อยแลกกับลดความแปรปรวนลงมาก มักให้ผลงานดีกว่าบนข้อมูลที่โมเดลไม่เคยเห็น นั่นคือการประนีประนอมที่คุ้มค่าแทบทุกครั้ง
การเลือกความแรงของ Regularization
ในฐานะผู้ปฏิบัติงานแมชชีนเลิร์นนิง ต้องตั้งค่าความแรงของ Regularization หลังจากเลือกประเภทแล้ว
ความแรงนี้ควบคุมด้วยไฮเปอร์พารามิเตอร์ — โดยทั่วไปเรียก lambda (λ) ในสัญกรณ์คณิตศาสตร์ หรือ alpha ใน scikit-learn เป็นตัวคูณหน้าพจน์โทษ เมื่อเปลี่ยนค่า ก็เปลี่ยนแรงกดดันให้โมเดลเรียบง่าย
ถ้าตั้งพลาดไปทางใดทางหนึ่ง จะเกิดปัญหาในการใช้งานจริง:
- ต่ำเกินไป: โทษอ่อนเกินกว่าจะมีผล โมเดลฟิตเกินเหมือนกับไม่มี Regularization เลย
- สูงเกินไป: โทษกลายเป็นปัจจัยหลัก โมเดลถูกจำกัดมากจนไม่เข้าใจรูปแบบจริงในข้อมูล กลายเป็นการฟิตไม่พอ
ค่าที่เหมาะสมอยู่ระหว่างกลาง และไม่มีคำตอบสากล ขึ้นอยู่กับข้อมูล โมเดล และระดับสัญญาณรบกวนที่เผชิญ
วิธีมาตรฐานในการหา คือครอสวา ลิเดชัน แบ่งข้อมูลฝึกเป็นหลายส่วน ฝึกโมเดลบนชุดผสมต่าง ๆ และวัดผลวา ลิเดชันบนช่วงค่าของ alpha ค่าที่ให้คะแนนวา ลิเดชันเฉลี่ยดีที่สุดคือค่าที่ใช้
ใน scikit-learn, RidgeCV และ LassoCV ทำสิ่งนี้ให้อัตโนมัติ — รันครอสวา ลิเดชันบนกริดของค่า alpha และเลือกค่าที่ดีที่สุดให้
from sklearn.linear_model import RidgeCV
model = RidgeCV(alphas=[0.01, 0.1, 1.0, 10.0], cv=5)
model.fit(X_train, y_train)
print(model.alpha_)
ค่า alpha ที่พิมพ์ออกมาจะแสดงค่าที่ดีที่สุดที่ได้จากครอสวา ลิเดชัน เริ่มจากช่วงกว้าง ๆ ก่อน แล้วค่อยแคบลงเมื่อรู้ขอบเขตที่เหมาะสม
สรุป
Regularization คือวิธีไม่ให้โมเดล “ฉลาดเกินเหตุ” จนทำร้ายตัวเอง
มันลงโทษความซับซ้อน บังคับให้โมเดลหาคำตอบที่เหมาทั่วแทนที่จะท่องจำข้อมูลฝึก L2 จะเก็บฟีเจอร์ทั้งหมดไว้และลดอิทธิพลของมัน L1 จะตัดฟีเจอร์ที่ไม่เกี่ยวข้อง Elastic Net ผสานทั้งสอง และในบรรดาโมเดลเชิงเส้น โลจิสติกรีเกรสชัน โครงข่ายประสาท และโมเดลเชิงคณะ (ensemble) แนวคิดเดียวกันนี้ปรากฏในรูปแบบต่าง ๆ และไม่ได้ถูกเรียกว่า “regularization” เสมอไป
สิ่งสำคัญที่สุดคือเทคนิคที่เลือกและความแรงที่ตั้งค่า ดังนั้นทางที่ควรทำคือทดลอง ลองหลายวิธีกับค่าพารามิเตอร์ต่าง ๆ อย่าเลือกวิธีเดียวแล้วไปต่อ
ข้อมูลจะบอกเองว่าอะไรได้ผล
หากอยากเห็นเทคนิค Regularization อื่น ๆ ในการปฏิบัติ ลงทะเบียนในโปรแกรม Machine Learning Scientist in Python ของเรา มีเนื้อหา 85 ชั่วโมงที่จะช่วยเตรียมความพร้อมสำหรับงาน
FAQs
Regularization ในแมชชีนเลิร์นนิงคืออะไร?
Regularization เป็นเทคนิคที่เพิ่มพจน์โทษเข้าไปในฟังก์ชันการสูญเสียของโมเดลเพื่อยับยั้งความซับซ้อน ป้องกันการฟิตเกินด้วยการบังคับให้โมเดลคงค่าสัมประสิทธิ์ให้เล็กลง ส่งผลให้ได้วิธีแก้ที่เรียบง่ายและเหมาทั่วกับข้อมูลใหม่ได้ดีกว่า
ควรใช้ Regularization เมื่อใด?
ใช้ Regularization เมื่อใดก็ตามที่โมเดลทำผลงานได้ดีบนข้อมูลฝึก แต่แย่บนข้อมูลวา ลิเดชันหรือทดสอบ — ช่องว่างนั้นเป็นสัญญาณของการฟิตเกิน นอกจากนี้ยังเป็นแนวปฏิบัติที่ดีเมื่อทำงานกับข้อมูลมิติสูง หรือชุดข้อมูลที่จำนวนฟีเจอร์ใกล้เคียงหรือมากกว่าจำนวนตัวอย่าง
Regularization ช่วยให้ประสิทธิภาพโมเดลดีขึ้นเสมอหรือไม่?
ไม่เสมอไป หากโมเดลกำลังฟิตไม่พออยู่แล้ว การเพิ่ม Regularization จะยิ่งแย่ลง เพราะผลักให้คำตอบง่ายเกินไป เป้าหมายคือหาสมดุลที่เหมาะสม — Regularization ช่วยเมื่อโมเดลซับซ้อนเกินไป ไม่ใช่เมื่อมันง่ายเกินไป
ความต่างระหว่าง alpha ใน Lasso กับ C ในโลจิสติกรีเกรสชันคืออะไร?
ทั้งสองควบคุมความแรงของ Regularization แต่ทำงานคนละทิศทาง alpha ใน Lasso ปรับสเกลพจน์โทษ — ค่ายิ่งสูงยิ่งแรง ส่วน C ในโลจิสติกรีเกรสชันของ scikit-learn เป็นผกผันของความแรงของโทษ ดังนั้น C ที่เล็กกว่าจะหมายถึงการทำให้เป็นปกติที่แรงกว่า หากสลับใช้ระหว่างสองตัวนี้ จำไว้ว่าการเพิ่ม alpha และการลด C ให้ผลเหมือนกัน
ใช้ L1 และ L2 ร่วมกันได้ไหม?
ได้ — นั่นคือสิ่งที่ Elastic Net ทำ มันรวมพจน์โทษทั้งสองเข้าด้วยกันเป็นวัตถุประสงค์เดียว ทำให้ได้ทั้งการคัดเลือกฟีเจอร์แบบ L1 และความนิ่งแบบ L2 เหมาะเมื่อมีฟีเจอร์ที่มีสหสัมพันธ์และยังต้องการตัดแต่งบางส่วน เพราะ Lasso เพียงอย่างเดียวมักจะเลือกฟีเจอร์เพียงตัวเดียวจากกลุ่มที่มีสหสัมพันธ์และละทิ้งที่เหลือแบบตามใจ