Chương 1·Bài 1.2

Generalization

Một model có thể đúng hoàn toàn trên dữ liệu đã học mà vẫn sai trên dữ liệu mới, ví dụ khi nó chỉ lưu lại các buổi cũ rồi tra bảng. Điều ta cần là đoán tốt trên mẫu chưa thấy; khả năng đó gọi là tổng quát hóa (generalization). Bài này dùng một model đơn giản để thấy underfitting (model quá đơn giản), overfitting (model học thuộc dữ liệu train) và cách đọc learning curve để quyết định nên làm gì tiếp.

Nhớ một ví dụ khác với học một quy luật

Ta tạm thu bài toán xuống một feature xx trong khoảng 0–1: vị trí của một buổi trong lịch hoạt động. Mức tham gia đã chuẩn hóa là

y=sin⁡(2πx)+ε.y=\sin(2\pi x)+\varepsilon.

sin⁡\sin tạo một xu hướng lên rồi xuống để nhìn được bằng hình. ε\varepsilon là nhiễu, ở đây sinh ngẫu nhiên với trung bình 0 và độ lệch chuẩn 0.25. Các giá trị âm có nghĩa là thấp hơn mức tham gia chuẩn, không phải số người âm. Dạng sóng này do ta tự đặt ra để thí nghiệm, nhờ đó biết chính xác đâu là quy luật, đâu là nhiễu. Học được là nhờ có quy luật: nếu nhãn hoàn toàn ngẫu nhiên như kết quả xổ số thì không mô hình nào đoán được, dù dữ liệu nhiều đến đâu.

k = 1 bám nhiễu, k = 80 san phẳng, k = 10 vừa đủ.k = 1valid MSE 0.101k = 10valid MSE 0.082k = 80valid MSE 0.565
k = 1 bám nhiễu, k = 80 san phẳng, k = 10 vừa đủ.
kNN hồi quy trên 80 điểm train của bài khi giảm k từ 80 về 1: đường cam đi từ quá phẳng tới bám từng điểm nhiễu; nét đứt là quy luật thật.

Mô hình trong hình là k-Nearest Neighbors regression, viết ngắn là kNN. Để đoán tại xx, nó tìm kk điểm train gần nhất rồi lấy trung bình nhãn của chúng. Bài 2.4 sẽ học thuật toán kỹ hơn; hôm nay chỉ dùng đặc tính: kk nhỏ cho đường linh hoạt hơn, kk lớn cho đường trơn hơn.

Với k=1k=1, tại một điểm train, hàng xóm gần nhất chính là nó, nên mô hình trả đúng nhãn đã quan sát. Điều ấy bao gồm cả phần nhiễu của riêng điểm đó. Với kk bằng toàn bộ số mẫu train, mọi vị trí nhận cùng một giá trị trung bình, dù xu hướng thật lên xuống rõ rệt.

Hỏi nhanh

Mô hình đoán đúng mọi nhãn trên tập train. Điều đó chứng minh được gì?

Viết rõ đang đo lỗi ở đâu

Giả sử có nn mẫu train. Sai số train với MSE là

R^train(f)=1n∑i=1n(f(xi)−yi)2.\widehat R_{\rm train}(f)=\frac1n\sum_{i=1}^{n}(f(x_i)-y_i)^2.

Ví dụ ba mẫu có nhãn thật (1,3,5)(1, 3, 5) và dự đoán (2,3,4)(2, 3, 4) cho MSE =(1+0+1)/3=2/3= (1 + 0 + 1)/3 = 2/3.

Nhưng điều ta thật sự cần là lỗi trên các mẫu mới, tức trung bình lỗi nếu đem model dùng cho rất nhiều buổi sau này:

R(f)=E[(f(x)−y)2].R(f)=\mathbb E\big[(f(x)-y)^2\big].

E\mathbb E là kỳ vọng (bài 0.7), lấy trên mọi mẫu có thể gặp lúc dùng thật. Ta không có các mẫu đó, nên dùng tập validation để ước lượng R(f)R(f). Muốn ước lượng đúng, validation phải giống dữ liệu lúc dùng thật; chia sai thì điểm có thể đẹp mà không nói lên điều ta cần. Khả năng đoán tốt trên mẫu chưa gặp lúc học gọi là tổng quát hóa, hay khái quát hóa (generalization); đó là thứ ta cần, không phải điểm trên train.

