Vì sao lan truyền ngược phải đi ngược chiều?

Công nghệ21 tháng 9, 2026·6 phút đọc

Lan truyền ngược (backpropagation) là thuật toán nền tảng để huấn luyện mạng nơ-ron, nhưng ít ai giải thích trực tiếp vì sao nó buộc phải chạy từ cuối về đầu thay vì tính đạo hàm ngay trong lượt lan truyền xuôi. Bài viết phân tích từ nguyên lý chuỗi đạo hàm nhiều biến và chỉ ra rằng cách làm xuôi chiều sẽ tốn thời gian bậc hai theo số nút, trong khi lan truyền ngược chỉ mất thời gian tuyến tính.

Vì sao lan truyền ngược phải đi ngược chiều?

Cách giải thích quen thuộc về lan truyền ngược (backpropagation) — thuật toán dùng để huấn luyện mạng nơ-ron, được Rumelhart và cộng sự công bố năm 1986 — thường chỉ nói rằng nó đang lan truyền sai số của từng nút theo chiều ngược lại. Nhưng khi mới học thuật toán này, tôi có một thắc mắc mà không tìm được câu trả lời trực tiếp: vì sao nó buộc phải đi ngược chiều?

Suy cho cùng, một mạng nơ-ron chỉ là một hàm hợp, và ta biết cách tính đạo hàm của hàm hợp bằng quy tắc chuỗi. Vậy tại sao không tính luôn gradient trong một lượt lan truyền xuôi? Việc trả lời câu hỏi này đã giúp tôi hiểu sâu hơn hẳn về lan truyền ngược.

Sơ đồ thiết lập bài toán lan truyền ngượcSơ đồ thiết lập bài toán lan truyền ngược

Bài toán mà lan truyền ngược cần giải

Mục tiêu của lan truyền ngược là tính một cách hiệu quả đạo hàm riêng ∂f/∂θᵢ cho mọi trọng số θᵢ trong mạng nơ-ron f. Để đặt vấn đề cho rõ ràng, hãy xét một trọng số tùy ý θ₁ và một nút v nào đó nằm trong f.

Cần nói rõ: nút v ở đây là giá trị đầu ra của nút sau khi tổng có trọng số của các đầu vào đã đi qua hàm kích hoạt σ, tức là:

u = θ₁t₁ + θ₂t₂ + … + θₙtₙ v = σ(u)

Trong sơ đồ thông thường, u, σ và v sẽ được gộp thành một nút duy nhất, ký hiệu bằng đường nét đứt.

Theo tôi, quan sát quan trọng nhất để hiểu lan truyền ngược là: phần lớn phép tính ∂f/∂θ₁ có thể được thực hiện cục bộ tại từng nút, nhờ quy tắc chuỗi:

∂f/∂θ₁ = (∂f/∂v) · (∂v/∂u) · (∂u/∂θ₁)

Ta có thể tính ∂v/∂u bằng giải tích, nó chỉ phụ thuộc vào định nghĩa của σ. Và ta biết ∂u/∂θ₁ = t₁. Như vậy, tại mỗi nút v, nếu đã biết ∂f/∂v thì ta tính được ngay ∂f/∂θ₁.

Nút thắt nằm ở đại lượng ∂f/∂v

Vấn đề khó là tính ∂f/∂v, bởi các nút phía sau đều phụ thuộc vào giá trị của v. Rất may, quy tắc chuỗi nhiều biến cho ta câu trả lời. Với hàm nhiều biến g(w₁, w₂, …, wₘ) trong đó mỗi wᵢ lại là hàm một biến wᵢ(v), ta có:

∂g/∂v = Σⱼ (∂g/∂wⱼ) · (∂wⱼ/∂v)

Như vậy về lý thuyết, ta hoàn toàn có đủ công cụ để thử cài đặt lan truyền ngược theo chiều xuôi thay vì chiều ngược. Hãy xem điều gì sẽ xảy ra.

Khẳng định về thứ tự tính đạo hàm trong đồ thị có hướngKhẳng định về thứ tự tính đạo hàm trong đồ thị có hướng

Vì sao chiều xuôi là lựa chọn tồi

Giả sử ta muốn một thuật toán lan truyền xuôi có thể tính ∂f/∂θᵢ cho một trọng số tùy ý. Như đã chỉ ra, tại nút v điều này tương đương với:

