Gradient descent: cost, step và local minima
Heuristic số giao cắt, tối ưu hàm chi phí, bước đi, lấy mẫu ngẫu nhiên và toán hình học gradient descent.
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 đi xuống dốc để tìm lời giải đẹp. Dùng để vẽ đồ thị ít giao cắt và huấn luyện model.
Kiến thức cần nhớ
Cost và đáy địa phương
- Định nghĩa: cost là 1 số đo độ xấu, càng nhỏ càng đẹp.
- Đáy địa phương: dịch chút nào cũng xấu hơn tạm thời.
- Bước lớn thì nhảy qua đáy, bước bé thì bò mãi.
- Ví dụ đời thường: như xuống núi trong sương mù dày.
- Lấy mẫu ngẫu nhiên: thử nhiều chỗ rồi giữ chỗ tốt.
Gradient descent
- Định nghĩa: bước ngược hướng dốc một đoạn theo tốc độ học.
- Đạo hàm mách hướng lên, ta đi hướng ngược lại xuống.
- Ví dụ đời thường: như sờ dốc dưới chân rồi bước xuống.
- Thêm xung lượng để vượt gợn nhỏ trên đường.
- Chuẩn hóa data để thung lũng tròn dễ đi hơn.
| Bước đi | Dấu hiệu | Cách sửa |
|---|---|---|
| Quá lớn | Loss vọt lên xuống | Giảm tốc độ học |
| Quá bé | Học mãi không tới | Tăng bước hoặc xung lượng |
| Vừa | Loss giảm êm | Giữ và giảm dần cuối |
Giới hạn
- Cần hàm trơn có đạo hàm tính được mỗi ngày.
- Dễ kẹt đáy gần nhất và lượn ở thung hẹp.
- Điểm yên ngựa: dốc gần 0 nhưng chưa phải đáy.
- Ví dụ đời thường: như đèo phẳng tưởng đỉnh nhưng chưa.
- Hàm rời rạc nhiều đáy nên dùng ủ nhiệt sau.
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 nhảy qua đáy liên tục nên không chốt được.
# Một bước gradient descent
x = x - toc_do * dao_ham(x) # bước ngược dốc
print(x) # vị trí mới thấp hơn
💻 Bài tập
Ngôn ngữ: Python 3 với NumPy và matplotlib. Nộp vào day-111/.
Bài 1: Gradient descent trên hàm 1 biến và 2 biến
| Hàm | Yêu cầu |
|---|---|
numerical_grad(f, x, h=1e-5) | Sai phân trung tâm cho vector x |
gd(f, grad, x0, lr, steps) | Trả toàn bộ quỹ đạo |
gd_momentum(f, grad, x0, lr, beta, steps) |
Hàm thử:
f(x) = (x - 3)^2 -> hội tụ về 3 với lr = 0.1
f(x) = (x - 3)^2, lr = 1.1 -> phân kỳ (in 10 bước đầu)
f(x, y) = x^2 + 10 y^2 -> thung hẹp, GD đi zic zắc
Rosenbrock (1-x)^2 + 100(y-x^2)^2 -> đáy (1, 1)
Vẽ quỹ đạo trên contour của từng hàm 2 biến.
Bài 2: Tốc độ học và xung lượng
- Trên
x^2 + 10 y^2, quétlrtừ0.001tới0.2. Vẽ số bước tới|grad| < 1e-6theolr. Chỉ ra ngưỡng phân kỳ và giải thích bằng hệ số 10. - So GD, momentum (
beta = 0.9), và Adam tự cài trên Rosenbrock. In số bước và vẽ quỹ đạo. - Chuẩn hóa biến
y' = sqrt(10) y. Chạy lại GD. Giải thích vì sao thung tròn dễ đi.
Bài 3: Nhiều đáy và điểm yên ngựa (nâng cao)
- Hàm Rastrigin 2D có nhiều đáy địa phương. Chạy GD từ 100 điểm ngẫu nhiên. Đếm số lần tới đáy toàn cục
(0, 0). - Random restart: giữ nghiệm tốt nhất của 100 lần. So với 1 lần.
- Hàm
f(x, y) = x^2 - y^2. Xuất phát tại(1, 0): GD kẹt ở điểm yên ngựa. Xuất phát tại(1, 1e-6): thoát. Vẽ 2 quỹ đạo.
✅ Tiêu chí hoàn thành
- Test hội tụ và phân kỳ trên
(x-3)^2pass. - Có hình quỹ đạo trên contour cho 3 hàm 2 biến.
- Bảng GD, momentum, Adam trên Rosenbrock có số thật.
- Có minh họa điểm yên ngựa.
❓ Câu hỏi ôn tập
- Cost đo cái gì?
- Gradient mách hướng nào?
- Bước lớn gây gì?
- Khi nào gradient kẹt?
🌕 Bạn đã hoàn thành ngày 111. Làm hết bài tập phía trên rồi sang ngày tiếp theo.