Courses
Bạn đã huấn luyện một mô hình dự đoán gần như hoàn hảo trên dữ liệu huấn luyện nhưng lại thất bại trên dữ liệu mới? Ai cũng từng gặp tình huống đó.
Đó là định nghĩa khái quát của overfitting. Mô hình không học được quy luật thực sự mà chỉ ghi nhớ dữ liệu huấn luyện. Trong môi trường sản xuất với dữ liệu mới và chưa từng thấy, mô hình sẽ đưa ra dự đoán mà bạn khó lòng tin tưởng. Dữ liệu thực tế càng khác với mẫu huấn luyện, vấn đề này càng tệ.
Regularization khắc phục điều đó bằng cách thêm một khoản phạt vào hàm mất mát. Khoản phạt này làm nản lòng các mô hình quá phức tạp. Nói cách khác, đó là cơ chế ngăn mô hình khớp với mọi điểm dữ liệu và buộc nó phải khái quát hóa.
Trong bài viết này, tôi sẽ giải thích trực quan về regularization, các phương pháp phổ biến nhất - L1, L2 và Elastic Net - và cách chọn phương pháp phù hợp cho trường hợp sử dụng của bạn.
Nếu bạn muốn hiểu vì sao và bằng cách nào các mô hình machine learning thất bại trong môi trường sản xuất, hãy đọc bài viết Sự đánh đổi giữa độ chệch và phương sai (Bias-Variance Tradeoff) của chúng tôi.
Regularization trong Machine Learning là gì
Regularization là kỹ thuật thêm một hạng phạt vào hàm mất mát của mô hình để hạn chế độ phức tạp.
Nếu không có hạng phạt này, mô hình đủ linh hoạt để khớp dữ liệu huấn luyện sát mức nó muốn, bao gồm cả nhiễu và ngoại lệ. Regularization đặt ra chi phí cho sự linh hoạt đó. Mô hình càng muốn phức tạp, khoản phạt càng lớn.
Hàm mất mát của mô hình thường đo lường chênh lệch giữa giá trị dự đoán và giá trị thực. Regularization thêm một hạng phụ vào phương trình đó, tăng lên khi các hệ số của mô hình tăng. Giờ đây mô hình phải cân bằng hai mục tiêu đối nghịch: khớp dữ liệu huấn luyện và giữ cho các hệ số nhỏ.
Sự cân bằng đó kiểm soát độ linh hoạt của mô hình.
Một mô hình quá linh hoạt có thể "uốn" theo mọi hình dạng để khớp dữ liệu huấn luyện. Regularization làm phẳng nó về một dạng đơn giản hơn - có khả năng bền vững hơn trên dữ liệu mô hình chưa từng thấy.
Vì sao cần Regularization
Mỗi mô hình bạn huấn luyện đều nằm đâu đó giữa hai thái cực vô dụng: quá đơn giản và quá phức tạp.
Một mô hình quá đơn giản không "nắm bắt" được quy luật thực sự trong dữ liệu. Nó bỏ lỡ tín hiệu. Đó là underfitting - mô hình hoạt động kém cả trên dữ liệu huấn luyện lẫn dữ liệu mới.
Một mô hình quá phức tạp thì ngược lại. Nó khớp mọi chi tiết trong dữ liệu huấn luyện, kể cả nhiễu. Đó là overfitting - mô hình thể hiện rất tốt trên dữ liệu huấn luyện nhưng thất bại trên dữ liệu mới vì nó ghi nhớ sai thứ cần ghi nhớ.
Lấy hồi quy đa thức làm ví dụ cụ thể. Một đa thức bậc 3 khớp với dữ liệu có dạng cong nhẹ thường sẽ mô tả đúng quy luật. Nhưng một đa thức bậc 15 trên cùng dữ liệu đó sẽ dẫn đến overfit - đường cong đi qua mọi điểm dữ liệu nhưng cho dự đoán ngẫu nhiên ở khoảng giữa.
Biểu đồ dưới đây minh họa điều đó trong thực tế.

