Bộ tối ưu mạng nơ-ron: SGD, Momentum và Adam trong Python
Bộ tối ưu là quy tắc biến gradient thành bước cập nhật trọng số. Gradient descent thường chỉ dùng gradient hiện tại; momentum nhớ các hướng trước đó, còn Adam điều chỉnh thêm độ dài bước cho từng trọng số.
Khái niệm bằng lời đơn giản
Bộ tối ưu là quy tắc biến gradient thành bước cập nhật trọng số. Gradient descent thường chỉ dùng gradient hiện tại; momentum nhớ các hướng trước đó, còn Adam điều chỉnh thêm độ dài bước cho từng trọng số.
So sánh gradient descent thường, momentum và Adam bằng cách tối thiểu hóa cùng một hàm từng bước một.
Ý chính
- Momentum giữ một vận tốc nên lăn qua được vùng phẳng và các chỗ gồ ghề nhỏ.
- Adam giữ trung bình trượt của gradient và của bình phương gradient.
- Hiệu chỉnh bias (chia cho 1 − βᵗ) sửa các giá trị trung bình đó ở những bước đầu.
- Khởi tạo trọng số tốt và mini-batch cũng giúp huấn luyện nhanh và ổn định hơn.
Khi nào nên sử dụng?
- Hiểu điều gì diễn ra bên trong mạng nơ-ron và các thư viện AI.
- Nắm ý tưởng trước khi tự cài đặt nó trong các thử thách tương ứng.
- Chuẩn bị cho khóa học machine learning, phỏng vấn và dự án.
Xem trực quan
Nhấn Phát để ba bộ tối ưu cùng chạy xuống một thung lũng gồ ghề. Thử learning rate lớn hơn để thấy momentum vượt quá đích.
Code ví dụ
import math
# Minimise f(x) = (x - 3)² with three optimizers. The gradient is 2(x - 3).
grad = lambda x: 2 * (x - 3)
def sgd(steps, lr=0.1):
x = 0.0
for _ in range(steps):
x -= lr * grad(x)
return x
def momentum(steps, lr=0.1, beta=0.9):
x, v = 0.0, 0.0
for _ in range(steps):
v = beta * v + grad(x) # remember the direction we were going
x -= lr * v
return x
def adam(steps, lr=0.3, b1=0.9, b2=0.999, eps=1e-8):
x, m, v = 0.0, 0.0, 0.0
for t in range(1, steps + 1):
g = grad(x)
m = b1 * m + (1 - b1) * g # running mean of gradients
v = b2 * v + (1 - b2) * g * g # running mean of squared gradients
m_hat, v_hat = m / (1 - b1 ** t), v / (1 - b2 ** t)
x -= lr * m_hat / (math.sqrt(v_hat) + eps)
return x
for steps in (5, 20, 50):
print(f"{steps:>2} steps sgd={sgd(steps):.3f} momentum={momentum(steps):.3f} adam={adam(steps):.3f}")
Kết quả dự kiến
5 steps sgd=2.017 momentum=4.741 adam=1.476
20 steps sgd=2.965 momentum=4.048 adam=3.813
50 steps sgd=3.000 momentum=3.091 adam=3.014
Cách hoạt động
Cả ba đều tối thiểu hóa (x − 3)², có điểm thấp nhất tại x = 3. SGD đi đều đặn, momentum tăng tốc và vượt quá trước khi ổn định, còn Adam chia mỗi bước theo trung bình trượt của gradient và bình phương của nó. Sau 50 bước cả ba đều gần 3.
Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.
Bài tập mở rộng
Hãy sửa code theo các bài tập dưới đây để hiểu rõ cách hoạt động thay vì chỉ sao chép kết quả.
- Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
- In các giá trị trung gian để theo dõi từng bước tính toán.
- Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
- Khởi tạo trọng số Xavier và He Tính khoảng giá trị hoặc độ lệch chuẩn dùng để khởi tạo trọng số của một lớp. Dễ
- Hạ gradient theo mini-batch Huấn luyện mô hình tuyến tính bằng cách cập nhật trọng số sau mỗi lô nhỏ thay vì sau toàn bộ dữ liệu. Trung bình
- Hạ gradient với momentum Áp dụng cập nhật momentum, giữ lại một phần bước trước để tăng tốc theo các hướng ổn định. Dễ
- Bộ tối ưu Adam Cài đặt Adam, bộ tối ưu mặc định của học sâu, với trung bình trượt và hiệu chỉnh độ lệch. Trung bình