AIToanHoc.comAI Toán Học
Toán đứng sau trí tuệ nhân tạo

Lan truyền ngược (backpropagation) là gì: quy tắc dây chuyền tính tay qua hai lớp

Lan truyền ngược là cách tính đạo hàm của hàm mất mát theo mọi trọng số bằng quy tắc dây chuyền. Tính tay một mạng hai lớp và kiểm bằng sai phân.

Hai Phong shipyard at sunset, workers seen from behind tracing a long chain of steel cables back toward a crane, wide angle, orange and steel blue tones

Lan truyền ngược là thuật toán tính đạo hàm của hàm mất mát theo từng trọng số trong mạng nơ-ron, bằng cách áp dụng quy tắc dây chuyền từ đầu ra ngược về đầu vào và tái sử dụng kết quả trung gian. Nó không phải thuật toán học; thuật toán học là hạ dốc. Lan truyền ngược chỉ là cách tính gradient thật nhanh để hạ dốc có cái mà dùng.

Cái hay của nó nằm ở chi phí: tính gradient theo toàn bộ trọng số chỉ tốn cỡ vài lần một lượt chạy thuận, bất kể mạng có bao nhiêu trọng số. Bài này nhắc lại quy tắc dây chuyền, tính tay trên một mạng hai lớp, kiểm kết quả bằng phương pháp sai phân, rồi giải thích vì sao gradient có thể teo lại hoặc phình to khi đi qua nhiều lớp.

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

Để chạy thuật toán hạ dốc, ta cần đạo hàm của hàm mất mát theo từng tham số. Cách ngây thơ nhất là sai phân: nhích một tham số lên một chút, chạy lại mạng, xem hàm mất mát đổi bao nhiêu. Mỗi tham số cần ít nhất một lượt chạy thêm. Với mạng một trăm nghìn tham số, mỗi bước huấn luyện tốn một trăm nghìn lượt chạy; với mạng hàng tỷ tham số thì không thể làm nổi.

Lan truyền ngược tránh được điều đó vì nhận ra một cấu trúc: hàm mất mát là hàm hợp của rất nhiều hàm nhỏ xếp nối nhau, và nhiều tham số dùng chung một phần đường đi tới đầu ra. Tính đạo hàm từ đầu ra ngược về, mỗi kết quả trung gian chỉ cần tính một lần và được chia sẻ cho mọi tham số phía trước nó.

Về lịch sử, ý tưởng tính đạo hàm theo chiều ngược của một chuỗi phép tính đã xuất hiện trong công trình về vi phân tự động của Linnainmaa năm 1970 và trong luận án của Werbos năm 1974. Bài báo của Rumelhart, Hinton và Williams trên tạp chí Nature năm 1986 cho thấy phương pháp này huấn luyện được mạng nhiều lớp và làm nó trở nên phổ biến.

Nhắc lại quy tắc dây chuyền bằng một ví dụ một biến

Nếu y phụ thuộc u, và u phụ thuộc x, thì đạo hàm của y theo x bằng đạo hàm của y theo u nhân với đạo hàm của u theo x. Viết gọn: dy/dx = dy/du · du/dx. Mỗi mắt xích chỉ cần biết đạo hàm cục bộ của chính nó.

Ví dụ: y = (3x + 1)², tính tại x = 1. Đặt u = 3x + 1, khi đó u = 4. Đạo hàm cục bộ: dy/du = 2u = 8 và du/dx = 3. Nhân lại: dy/dx = 8 · 3 = 24. Kiểm bằng cách khai triển: y = 9x² + 6x + 1, đạo hàm 18x + 6, tại x = 1 bằng 24. Khớp.

