Backpropagation, hay thuật toán lan truyền ngược, là cơ chế giúp mạng nơ-ron biết mỗi trọng số đã đóng góp bao nhiêu vào sai số dự đoán. Từ thông tin đó, mô hình có thể điều chỉnh các tham số theo hướng làm giảm hàm mất mát và dần học được quy luật từ dữ liệu.
Hầu hết mô hình học sâu trong xử lý ngôn ngữ tự nhiên, thị giác máy tính và nhiều lĩnh vực trí tuệ nhân tạo đều dựa vào Backpropagation để tính gradient. Hiểu thuật toán này giúp ta nhìn rõ điều gì thực sự xảy ra phía sau các lệnh quen thuộc như loss.backward() trong PyTorch.
- Backpropagation dùng quy tắc dây chuyền để tính gradient của hàm mất mát theo từng tham số.
- Quá trình huấn luyện thường gồm: forward pass → tính loss → backward pass → cập nhật trọng số.
- Backpropagation không phải thuật toán tối ưu; nó tính gradient, còn Gradient Descent, Adam hoặc SGD sử dụng gradient để cập nhật tham số.
- Cùng một nguyên lý được dùng để huấn luyện CNN, Transformer, LSTM, ViT và nhiều kiến trúc học sâu khác.
Backpropagation thực sự giải quyết vấn đề gì?
Một mạng nơ-ron có thể chứa từ vài nghìn đến hàng tỷ tham số. Khi mô hình dự đoán sai, câu hỏi quan trọng không chỉ là “sai bao nhiêu?” mà còn là “mỗi trọng số phải chịu trách nhiệm bao nhiêu cho sai số đó?”.
Giả sử trọng số w thay đổi một lượng rất nhỏ. Nếu hàm mất mát thay đổi mạnh, w có ảnh hưởng lớn đến kết quả. Nếu loss gần như không đổi, ảnh hưởng của w nhỏ. Đại lượng mô tả mức độ nhạy này chính là đạo hàm:
Trong đó L là hàm mất mát. Khi mạng có rất nhiều tham số, ta cần gradient gồm toàn bộ các đạo hàm riêng:
Backpropagation là phương pháp tính các gradient này một cách hiệu quả bằng cách đi ngược qua đồ thị tính toán. Thay vì tính lại toàn bộ mạng cho từng tham số, thuật toán tái sử dụng các đạo hàm trung gian đã có.
Từ Forward Pass đến Backward Pass
Xét một mạng nơ-ron đơn giản gồm một tầng ẩn. Với một minibatch dữ liệu, quá trình truyền xuôi có thể viết dưới dạng ma trận:
Ở đây X là dữ liệu đầu vào, W và b là tham số, còn f và g là các hàm kích hoạt. Mạng tạo ra dự đoán Ŷ, sau đó so sánh dự đoán với nhãn thật Y thông qua hàm mất mát L.
Forward pass chỉ trả lời câu hỏi mạng dự đoán gì. Backward pass trả lời câu hỏi quan trọng hơn đối với quá trình học: cần thay đổi từng tham số theo hướng nào để loss giảm?
Bước 1: tính sai số ở đầu ra
Giả sử bài toán phân loại nhị phân sử dụng sigmoid ở đầu ra và Binary Cross-Entropy làm hàm mất mát. Một kết quả rất thuận tiện là gradient tại tầng đầu ra có dạng:
Trong đó m là số mẫu trong minibatch. Nếu dự đoán lớn hơn nhãn thật, gradient mang dấu dương; nếu dự đoán nhỏ hơn nhãn thật, gradient có xu hướng mang dấu âm.
Bước 2: tính gradient của trọng số
Gradient sau đó tiếp tục truyền về tầng trước:
Ký hiệu ⊙ là phép nhân từng phần tử. Quy trình tiếp tục tương tự nếu mạng có nhiều tầng hơn: gradient đi từ đầu ra về đầu vào cho đến khi các tham số cần huấn luyện đều nhận được đạo hàm tương ứng.
Quy tắc dây chuyền là nền tảng của Backpropagation
Lý do Backpropagation có thể đi ngược qua hàng chục hoặc hàng trăm tầng nằm ở quy tắc dây chuyền (chain rule) trong giải tích.
Giả sử một đại lượng y phụ thuộc vào u, còn u phụ thuộc vào x:
Đạo hàm của y theo x được tính bằng:
Một mạng nơ-ron chỉ là phiên bản lớn hơn của chuỗi phụ thuộc này. Ví dụ:
Muốn biết trọng số w1 ảnh hưởng đến loss như thế nào, ta nhân các đạo hàm cục bộ trên đường từ w1 đến L:
Điểm quan trọng là nhiều tham số chia sẻ cùng các phép tính trung gian. Backpropagation lưu và tái sử dụng những kết quả này thay vì tính từng đạo hàm một cách độc lập. Đây là lý do thuật toán đủ hiệu quả để huấn luyện các mạng rất lớn.
Ví dụ trực quan: một trọng số học như thế nào?
Xét một neuron cực kỳ đơn giản:
Giả sử mô hình đang dự đoán ŷ cao hơn giá trị đúng y. Với kết hợp sigmoid và Binary Cross-Entropy, gradient theo z tỷ lệ với ŷ − y. Nếu gradient của w là số dương, giảm w một chút sẽ làm loss giảm.
Gradient Descent thực hiện điều đó bằng quy tắc:
Trong đó η là learning rate, tức tốc độ học. Nếu gradient dương, w giảm; nếu gradient âm, w tăng. Bằng cách lặp quá trình này trên nhiều minibatch, mạng dần di chuyển tới vùng tham số tạo ra loss thấp hơn.
Cài đặt Backpropagation bằng Python từ đầu
Ví dụ dưới đây xây dựng một mạng hai tầng để học bài toán XOR. Mục tiêu không phải tạo framework học sâu, mà là quan sát rõ forward pass, gradient và bước cập nhật tham số.
import numpy as np
np.random.seed(7)
# Dữ liệu XOR
X = np.array([
[0., 0.],
[0., 1.],
[1., 0.],
[1., 1.]
])
y = np.array([
[0.],
[1.],
[1.],
[0.]
])
# Khởi tạo tham số
W1 = np.random.randn(2, 4) * 0.8
b1 = np.zeros((1, 4))
W2 = np.random.randn(4, 1) * 0.8
b2 = np.zeros((1, 1))
lr = 0.1
def sigmoid(z): return 1 / (1 + np.exp(-z))
for epoch in range(5000):
```
# ----- Forward pass -----
z1 = X @ W1 + b1
a1 = np.tanh(z1)
z2 = a1 @ W2 + b2
y_hat = sigmoid(z2)
eps = 1e-9
loss = -(y * np.log(y_hat + eps)
+ (1 - y) * np.log(1 - y_hat + eps)).mean()
# ----- Backward pass -----
dz2 = (y_hat - y) / len(X)
dW2 = a1.T @ dz2
db2 = dz2.sum(axis=0, keepdims=True)
da1 = dz2 @ W2.T
dz1 = da1 * (1 - a1 ** 2)
dW1 = X.T @ dz1
db1 = dz1.sum(axis=0, keepdims=True)
# ----- Gradient Descent -----
W1 -= lr * dW1
b1 -= lr * db1
W2 -= lr * dW2
b2 -= lr * db2
```
print("Loss:", loss) print("Prediction:", np.round(y_hat.ravel(), 3))
Mạng có hai đầu vào, bốn neuron ẩn và một đầu ra. Tầng ẩn sử dụng tanh, trong khi đầu ra dùng sigmoid để tạo giá trị nằm trong khoảng từ 0 đến 1.
Phần đáng chú ý nhất nằm sau dòng Backward pass. Từ sai số ở đầu ra, chương trình lần lượt tính dW2, db2, sau đó truyền gradient về tầng ẩn để tìm dW1 và db1.
Framework như PyTorch làm gì khác?
Trong thực tế, ta gần như không viết thủ công từng công thức gradient. PyTorch, TensorFlow và JAX xây dựng một đồ thị tính toán và sử dụng cơ chế vi phân tự động (automatic differentiation) để tính đạo hàm.
Ví dụ, trong PyTorch, lời gọi loss.backward() yêu cầu hệ thống thực hiện quá trình lan truyền gradient ngược qua đồ thị. Các gradient thu được được lưu trong thuộc tính gradient của tham số, sau đó optimizer sử dụng chúng để cập nhật trọng số.
optimizer.zero_grad()
y_hat = model(X)
loss = criterion(y_hat, y)
loss.backward() # Backpropagation
optimizer.step() # Cập nhật tham số
Hai dòng cuối thể hiện rõ sự phân chia trách nhiệm: backward() tính gradient, còn optimizer.step() sử dụng gradient để thay đổi tham số.
Backpropagation khác Gradient Descent như thế nào?
Hai khái niệm thường xuất hiện cùng nhau nên dễ bị xem là một. Thực tế, chúng giải quyết hai nhiệm vụ khác nhau.
| Khái niệm | Nhiệm vụ | Kết quả |
|---|---|---|
| Forward pass | Tính đầu ra của mô hình | Dự đoán ŷ và loss |
| Backpropagation | Tính đạo hàm qua mạng | Gradient ∇L |
| Gradient Descent / SGD | Dùng gradient để cập nhật tham số | W và b mới |
| Adam | Tối ưu tham số bằng gradient và thống kê động lượng | W và b mới |
Có thể xem Backpropagation là bộ phận tính thông tin, còn optimizer là bộ phận ra quyết định cập nhật. Một mô hình có thể giữ nguyên Backpropagation nhưng thay SGD bằng Adam mà không làm thay đổi nguyên lý lan truyền gradient.
Backpropagation trong NLP, Computer Vision và mô hình hiện đại
Nguyên lý của Backpropagation không phụ thuộc vào một kiến trúc mạng cụ thể. Miễn là các phép toán trong đường tính loss có thể vi phân hoặc có gradient phù hợp, gradient có thể được truyền ngược qua chúng.
Trong xử lý ngôn ngữ tự nhiên
Với Transformer, gradient được truyền từ hàm loss qua tầng đầu ra, mạng feed-forward, cơ chế attention, embedding và các tham số liên quan. Nếu mô hình dự đoán token tiếp theo sai, Backpropagation giúp xác định những ma trận trọng số nào trong hệ thống phải được điều chỉnh.
Cùng nguyên lý này áp dụng cho phân loại văn bản, phân tích cảm xúc, dịch máy, tóm tắt, mô hình ngôn ngữ và nhiều bài toán NLP khác.
Trong thị giác máy tính
Trong CNN, gradient đi ngược qua các lớp tích chập để cập nhật các kernel. Với Vision Transformer, gradient truyền qua các block attention và feed-forward tương tự Transformer trong NLP.
Các mô hình phân loại ảnh, phát hiện đối tượng, phân đoạn ảnh hoặc ước lượng chiều sâu đều có thể được huấn luyện bằng cùng nguyên tắc: tạo dự đoán, tính loss, lan truyền gradient ngược và cập nhật tham số.
Không phải mọi thứ đều được “học” bằng Backpropagation
Thuật toán chỉ tác động tới các tham số được đưa vào quá trình tối ưu. Dữ liệu đầu vào, token ID hay nhãn lớp thường không phải tham số cần cập nhật. Trong quá trình fine-tuning, ta cũng có thể đóng băng một số tầng; gradient của các tham số đó sẽ không được sử dụng để thay đổi trọng số.
Giới hạn và những vấn đề thường gặp
Backpropagation rất mạnh nhưng không đảm bảo quá trình huấn luyện luôn dễ dàng. Một số vấn đề quan trọng xuất phát chính từ việc gradient phải đi qua nhiều phép toán liên tiếp.
- Vanishing gradient: gradient trở nên rất nhỏ khi truyền qua nhiều tầng, khiến các tầng đầu học chậm.
- Exploding gradient: gradient tăng quá lớn, làm việc cập nhật tham số mất ổn định.
- Bộ nhớ: backward pass thường cần giữ lại nhiều giá trị trung gian từ forward pass để tính gradient.
- Hàm không khả vi: nếu một phép toán không có gradient thích hợp, không thể trực tiếp áp dụng Backpropagation theo cách thông thường.
- Gradient không đồng nghĩa với tối ưu toàn cục: có gradient chính xác không đảm bảo optimizer sẽ tìm được nghiệm tốt nhất của bài toán.
Các kỹ thuật như ReLU, residual connection, normalization, gradient clipping và cách khởi tạo trọng số phù hợp giúp giảm nhiều vấn đề trong thực tế. Với mạng cực lớn, gradient checkpointing còn có thể đánh đổi thêm thời gian tính toán để giảm bộ nhớ cần lưu cho backward pass.
Kết luận
Backpropagation là cầu nối giữa sai số của mô hình và cách từng tham số cần thay đổi. Thuật toán sử dụng quy tắc dây chuyền để truyền gradient từ đầu ra về các tầng trước, sau đó optimizer dùng gradient đó để cập nhật trọng số.
Khi đã hiểu rõ chu trình forward → loss → backward → update, các kiến trúc phức tạp như CNN, LSTM, Transformer hay Vision Transformer trở nên dễ phân tích hơn: cấu trúc mạng có thể khác nhau, nhưng cơ chế học cơ bản vẫn dựa trên cùng một nguyên lý.
Nội dung gốc thuộc tác giả. Vui lòng không đăng lại toàn văn khi chưa được phép, trừ trường hợp pháp luật hoặc giấy phép áp dụng cho phép. Nội dung của bên thứ ba tuân theo quyền và giấy phép tương ứng.
Nguồn gốc: Backpropagation là gì? Cách mạng nơ-ron học từ lỗi