Trong thí nghiệm này, train và validation được sinh riêng từ cùng một công thức, nên validation giống hệt dữ liệu mới. Code tạo 80 mẫu train và 160 mẫu validation, rồi so ba giá trị kk.

Python
import numpy as np
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error

rng = np.random.default_rng(12)

def make_data(n):
    X = rng.uniform(0, 1, size=(n, 1))
    y = np.sin(2 * np.pi * X[:, 0]) + rng.normal(0, 0.25, size=n)
    return X, y

X_train, y_train = make_data(80)
X_valid, y_valid = make_data(160)
print(X_train.shape, y_train.shape)
for k in [80, 10, 1]:
    model = KNeighborsRegressor(n_neighbors=k).fit(X_train, y_train)
    train_mse = mean_squared_error(y_train, model.predict(X_train))
    valid_mse = mean_squared_error(y_valid, model.predict(X_valid))
    print(f"k={k:2d}: train={train_mse:.4f}, valid={valid_mse:.4f}")

Đọc cả hai cột. Khi k=80k=80, train và validation cùng có lỗi lớn: mô hình quá đơn giản để giữ xu hướng. Khi k=1k=1, train có lỗi bằng 0, nhưng validation không vì thế thấp nhất. k=10k=10 lấy trung bình cục bộ, giảm tác động của nhiễu mà còn giữ được dạng sóng.

Không chọn mô hình từ cột train. Cũng không biến ví dụ thành quy tắc “luôn dùng k=10k=10”: số mẫu, mật độ điểm, độ nhiễu và số chiều thay đổi thì kk phù hợp cũng đổi.

Hỏi nhanh

Phương án A có MSE 0.01 trên train và 0.30 trên validation. Phương án B có MSE 0.08 trên train và 0.12 trên validation. Chọn theo validation thì ta chọn phương án nào?

Underfit và overfit là chẩn đoán có điều kiện

Underfitting (học chưa đủ): model quá đơn giản, không bắt được quy luật. Ví dụ k=80k = 80 san phẳng cả đường cong. Dấu hiệu: lỗi train và lỗi validation cùng cao và gần nhau. Thêm dữ liệu cùng loại không giúp, vì model còn chưa khớp nổi train; cần model linh hoạt hơn hoặc thêm đặc trưng tốt hơn.

Overfitting (học quá sát): model học thuộc cả nhiễu của train. Ví dụ k=1k = 1: đổi một nhãn nhiễu là cả một đoạn dự đoán đổi theo. Dấu hiệu: lỗi train thấp mà lỗi validation cao hơn hẳn. Cách chữa: giảm độ linh hoạt (ở đây là tăng kk), dùng regularization (chương 2), hoặc thêm dữ liệu.

Overfitting dễ xảy ra khi model có rất nhiều tham số mà dữ liệu ít, hay số đặc trưng nhiều hơn số mẫu, như 100 chỉ số xét nghiệm cho 50 bệnh nhân. Một mạng neural đủ lớn còn học thuộc được cả nhãn bị xáo ngẫu nhiên, đúng 100% trên train; vì vậy điểm train cao không chứng minh model đã học được quy luật.

Tuy vậy, hai dấu hiệu trên chỉ là gợi ý. Train tốt mà validation kém cũng có thể do dữ liệu đổi theo thời gian, một cột bị sai đơn vị, hay hai tập được xử lý khác nhau. Train và validation cùng kém cũng có thể do nhãn bị lệch hàng hay metric viết sai. Trước khi sửa model, nên kiểm lại dữ liệu và tính tay một ví dụ nhỏ.

Hỏi nhanh

Một mô hình phân loại review phim là khen hay chê, có 2.4 triệu tham số, học trên 5000 review. Nó đoán đúng 98.5% trên train, 72.3% trên validation và 71.8% trên test. Số liệu này chỉ ra vấn đề gì?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 272

Năm bộ train: k = 1 đổi theo từng bộ, k = 80 lần nào cũng sai như nhau.k = 1variance cao: mỗi bộ train một đườngk = 80bias cao: sai giống nhau mọi lần
Năm bộ train: k = 1 đổi theo từng bộ, k = 80 lần nào cũng sai như nhau.

Learning curve: thêm dữ liệu có đáng làm không?

Câu hỏi thực tế: có nên thu thêm dữ liệu không? Learning curve trả lời câu đó: giữ k=10k = 10, tăng dần số mẫu train, và đo lỗi train cùng lỗi validation ở mỗi mức. Trục ngang là số mẫu train. (Đừng nhầm với đường loss theo số bước huấn luyện, sẽ gặp ở chương 3.)

