Khái niệm AI với Python

Gradient descent và lan truyền ngược trong Python

Huấn luyện là điều chỉnh trọng số để giảm mất mát. Gradient cho biết hướng làm mất mát tăng, nên gradient descent bước những bước nhỏ theo hướng ngược lại. Lan truyền ngược dùng quy tắc chuỗi để tính gradient đó cho mọi trọng số.

Khái niệm bằng lời đơn giản

Huấn luyện là điều chỉnh trọng số để giảm mất mát. Gradient cho biết hướng làm mất mát tăng, nên gradient descent bước những bước nhỏ theo hướng ngược lại. Lan truyền ngược dùng quy tắc chuỗi để tính gradient đó cho mọi trọng số.

Huấn luyện một nơ-ron bằng gradient descent: dùng quy tắc chuỗi để biết mỗi trọng số ảnh hưởng đến mất mát ra sao, rồi bước xuống dốc.

Ý chính

  • Gradient là độ dốc của mất mát theo từng trọng số.
  • Learning rate quyết định độ dài bước: quá lớn sẽ vượt quá, quá nhỏ thì chậm.
  • Lan truyền ngược áp dụng quy tắc chuỗi từ đầu ra ngược về lớp đầu tiên.
  • Một epoch là một lượt đi qua toàn bộ dữ liệu huấn luyệ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 để huấn luyện. Đường thẳng tiến dần về các điểm, còn đường màu cam đi xuống dốc trên bề mặt mất mát tới điểm thấp nhất.

Code ví dụ

Chạy code →
main.py
# Train one neuron y = w * x + b to fit points on the line y = 2x + 1.
data = [(0, 1), (1, 3), (2, 5), (3, 7)]
w, b = 0.0, 0.0
learning_rate = 0.05

for epoch in range(1, 201):
    grad_w = grad_b = 0.0
    for x, y in data:
        error = (w * x + b) - y          # prediction minus target
        # Chain rule: d(error²)/dw = 2 * error * x, d(error²)/db = 2 * error
        grad_w += 2 * error * x
        grad_b += 2 * error
    # Step against the gradient to make the loss smaller.
    w -= learning_rate * grad_w / len(data)
    b -= learning_rate * grad_b / len(data)
    if epoch in (1, 10, 50, 200):
        loss = sum(((w * x + b) - y) ** 2 for x, y in data) / len(data)
        print(f"epoch {epoch:>3}: w={w:.3f} b={b:.3f} loss={loss:.4f}")

Kết quả dự kiến

epoch   1: w=0.850 b=0.400 loss=7.0587
epoch  10: w=2.009 b=0.958 loss=0.0009
epoch  50: w=2.005 b=0.989 loss=0.0000
epoch 200: w=2.000 b=1.000 loss=0.0000

Cách hoạt động

Với mỗi điểm, sai số là dự đoán trừ mục tiêu. Quy tắc chuỗi cho gradient của bình phương sai số là 2·error·x với w và 2·error với b. Lấy trung bình trên dữ liệu và bước ngược hướng gradient sẽ đưa w và b về gần 2 và 1, còn mất mát giảm gần về 0.

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