Blog Đông Tác

Nguyễn Chí Công, CFLS

Trang nhà > Công nghệ > Ứng dụng > Machine Translation (2)

ThS Lê Văn Lợi

Machine Translation (2)

Thứ Sáu 28, Tháng Năm 2021, bởi Lê Văn Lợi

Ngày 28/04/2006, Google cho ra mắt phần mềm dịch máy SMT. Bài báo đấy ở đây.

Chắc nhiều bạn, cũng giống như tôi, rất háo hức và “thần phục” phần mềm dịch máy của Google. Các đoạn văn mang tính ngoại giao quốc tế thì Google dịch cực hay. Tuy nhiên, khi tôi dịch một vài câu thông thường thì phần mềm này dịch khá lủng củng, thậm chí có vài trường hợp vô nghĩa. Hồi đó tôi chưa rõ lý do. Sau này khi tìm hiểu thêm thì hóa ra lý do là do phần mềm này được huấn luyện từ các “học liệu” lấy từ các bản dịch ở Liên hợp quốc!

ⓓ Dịch máy bằng mạng nơ-ron

Dịch máy bằng mạng nơ-ron (Neural Machine Translation - NMT) đứng trên vai của dịch máy “từng cụm từ một” (Phrase-based SMT). Nghĩa là NMT chạy tiếp sức từ Phrase-based SMT. Do đó, NMT không có phát kiến mới. Tuy nhiên, NMT có cách tiếp cận khác biệt. Đại ý, có thể khái quát như sau:
câu nguồn → [context] → câu đích

Nghĩa là:

  • Bước 1: Câu nguồn được “mã hóa” thành context. Có thể hiểu context là một cách mã hóa các đặc tính (feature) của câu nguồn. Context không có gì bí hiểm cả: dưới góc độ của dân lập trình thì context là một vector hoặc ma trận số thực!
  • Bước 2: Phát sinh ra câu đích từ việc giải mã context!

Trước khi có thể dịch được, người ta phải huấn luyện (training) mạng nơ-ron. Dữ liệu dùng để huấn luyện được lấy từ kho ngữ liệu song ngữ (là các bản song ngữ đã được dịch). SMT huấn luyện bằng cách thống kê từ, cụm từ. Còn NMT huấn luyện mạng nơ-ron theo cách của Machine Learning: nguyên liệu đầu vào là câu nguồn, câu đích (không tách thành cụm từ). Mạng nơ-ron “học” dịch qua các cặp này và “chiết xuất” ra context!

Cách tiếp cận này làm chúng ta nhớ lại cách tiếp cận của dịch qua liên ngữ:
câu nguồnbiểu diễn interlinguacâu đích.

Biểu diễn qua interlinga trong trường hợp này chính là context.

Dưới góc độ truyền tin, chúng ta có thể hiểu dịch máy là bộ encoder-decoder: đầu vào (câu nguồn) được mã hóa (encode), và đầu ra (câu đích) là kết quả của giải mã (decode).

Tôi xin lược qua sự tiến hóa của NMT theo thời gian, căn cứ vào thời gian xuất hiện các bài báo khoa học. Anh/chị nào ngại đi sâu vào chi tiết kỹ thuật, xin bỏ qua phần sau.

- ① Mô hình Seq2Seq (Sequence-to-Sequence)

Theo quan sát của tôi thì bài báo đầu tiên đề xuất mô hình chuyển đổi một chuỗi từ này (câu nguồn) thành một chuỗi từ khác (câu đích) là bài này (đăng tháng 6/2014). Cả đầu vào và đầu ra họ đều sử dụng mạng RNN (RNN: Recurrent Neural Networks – mạng Nơ-ron đệ quy). Chúng ta có thể hiểu RNN là mạng nơ-ron tuần tự cũng được. Ví dụ, nếu dịch chuỗi a, b, c, d thành chuỗi x, y, z và context là vector có 5 phần tử, một cách trực quan, chúng ta có thể hình dung như sau:

  • ⓐ→ⓑ→ⓒ→ⓓ→
  • [0.1, -1.9, 0.7, 1.2, -0.5]
  • →ⓧ→ⓨ→ⓩ
  • Encoder (RNN)
  • Context (vector)
  • Decoder (RNN)

Trong mô hình trên, context được tạo ra từ lớp ẩn (hidden layer) của Encoder RNN!

Thế người ta tạo câu đích bằng cách nào? Do sử dụng RNN nên decoder tạo câu đích “từng từ một”. Từ tiếp theo là kết quả của hàm số có tham số là context, lớp ẩn và dãy các từ đã sinh ra trước đó. Giả thiết câu đích có n từ, ký hiệu là y1, y2, …, yn thì decoder sẽ tạo ra đầu tiên là y1, tiếp đến y1, y2, tiếp đến y1, y2, y3, … và cuối cùng là y1, y2, …, yn.