Thêm mẫu, hai đường lỗi gần nhau và sát mức nhiễu.0.000.050.100.150.200.252060140300số mẫu trainnhiễutrainvalidation
Thêm mẫu, hai đường lỗi gần nhau và sát mức nhiễu.

Hàm learning_curve của scikit-learn làm việc này. Ở mỗi kích thước, nó chia dữ liệu thành 4 phần (gọi là 4 fold), lần lượt giữ một phần để chấm và học trên phần còn lại, rồi lấy trung bình; bài 1.3 sẽ học kỹ cách chia này.

Python
from sklearn.model_selection import KFold, learning_curve

X_curve, y_curve = make_data(400)
cv = KFold(n_splits=4, shuffle=True, random_state=12)
sizes, train_scores, valid_scores = learning_curve(
    KNeighborsRegressor(n_neighbors=10),
    X_curve, y_curve, cv=cv,
    train_sizes=[20, 60, 140, 300],
    scoring="neg_mean_squared_error",
    shuffle=True, random_state=12, n_jobs=1,
)
for size, train_score, valid_score in zip(
    sizes, train_scores.mean(axis=1), valid_scores.mean(axis=1)
):
    print(f"n={size:3d}: train MSE={-train_score:.4f}, valid MSE={-valid_score:.4f}")

Các score có dấu âm vì công cụ chọn mô hình của scikit-learn quy ước “lớn hơn là tốt hơn”, nên MSE được đổi dấu thành neg-MSE; ta đổi dấu lại để đọc. Mỗi hàng là trung bình của bốn fold.

Với 20 mẫu, mười hàng xóm phủ một vùng rộng nên đường dự đoán bị san phẳng, cả hai lỗi đều cao. Thêm mẫu thì vùng ấy hẹp lại, đường giữ được dạng sóng, và lỗi validation giảm. Từ 140 lên 300 mẫu, lỗi validation gần như không giảm nữa.

Cách đọc một learning curve:

  • Hai đường sát nhau và cùng đi ngang ở mức lỗi cao: underfitting. Thêm dữ liệu không giúp; cần model mạnh hơn hoặc đặc trưng tốt hơn.
  • Hai đường cách xa, đường validation còn đang giảm: thêm dữ liệu còn có ích.
  • Hai đường cách xa, đường validation đã đi ngang: overfitting; nên giảm độ phức tạp hoặc thêm regularization.

Đổi tỉ lệ chia, chẳng hạn từ 70% train và 30% test sang 90% và 10%, cũng theo cách đọc này: train nhiều hơn thường giúp nhưng không chắc, còn tập chấm nhỏ đi thì con số đo được dao động nhiều hơn.

Còn một mốc để so: kể cả khi biết chính xác sin⁡(2πx)\sin(2\pi x), lỗi vẫn còn bằng phương sai của nhiễu, 0.252=0.06250.25^2 = 0.0625, vì không model nào đoán được nhiễu. Validation MSE 0.0748 ở 300 mẫu đã khá gần mốc ấy, nên không còn cải thiện được bao nhiêu. Với dữ liệu thật ta không biết mức nhiễu; người ta thường lấy kết quả tốt nhất mà con người làm được, như một nhóm bác sĩ hội chẩn, làm ước lượng cho mức lỗi thấp nhất có thể, gọi là sai số Bayes.

Hỏi nhanh

Tăng train từ 200 lên 800 rồi 2000 mẫu. MSE trên train lần lượt là 0.42, 0.43, 0.43. MSE trên validation là 0.46, 0.45, 0.45. Cách chia và metric đều đã kiểm. Ta nên thử gì trước?

Phỏng theoCMU 10-601 · Practice Problems, Exam 1 · Q3.1

Trở lại câu chuyện câu lạc bộ

Model học trên các buổi trong năm học rồi đem dùng vào dịp hè có thể đoán kém, vì số đăng ký, lịch học và thói quen tham gia đều đổi. Hiện tượng dữ liệu lúc dùng khác dữ liệu lúc học gọi là distribution shift (thay đổi phân phối). Model chỉ đáng tin trong vùng dữ liệu đã học. Vài ví dụ:

  • Học giá nhà 40–120 m² rồi đoán căn 600 m²: đoán ra ngoài vùng đã học (ngoại suy).
  • Nhận diện khuôn mặt học trên người lớn, dùng cho trẻ em.
  • Học trên ảnh chụp ban ngày, dùng cho ảnh ban đêm.
  • Học trên dữ liệu năm 2023, dùng cho năm 2025.

