Supervised Learning - Học có giám sát
Supervised Learning - Học có giám sát
Trong Supervised Learning (Học có giám sát), tập dữ liệu huấn luyện là một danh sách các cặp câu hỏi và đáp án đúng:
Nhiệm vụ của máy là tìm ra một quy tắc dự đoán (gọi là hàm giả thuyết - hypothesis) sao cho với bất kỳ dữ liệu mới nào trong tương lai, giá trị dự đoán càng gần với đáp án thật càng tốt.
⚠️ Quy tắc vàng: Mục tiêu của học có giám sát không phải là học thuộc lòng (memorize) toàn bộ ví dụ trong quá khứ, mà là rút ra quy luật tổng quát để dự đoán chính xác cho dữ liệu chưa từng thấy.
1. Hai bài toán kinh điển: Classification vs Regression
Tùy thuộc vào bản chất của đáp án , học có giám sát được chia làm hai nhánh chính:
1.1 Phân loại (Classification) - Chọn nhãn hộp
- Đặc điểm: là một tập hữu hạn các nhãn phân loại rời rạc.
- Ví dụ:
- Nhị phân (Binary): Tin nhắn rác (
0) hay Hợp lệ (1), Khối u Lành tính (0) hay Ác tính (1). - Đa lớp (Multiclass): Nhận diện chữ số viết tay từ
0đến9, nhận diện loài hoa.
- Nhị phân (Binary): Tin nhắn rác (
1.2 Hồi quy (Regression) - Đo lường đại lượng
- Đặc điểm: là một giá trị số thực liên tục trên trục số.
- Ví dụ:
- Dự đoán thời gian tài xế giao đồ ăn đến nơi (ví dụ: phút).
- Dự đoán giá thuê phòng trọ dựa vào diện tích và khoảng cách tới trường đại học.
💡 Góc nhìn thực tế: Ranh giới giữa hai bài toán có thể chuyển đổi linh hoạt. Ví dụ: Dự đoán chính xác điểm thi môn AI (từ đến ) là bài toán Regression. Nhưng nếu trường chỉ quan tâm sinh viên Đậu () hay Rớt (), bài toán ngay lập tức trở thành Classification.
2. Thuật toán k-Nearest Neighbors (k-NN) - “Gần mực thì đen, gần đèn thì rạng”
k-NN là thuật toán đơn giản và trực quan nhất trong toàn bộ thế giới Machine Learning.
2.1 Ý tưởng cốt lõi
Muốn biết một người có tính cách thế nào, hãy nhìn người bạn thân nhất xung quanh họ. Muốn phân loại một mẫu dữ liệu mới , hãy tìm điểm dữ liệu trong quá khứ nằm gần nó nhất và lấy nhãn xuất hiện nhiều nhất (bỏ phiếu đa số - majority voting).
2.2 Đo khoảng cách thế nào?
Để biết ai “gần” ai, ta dùng các công thức khoảng cách hình học. Phổ biến nhất là Khoảng cách Euclidean (khoảng cách đường chim bay).
Trong không gian 2 chiều với hai điểm và :
Tổng quát trong không gian chiều:
2.3 Ví dụ tính tay từng bước
Giả sử ta cần dự đoán một sinh viên mới có đặc trưng , tức vắng 3 buổi và muộn 2 buổi, có nguy cơ Trượt môn (1) hay Đậu môn (0):
| Sinh viên trong quá khứ | Vắng () | Muộn () | Nhãn thật () | Khoảng cách tới |
|---|---|---|---|---|
| A | 1 | 1 | Đậu (0) | |
| B | 4 | 2 | Trượt (1) | |
| C | 2 | 3 | Đậu (0) | |
| D | 5 | 4 | Trượt (1) |
- Nếu chọn : Điểm gần nhất là B (, nhãn
Trượt). Dự đoán: Trượt. - Nếu chọn : Ba điểm gần nhất là B (), C (), A ().
- Nhãn gồm: 1 phiếu
Trượt(B) và 2 phiếuĐậu(C, A). - Bỏ phiếu đa số: 2 phiếu
Đậuthắng 1 phiếuTrượt. Dự đoán: Đậu.
- Nhãn gồm: 1 phiếu
2.4 Chọn thế nào?
- : Rất nhạy cảm với nhiễu (noise) hoặc điểm gán nhãn sai. Ranh giới quyết định rất ngoằn ngoèo Dễ bị Overfitting.
- quá lớn (ví dụ ): Luôn luôn dự đoán lớp chiếm số đông trong toàn bộ dữ liệu, bất kể điểm mới nằm ở đâu Dễ bị Underfitting.
- Kinh nghiệm thực hành:
- Với bài toán nhị phân 2 lớp, nên chọn là số lẻ () để không bao giờ xảy ra tình trạng hòa phiếu.
- Chọn tối ưu bằng phương pháp Cross-Validation (sẽ học ở bài sau).
2.5 Bẫy chết người: Tại sao BẮT BUỘC phải Scale dữ liệu khi dùng k-NN?
Hãy nhìn vào ví dụ thực tế này:
- Đặc trưng 1:
Thu nhập(từ đến VNĐ). - Đặc trưng 2:
Số con(từ đến con).
Khoảng cách giữa hai người:
Số con lệch nhau hoàn toàn bị con số triệu của thu nhập “nuốt chửng”. k-NN sẽ coi như đặc trưng số con không hề tồn tại! Bắt buộc phải chuẩn hóa (Feature Scaling) đưa mọi đặc trưng về cùng một thang đo (ví dụ dùng Z-score: hoặc Min-Max scaling về đoạn ).
2.6 Góc nhìn chuyên sâu: Bản chất “Lazy Learning” và Tai ương số chiều (Curse of Dimensionality)
- Lazy Learning (Học lười): k-NN không hề trải qua giai đoạn huấn luyện (training phase tốn thời gian, chỉ việc lưu dữ liệu vào bộ nhớ). Nhưng khi dự đoán, nó phải quét qua toàn bộ điểm trong dataset để tính khoảng cách (inference tốn thời gian). Nếu hệ thống có hàng triệu người dùng, k-NN sẽ chạy cực kỳ chậm!
- Tai ương số chiều: Khi số đặc trưng tăng lên hàng trăm/nghìn chiều, thể tích không gian tăng theo cấp số nhân khiến dữ liệu trở nên cực kỳ thưa thớt (sparse). Mọi cặp điểm đều cách xa nhau một khoảng tương đương nhau, khiến khái niệm “hàng xóm gần nhất” mất đi ý nghĩa. Do đó, k-NN không phù hợp với ảnh thô hoặc văn bản trừ khi đã qua bước giảm số chiều.
3. Linear Classifier - Chia đôi thế giới bằng một đường thẳng
Thay vì phải ôm khư khư toàn bộ tập dữ liệu như k-NN, liệu ta có thể học ra một ranh giới quyết định (Decision Boundary) cố định?
Trong mặt phẳng 2D, một đường thẳng có phương trình:
Trong không gian chiều, đường thẳng trở thành một siêu phẳng (hyperplane):
Trong đó:
- là vector trọng số (weights).
- (hoặc ) là hệ số tự do (bias).
Quy tắc phân loại:
4. Thuật toán Perceptron (Rosenblatt, 1958)
Perceptron là mô hình học máy tự động tìm các trọng số bằng cách học từ sai lầm.
4.1 Luật cập nhật Perceptron (Perceptron Learning Rule)
Khởi tạo trọng số và bias . Với mỗi mẫu huấn luyện , mô hình đưa ra dự đoán . Sau đó cập nhật:
Trong đó:
- là tốc độ học (learning rate), ví dụ .
- là nhãn thật ( hoặc ), là nhãn dự đoán ( hoặc ).
4.2 Cơ chế sửa sai trực giác
Hãy xem hiệu số sai lệch hoạt động vi diệu thế nào:
- Nếu dự đoán đúng (): Trọng số giữ nguyên không đổi.
- Nếu đoán thiếu ( nhưng đoán ): Trọng số được cộng thêm một lượng . Điều này làm cho tổng ở lần sau sẽ tăng lên, kéo dự đoán tiến gần về .
- Nếu đoán thừa ( nhưng đoán ): Trọng số bị trừ đi một lượng . Điều này làm cho tổng ở lần sau sẽ giảm xuống, kéo dự đoán tiến về .
4.3 Bảng tính tay vết chạy Perceptron (Step-by-step Trace)
Cho bài toán học cổng logic OR với 2 đặc trưng , học với , ban đầu :
| Lần lặp | Mẫu | Nhãn thật | Tính | Đoán | Sai số | Cập nhật |
|---|---|---|---|---|---|---|
| 1 | 0 | 1 (Sai) | , | |||
| 2 | 1 | 0 (Sai) | , | |||
| 3 | 1 | 1 (Đúng) | Giữ nguyên: | |||
| 4 | 1 | 1 (Đúng) | Giữ nguyên: |
Chỉ sau vài vòng lặp, Perceptron sẽ tìm được đường thẳng ngăn cách chính xác!
4.4 Giới hạn lịch sử của Perceptron: Vấn đề XOR (Minsky & Papert, 1969)
Năm 1969, hai nhà khoa học Marvin Minsky và Seymour Papert xuất bản cuốn sách chứng minh một sự thật chấn động: Perceptron đơn tầng không thể học được hàm XOR.
Cổng AND (Tách được) Cổng OR (Tách được) Cổng XOR (BÓ TAY!)
x₂ x₂ x₂
1 | O X 1 | X X 1 | X O
| | |
0 | O O 0 | O X 0 | O X
+------------- x₁ +------------- x₁ +------------- x₁
0 1 0 1 0 1
(Vẽ được 1 đường thẳng) (Vẽ được 1 đường thẳng) (Không thể vẽ 1 đường thẳng)
- Nhãn của XOR nằm chéo nhau: , , nhưng , .
- Dữ liệu này phi tuyến tính (Non-linearly Separable). Một nhát cắt thẳng không bao giờ chia tách được hình chữ X.
- Phát hiện này đã nhấn chìm ngành nghiên cứu AI vào “Mùa đông AI” suốt hơn một thập kỷ, cho đến khi con người chứng minh được: Nếu xếp nhiều Perceptron thành nhiều tầng (Multi-Layer Perceptron) và dùng hàm kích hoạt phi tuyến, mạng neural có thể học được bất kỳ hình dạng nào! (Đây là nội dung của chương Neural Networks tiếp theo).
5. Từ Hard Threshold sang Xác suất: Hàm Sigmoid
Perceptron dùng hàm bước nhảy cứng (step function): hoặc là , hoặc là . Nhưng trong thực tế, ta thường muốn biết mức độ chắc chắn: “Mô hình đoán bệnh nhân này bị ung thư với xác suất 92% hay chỉ 51%?”
Hàm Sigmoid (Logistic Function) biến mọi số thực thành một xác suất nằm trọn vẹn trong khoảng :
1.0 +---------------------------------*****
| ******
| ***
0.5 |---------------------*----------------
| ***
| ******
0.0 *****----------------------------------
-6 -4 -2 0 2 4 6 (z)
- Nếu (Lưỡng lự 50-50).
- Nếu (Rất tự tin nhãn 1).
- Nếu (Rất tự tin nhãn 0).
Đây chính là nền tảng của thuật toán Logistic Regression và là hàm kích hoạt kinh điển trong các mạng nơ-ron sơ khai.
6. Support Vector Machine (SVM) - Ranh giới an toàn tối đa
Nếu dữ liệu có thể phân tách tuyến tính, có vô số đường thẳng có thể chia tách hoàn hảo hai lớp. Vậy đường nào là tốt nhất?
6.1 Ý tưởng cốt lõi: Tối đa hóa Margin (Maximum Margin)
- Margin (Lề): Khoảng cách ngắn nhất từ đường phân chia tới các điểm dữ liệu gần nó nhất của cả hai phía.
- SVM tìm siêu phẳng sao cho Margin là lớn nhất có thể.
- Tại sao cần Margin lớn nhất? Vì một đường phân chia có khoảng đệm an toàn rộng sẽ ít bị tổn thương nhất khi dữ liệu mới trong thực tế bị xê dịch nhẹ.
6.2 Support Vectors là gì?
Những điểm dữ liệu nằm sát mép đường lề (chạm vào ranh giới margin) được gọi là Support Vectors (Các vector hỗ trợ).
- Điểm kỳ diệu của SVM: Vị trí của đường phân chia hoàn toàn chỉ phụ thuộc vào các Support Vectors này.
- Tất cả những điểm dữ liệu nằm sâu bên trong vùng an toàn dù có bị xóa đi hay dịch chuyển nhẹ thì đường biên của SVM vẫn giữ nguyên không đổi!
6.3 Soft Margin và Tham số
Trong dữ liệu thực tế, các lớp thường lẫn vào nhau do nhiễu, không thể vẽ đường nào tách rời 100% (Hard Margin). SVM giải quyết bằng Soft Margin, cho phép một số điểm được phép lọt vào trong margin hoặc bị phân loại sai, nhưng đi kèm một khoản tiền phạt được kiểm soát bởi tham số :
- lớn: Phạt rất nặng mỗi lỗi sai Cố gắng phân loại đúng từng điểm huấn luyện Margin hẹp Dễ bị Overfitting.
- nhỏ: Chấp nhận lỗi sai dễ dãi hơn Ưu tiên mở rộng margin rộng rãi Dễ bị Underfitting.
6.4 Trực giác về Kernel Trick: “Uốn cong không gian để bẻ khóa phi tuyến”
Làm sao SVM phân loại được dữ liệu không phân tách tuyến tính (như bài toán XOR hoặc các vòng tròn đồng tâm)?
- Ý tưởng: Nếu không thể kẻ đường thẳng ở không gian 2D, hãy chiếu dữ liệu lên không gian 3D cao hơn.
- Ví dụ kinh điển: Các điểm nằm trong vòng tròn bán kính . Trong 2D với , ta không thể dùng đường thẳng tách được hình tròn. Nhưng nếu tạo thêm chiều thứ ba , tất cả các điểm bên trong hình tròn sẽ chìm xuống dưới, còn các điểm bên ngoài sẽ nổi lên cao. Lúc này, chỉ cần lấy một mặt phẳng ngang cắt ngang qua là tách đôi được dữ liệu!
- Kernel Trick: SVM có thể tính toán trong không gian vô hạn chiều mà không cần thực sự biến đổi tọa độ của từng điểm, nhờ các hàm nhân (Kernel) như RBF (Radial Basis Function), Polynomial Kernel.
7. Triển khai chuẩn công nghiệp với scikit-learn
Trong thực tế, ta luôn bọc các bước tiền xử lý (Scaling) và mô hình (Model) vào trong một Pipeline duy nhất để code gọn gàng và ngăn chặn rò rỉ dữ liệu:
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
# 1. Pipeline cho k-NN
knn_pipeline = make_pipeline(
StandardScaler(),
KNeighborsClassifier(n_neighbors=5, metric="euclidean")
)
# 2. Pipeline cho SVM với RBF Kernel
svm_pipeline = make_pipeline(
StandardScaler(),
SVC(kernel="rbf", C=1.0, gamma="scale")
)
# 3. Pipeline cho Logistic Regression
lr_pipeline = make_pipeline(
StandardScaler(),
LogisticRegression(C=1.0, max_iter=1000)
)
# Huấn luyện và dự đoán cực kỳ nhất quán:
# knn_pipeline.fit(X_train, y_train)
# y_pred = knn_pipeline.predict(X_test)
8. Bảng so sánh tổng kết các thuật toán
| Thuật toán | Bản chất toán học | Tốc độ Train / Predict | Độ nhạy với Scaling | Khả năng xử lý Phi tuyến | Ưu điểm & Ứng dụng |
|---|---|---|---|---|---|
| k-NN | Instance-based (Khoảng cách Euclidean) | Train: Predict: Chậm | Cực kỳ nhạy (Bắt buộc scale) | Tốt (Tùy thuộc hình dạng cụm) | Rất trực quan, tốt cho bài toán gợi ý hoặc tập dữ liệu nhỏ. |
| Perceptron | Linear threshold () | Train: Rất nhanh Predict: | Nhẹ | Kém (Chỉ học được tuyến tính) | Đơn giản, là nền móng lịch sử để xây dựng Mạng nơ-ron. |
| Logistic Regression | Linear + Sigmoid xác suất | Train: Rất nhanh Predict: | Trung bình | Kém (Trừ khi tự tạo feature đa thức) | Chuẩn mực vàng khi cần biết xác suất và cần giải thích trọng số feature. |
| SVM | Tối đa hóa Margin () | Train: Trung bình Predict: Nhanh | Cực kỳ nhạy (Bắt buộc scale) | Rất mạnh nhờ Kernel Trick | Baseline cực mạnh cho dữ liệu có số chiều cao (như text, gene, sinh học). |
9. Câu hỏi tự kiểm tra & Thảo luận
1. Tại sao nói k-NN là một thuật toán “học lười” (Lazy Learner)? Điều này gây bất lợi gì khi đưa mô hình vào sản phẩm thực tế?
k-NN không hề tính toán hay tối ưu hóa bất kỳ tham số nào trong lúc huấn luyện (nó chỉ lưu toàn bộ dữ liệu vào RAM). Bất lợi khi đưa vào sản phẩm: thời gian suy luận (inference) rất lâu vì mỗi lần có người dùng mới gửi request, hệ thống lại phải lôi toàn bộ hàng triệu dòng dữ liệu cũ ra tính khoảng cách từ đầu.
2. Một bạn sinh viên chạy k-NN phân loại khách hàng và quên không chuẩn hóa (scaling) đặc trưng. Kết quả mô hình dự đoán chỉ phụ thuộc vào Tổng tiền mua sắm mà bỏ qua Độ tuổi. Giải thích tại sao?
Vì Tổng tiền mua sắm có thang đo hàng triệu VNĐ, trong khi Độ tuổi chỉ từ 18 đến 60. Khi tính khoảng cách Euclidean bình phương , con số hàng triệu triệu sẽ áp đảo hoàn toàn con số vài chục đơn vị, khiến độ tuổi không đóng góp gì vào khoảng cách.
3. Tại sao Perceptron không thể giải được bài toán XOR? Làm thế nào các hệ thống AI hiện đại vượt qua được hạn chế này?
Vì bài toán XOR không thể phân tách tuyến tính (các điểm nhãn 1 nằm chéo góc nhau, không một đường thẳng nào có thể chia cắt). Để vượt qua, AI hiện đại kết hợp nhiều tầng Perceptron lại với nhau (Multi-Layer Perceptron / Deep Neural Networks) kết hợp với các hàm kích hoạt phi tuyến như ReLU, Sigmoid.
4. Trong SVM, điều gì xảy ra nếu ta tăng giá trị tham số lên rất lớn?
Khi rất lớn, mô hình phạt rất nặng những điểm bị phân loại sai hoặc lọt vào margin. Kết quả là mô hình sẽ cố ép lề (margin) hẹp lại để bao bọc chính xác từng điểm huấn luyện, dẫn đến nguy cơ cao bị Overfitting (học vẹt theo cả dữ liệu nhiễu).
10. Tài liệu tham khảo
- CS50 AI Lecture 4 - Learning: Nearest-Neighbor, Perceptron, Support Vector Machines.
- Rosenblatt, F. (1958), The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain.
- Minsky, M., & Papert, S. (1969), Perceptrons: An Introduction to Computational Geometry, MIT Press.
- Cortes, C. & Vapnik, V. (1995), Support-Vector Networks, Machine Learning, 20, 273–297.
- Scikit-learn Documentation: Nearest Neighbors, Support Vector Machines, Preprocessing Data.