Huấn luyện mạng: loss, backprop và hàm kích hoạt
Hàm mất mát, lan truyền ngược, gradient descent, sáu hàm kích hoạt step sigmoid ReLU leaky ReLU tanh softmax và siêu tham số Keras.
KhóThuật toán ~60 phút
Ôn lại trước khi học
Giới thiệu
Bài này học loss, lan truyền ngược và hàm kích hoạt. Dùng để huấn luyện mạng noron chạy được thật.
Kiến thức cần nhớ
Loss và gradient descent
- Định nghĩa: loss đo khoảng cách giữa đoán và nhãn đúng.
- Mục tiêu học là tìm trọng số làm loss nhỏ nhất.
- Ví dụ đời thường: như đo độ lệch bia bắn khỏi hồng tâm.
- Gradient descent: bước ngược hướng dốc để xuống đáy.
- Tốc độ học lớn thì vọt qua đáy, bé thì bò chậm.
Lan truyền ngược
- Định nghĩa: chia lỗi đầu ra ngược về từng noron.
- Noron góp lỗi nhiều thì chỉnh nhiều hơn.
- Ví dụ đời thường: như truy trách nhiệm từ cuối dây chuyền.
- Gồm 2 pha: lan xuôi tính đoán, lan ngược chỉnh.
- Dùng quy tắc dây chuyền để tính đạo hàm từng lớp.
| Hàm kích hoạt | Dạng | Khi nào dùng |
|---|---|---|
| Sigmoid | Cong 0 tới 1 | Đầu ra nhị phân |
| ReLU | Giữ dương, cắt âm | Tầng ẩn mặc định |
| Softmax | Thành xác suất | Phân loại nhiều lớp |
| Tanh | Từ -1 tới 1 | Dữ liệu quanh 0 |
Siêu tham số
- Định nghĩa: số do người chọn, mạng không tự học.
- Gồm tốc độ học, số epoch, cỡ batch.
- Ví dụ đời thường: như núm vặn bếp do đầu bếp chỉnh.
- Sai siêu tham số thì mạng giỏi cũng học hỏng.
- Nên thử vài giá trị rồi đo trên tập kiểm tra.
Thêm hàm kích hoạt
| Hàm | Dạng | Ghi chú |
|---|---|---|
| Bậc thang (step) | 0 hoặc 1 | Dùng trong perceptron gốc, không có đạo hàm để lan ngược |
| Leaky ReLU | Giữ dương, âm nhân hệ số nhỏ như 0.01 | Tránh nơ-ron "chết" khi luôn nhận đầu vào âm |
Ví dụ
- Input: loss dao động vọt lên xuống -> Output: giảm tốc độ học.
- Giải thích: bước quá lớn nên nhảy qua đáy liên tục.
# Cập nhật 1 trọng số theo gradient
w = w - toc_do_hoc * dao_ham # bước ngược dốc
print(w) # trọng số mới
💻 Bài tập
Ngôn ngữ: Python 3 với NumPy. Không dùng thư viện học sâu cho Bài 1-2. Nộp vào day-094/.
Bài 1: Backprop cho MLP
class MLP:
def __init__(self, sizes: list[int], activation="relu", seed=0): ...
def forward(self, X) -> np.ndarray: ... # đầu ra softmax, lưu cache cho backward
def backward(self, y_onehot) -> list[tuple]: ... # trả (dW, db) mỗi tầng
def step(self, grads, lr): ...
def cross_entropy(probs, y_onehot) -> float: ...
Kiểm tra gradient bắt buộc: với mạng nhỏ [4, 5, 3], so dW từ backprop với sai phân trung tâm , . Sai số tương đối dưới 1e-6.
Học XOR với [2, 4, 2], 2000 bước -> accuracy 100%
gradient check -> relative error < 1e-6 cho mọi tầng
Bài 2: Huấn luyện trên chữ số viết tay
Bộ load_digits (8x8, 10 lớp) hoặc MNIST.
- Mini-batch SGD, batch 32, 30 epoch. Vẽ loss và accuracy train/validation theo epoch.
- Quét
lr = 1.0, 0.1, 0.01, 0.001. Vẽ 4 đường loss. Chỉ ra lr nào dao động, lr nào bò chậm. - So
sigmoid,tanh,reluở tầng ẩn: accuracy sau 30 epoch.
Bài 3: So với PyTorch (nâng cao)
- Dựng cùng kiến trúc bằng PyTorch. Khởi tạo cùng trọng số với mạng tự cài (copy từ NumPy sang). Chạy 1 bước. So gradient: phải khớp.
- Thêm momentum và Adam vào mạng tự cài. So tốc độ hội tụ với SGD thuần.
- Thêm dừng sớm theo validation loss (patience 5).
✅ Tiêu chí hoàn thành
- Gradient check pass.
- Accuracy test chữ số trên 95% (load_digits).
- Có hình loss theo lr và bảng so sánh hàm kích hoạt.
- Gradient khớp PyTorch sai số
1e-6.
❓ Câu hỏi ôn tập
- Loss dùng để làm gì?
- Lan truyền ngược chia lỗi thế nào?
- ReLU khác sigmoid ở đâu?
- Siêu tham số khác tham số thế nào?
🌕 Bạn đã hoàn thành ngày 94. Làm hết bài tập phía trên rồi sang ngày tiếp theo.