Cách sửa gốc là đưa đúng loại dữ liệu sẽ gặp lúc dùng vào train, và chấm trên dữ liệu gần thời điểm dùng nhất. Vì vậy “model tổng quát hóa tốt” luôn phải nói rõ: tốt cho trường hợp nào. Đoán các buổi sau của cùng câu lạc bộ khác với đoán cho câu lạc bộ ở một trường mới; bài 1.3 sẽ chia dữ liệu theo thời gian và theo nhóm để đo từng trường hợp.

Hỏi nhanh

Ta cần dự báo cho tháng sau. Chia dữ liệu ngẫu nhiên thì MAE là 2. Giữ riêng tháng cuối làm validation thì MAE là 5. Nên tin con số nào?

Khi đi thi

  • Ghi cả lỗi train lẫn lỗi validation cho mỗi lần thử; một cột không đủ để chẩn đoán.
  • Train tốt, validation kém: giảm độ linh hoạt hoặc thêm regularization. Cả hai cùng kém: thêm feature hoặc dùng model mạnh hơn.
  • Chia validation giống lúc dùng thật: đoán tương lai thì giữ riêng đoạn thời gian cuối.

Tóm tắt

  • Generalization là đoán tốt trên mẫu mới, trong đúng trường hợp sẽ dùng model.
  • Lỗi train thấp chưa đủ; phải xem lỗi validation, và validation phải chia giống lúc dùng thật.
  • Cả hai lỗi cùng cao: underfitting. Train thấp, validation cao hẳn: overfitting. Nhưng kiểm dữ liệu trước khi sửa model.
  • Learning curve vẽ lỗi theo số mẫu train, cho biết thu thêm dữ liệu có đáng không.

Kiểm tra cuối bài

Câu 1

Một mô hình khớp train rất tốt. Bằng chứng nào cho thấy nó cũng sẽ đoán tốt khi đem dùng thật?

Câu 2

kNN regression dùng trọng số đều, có 80 mẫu train, và ta chọn k=80k = 80. Hai điểm cần đoán khác nhau sẽ nhận dự đoán thế nào?

Câu 3

Bài phân loại văn bản 10 lớp, có 5000 mẫu. Ba mô hình cho tỉ lệ đúng trên train và validation như sau. A là một mô hình rất đơn giản: 68% và 67%. B là một mô hình rất lớn, 2 triệu tham số: 99% và 71%. C là mô hình vừa phải, có regularization: 85% và 83%. Chẩn đoán nào đúng?

Đề thiNOAI 2026 Singapore · Vòng sơ loại · Câu 277

Câu 4

kNN regression với k=1k = 1, chấm trên chính tập train. Khi nào thì lỗi train chắc chắn bằng 0?

Câu 5

Một hàm của scikit-learn báo điểm neg_mean_squared_error bằng −0.12-0.12. MSE bằng bao nhiêu?

Câu 6

Trên cùng một cách chia, kNN cho MSE trên train và validation như sau. k=1k = 1: 0 và 0.48. k=5k = 5: 0.07 và 0.21. k=25k = 25: 0.25 và 0.29. Chỉ chọn trong ba giá trị này thì chọn kk nào?

Phỏng theoCMU 10-601 · Practice Problems, Exam 1 · Q3.2

Câu 7

Khi tăng độ phức tạp của mô hình, chẳng hạn tăng bậc đa thức trong hồi quy, bias và variance thường thay đổi thế nào?

Đề thiUSA-NA-AIO 2026 · Vòng 1 · Part 1.3

Câu 8

Giữ nguyên validation, tăng train từ 100 lên 400 rồi 1600 mẫu. MSE trên train là 0.03, 0.07, 0.10. MSE trên validation là 0.50, 0.30, 0.18. Nếu còn kinh phí, ta nên làm gì?

Phỏng theoCMU 10-601 · Practice Problems, Exam 1 · Q3.1

Câu 9

Một đội chia ngẫu nhiên train và validation 50 lần, rồi chỉ báo MSE nhỏ nhất trong 50 lần ấy. Làm vậy sai ở đâu?

Câu 10

Mô hình đạt điểm tốt khi chia ngẫu nhiên từng hàng. Có chắc nó cũng đoán tốt cho một trường chưa có trong dữ liệu không?

Đọc thêm