Với mạng nơ-ron, chuỗi dài hơn nhiều: hàm mất mát phụ thuộc đầu ra, đầu ra phụ thuộc lớp cuối, lớp cuối phụ thuộc lớp trước nó, và cứ thế tới trọng số ở lớp đầu. Đạo hàm theo một trọng số ở lớp đầu là tích của một chuỗi dài các đạo hàm cục bộ. Khi một biến ảnh hưởng tới đầu ra qua nhiều đường, quy tắc dây chuyền cộng đóng góp của các đường lại. Lan truyền ngược chỉ là cách tổ chức phép nhân và phép cộng đó cho gọn.

Tính tay trên một mạng hai lớp

Mạng ví dụ: đầu vào x = 2, lớp ẩn một nơ-ron h = ReLU(w1·x), đầu ra p = w2·h, hàm mất mát L = (p − t)² với đáp án t = 1. Trọng số ban đầu là ví dụ giả định: w1 = 0,5 và w2 = 3. Đầu tiên là lượt chạy thuận, sau đó là lượt chạy ngược.

  1. Chạy thuận: z = w1·x = 0,5 · 2 = 1. Vì z dương nên h = ReLU(1) = 1. Đầu ra p = w2·h = 3 · 1 = 3. Mất mát L = (3 − 1)² = 4. Lưu lại z, h, p để dùng ở lượt ngược.
  2. Bắt đầu chạy ngược từ hàm mất mát: dL/dp = 2(p − t) = 2 · 2 = 4.
  3. Đạo hàm theo w2: vì p = w2·h nên dp/dw2 = h = 1, do đó dL/dw2 = 4 · 1 = 4.
  4. Truyền tiếp về lớp ẩn: dp/dh = w2 = 3, nên dL/dh = 4 · 3 = 12. Con số này được dùng lại cho mọi thứ phía trước h, đây là chỗ tiết kiệm của thuật toán.
  5. Qua ReLU: vì z = 1 dương nên đạo hàm của ReLU tại đó bằng 1, do đó dL/dz = 12 · 1 = 12.
  6. Đạo hàm theo w1: vì z = w1·x nên dz/dw1 = x = 2, do đó dL/dw1 = 12 · 2 = 24.
  7. Cập nhật với tốc độ học 0,01: w2 mới = 3 − 0,01 · 4 = 2,96 và w1 mới = 0,5 − 0,01 · 24 = 0,26. Chạy thuận lại: h = 0,52, p = 2,96 · 0,52 = 1,5392, mất mát giảm từ 4 xuống khoảng 0,29.

Thử lại với tốc độ học 0,1 sẽ thấy một bài học khác: w1 mới = 0,5 − 2,4 = −1,9, khi đó z = −3,8, ReLU trả về 0, đầu ra p = 0 và mất mát bằng 1. Tệ hơn, đạo hàm của ReLU ở phía âm bằng 0 nên dL/dw1 từ nay bằng 0, nơ-ron này không học được nữa. Hiện tượng đó có tên là nơ-ron ReLU chết, và tốc độ học quá lớn là một nguyên nhân phổ biến.

Kiểm kết quả bằng sai phân: thói quen nên có

Khi tự viết một lớp mới hay một hàm mất mát mới, cách kiểm lan truyền ngược đúng hay sai là so với sai phân trung tâm: đạo hàm xấp xỉ bằng [L(w + ε) − L(w − ε)] chia cho 2ε, với ε nhỏ. Cách này chậm, chỉ dùng để kiểm chứ không dùng để huấn luyện.

Áp vào ví dụ trên với ε = 0,01 cho w1. Khi w1 = 0,51: h = 1,02, p = 3,06, L = 2,06² = 4,2436. Khi w1 = 0,49: h = 0,98, p = 2,94, L = 1,94² = 3,7636. Hiệu bằng 0,48, chia cho 0,02 được 24. Trùng với kết quả lan truyền ngược. Ở ví dụ này trùng tuyệt đối vì L là hàm bậc hai theo w1 trong vùng đó; với hàm thật, hai con số sẽ lệch nhau rất ít, và người ta so sai số tương đối giữa chúng.

