App: tuning siêu tham số với gradient và eval
Xây pipeline tuning: gradient descent cho hồi quy, random và grid search siêu tham số, eval chống overfit, báo cáo đường cong học.
Chuyên giaThuật toán ~120 phút
Ôn lại trước khi học
Giới thiệu
Bài này học chỉnh model cho vừa đẹp. Nhỏ quá thì dốt, lớn quá thì học vẹt.
Kiến thức cần nhớ
Gradient descent học tham số
- Tham số là số trong model, học bằng bước ngược gradient.
- Learning rate lớn quá thì phân kỳ, nhỏ quá thì lì.
- Log loss mỗi epoch để vẽ đường cong học.
- Ví dụ đời thường: xuống núi đi bước vừa chân, bước dài quá thì ngã.
Grid và random search
- Siêu tham số là số ngoài model như độ sâu cây.
- Grid search vét hết lưới, random search bốc ngẫu nhiên.
- Cùng 20 trial thì random hay thắng vì ít siêu tham số quan trọng.
- Mỗi trial chấm bằng cross-validation 3-fold cho chắc.
Chống overfit khi eval
- Chia train, validation, test theo 60-20-20 có seed.
- Chọn cấu hình trên validation, đo test đúng 1 lần cuối.
- Train tốt mà validation tệ là overfit học vẹt.
- Điểm train cao hơn hẳn validation là dấu hiệu overfit; khoảng cách nhỏ và ổn định qua các fold mới đáng tin.
# Vòng tuning gọn
for params in search(20): # grid hoặc random 20 trial
score = cross_val(params, train) # chấm CV 3-fold
log(params, score) # ghi nhật ký
best = pick_best() # chốt trên validation
test_once(best) # đo test đúng 1 lần
Ví dụ
- Input: hồi quy tuyến tính với 3 learning rate. Output: rate vừa cho loss giảm đều, rate lớn gây phân kỳ.
- Giải thích: bước quá dài nhảy qua đáy nên loss nổ tung.
- Input: cây quá sâu. Output: train tốt, validation tệ, gap lớn.
- Giải thích: cây nhớ vẹt từng điểm train nên không tổng quát.
💻 Bài tập
Ngôn ngữ: Python 3 với sklearn. Nộp vào day-138-tuning/.
Bài 1: Đường cong học
- Dùng logistic regression tự cài (ngày 55) trên Breast Cancer. Quét
lr = 1, 0.1, 0.01, 0.001. Vẽ log-loss theo epoch cho cả 4. - Chia train/validation/test 60/20/20 có seed. In loss train và validation mỗi epoch.
- Chỉ ra lr phân kỳ, lr lì, lr tốt.
Bài 2: Grid search và random search tự cài
def grid_search(model_fn, param_grid: dict, X, y, cv=3, seed=0) -> list[dict]: ...
def random_search(model_fn, param_dist: dict, n_iter: int, X, y, cv=3, seed=0) -> list[dict]: ...
# param_dist: giá trị là list (chọn đều) hoặc hàm sinh (ví dụ log-uniform)
# Trả mọi trial: params, mean_score, std_score, time
Dùng GradientBoostingClassifier trên bộ Adult Income với 4 siêu tham số: learning_rate, max_depth, n_estimators, subsample.
cách số_trial best_cv test_score thời_gian
grid 81 ...
random 20 ...
random 81 ...
Vẽ điểm CV theo từng siêu tham số (scatter). Chỉ ra siêu tham số nào quan trọng nhất.
Bài 3: Tối ưu thông minh hơn (nâng cao)
- Dùng
optuna(TPE) với 40 trial. So với random 40 trial. - Thêm pruning: dừng sớm trial có điểm thấp ở fold đầu.
- Chỉ đánh giá test đúng 1 lần với cấu hình cuối cùng. Ghi rõ trong
README.mdquy trình để không rò rỉ. - Chạy lại toàn bộ với seed khác. So cấu hình được chọn.
✅ Tiêu chí hoàn thành
- Hình đường cong học 4 lr.
- Grid và random tự cài, bảng so sánh có số thật.
- Bảng random vs optuna.
- Test chỉ chạm 1 lần, có ghi quy trình.
❓ Câu hỏi ôn tập
- Learning rate lớn quá và nhỏ quá gây gì?
- Random search thắng grid search khi nào?
- Overfit lộ qua dấu hiệu nào?
- Vì sao test chỉ đo 1 lần cuối?
🌕 Bạn đã hoàn thành ngày 138. Làm hết bài tập phía trên rồi sang ngày tiếp theo.