Backpropagation in Translation
Lan truyền ngược: Google Translate học từ mỗi câu sai
Công ty nào đang ứng dụng Lan truyền ngược?
Bạn gõ “Xin chào” vào Google Translate và ngay lập tức nhận được “Hello”. Đằng sau khoảnh khắc đó là hàng triệu cặp câu Anh-Việt mà mô hình đã nhìn qua trong lúc huấn luyện. Mỗi cặp là một cơ hội mắc lỗi, và mỗi lỗi là một lần thuật toán lan truyền ngược đi đánh dấu lại hàng triệu trọng số bên trong mạng nơ-ron.
Bài này cho bạn theo dõi đúng một cặp câu đi từ đầu vào đến đầu ra, xem mô hình dự đoán sai chỗ nào, rồi nhìn gradient (mũi tên sửa lỗi) chảy ngược qua từng lớp. Sau khi cập nhật, cùng cặp câu đó sẽ cho kết quả tốt hơn một chút. Nhân chuyện nhỏ đó lên hàng tỉ lần thì ra hệ thống Google Translate.
Nguồn (EN)
“I love you”
Đích (VI)
“Tôi yêu bạn”
Mạng nơ-ron 16 lớp (8 encoder + 8 decoder) lần đầu tiên có thể dịch cả câu trọn vẹn thay vì dịch từng cụm rời rạc. Toàn bộ mạng đó được huấn luyện bằng một thuật toán duy nhất: lan truyền ngược.
Vấn đề công ty cần giải quyết
Trước năm 2016, Google Translate ghép từng cụm từ lại với nhau theo phương pháp thống kê. Bản dịch thường đứt gãy giữa câu, mất ngữ cảnh, và đặc biệt kém với cặp ngôn ngữ xa nhau như Anh-Việt. Giải pháp hiển nhiên: một mạng nơ-ron 16 lớp đọc toàn bộ câu nguồn, rồi sinh ra câu đích trọn vẹn.
Nhưng mạng đó có hàng trăm triệu trọng số. Không ai chỉnh tay được. Cần một thuật toán tự động: nhìn vào lỗi dịch ở đầu ra, rồi quay ngược về từng trọng số và nói chính xác nó phải nhích bao nhiêu theo hướng nào. Thuật toán đó chính là lan truyền ngược.
16 lớp sâu
8 lớp encoder LSTM + 8 lớp decoder LSTM, mỗi lớp 1.024 nút. Gradient phải chảy ngược qua tất cả mà không bị triệt tiêu.
Hàng trăm triệu trọng số
Không thể thử từng trọng số một. Cần một thuật toán tính gradient cho tất cả cùng lúc trong một lần duyệt ngược.
36 triệu cặp câu
Mỗi cặp là một bước học. Cần vòng lặp forward-loss-backward-update chạy ổn định hàng tỉ lần không phân kỳ.
Cách Lan truyền ngược giải quyết vấn đề
Chọn một cặp câu từ dữ liệu.Hệ thống bốc ngẫu nhiên một cặp (câu nguồn, câu đích) từ kho 36 triệu cặp song ngữ. Câu nguồn đi vào encoder, câu đích giữ lại làm “đáp án”. Lúc này mô hình chưa biết câu đích, nó phải tự đoán.
Forward: encoder nén câu nguồn, decoder sinh câu đích. 8 lớp LSTM encoder đọc “I love you” rồi nén thành một chuỗi vector ngữ nghĩa. 8 lớp LSTM decoder lần lượt sinh ra từng token của câu đích. Tại mỗi bước, decoder cho ra phân phối xác suất trên toàn bộ từ vựng tiếng Việt.
Loss: so với bản dịch đúng.Token do mô hình dự đoán được so với token đúng bằng cross-entropy. Nếu mô hình tự tin sai (ví dụ đẩy “em” lên 0.7 thay vì “bạn”), loss lớn. Loss của câu = tổng loss trên tất cả các token của câu đích.
Backward: gradient chảy ngược qua 16 lớp.Bắt đầu từ loss, thuật toán backprop đi ngược qua softmax head, decoder (lớp cao xuống lớp thấp), attention, rồi encoder. Mỗi trọng số nhận về một con số: “bạn đang đóng góp bao nhiêu vào lỗi này?”. Kết nối tắt (residual) giữ gradient không bị triệt tiêu khi qua nhiều lớp.
Update: trọng số nhích theo gradient. Mỗi trọng số w được cập nhật bằng công thức đơn giản: trừ đi tốc độ học nhân với gradient. Lớp softmax head và decoder cao (gần đầu ra) thường nhận chỉnh sửa mạnh nhất vì gần loss. Lớp encoder thấp (gần đầu vào) chỉnh nhẹ. Gradient được cắt ngưỡng ở 5,0 để tránh bùng nổ.
Thử nghiệm: chọn một cặp câu, xem mô hình sai chỗ nào
Đây là một mô hình rút gọn. Phân phối xác suất là minh họa, nhưng logic loss-gradient-update đúng như trong GNMT thật.
Nguồn (EN)
“I love you”
câu tiếng Anh đầu vào
Mô hình dự đoán
“Tôi yêu em”
weights hiện tại chưa hoàn hảo
Đáp án đúng (con người viết)
“Tôi yêu bạn”
Phân phối xác suất cho token đầu tiên
Tại mỗi bước, decoder cho ra một xác suất trên toàn bộ từ vựng tiếng Việt. Dưới đây là top-4 ứng viên cho token mở đầu.
Tôiđúng chủ ngữ
72%đang chọn
Anhcũng hợp nhưng lệch
14%Emlệch ngôi
8%Mìnhthân mật, sai ngữ cảnh
6%Sai nhẹLoss cho cặp câu này: 0.34
Token đầu đã đúng (Tôi). Token thứ hai sai nhẹ (em thay vì bạn). Loss trung bình thấp.
Bấm “Chạy một bước” để thấy gradient chảy ngược qua các lớp. Mỗi lớp nhận một “liều chỉnh sửa” khác nhau, lớp gần đầu ra nhận mạnh hơn.
Bên trong một bước huấn luyện: bốn pha không bao giờ đổi
Bấm “Tiếp tục” để theo dõi cặp câu “I love you” đi hết vòng lặp.
1 · Forward: sinh bản dịch tạmForward: encoder nén, decoder sinh
Câu 'I love you' được tách thành ba wordpiece. 8 lớp LSTM encoder đọc lần lượt, tạo ra ba vector ngữ cảnh. 8 lớp LSTM decoder bắt đầu sinh token tiếng Việt: đầu tiên là 'Tôi' (xác suất 0.72, đúng), sau đó là 'yêu' (đúng), rồi 'em' (xác suất 0.51, SAI, nên là 'bạn').
Google huấn luyện GNMT không dùng từng cặp câu một, mà gộp 32 cặp thành MỘT mini-batch rồi backprop trung bình gradient. Lợi ích chính của cách này là gì?
Gradient không phân phối đều: lớp nào nhận nhiều chỉnh sửa nhất?
Cùng cặp câu bạn đang xem, các lớp khác nhau nhận các mức “liều chỉnh” khác nhau. Lớp gần output (nơi loss phát sinh) thường nhận gradient lớn, lớp gần input thường nhận gradient nhỏ. Đó là lý do mạng sâu không kết nối tắt dễ bị “biến mất gradient” ở lớp thấp.
Embedding
chỉnh nhẹ nhúng của 'you'
0.08Encoder L1-L4
lớp thấp bắt cú pháp, ít sai
0.12Encoder L5-L8
lớp cao giữ ngữ nghĩa tình cảm
0.24Attention
0.55phải học nối 'you' với 'bạn' thay vì 'em'
0.55Decoder L1-L4
0.38sinh từ sai, gradient mạnh vào đây
0.38Decoder L5-L8
0.62lớp gần output nhận chỉnh sửa lớn nhất
0.62Softmax head
0.81phải đẩy xác suất 'bạn' lên, 'em' xuống
0.81Mẫu hình chung: softmax head > decoder cao > attention > decoder thấp > encoder cao > encoder thấp > embedding. Lớp gần đầu ra gần loss hơn → gradient ít bị nhân với nhiều đạo hàm cục bộ → ít bị suy giảm.
- Bốn điều cần nhớ về backprop trong dịch máy
- Mỗi cặp câu Anh-Việt là một bài học: forward sinh dự đoán, loss đo sai, backward trôi ngược, update nhích weights.
- Gradient của lớp gần output thường lớn, lớp gần input nhỏ. Kết nối tắt giữ gradient không bị triệt tiêu khi qua 16 lớp.
- Mini-batch 32 cặp câu khử nhiễu gradient, tận dụng GPU song song. Cân bằng giữa ổn định và tốc độ.
- Không có backprop, không có Google Translate như hôm nay: 36 triệu cặp câu × hàng trăm triệu trọng số không thể chỉnh tay.
Trở lại lý thuyếtMuốn hiểu tại sao chain rule lại tính được gradient cho hàng triệu trọng số trong một lần duyệt ngược, quay về bài Lan truyền ngược.
Con số thật
- Giảm 60% lỗi dịch so với dịch thống kê (đánh giá bởi con người) [1]
- 26,30 BLEU trên WMT'14 Anh→Đức và 41,16 BLEU trên Anh→Pháp [1]
- Mô hình lai Transformer-RNN (2020) cải thiện +5 BLEU trung bình trên hơn 100 ngôn ngữ [3]
- Huấn luyện trên 96 GPU NVIDIA K80 trong khoảng 6 ngày, gradient được cắt ngưỡng 5,0 [1]
Nếu không có Lan truyền ngược, app sẽ ra sao?
Nếu không có lan truyền ngược, không có cách nào tính gradient qua 16 lớp LSTM với hàng trăm triệu trọng số. Google sẽ phải tiếp tục dùng dịch thống kê, với lỗi dịch cao hơn 60% và bản dịch đứt gãy giữa câu.
Hơn 500 triệu người dùng Google Translate mỗi ngày sẽ nhận bản dịch kém hơn đáng kể. Học sinh làm bài tập, khách du lịch đọc thực đơn, bác sĩ đọc hồ sơ bệnh nhân nước ngoài: tất cả đều nhận một trải nghiệm tệ hơn rất nhiều.
Bài học rút ra: sức mạnh của backprop không nằm ở một cặp câu đơn lẻ. Mỗi lần lan truyền ngược chỉ chỉnh weights một chút xíu. Nhưng lặp lại hàng tỉ lần trên 36 triệu cặp câu, mô hình học được cấu trúc ngữ pháp, kính ngữ, cách dịch thành ngữ, và cả sắc thái văn hóa. Đó là phép màu của thuật toán: đơn giản mỗi bước, kỳ diệu khi nhân lên.