Chuyển đến nội dung chính

Backpropagation là gì? Cách mạng nơ-ron học từ lỗi

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.

Tóm tắt nội dung
  • 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 và chu trình huấn luyện mạng nơ-ron Input Dữ liệu x Forward Tính dự đoán ŷ Loss L(y, ŷ) Backward Tính gradient Update W ← W − η∇W Lặp lại với tham số đã được cập nhật Forward pass → ← Backward pass
Chu trình huấn luyện điển hình: dự đoán, đo sai số, lan truyền gradient ngược và cập nhật tham số.

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:

∂L / ∂w

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:

∇L = [∂L/∂w1, ∂L/∂w2, ..., ∂L/∂wn]

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ó.

Điểm dễ nhầm: Backpropagation không tự quyết định trọng số mới bằng bao nhiêu. Nó chỉ cung cấp gradient. Việc cập nhật tham số thuộc về thuật toán tối ưu như SGD, Gradient Descent hoặc Adam.

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:

Z1 = XW1 + b1
A1 = f(Z1)
Z2 = A1W2 + b2
Ŷ = g(Z2)

Ở đâ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:

dZ2 = (Ŷ − Y) / m

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ố

dW2 = A1TdZ2
db2 = Σ dZ2

Gradient sau đó tiếp tục truyền về tầng trước:

dA1 = dZ2W2T
dZ1 = dA1 ⊙ f′(Z1)
dW1 = XTdZ1

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:

x → u → y

Đạo hàm của y theo x được tính bằng:

dy/dx = (dy/du)(du/dx)

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ụ:

x → z1 → a1 → z2 → ŷ → L

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:

∂L/∂w1 = ∂L/∂ŷ · ∂ŷ/∂z2 · ∂z2/∂a1 · ∂a1/∂z1 · ∂z1/∂w1

Đ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:

z = wx + b
ŷ = σ(z)

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:

wnew = wold − η · ∂L/∂w

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ách hình dung: Forward pass cho biết ta đang đứng ở đâu trên bề mặt loss. Backpropagation tính hướng dốc tại vị trí đó. Optimizer quyết định bước đi tiếp theo.

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.

Với khởi tạo ngẫu nhiên cố định trong ví dụ, sau quá trình huấn luyện các dự đoán tiến gần mẫu XOR [0, 1, 1, 0]. Giá trị cụ thể không phải mục tiêu chính; điều quan trọng là toàn bộ việc học được tạo ra từ chuỗi forward → loss → backward → update.

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.

Một hiểu nhầm khác: loss giảm chậm không nhất thiết có nghĩa Backpropagation sai. Nguyên nhân có thể nằm ở learning rate, dữ liệu, kiến trúc, hàm loss, khởi tạo tham số hoặc optimizer.

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ý.

© The CS Note · THE CS NOTE

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

Về trang chủ Về đầu bài

Bài Đăng Phổ Biến

Bài toán tháp Hà nội

Trải nghiệm Tháp Hà Nội Kéo thả đĩa hoặc chạm vào các nút bên dưới để di chuyển. Bạn phải chuyển toàn bộ đĩa sang cột ngoài cùng bên phải (Cột 3) mà không đặt đĩa to lên đĩa nhỏ. Cột 1 Cột 2 Cột 3 Điều khiển & Chế độ Số lượng đĩa 4 Tốc độ máy giải ↪ Undo ↻ Chơi lại 🤖 Máy tự giải Thống kê ván chơi Nước đã đi 0 Thời gian 00:00 Tối thiểu cần 15 Kỷ lục của bạn - Lịch sử và Nguồn gốc Truyền thuyết Bài toán Tháp Hà Nội (hay Tháp Brahma) là một trò chơi xếp hình toán học kinh điển được giới thiệu lần đầu vào năm 1883 bởi nhà toán học người Pháp Édouard L...

Bài toán phân tích cảm xúc trong văn bản

Bài toán phân tích cảm xúc (sentiment analysis) là một bài toán NLP nhằm xác định thái độ hoặc cảm xúc được thể hiện trong văn bản. Ví dụ, từ một đánh giá như “Điện thoại đẹp, chạy nhanh nhưng pin hơi yếu”, hệ thống có thể nhận biết rằng người dùng có cả nhận xét tích cực và tiêu cực. Điểm thú vị của bài toán nằm ở khoảng cách giữa cách con người hiểu ngôn ngữ và cách máy tính xử lý dữ liệu. Một hệ thống phân tích cảm xúc cần biến văn bản tự nhiên thành dữ liệu có cấu trúc, học được các mẫu ngôn ngữ từ dữ liệu huấn luyện và đưa ra dự đoán hợp lý trên những câu chưa từng gặp. 1. Bài toán phân tích cảm xúc bắt đầu từ đâu? Hãy tưởng tượng một cửa hàng trực tuyến có hàng nghìn đánh giá mỗi ngày. Con người có thể đọc từng đánh giá để biết khách hàng hài lòng hay không, nhưng việc này nhanh chóng trở nên tốn thời gian khi dữ liệu tăng lên. NLP có thể biến bài toán đó thành một bài toán phân loại. Với mỗi văn bản, hệ thống nhận vào một chuỗi ký...