Thư viện học sâu hiện nay tự tính đạo hàm bằng vi phân tự động, nên phần lớn thời gian bạn không phải tự viết lượt ngược. Nhưng khi kết quả huấn luyện bất thường, mất mát không giảm hay trở thành giá trị không xác định, biết cách kiểm gradient bằng sai phân là công cụ chẩn đoán rất đáng tin.

Vì sao gradient teo lại hoặc phình to qua nhiều lớp

Gradient ở lớp đầu là tích của nhiều đạo hàm cục bộ. Tích của nhiều số nhỏ hơn 1 tiến về 0, tích của nhiều số lớn hơn 1 tăng rất nhanh. Bảng dưới minh hoạ với mười lớp, giả sử mỗi lớp nhân gradient với cùng một hệ số:

Hệ số mỗi lớpSau 10 lớpHệ quả
0,25 (đạo hàm lớn nhất của sigmoid)khoảng 0,00000095Lớp đầu gần như không học, gradient teo
0,9khoảng 0,35Giảm nhưng còn dùng được
11Giữ nguyên, lý tưởng
1,5khoảng 57,7Gradient phình to, bước cập nhật quá lớn, huấn luyện mất ổn định

Đây là lý do sigmoid ít được dùng ở lớp ẩn của mạng sâu: đạo hàm của nó không bao giờ vượt quá 0,25. ReLU có đạo hàm bằng 1 ở phía dương nên đỡ teo hơn. Kết nối tắt trong mạng phần dư cộng thẳng đầu vào của khối vào đầu ra, tạo một đường cho gradient đi qua mà không bị nhân với chuỗi hệ số. Chuẩn hoá lớp giữ độ lớn tín hiệu ổn định, còn cắt ngưỡng gradient chặn trường hợp phình to bằng cách thu nhỏ gradient khi độ dài vượt một mức đặt trước.

Từ một trọng số lên cả ma trận: hai công thức cần nhớ

Mạng thật không có từng trọng số lẻ mà có cả ma trận. Với một lớp tuyến tính y = W·x, giả sử đã biết gradient của hàm mất mát theo đầu ra, gọi là vector g. Khi đó có hai công thức. Thứ nhất, gradient theo ma trận trọng số W là tích ngoài của g với x: phần tử ở hàng i, cột j bằng g thứ i nhân x thứ j. Thứ hai, gradient theo đầu vào x, thứ được chuyển ngược cho lớp phía trước, bằng ma trận chuyển vị của W nhân với g.

Ví dụ giả định: W có hàng một là (0,5; −1), hàng hai là (1; 1), đầu vào x = (1; 2), và gradient theo đầu ra g = (1; −1). Gradient theo W có hàng một là (1·1; 1·2) = (1; 2), hàng hai là (−1·1; −1·2) = (−1; −2). Gradient theo x là W chuyển vị nhân g: thành phần thứ nhất 0,5·1 + 1·(−1) = −0,5, thành phần thứ hai (−1)·1 + 1·(−1) = −2, tức (−0,5; −2).

Hai công thức này giải thích vì sao lượt ngược tốn chi phí cùng cỡ với lượt thuận: lượt thuận có một phép nhân ma trận mỗi lớp, lượt ngược có hai, một cho trọng số, một cho đầu vào. Nó cũng giải thích một thói quen khi đọc mã nguồn: thấy ma trận chuyển vị xuất hiện trong phần tính gradient là chuyện bình thường, đó chính là tín hiệu lỗi đang được chuyển ngược về lớp trước.

Học lan truyền ngược với sự trợ giúp của AI