Đến tháng 9/2014, một bài báo khác đề xuất mô hình tương tự.

  • ⓓ→ⓒ→ⓑ→ⓐ→
  • [0.1, -1.9, 0.7, 1.2, -0.5]
  • →ⓧ→ⓨ→ⓩ
  • Encoder (LSTM)
  • Context (vector)
  • Decoder (LSTM)

Trong đề xuất này, họ thay RNN bằng LSTM (Long Short-Term Memory). LSTM là một dạng đặc biệt của RNN. Họ sử dụng LSTM 4 lớp và đảo thứ tự chuỗi đầu vào (xem hình minh họa ở trên). Context trong trường hợp này được phát sinh từ lớp ẩn cuối của LSTM.

Theo bài báo, chưa cần tinh chỉnh, đề xuất của họ đã cho chất lượng dịch tốt hơn SMT! Nghĩa là điểm BLEU của họ cao hơn điểm BLEU của SMT.

- ② Mô hình Seq2Seq kết hợp với Attention

Cũng trong khoảng thời gian này, có một đề xuất kết hợp mô hình Seq2Seq với một cơ chế có tên gọi là Attention (tạm dịch là cơ chế chú ý).

  • ⓐ→ⓑ→ⓒ→ⓓ
  • ⓐ←ⓑ←ⓒ←ⓓ
  • [0.85, 0.05, 0.02, 0.00]
  • [0.01, 0.90, 0.90, 0.02]
  • [0.01, 0.02, 0.01, 0.90]
  • →ⓧ→ⓨ→ⓩ
  • Encoder (BiRNN)
  • Context (matrix nxm)
  • Decoder (RNN)

Qua hình vẽ minh họa ở trên:

  • Encoder: là mạng RNN 2 chiều (BiRNN). Nghĩa là: đầu vào là tổ hợp của chuỗi xuôi (đúng thứ tự câu nguồn) ghép với chuỗi ngược (đảo thứ tự câu nguồn). (Xem minh họa ở trên.)
  • Context: là một ma trận nxm trong đó n là số từ của câu đích và m là số từ của câu nguồn. Mỗi một từ trong câu đích sử dụng một vector context riêng. Tuy là vector context riêng nhưng đó là kết quả mã hóa của toàn bộ câu nguồn!
  • Decoder: là mạng RNN.

Điểm đáng chú ý của mô hình này là: ngoài việc “suy diễn” ra từ đích (trong câu đích), người ta còn dóng (align):
từ đíchtừ nguồn

Cơ chế Attention là một đột phá trong Machine Learning. (Cơ chế Attention còn được ứng dụng sang nhiều lĩnh vực khác của Machine Learning).

💡 Luận bàn thêm về cách tạo ra cơ chế “Attention”. Để hiểu được chính xác, mời bạn đọc bài báo tôi đã dẫn ở trên. Ở đây tôi chỉ diễn đạt vấn đề một cách nôm na. Ý tưởng của “Attention” là mỗi từ đích chỉ “chú ý” đến một số từ của câu nguồn. Biết thế, nhưng làm cách nào để biết được “từ” được chú ý là “từ” nào? Nếu bạn nhớ lại cách mà Word2Vec đo độ “similarity” của các từ thì lần này “Attention” tìm cách đo “mối tương quan” của từ đích với tất cả các từ nguồn. Ví dụ, khi huấn luyện mạng, trong 100 lần xuất hiện từ đích “x” thì từ nguồn “a” xuất hiện 85 lần, từ nguồn “b” xuất hiện 10 lần, từ nguồn “c” xuất hiện 5 lần, còn từ nguồn “d” không xuất hiện lần nào. Căn cứ vào mối tương quan này người ta sẽ dóng từ đích “x” với từ nguồn “a”. Logic, đúng không ạ?! Vì sao? Vì từ đích “x” rõ ràng là “chú ý” đến từ nguồn “a” nhiều nhất (vì “mối tương quan” là 85/100 lớn nhất so với 10/100, 5/100, 0/100).

Câu hỏi tiếp theo được đặt ra là: làm thế nào để đo được “mối tương quan” như đề cập ở trên? Cách mà người ta thực hiện là: đưa ra công thức tính trọng số mối tương quan, lấy các trọng số này từ việc huấn luyện một mô hình khác, cùng huấn luyện đồng thời, đặt bên cạnh bộ Encoder-Decoder và được đặt tên là “alignment model” (tạm dịch là mô hình dóng hàng).

