← Tất cả bài viết

Infographic backpropagation trên giấy trắng, nhân vật anime ngồi mép bàn cầm máy tính và chỉ sơ đồ mạng.

Backpropagation: tính gradient trước, cập nhật trọng số sau


“AI học từ lỗi” là cách nói dễ hình dung, nhưng để hiểu kỹ thuật, bạn cần biết lỗi được biến thành phép tính nào. Backpropagation tính gradient của hàm mất mát theo các tham số; bước cập nhật tham số do optimizer thực hiện. Hai việc liên tiếp này thường bị gộp thành một.

➡️ 1. Bắt đầu từ một dự đoán

Xét mô hình rất nhỏ: prediction = w * x. Đầu vào x = 2, đáp án mục tiêu y = 6, và trọng số ban đầu w = 1. Mô hình dự đoán 2, trong khi chúng ta muốn 6.

Chọn hàm mất mát L = (prediction - y)^2. Ở lần đầu, L = (2 - 6)^2 = 16. Đây là ví dụ một tham số để tự tính, không phải mô phỏng đầy đủ một chatbot.

📉 2. Gradient trả lời câu hỏi nào?

Ta muốn biết nếu thay đổi w một chút, mất mát sẽ thay đổi theo hướng nào tại điểm hiện tại. Áp dụng quy tắc dây chuyền cho ví dụ này cho ra dL/dw = 2 * (w*x-y) * x, bằng -16.

Dấu âm cho biết tăng w một lượng nhỏ sẽ làm giảm mất mát tại điểm đang xét. Nó không có nghĩa “một neuron chịu 16 phần lỗi”, cũng không bảo đảm mọi bước tăng lớn đều tốt.

Trong mạng nhiều phép toán, backpropagation truyền các đạo hàm theo đồ thị tính toán bằng quy tắc dây chuyền. PyTorch thực hiện việc này qua autograd. Tài liệu autograd.

⚙️ 3. Cập nhật là một bước riêng

Dùng gradient descent với tốc độ học lr = 0.1: trọng số mới là w_new = w - lr * grad = 2.6. Dự đoán mới bằng 5.2, mất mát còn 0.64.

Trong PyTorch, loss.backward() tính gradient, còn optimizer.step() dùng chúng để điều chỉnh tham số; gradient cũng cần được quản lý hoặc xóa phù hợp giữa các lượt. Vòng tối ưu trong PyTorch.

🧪 4. Tự chạy ví dụ bằng Python

Đoạn mã sau chỉ dùng phép toán cơ bản, không cần cài thư viện học máy:

x, y, w, lr = 2.0, 6.0, 1.0, 0.1

prediction = w * x
loss = (prediction - y) ** 2
grad = 2 * (prediction - y) * x

w_new = w - lr * grad
new_prediction = w_new * x
new_loss = (new_prediction - y) ** 2

print("prediction:", prediction)
print("loss:", loss)
print("gradient:", grad)
print("new weight:", w_new)
print("new loss:", round(new_loss, 4))

Bạn sẽ nhận được lần lượt 2.0, 16.0, -16.0, 2.6 và 0.64. Hãy thử đổi riêng lr thành 1.0: trọng số nhảy đến 17 và mất mát tăng lên 784. Gradient đúng vẫn có thể đi cùng bước cập nhật quá lớn.

🔎 Kiểm tra bằng sai phân hữu hạn

Tính mất mát tại w + epsilon và w - epsilon, lấy hiệu rồi chia cho 2 * epsilon. Với epsilon = 0.000001, kết quả gần -16. Đây là cách đối chiếu đạo hàm của ví dụ nhỏ; nó không thay thế backpropagation cho một mạng lớn.

💬 5. Sửa prompt khác với huấn luyện trọng số

Trong ví dụ, việc học được thể hiện bằng thay đổi w. Nếu bạn chỉ bổ sung hướng dẫn vào một cuộc chat, bạn đã thay đổi ngữ cảnh đầu vào; điều đó tự nó chưa chứng minh trọng số mô hình vừa được cập nhật.

Khi đọc một công cụ nói “AI học từ bạn”, hãy hỏi cụ thể: nó lưu ghi nhớ, truy xuất tài liệu hay thực sự chạy một quy trình huấn luyện? Các cơ chế này cần được giải thích riêng.

✅ 6. Một mất mát nhỏ chưa đủ

Ví dụ chỉ có một điểm dữ liệu. Việc khớp tốt điểm này chưa nói mô hình làm được gì ở những điểm khác. Để kiểm hiểu, hãy đặt x = 3, mục tiêu y = 9, rồi tính đầu ra trước và sau bước cập nhật.

Khi thử một mô hình thật, giữ một tập dữ liệu riêng để đánh giá. Hãy theo dõi cả phép cập nhật lẫn kết quả trên dữ liệu chưa dùng để học, thay vì chỉ nhìn con số mất mát đang giảm.

Bài viết liên quan