Lan truyền ngược là chủ đề mà chatbot giải thích khá tốt về ý, nhưng hay nhầm chỉ số và dấu khi tính cụ thể. Cách học an toàn:

  • Tự vẽ đồ thị tính toán cho một mạng nhỏ trên giấy: mỗi nút là một phép tính, mỗi cạnh là một giá trị.
  • Tự tính một lượt thuận và một lượt ngược với số cụ thể như ví dụ trên, rồi mới hỏi chatbot để đối chiếu.
  • Dùng câu lệnh kiểu: “Cho mạng h = ReLU(w1·x), p = w2·h, L = (p − t)². Chỉ nêu các đạo hàm cục bộ cần dùng, không tính ra số, để người học tự ghép.”
  • Viết một đoạn mã nhỏ kiểm gradient bằng sai phân cho chính mạng đó, xem kết quả có khớp không.
  • Hỏi thêm: “Nếu thêm hàm sigmoid ở đầu ra thì chuỗi đạo hàm đổi ra sao?” rồi tự tính lại trước khi đọc câu trả lời.

Nếu chatbot đưa ra con số khác bạn, đừng vội tin bên nào. Kiểm bằng sai phân là trọng tài khách quan nhất, vì nó chỉ dựa vào việc chạy thuận, thứ mà ai cũng tính được chắc chắn.

Câu hỏi thường gặp

Lan truyền ngược và gradient descent có phải là một không?

Không. Lan truyền ngược là cách tính gradient của hàm mất mát theo các trọng số. Gradient descent là cách dùng gradient đó để cập nhật trọng số. Hai thứ hay đi cùng nhau nên dễ bị gọi lẫn, nhưng bạn có thể dùng gradient tính bằng lan truyền ngược cho những thuật toán tối ưu khác như Adam.

Vì sao gọi là lan truyền ngược?

Vì đạo hàm được tính bắt đầu từ hàm mất mát ở cuối mạng, rồi đi ngược từng lớp về phía đầu vào, ngược chiều với dữ liệu khi chạy thuận. Mỗi lớp nhận đạo hàm theo đầu ra của nó từ lớp phía sau, tính đạo hàm theo trọng số của mình, rồi chuyển đạo hàm theo đầu vào cho lớp phía trước.

Lan truyền ngược tốn bao nhiêu bộ nhớ?

Nó cần giữ lại các giá trị trung gian của lượt chạy thuận để dùng trong lượt ngược, nên bộ nhớ tăng theo số lớp và kích thước lô. Đây là lý do huấn luyện tốn bộ nhớ hơn nhiều so với chỉ chạy mô hình. Có kỹ thuật lưu một phần rồi tính lại phần còn lại khi cần, đổi thêm thời gian lấy bớt bộ nhớ.

ReLU không có đạo hàm tại 0 thì lan truyền ngược xử lý thế nào?

Trên thực tế, thư viện quy ước đạo hàm tại 0 bằng 0 hoặc bằng 1. Vì xác suất để tổng có trọng số đúng bằng 0 tuyệt đối là rất nhỏ với số thực, quy ước này gần như không ảnh hưởng tới kết quả huấn luyện.

Não người có học bằng lan truyền ngược không?

Chưa có bằng chứng cho thấy não dùng lan truyền ngược theo đúng cách mạng nhân tạo làm, vì cơ chế đó đòi hỏi truyền tín hiệu lỗi chính xác ngược qua cùng các kết nối. Đây là chủ đề nghiên cứu còn mở; các nhà khoa học đề xuất nhiều cơ chế khác có thể xấp xỉ nó, nhưng chưa có kết luận.

Có cần học lan truyền ngược nếu chỉ dùng mô hình có sẵn?

Nếu chỉ gọi mô hình đã huấn luyện thì không bắt buộc. Nếu bạn tinh chỉnh mô hình, đọc nhật ký huấn luyện hay chẩn đoán vì sao mất mát không giảm, hiểu lan truyền ngược giúp đoán nguyên nhân nhanh hơn nhiều: tốc độ học, hàm kích hoạt, khởi tạo trọng số hay dữ liệu.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
Gọi ngay 0926 138 138