Vậy “alignment model” có gì đặc biệt không? Mô hình này là một mạng nơ-ron thông thường (feed-forward network), có duy nhất 1 lớp ẩn, lấy softmax là hàm đầu ra – có thể hiểu là cách đánh giá “mối tương quan” của “từ đầu ra” (output word) so với với tất cả các “từ đầu vào” (input word). Sau đó, bộ Encoder-Decoder sẽ dóng (align) “từ đầu ra” với “từ đầu vào” nào tương ứng với giá trị softmax lớn nhất.

- ③ Mô hình GNMT của Google

Một trong những vấn đề của NMT là từ vựng (vocabulary). Vấn đề là, khi huấn luyện người ta thu được một lượng từ vựng từ các kho ngữ liệu song ngữ (bitext). Như vậy, lượng từ vựng đó là do kho ngữ liệu cung cấp, gọi là từ vựng “phổ thông”. NMT sẽ ứng xử thế nào khi gặp một từ không nằm trong kho từ vựng đã biết (OOV: out-of-vocabulary)? Để đưa vào ứng dụng thực tế, phải có một cách nào đó ứng xử trường hợp này.

Một trường hợp nữa tương tự như OOV, là câu nguồn chứa “tên riêng”, “con số” và “ngày tháng năm”. Làm thế nào để dịch “tên riêng”, “con số”, “ngày tháng năm” từ câu nguồn sang câu đích? Sao chép y nguyên từ nguồn sang đích chăng? Không hẳn là ổn. Ví dụ chúng ta thường dịch France → Pháp, Moscow → Mạc Tư Khoa. Như vậy, tên riêng vẫn phải dịch, không đơn thuần sao chép sang. Ví dụ nữa: số trong tiếng Anh là 32,500 - trong tiếng Việt chúng ta lại ghi là 32.500. Vậy là con số, trong một số trường hợp, vẫn phải dịch. Ngày tháng cũng vậy. Trong tiếng Anh (Mỹ) nếu họ đề 9/11 thì chúng ta hiểu đó là ngày 11 tháng 9.

Ngày 27/09/2016, Google ra thông báo về phần mềm dịch máy trên nền tảng NMT có tên gọi là GNMT: Google Neural Machine Translation system. Thông báo đấy ở đây (trước đó Google đã đăng bài báo khoa học về vấn đề này). Như vậy, 10 năm sau khi ứng dụng SMT, Google đã thay dịch máy bằng NMT.

Theo bài báo của Google, thì công nghệ dịch của GNMT dựa trên ý tưởng chính là phối hợp EncoderRNN-DecoderRNN với cơ chế Attention. Cơ chế Attention gần như giữ nguyên bản gốc, còn Encoder và Decoder thì được tăng cường bằng cách tăng số lớp LSTM thành 8, sử dụng GPU + tính toán song song.

Để đối phó với vấn đề OOV, Google đã chọn cách chia từ thành từng mảnh bé hơn (wordpiece). Như vậy, “từ” không còn là đơn vị bé nhất mà các “mảnh từ” mới là đơn vị bé nhất. Chú ý rằng cách tách từ thành “mảnh từ” khác với cách tách từ thành tổ hợp của các ký tự. Nếu người ta tổ hợp đủ tất cả các “mảnh từ” có thể có, thì sẽ không xảy ra trường hợp OOV.

Cũng phải nói thêm, để ra được GNMT, Google đã tổ hợp rất nhiều công trình nghiên cứu trước đó. Trên đây tôi chỉ điểm sơ lược vài điểm tôi cho là “hấp dẫn” 😊.

💡 Mô hình “Transformer”. Đến tháng 6/2017, Vaswani et al đề xuất một mô hình mới có tên là “Transformer” (Attention Is All You Need). Mô hình này chỉ dùng cơ chế “Attention”, không dùng mạng RNN. Thay vì cho từng từ của câu nguồn lần lượt qua RNN (cần đến n nhịp nếu câu nguồn có n từ), mô hình này mã hóa toàn bộ các từ của câu nguồn thành 1 véc-tơ kèm với việc mã hóa thứ tự của từng từ và chỉ cần một nhịp là “Transformer” nhận hết toàn bộ câu nguồn (đầu vào). Tương tự như vậy, chỉ với một nhịp, “Transformer” cho kết quả đầu ra: toàn bộ các từ của câu đích kèm với mã hóa số thứ tự của từng từ trong câu. Với cách làm này mô hình rút ngắn thời gian huấn luyện cũng như rút ngắn thời gian cho kết quả đầu ra. “Transformer” còn có nhiều chi tiết tổng quát hóa cơ chế “Attention” nhưng tôi xin phép không đi sâu. Theo bài báo, với cùng tập dữ liệu thử nghiệm như các mô hình khác, “Transformer” cho kết quả chấm điểm BLEU tốt nhất.

║ Ngoài lề: mô hình “Transformer” có ảnh hưởng khá lớn trong Machine Learning.