∂f/∂θᵢ = (∂f/∂v) · (∂v/∂θᵢ)

Để thiết kế thuật toán xuôi, cần chính thức hóa một sự thật quan trọng: trong một đồ thị tính toán có hướng mà nút b phụ thuộc vào nút a, thì không thể tính ∂b/∂a tại bất kỳ thời điểm nào trước khi có nút b.

Khẳng định này khá hiển nhiên. Nếu đồ thị tính toán biểu diễn hàm f(a) = b, ta không thể tính f′(a) khi chưa có f, và do đó chưa có b.

Trong thiết lập của chúng ta, với mọi nút phía sau wⱼ phụ thuộc vào nút v, không thể tính ∂wⱼ/∂v ngay tại nút v. Vì vậy, để tính ∂f/∂v, ta buộc phải phân rã số hạng bằng quy tắc chuỗi nhiều biến và truyền tiếp các số hạng còn lại cần cho việc tính ∂f/∂θᵢ về phía trước, tới từng nút wⱼ phụ thuộc vào v:

∂f/∂θᵢ = [ Σⱼ (∂f/∂wⱼ) · (∂wⱼ/∂v) ] · (∂v/∂θᵢ)

Trong đó, số hạng ∂wⱼ/∂v được tính tại chính nút wⱼ, còn số hạng ∂v/∂θᵢ được truyền tiếp về phía trước.

Minh họa lan truyền xuôi và các số hạng bị lặp lạiMinh họa lan truyền xuôi và các số hạng bị lặp lại

Có thể thấy ngay thuật toán kiểu này bùng nổ về chi phí tính toán vì ta phải truyền đi truyền lại cùng một thông điệp rất nhiều lần. Ví dụ, nếu muốn tính ∂f/∂θᵢ và ∂f/∂θₖ với θᵢ và θₖ là hai trọng số khác nhau trong cùng một lớp, ta phải tính riêng ∂v/∂θᵢ và ∂v/∂θₖ, nhưng tất cả các số hạng còn lại đều bị lặp lại y hệt.

Nói cách khác, nếu đã có sẵn các số hạng phía sau, chẳng hạn ∂wⱼ/∂v, thì ta chỉ cần truyền ngược chúng về nút v để tính ∂f/∂v. Vì mỗi nút chỉ truyền đi số hạng cục bộ của chính nó, lượt truyền ngược có thể chạy trong thời gian tuyến tính theo số nút.

Hệ quả: bài toán gán công trạng

Tôi cho rằng sơ đồ trên chính là mấu chốt để hiểu vì sao lan truyền ngược lại đi ngược chiều. Điểm cốt lõi là: nếu đã có sẵn các số hạng phía sau, ta có thể truyền ngược chúng về nút v để tính ∂f/∂v. Vì mỗi nút chỉ truyền số hạng cục bộ của mình, lượt ngược chạy tuyến tính theo số nút.

Trên một nút b phụ thuộc vào nút a, ta chỉ đơn giản truyền ngược ∂b/∂a về cho a. Quy tắc chuỗi nhiều biến giúp chứng minh tính đúng đắn của lan truyền ngược. Với bất kỳ nút v nào có các trọng số phía sau wⱼ, nếu v chỉ cộng các thông điệp truyền ngược lại, nó sẽ tính được đạo hàm mong muốn:

∂f/∂v = Σⱼ (∂f/∂wⱼ) · (∂wⱼ/∂v)

Khi đã hiểu vấn đề tính toán cốt lõi mà lan truyền ngược giải quyết, cách giải thích quen thuộc về "lan truyền sai số ngược chiều" trở nên dễ hiểu hơn nhiều. Có thể xem quá trình này như lời giải cho một dạng bài toán gán công trạng: mỗi nút nói cho các nút phía trước biết chúng đã làm sai ở đâu.

Lý do thuật toán hoạt động theo cách này rất đơn giản: một lời giải ngây thơ theo chiều xuôi sẽ có thời gian chạy bậc hai theo số nút, trong khi lan truyền ngược chỉ cần thời gian tuyến tính.

Đối với những ai đang học về học sâu, đây là góc nhìn đáng để nắm vững. Hiểu được vì sao lan truyền ngược buộc phải đi ngược chiều không chỉ giúp ta nhớ thuật toán, mà còn là nền tảng để hiểu các kỹ thuật tối ưu tính toán gradient trong những mô hình lớn ngày nay.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