Mô hình vừa đủ so với quá phức tạp
Đây chính là sự đánh đổi giữa độ chệch và phương sai.
Mô hình đơn giản có độ chệch cao - đưa ra các giả định mạnh mẽ và bỏ lỡ quy luật thực. Mô hình phức tạp có phương sai cao - quá nhạy với các mẫu huấn luyện cụ thể, chỉ cần thay đổi nhỏ trong dữ liệu đã tạo ra mô hình rất khác.
Regularization giúp bạn dung hòa cả hai. Nó không loại bỏ độ phức tạp, nhưng phạt nó. Nhờ vậy, mô hình có cơ hội tốt hơn để học tín hiệu thực sự.
Regularization hoạt động như thế nào
Mỗi mô hình học bằng cách tối thiểu hóa một hàm mất mát - thước đo mức sai lệch của dự đoán. Không có regularization, nhiệm vụ duy nhất của mô hình là giảm lỗi đó. Nó sẽ làm mọi thứ cần thiết, kể cả tăng các hệ số thật lớn để khớp dữ liệu huấn luyện nhưng không khái quát được.
Regularization thay đổi mục tiêu. Thay vì chỉ tối thiểu hóa lỗi, giờ mô hình tối thiểu hóa biểu thức sau:

Regularization hoạt động như thế nào
Hạng phạt là một hàm của các hệ số mô hình. Hệ số lớn làm tăng khoản phạt. Để giữ chi phí tổng thấp, mô hình buộc phải giữ các hệ số nhỏ - đồng nghĩa với nghiệm đơn giản, dễ khái quát hơn.
λ (lambda) điều khiển mức độ quan trọng của khoản phạt. λ càng cao, áp lực buộc mô hình đơn giản càng lớn. λ càng thấp, mô hình càng tập trung vào việc khớp dữ liệu. Bạn sẽ thấy cách tinh chỉnh tham số này trong phần Chọn độ mạnh regularization bên dưới.
Các loại Regularization trong Machine Learning
Có vài cách để phạt độ phức tạp của mô hình. Mỗi cách tạo áp lực lên các hệ số theo cách khác nhau, phù hợp với các tình huống khác nhau.
Regularization L2 (hồi quy Ridge)
L2 phạt bình phương giá trị của mỗi hệ số. Hệ số càng lớn, đóng góp vào khoản phạt càng nhiều - và mô hình càng phải nỗ lực thu nhỏ nó.

Regularization L2
Từ khóa ở đây là thu nhỏ. L2 đẩy tất cả hệ số về gần 0, nhưng không bao giờ chạm đúng 0. Mọi đặc trưng vẫn ở trong mô hình, chỉ là với trọng số nhỏ hơn. Điều đó khiến Ridge là lựa chọn mặc định tốt khi bạn tin rằng hầu hết đặc trưng đều hữu ích và bạn muốn một mô hình ổn định, "ngoan ngoãn".
Regularization L1 (hồi quy Lasso)
L1 phạt giá trị tuyệt đối của mỗi hệ số thay vì bình phương.

Regularization L1
Khác biệt nhỏ này kéo theo hệ quả lớn. L1 có thể đẩy hệ số về đúng 0, tức là loại bỏ đặc trưng khỏi mô hình. Bạn có thể xem đây là chọn lọc đặc trưng tự động. Nói cách khác, Lasso có thể đơn giản hóa mô hình bằng cách loại bớt đặc trưng.
So sánh L1 và L2
Khác biệt cốt lõi nằm ở độ thưa (sparsity). L1 tạo ra mô hình thưa - chỉ một tập con đặc trưng được giữ lại. L2 tạo mô hình dày - tất cả đặc trưng được giữ, với trọng số nhỏ hơn.
Điều đó cũng ảnh hưởng đến khả năng diễn giải. Một mô hình Lasso với 5 đặc trưng hoạt động sẽ dễ giải thích hơn mô hình Ridge với 50 đặc trưng cùng đóng góp một chút. Nhưng Ridge có xu hướng ổn định hơn khi các đặc trưng tương quan với nhau, vì nó phân bổ trọng số giữa chúng thay vì tùy tiện chọn một cái.
Dưới đây là tổng quan nhanh về khác biệt:

Regularization L1 so với L2
Nếu bạn muốn xem chúng so sánh trong Python, hãy xem hướng dẫn Lasso và Ridge Regression trong Python của chúng tôi.
Regularization Elastic Net
Elastic Net kết hợp L1 và L2 thành một hạng phạt duy nhất.

