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ụ
# 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ả.
- Đổ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.
- Đạo hàm của các hàm kích hoạt Tính đạo hàm của sigmoid, ReLU, Leaky ReLU hoặc tanh tại từng giá trị, chính là độ dốc mà lan truyền ngược cần. Dễ
- Gradient của một nơ-ron Dùng quy tắc chuỗi để tìm mức thay đổi của hàm mất mát theo từng trọng số và bias của một nơ-ron sigmoid. Trung bình
- Lan truyền ngược trong mạng hai lớp Tính mọi gradient của trọng số và bias trong mạng có một lớp ẩn sigmoid và một đầu ra sigmoid. Khó
- Huấn luyện nơ-ron bằng hạ gradient Lặp lại lan truyền xuôi, tính gradient và cập nhật trọng số để dạy một nơ-ron sigmoid từ các ví dụ. Trung bình
- Huấn luyện mạng nơ-ron giải bài toán XOR Kết hợp tất cả: huấn luyện mạng sigmoid 2-2-1 bằng lan truyền ngược cho đến khi học được XOR. Khó