KAN cho phân đoạn khối u não với bộ BraTS 2020

Kolmogorov-Arnold Network (KAN) mở ra một hướng khác với MLP truyền thống: thay vì chỉ học các trọng số vô hướng trên mỗi kết nối, KAN có thể học những hàm phi tuyến một biến trên các cạnh . Khi đưa ý tưởng này vào kiến trúc encoder-decoder như U-Net, ta có thể sử dụng convolution để giữ cấu trúc không gian của ảnh MRI và dùng KAN để thực hiện các phép biến đổi phi tuyến mạnh hơn trên representation trung gian. Một bài toán phù hợp để nghiên cứu hướng này là phân đoạn u thần kinh đệm trên BraTS 2020 . Dataset cung cấp MRI đa mô thức và yêu cầu xác định các vùng Whole Tumor (WT), Tumor Core (TC) và Enhancing Tumor (ET). Đây là bài toán 3D có sự mất cân bằng voxel lớn, hình dạng khối u rất đa dạng và ranh giới giữa các mô bệnh lý không đơn giản. Lưu ý học thuật quan trọng: U-KAN gốc được công bố cho nhiều benchmark phân đoạn ảnh y tế nhưng không báo cáo kết quả BraTS 2020. Một công trình sau đó đã mở rộng U-KAN sang 3D MRI brain tumor segmentation , nhưng đánh giá trên BraTS 2...

Tách từ trong tiếng Việt Word Segmentation

Tách từ tiếng Việt là bài toán xác định ranh giới giữa các từ trong một chuỗi văn bản. Khó khăn nằm ở chỗ khoảng trắng trong tiếng Việt thường phân cách các âm tiết , nhưng một từ hoàn chỉnh có thể gồm nhiều âm tiết như “sinh viên” , “đại học” , “công nghệ” hay “tự nhiên” . Tách từ đúng giúp các hệ thống NLP dựa trên từ biểu diễn văn bản hợp lý hơn, đặc biệt trong tìm kiếm, TF-IDF, phân loại văn bản, gán nhãn từ loại và một số mô hình ngôn ngữ tiếng Việt. Tuy nhiên, với các Transformer sử dụng tokenizer dưới mức từ như subword hoặc SentencePiece, tách từ thủ công không phải lúc nào cũng là bước bắt buộc . Việc có cần tách từ trước hay không phụ thuộc vào mô hình và pipeline cụ thể. Tóm tắt nội dung Khoảng trắng trong tiếng Việt không phải lúc nào cũng là ranh giới từ ; nhiều từ gồm hai hoặc nhiều âm tiết. Word segmentation và tokenization có liên quan nhưng không hoàn toàn đồng nghĩa. Ba hướng chính gồm dựa trên từ điển, mô hình thống kê và mô hình học sâu . Tron...

KAN là gì? Mạng Kolmogorov-Arnold khác MLP thế nào?

Kolmogorov-Arnold Network (KAN) là một kiến trúc mạng nơ-ron trong đó mỗi cạnh không chỉ chứa một trọng số vô hướng mà mang một hàm một biến có thể học được . Đây là khác biệt cốt lõi so với Multi-Layer Perceptron (MLP), nơi các cạnh chủ yếu thực hiện phép nhân với trọng số còn hàm kích hoạt thường được áp dụng tại các node. KAN được lấy cảm hứng từ định lý biểu diễn Kolmogorov-Arnold và đặc biệt đáng chú ý trong các bài toán xấp xỉ hàm, mô hình hóa khoa học và symbolic regression. Tuy nhiên, KAN không nên được hiểu là kiến trúc đã thay thế MLP trong mọi bài toán Deep Learning; khả năng biểu diễn, chi phí tính toán và mức độ phù hợp của hai kiến trúc khác nhau theo từng nhiệm vụ. Tóm tắt nội dung MLP học chủ yếu trọng số trên các cạnh , còn KAN đặt hàm một biến học được trên từng cạnh . Một KAN layer cộng kết quả của nhiều hàm cạnh để tạo activation của node tiếp theo. KAN gốc sử dụng B-spline để tham số hóa các hàm phi tuyến trên cạnh. KAN có lợi thế đáng chú ý về trực...