1. Underfitting và Overfitting
- Overfitting là hiện tượng mô hình dự đoán quá khớp với dữ liệu đã cho dẫn đến việc sẽ dự đoán không tốt trên các dữ liệu mới. Ví dụ như học tủ nhưng đi thi thì lệch tủ.
- Underfitting là hiện tượng mô hình quá đơn giản so với cấu trúc dữ liệu. Điều này dẫn đến dự đoán từ mô hình đưa ra luôn có hiệu suất kém.
Hình minh cho Underfitting, Overfitting và Optimal (tối ưu).
2. Regularized Linear Models
Regularized là một phương pháp giúp giảm overfitting trong quá trình huấn luyện.
Lưu ý: Bài viết này chúng ta sẽ tìm hiểu cách dùng Regularized với mô hình tuyến tính Linear Models).
- Ý tưởng chính của phương pháp này là cộng thêm 1 thành phần regularization vào hàm mất mát.
Sau đó qua trở lại bài toán tìm sao cho đạt giá trị nhỏ nhất.
Ridge Regression (L2 norm)
Với:
- là một tham số có thể điều chỉnh được (hyperparameter)
- m là số lượng mẫu dữ liệu
- n là số lượng đặc trưng (feature)
- gọi là L2 regularization term (phần "phạt").
Khi => mô hình hồi quy tuyến tính thông thường không áp dụng Regularized
Ý nghĩa của việc cộng thêm L2 regularization term:
- Ép các tham số nhỏ lại vì nếu to thì hàm mất mát sẽ lớn.
- Tạo ngẫu nhiên 20 điểm dữ liệu
np.random.seed(42)
m = 20
X = 3 * np.random.rand(m, 1)
y = 1 + 0.5 * X + np.random.randn(m, 1) / 1.5 # y = 1 + 0.5 * x + nhiễu
X_new = np.linspace(0, 3, 100).reshape(100, 1)
- Vẽ các điểm vừa tạo trên đồ thị
import matplotlib.pyplot as plt plt.rc('font', size=14)
plt.rc('axes', labelsize=14, titlesize=14)
plt.rc('legend', fontsize=14)
plt.rc('xtick', labelsize=10)
plt.rc('ytick', labelsize=10) plt.figure(figsize=(6, 4))
plt.plot(X, y, ".")
plt.xlabel("$x_1$")
plt.ylabel("$y$ ", rotation=0)
plt.axis([0, 3, 0, 3.5])
plt.grid()
plt.show()
- Tìm
Ta có công thức tìm tối ưu:
- A là một ma trận, thường là ma trận đơn vị (ma trận đường chéo với các phần tử đường chéo bằng 1).
alpha = 0.1
A = np.array([[0., 0.], [0., 1.]])
X_b = np.c_[np.ones(m), X]
np.linalg.inv(X_b.T @ X_b + alpha * A) @ X_b.T @ y """
array([[0.97898394], [0.3828496 ]])
Mô hình cho ra: y = 0.97 + 0.38 * x
"""
Hoặc dùng hàm có sẵn trong thư viện sklearn
from sklearn.linear_model import Ridge ridge_reg = Ridge(alpha=0.1, solver="cholesky")
ridge_reg.fit(X, y)
print(ridge_reg.intercept_, ridge_reg.coef_) # [0.97898394] [0.3828496]: y = 0.97 + 0.38 * x
- Thử với các giá trị alpha khác nhau
Từ các đồ thị trên, nhận thấy.
- Nếu α quá lớn, mô hình sẽ bị underfitting.
- Nếu α quá nhỏ thì overfitting.
Cũng dễ hiểu thôi vì nếu α càng lớn => hàm mất mát càng lớn. Do đó trong quá trình tối ưu thì mô hình càng phải ép các giá trị nhỏ đi dẫn đến underfitting.
Lasso Regression (L1 norm)
Thay vì dùng bình phương như Ridge regression, Lasso Regression dùng trị tuyệt đối với công thức như sau:
Phương pháp của Lasso dùng trị tuyệt đối gọi là L1 norm, còn của Ridge sử dụng bình phương là L2 norm.
Lưu ý:
-
Để giảm overfitting, Lasso có thể ép một vài về bằng 0.
-
Đối với Ridge, chỉ có tác động làm giảm bớt giá trị của các .
-
Lasso không có công thức tính tối ưu như Ridge do không có đạo hàm tại 0 (không giải được phương trình đạo hàm bằng 0 để tìm tối ưu).
-
Lasso sẽ dùng một số phương pháp khác để tính tối ưu như Coordinate Descent, Proximal Gradient Descent, Subgradient Descent ...
-
Dùng hàm
Lasso
của thư viện Sklearn để tính toán.
from sklearn.linear_model import Lasso lasso_reg = Lasso(alpha=0.1)
lasso_reg.fit(X, y) print(lasso_reg.intercept_, lasso_reg.coef_) # [1.14537356] [0.26167212]: y = 1.14 + 0.26 * x
Elastic Net
Elastic Net là một phương pháp trung gian giữa Ridge và Lasso. Thành phần regularization là sự kết hợp của cả hai phương pháp trên.
- r = 0 tương đương với Ridge Regression
- r = 1 tương đương với Lasso Regression
from sklearn.linear_model import ElasticNet elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net.fit(X, y) print(elastic_net.intercept_, elastic_net.coef_) # [1.08639303] [0.30462619]: y = 1.08 + 0.304x
Early Stopping
Early stopping khác biệt so với các kỹ thuật như Lasso hay Ridge. Thay vì tinh chỉnh hàm mất mát, nó chỉ đơn giản là dừng quá trình huấn luyện khi lỗi trên tập kiểm định (validation error) đạt giá trị nhỏ nhất.
Geoffrey Hinton gọi phương pháp này là “beautiful free lunch”.
- Như hình trên, sau khi huấn luyện xong. Lấy thông số mô hình tại điểm mà lỗi trên tập validation bé nhất. Rất đơn giản mà lại hiểu quả phải không 😄
Tài liệu tham khảo
https://jashrathod.github.io/2021-09-30-underfitting-overfitting-and-regularization/
https://github.com/ageron/handson-ml3/blob/main/04_training_linear_models.ipynb