Khái niệm AI với Python

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ụ

Chạy code →
main.py
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ả.

  1. Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
  2. In các giá trị trung gian để theo dõi từng bước tính toán.
  3. Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
Chạy trong Python IDE →

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.

Tất cả thử thách