Regularization Elastic Net
Mục tiêu là tận dụng ưu điểm của cả hai: khả năng chọn lọc đặc trưng của L1 và sự ổn định của L2. Điều này hữu ích khi bạn có các đặc trưng tương quan và vẫn muốn loại bớt một số. Lasso đơn thuần có xu hướng chọn một đặc trưng trong nhóm tương quan và bỏ qua phần còn lại. Elastic Net có khả năng giữ lại một vài trong số đó đồng thời loại bỏ những đặc trưng không liên quan.
Regularization trong các mô hình khác nhau
Regularization xuất hiện ở nhiều mô hình machine learning, nhưng dưới những hình thức khác nhau. Hãy xem đó là gì.
Hồi quy tuyến tính là nơi đa số mọi người lần đầu thấy regularization. Thêm L2 vào hồi quy tuyến tính bạn sẽ có Ridge. Tương tự, thêm L1 bạn sẽ có Lasso. Toán học giống như đã mô tả ở trên - thêm hạng phạt vào hàm mất mát bình phương tối thiểu.
Hồi quy logistic hoạt động tương tự. Hàm mất mát thay đổi - là cross-entropy thay vì sai số bình phương - nhưng hạng phạt thì giống hệt. Phần lớn thư viện machine learning áp dụng L2 cho hồi quy logistic theo mặc định, đó là lý do bạn sẽ thấy tham số C trong scikit-learn. Nó là nghịch đảo của λ, nên C nhỏ hơn đồng nghĩa regularization mạnh hơn.
Mạng nơ-ron dùng vài cách tiếp cận khác nhau:
- Weight decay: L2 áp dụng lên trọng số của mạng - hoạt động tương tự, chỉ là ở quy mô lớn hơn nhiều
- Dropout: Trong quá trình huấn luyện, ngẫu nhiên vô hiệu hóa một phần nơ-ron ở mỗi lượt, giúp ngăn mạng phụ thuộc quá mức vào bất kỳ đường đi đơn lẻ nào qua các lớp.
Cả hai đều giảm overfitting, nhưng theo những cách khác nhau.
Các mô hình dựa trên cây không dùng hạng phạt trong hàm mất mát. Thay vào đó, chúng kiểm soát độ phức tạp bằng tỉa cây - giới hạn độ sâu tối đa của cây, hoặc loại bỏ nhánh không cải thiện dự đoán đủ để xứng đáng tồn tại. Các siêu tham số như max_depth và min_samples_split trong scikit-learn là các tham số regularization, dù không được gọi như vậy.
Regularization và sự đánh đổi Bias-Variance
Regularization là câu chuyện về sự đánh đổi.
Khi thêm hạng phạt, bạn đang hạn chế những gì mô hình có thể làm. Nó không còn được khớp dữ liệu huấn luyện sát như mong muốn. Ràng buộc đó đưa vào độ chệch - mô hình cố ý chấp nhận những giả định hơi sai, vì bạn đã yêu cầu nó giữ đơn giản.
Nhưng cùng ràng buộc đó giảm phương sai. Một mô hình không thể khớp mọi điểm dữ liệu sẽ ít nhạy cảm hơn với những mẫu cụ thể nó được huấn luyện. Khi bạn huấn luyện trên bộ dữ liệu hơi khác, bạn sẽ nhận được kết quả tương tự. Sự ổn định đó mới là điều bạn muốn, để mô hình không thất bại trong sản xuất.
Không có regularization, bạn có một mô hình rất linh hoạt với độ chệch thấp (ít giả định và khớp tốt dữ liệu huấn luyện) và phương sai cao (chỉ cần thay đổi nhỏ trong dữ liệu huấn luyện đã tạo ra mô hình rất khác, tức là không thể tin cậy trên dữ liệu mới).
Regularization là điều chỉnh cán cân. Thêm một chút độ chệch để đổi lấy giảm mạnh phương sai thường dẫn tới hiệu quả tốt hơn trên dữ liệu chưa từng thấy. Đó là sự đánh đổi, và gần như luôn đáng làm.
Chọn độ mạnh Regularization
Là người thực hành machine learning, bạn sẽ phải đặt độ mạnh regularization sau khi chọn loại regularization.
Độ mạnh này được điều khiển bởi một siêu tham số - thường gọi là lambda (λ) trong ký hiệu toán, hoặc alpha trong scikit-learn. Nó là hệ số nhân đứng trước hạng phạt. Khi bạn thay đổi nó, bạn thay đổi mức độ mô hình bị đẩy về sự đơn giản.
Nếu chọn sai theo bất kỳ hướng nào, bạn sẽ gặp vấn đề trong sản xuất:
- Quá thấp: khoản phạt quá yếu đến mức không đáng kể. Mô hình overfit, giống như không có regularization.
- Quá cao: khoản phạt chiếm ưu thế. Mô hình bị ràng buộc đến mức không thể nắm bắt quy luật thực trong dữ liệu. Đó là underfitting.
Giá trị đúng nằm đâu đó ở giữa, và không có câu trả lời chung. Nó phụ thuộc vào dữ liệu, mô hình và mức độ nhiễu bạn đang xử lý.
Cách tiêu chuẩn để tìm là cross-validation. Bạn chia dữ liệu huấn luyện thành các fold, huấn luyện mô hình trên từng tổ hợp fold, và đo hiệu năng xác thực trên một dải giá trị alpha. Giá trị cho điểm xác thực trung bình tốt nhất là giá trị bạn dùng.
Trong scikit-learn, RidgeCV và LassoCV có thể làm việc này tự động - chúng chạy cross-validation trên một lưới giá trị alpha và chọn giá trị tốt nhất cho bạn.
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_)
Giá trị alpha in ra sẽ cho bạn biết giá trị tốt nhất được tìm bằng cross-validation. Hãy bắt đầu với một dải giá trị rộng, sau đó thu hẹp lại khi bạn biết khoảng tối ưu nằm ở đâu.
Kết luận
Regularization là cách bạn ngăn mô hình trở nên "quá thông minh" theo nghĩa tiêu cực.
Nó phạt độ phức tạp, buộc mô hình tìm lời giải có khả năng khái quát thay vì chỉ ghi nhớ dữ liệu huấn luyện. L2 sẽ giữ mọi đặc trưng và giảm ảnh hưởng của chúng. L1 sẽ loại bỏ các đặc trưng không liên quan. Elastic Net kết hợp cả hai. Và trong các mô hình tuyến tính, hồi quy logistic, mạng nơ-ron, và các mô hình tập hợp, cùng một ý tưởng xuất hiện dưới những hình thức khác nhau, và không phải lúc nào cũng được gọi là "regularization".
Điều quan trọng nhất là kỹ thuật bạn chọn và độ mạnh bạn đặt. Vì vậy, điều bạn nên làm là thử nghiệm. Hãy thử các cách tiếp cận khác nhau với các giá trị tham số khác nhau. Đừng chỉ chọn một rồi bỏ qua.
Dữ liệu của bạn sẽ cho bạn biết điều gì hiệu quả.
Nếu bạn muốn thấy nhiều kỹ thuật regularization được áp dụng, hãy đăng ký lộ trình Machine Learning Scientist in Python của chúng tôi. Lộ trình có 85 giờ nội dung giúp bạn sẵn sàng cho công việc.
Câu hỏi thường gặp
Regularization trong machine learning là gì?
Regularization là kỹ thuật thêm một hạng phạt vào hàm mất mát của mô hình để hạn chế độ phức tạp. Nó ngăn overfitting bằng cách buộc mô hình giữ các hệ số nhỏ, từ đó dẫn đến lời giải đơn giản hơn và khái quát tốt hơn trên dữ liệu mới.
Khi nào tôi nên dùng regularization?
Hãy dùng regularization bất cứ khi nào mô hình hoạt động tốt trên dữ liệu huấn luyện nhưng kém trên dữ liệu xác thực hoặc kiểm thử - khoảng cách đó là dấu hiệu của overfitting. Đây cũng là thói quen tốt khi bạn làm việc với dữ liệu có số chiều cao hoặc tập dữ liệu mà số đặc trưng xấp xỉ hoặc vượt quá số mẫu.
Regularization có luôn cải thiện hiệu năng mô hình không?
Không phải lúc nào cũng vậy. Nếu mô hình của bạn đang underfitting, thêm regularization sẽ làm mọi thứ tệ hơn bằng cách đẩy nó về lời giải còn đơn giản hơn. Mục tiêu là tìm điểm cân bằng - regularization hữu ích khi mô hình quá phức tạp, không phải khi nó quá đơn giản.
Sự khác nhau giữa alpha trong Lasso và C trong hồi quy logistic là gì?
Cả hai đều kiểm soát độ mạnh regularization, nhưng theo hướng ngược nhau. alpha trong Lasso tỉ lệ với hạng phạt - giá trị cao hơn đồng nghĩa regularization mạnh hơn. C trong hồi quy logistic của scikit-learn là nghịch đảo của độ mạnh phạt, nên C nhỏ hơn đồng nghĩa regularization mạnh hơn. Nếu bạn chuyển qua lại giữa hai cái, hãy nhớ rằng tăng alpha và giảm C có tác dụng tương đương.
Tôi có thể dùng đồng thời regularization L1 và L2 không?
Có - đó chính xác là điều Elastic Net làm. Nó kết hợp cả hai hạng phạt vào một mục tiêu, đồng thời mang lại khả năng chọn lọc đặc trưng của L1 và sự ổn định của L2. Nó hữu ích khi bạn có các đặc trưng tương quan và vẫn muốn tỉa bớt, vì Lasso đơn thuần có xu hướng tùy tiện giữ lại một đặc trưng và bỏ các đặc trưng còn lại trong một nhóm tương quan.
