[AiviVN 3 - Vietnamese tone prediction] 2nd place solution

vietnamese_tone_prediction

#1

Lời đầu tiên, đại diện team [VietAI] Khả Vi mình (Phát) xin cảm ơn BTC aivivn đã tạo ra một sân chơi bổ ích nói chung và một cuộc thi thú vị nói riêng. Team mình cũng không có thời gian đầu tư tập trung làm nhiều, chỉ có 2 đợt làm chính: tháng 5 và cuối tháng 6. Cách tiếp cận cũng đơn giản, chỉ xoay quanh một mô hình là Sequence-to-Sequence với Transformer (Attention is all you need). Dưới đây mình nhóm trình bày ngắn gọn cách tiếp cận của nhóm, hy vọng được sự đóng góp của các bạn, mọi thắc mắc xin comment dưới note này. Source code sẽ được release trong vài ngày tới.

1. Bài toán

Tiếng Việt đặc trưng bởi các dấu thanh (sắc, huyền, hỏi, ngã, nặng), ê, ư, ơ, ô, ă, â, đ. Thêm dấu tiếng Việt là một ứng dụng quan trọng trong xử lý ngôn ngữ tự nhiên cho tiếng Việt.

Input: Một câu (đoạn văn) tiếng Việt không dấu

Output: Một câu (đoạn văn) tiếng Việt có dấu tương ứng.

Ví dụ:

Input: Anh yeu em rat nhieu

Output: Anh yêu em rất nhiều

Bài toán nghe có vẻ đơn giản nhưng rất khó khăn trong một số trường hợp, vì đòi hỏi mô hình phải hiểu về ngữ nghĩa, ngữ cảnh của toàn bộ câu (đoạn văn). Đặc biệt một số tên người khó có thể dự đoán đúng ngay cả đối với người (Việt).

2. Dữ liệu

Dữ liệu BTC cung cấp bao gồm:

  • Tập Train: gồm 2,126,280 câu không dấu và có dấu tương ứng.

  • Tập Test: gồm 8,238 câu không dấu.

Để cải thiện mô hình tốt hơn nhóm có sử dụng dữ liệu từ https://github.com/binhvq/news-corpus#full-txttitle--description--body-v1 gồm 111,274,300 câu có dấu. Trong quá trình xử lí, nhóm phát hiện có 8,049 câu trong tập dữ liệu này trùng với tập test BTC cung cấp. Nên để đảm bảo tính công bằng, tránh overfitting và leakage, nhóm đã remove 8,049 câu này khỏi tập train mở rộng.

3. Cách tiếp cận

Bài toán được đưa về bài toán dịch máy (Machine Translation) trong đó ngôn ngữ nguồn (source language) là tiếng Việt không dấu và ngôn ngữ đích (destination language) là tiếng Việt có dấu. Với bài toán dịch máy, cách tiếp cận Neural Machine Translation, cụ thể là Sequence-to-Sequence Learning với kiến trúc Encoder-Decoder được xem là state-of-the-art hiện tại. Một trong những mô hình tốt nhất cho Encoder/Decoder đó chính là Transformer (được giới thiệu trong Attention is all you need, NIPS 2017). Mô hình này ưu việt hơn Recurrent Nerual Network (RNN) ở chỗ nó không có tính chất “recurrence" như RNN thay vào đó các hidden states được tính song song qua cơ chế Multi-head Attention.

Để tăng độ chính xác cho mô hình, nhóm có sử dụng ba kỹ thuật:

  • Relative Positional Encoding : trong đó Positional Encoding được thay bằng việc học một ma trận thể hiện mối tương quan tương đối giữa vị trí của các từ trong câu. Kĩ thuật này giúp tăng khoảng 0.2% accuracy.

  • Kĩ thuật Average checkpoint: sau 1000 bước update, model checkpoint (bao gồm trọng số của mô hình) được lưu lại. Sau khi train xong, nhóm lấy trung bình trọng số của 100k checkpoint cuối cùng. Kĩ thuật này giúp tăng khoảng 0.03% accuracy.

  • Beam Search với beam_width = 4 và hệ số length normalization alpha = 0.6

Nhóm sử dụng thư viện Tensor2Tensor đã cài đặt sẵn Transformer và một số biến thể để thực hiện việc training và dự đoán. Thư viện Tensor2Tensor cũng hỗ trợ train trên nhiều GPU hoặc TPU.

Các submissions của team [VietAI] Khả Vi

Ngay từ lần train đầu tiên với mô hình Transformer base (6 layers, 8 heads, 512 hidden state dimensions) nhóm đã đạt được độ chính xác là 98.309%. Mô hình này được train chỉ với data BTC cung cấp với 12 giờ train trên 1 GPU 1080Ti. Sau đó nhóm áp dụng các kĩ thuật đã nêu trên để tăng độ chính xác lên được 98.775%. Cảm thấy model đã bảo hòa với data này nên nhóm đã tìm thêm dữ liệu để train với hơn 110M câu, train trong 5 ngày với 4 GPU 1080Ti thu được mô hình với độ chính xác là 99.33%.

Một số phương pháp nhóm đã thử nhưng không hiệu quả:

  • Transformer Big

  • Mô hình chỉ có Transformer Encoder

Câu chuyện bên lề, trong lúc làm việc với thư viện Tensor2Tensor bạn Pham Thuong Hai đã phát hiện ra một bug trong lúc decode với mô hình Transformer Relative Positional Encoding và đã fix bug này, tạo pull request trên github của thư viện (và đã được merge vào master branch).


[AIviVN 3 - Vietnamese tone prediction] 1st place solution