Machine Translation với thuật toán Attention trong Deep Learning

422
Thuật toán Attention trong Deep Learning

Giới thiệu

Bài toán dịch ngôn ngữ là 1 bài toán khá hay. Hôm nay, mình sẽ hướng dẫn chi tiết và code lại thuật toán Attention trong Deep learning cho dạng bài toán Sequence to sequence (Seq2Seq). Trong bài hướng dẫn này mình sẽ code một Machine Translation có chức năng dịch ngôn ngữ Anh -> Việt.

Với mục đích hiểu sâu hơn về thuật toán, sản phẩm được code trên Tensorflow 2.0 thay vì Keras (code với Keras đơn giản hơn rất nhiều nhưng khó hiểu sâu).

Kiến thức nền tảng:
  Các thuật toán sắp xếp lập trình viên phải biết
  5 cách mà Deep Learning ảnh hưởng đến cuộc sống của bạn

Encode-Decode

Trước đây, bài toán Seq2Seq được giải quyết chủ yếu bằng các mô hình Deep learning. Tuy chất lượng không so được với con người nhưng các Deep learning vẫn cho chất lượng hơn hẳn các thuật toán truyền thống.

Dạng mô hình được sử dụng phổ biến (trước đây) trong bài toán này có dạng encoder-decoder như hình minh họa dưới đây:Thuật toán Attention trong Deep Learning

Mô hình gồm 2 phần encode và decode. Giả sử dịch câu A tiếng Anh thành câu A’ tiếng Việt. Encoder đọc và mã hóa (encode) thông tin câu A thành 1 context vector. Thông thường context vector này chính là hidden state cuối cùng của encode.

Về mặt ý nghĩa, context vector cần đảm bảo chứa đủ các thông tin ngữ cảnh (chủ ngữ, vị ngữ, tính từ, trạng thái, tính chất) chuỗi A. Decoder nhận context vector làm input, giải mã (decode) thành chuỗi A’.

Có thể dễ dàng thấy mô hình encode-decode có nhược điểm: input của decoder chỉ là 1 vector duy nhất, điều đó có nghĩa rằng kết quả decode phụ thuộc quá nhiều vào 1 context vector.

Đặc biệt khi input là chuỗi dài, thông tin có thể mất mát trong quá trình lan truyền, context vector không còn chứa đủ thông tin cần thiết để decode. Attention ra đời nhằm khắc phục nhược điểm đó.

Thuật toán Attention trong Deep Learning

Ý tưởng của thuật toán Attention trong Deep Learning: thay vì chỉ sử dụng 1 context vector duy nhất (last state), decoder có thể đọc thông tin từ tất cả hidden state trong encode cho mỗi lần predict. Hãy quan sát 2 câu sau:

  • This is a book
  • Đó là một quyển sách

Có thể thấy sự tương ứng giữa các từ ngữ giữa 2 câu: “this”-“đó” , “book”-“quyển sách”. Như vậy việc dịch ra “quyển sách” sẽ phụ thuộc vào “book” hơn là “this”, “is” hay “a”.Thuật toán Attention trong Deep LearningÝ tưởng cốt lõi của Attention:

  • Thay vì sử dụng context vector duy nhất 1 lần tại input của decode, ta sử dụng mỗi context vector riêng biệt cho từng lần predict ra từ kế tiếp.
  • Mỗi context vector được tổng hợp có trọng số từ tất cả các hidden state trong encode.

Chi tiết thuật toán

Thuật toán Attention trong Deep Learning Câu cần dịch: Rahul is a good boy.

  • B1: Sau encode, ta thu được 5 hidden state H = [h1, h2, h3, h4, h5], trong đó h5 được chọn làm decode_hidden_state cho decode => decode_input = (H, h5)
  • B2: H và h5 được đưa vào 2 Neural network tương ứng, sau đó sum lại với nhau thu được S = [s1, s2, s3, s4, s5]
  • B3: Đưa S vào softmax, thu được E = [e1,e2,e3,e4,e5] -> trọng số tương ứng cho [h1, h2, h3. h4, h5]
  • B4: Tính context vector CV = e1* h1 + e2* h2 + e3* h3 + e4* h4 + e5* h5
  • B5: Kết hợp context vector CV với vector từ liền trước (trong step 1, từ khởi tạo là <START>), thu được concat_vector = [CV + “START”]
  • B6: Đưa h5 và concat_vector vào GRU, thu được output = “Rahul” + d1
  • B7: Như vậy ta đã predict ra từ đầu tiên, quá trình được lặp lại tương tự cho từng lần predict các từ kế tiếp, decode_hidden_state được thay đổi bằng hidden_state trả về mỗi lần predict. VD: tại step 1, input = (H, d1), step2: input = (H, d2)

Code

Github: trungthanhnguyen0502/pet-translate

Dataset: gồm 2 file train.en.txt và train.vi.txt gồm 100.000 câu song ngữ Anh-Việt. Lấy dataset trong github mình luôn nhé.

Import thư viện, tiền xử lí dữ liệu:

Xử lí ngôn ngữ với class Language:

Tạo dữ liệu cho train, validate:

Attention

Decode

Loss function

Tiến hành train model

Với mục đích demo, mình chỉ train khoảng 20 epochs thôi, dĩ nhiên là với 20 epochs này chất lượng không cao, vậy nên mình sẽ test trên chính tập train.

Việc test trên tập train nghe qua có vẻ buồn cười, tuy nhiên đó là 1 mẹo để kiểm tra thuật toán và model có hoạt động hiệu quả hay không.

Với 1 tập dữ liệu nhỏ, sau vài Epoch mà khi test trên tập train, model trả về kết quả không đúng thì có nghĩa bạn đã code sai chỗ nào đó rồi.

Test model

Kết quả trả về

Kết luận

Okie, vậy là mình đã hướng dẫn xong cách tạo Machine Translation với thuật toán Attention trong Deep Learning. Cảm ơn các bạn đã theo dõi bài viết của mình!

Nguồn tài liệu tham khảo và hình ảnh:

Đừng bỏ lỡ những bài viết hay về Deep Learning:

Xem thêm việc làm Software Developers hot nhất tại TopDev

TopDev via viblo

  Thuật toán Quick Sort là gì? 2 phút làm quen với thuật toán Quick Sort
  Bí mật của thuật toán ngẫu nhiên