Vậy Google có cập nhật theo mô hình “Transformer” không? Tôi thấy vào tháng 6/2020, Google có bài nói đến việc cập nhật GNMT. Trong bài này, họ nhận thấy “Transformer” có phần mã hóa đầu vào (Encoder) tốt hơn nhưng phần giải mã (Decoder) thì không tốt hơn bộ giải mã của RNN. Vì vậy, họ chỉ tích hợp phần mã hóa đầu vào (Encoder) của “Transformer”, còn phần giải mã (Decoder) thì họ giữ nguyên mô hình RNN.

Cũng xin nói rõ thêm với bạn, vì tôi “mê” Google nên tôi thường lấy Google ra làm ví dụ, và thậm chí là “thước đo” các tiến bộ trong dịch máy. Trên thực tế còn nhiều các “đại ca” khác về dịch máy. Lấy ví dụ như Bing của Microsoft. Hình như Bing sử dụng cùng công nghệ với Google Translate thì phải. Bây giờ mời bạn đưa văn bản vào phần tiếng Anh là “Nguyen Ngoc Binh” và bạn dịch ra tiếng Việt thì cả Google Translate và Bing Translator đều cho kết quả là “Nguyễn Ngọc Bình” với đầy đủ dấu tiếng Việt. Kể ra các phần mềm này thông minh đấy chứ nhỉ!? 😊

Để có một danh sách đầy đủ các website dịch máy trực tuyến thì chỉ cần mở Google Search và click … Và bạn có thể ngạc nhiên là sao có nhiều phần mềm dịch máy đến như vậy.

Thế mới thấy tác dụng của văn hóa mở (openess) và khoảng cách giữa nghiên cứu (research) và ứng dụng thực tế (application) được rút ngắn đến kinh ngạc.

ⓔ Dịch máy còn gì chưa ổn?

Dịch máy đạt đến như NMT có vẻ như “rất tuyệt vời”. Câu hỏi đặt ra là “máy dịch” liệu có thể đạt hoặc vượt “người dịch”? Câu trả lời ngắn là “Không”. Câu trả lời ngắn, thận trọng hơn là “Chưa”.

Trước khi trả lời dài hơn, chúng ta cùng điểm lại cái “trí tuệ” của SMT và NMT nằm ở đâu? “Trí tuệ” của SMT lẫn NMT đều nằm ở kho ngữ liệu song ngữ bitext. Ai tạo ra kho ngữ liệu song ngữ bitext: con người – các thông dịch viên, biên dịch viên chuyên nghiệp.

Câu trả lời dài: máy dịch chưa đáng tin cậy (100%), chưa dịch theo bối cảnh và máy dịch chưa có hiểu biết thường thức.

- ① Độ tin cậy (reliability)

Câu hỏi của độ tin cậy là: dịch thế đã đúng chưa? Cả SMT lẫn NMT đều “không chắc” câu dịch đúng hay không đúng. Nghĩa là trong trường hợp dịch sai thì máy cũng không biết là mình đã dịch sai. Có 2 điểm “không chắc”:

  • Máy chỉ xác định kết quả dựa trên xác suất. Ví dụ kết quả có xác suất 99% là đúng. Chuyện gì xảy ra nếu kết quả rơi vào 1% còn lại?
  • Chúng ta không thể khẳng định kho ngữ liệu chứa 100% câu dịch đúng. (Sai sót là chuyện thường tình của con người.) Mà máy dịch phải dựa vào kho ngữ liệu này nên độ tin cậy của dịch máy phải dựa vào độ tin cậy của kho ngữ liệu.

- ② Đặt trong bối cảnh (context)

Chú ý rằng, cả SMT lẫn NMT đều “dịch từng câu một”. Nghĩa là, câu sau không hề có bất cứ một mối liên hệ nào với các câu trước đó.

Gần đây xuất hiện một số nghiên cứu đặt câu dịch trong context của toàn bộ tài liệu. Tuy nhiên, hình như các nghiên cứu này chưa đưa được vào thực tế.

- ③ Hiểu biết thường thức (common sense)

“Hiểu biết thường thức” ở đây là kiến thức “đa số đều biết” nhưng không nằm trong văn bản của tài liệu nguồn. Tôi xin lấy một ví dụ: giới trẻ biết “metal” là một dòng nhạc rốc, vì vậy nên nếu trong tiếng Anh câu “I’m a huge metal fan!” có thể hiểu là “Tôi là người rất hâm mộ dòng nhạc metal!”. Tuy nhiên, nếu chúng ta dịch câu đó bằng Google Translate thì được “Tôi là một người hâm mộ kim loại lớn!” Còn nếu chúng ta dịch bằng Bing Translator thì được “Tôi là một fan hâm mộ kim loại khổng lồ!”. 😊 Chứng tỏ vẫn là “máy”, đúng không bạn?

(xem phần trước)