1st place solution - Phân loại sắc thái bình luận

nlp
deep-learning
demo_nlp_contest
tutorial

#1

1st place solution analysis

Chào mọi người bọn mình là Hoàng và Nhật trong team HoangNhat2 trên leaderboard. Đầu tiên, bọn mình muốn cảm ơn anh Tiệp và mọi người trong team Aivivn vì đã tổ chức một cuộc thi về Machine Learning về xử lý tiếng Việt rất thú vị. Bọn mình đã học được rất nhiều thứ mới lạ qua cuộc thi.

Tóm tắt cách làm:

Tụi mình không có nhiều kiến thức về xử lý NLP nên tụi mình tập trung thử nghiệm những model DL và xem model nào hoạt động tốt. Qua những lần thử rất nhiều model tụi mình nhận ra là không có single model nào vượt qua được 0.89x ở Public LB mặc dù có một số làm rất tốt ở local validation. Sau đó, bọn mình đã thôi thử model mới mà đã qua thử nghiệm một số cách kết hợp model hoặc augment train data.

Sau những lần thử nghiệm để đạt được độ diversity phù hợp thì solution được top 1 của bọn mình là Weighted Ensemble của những model sau đây:

  1. TextCNN (Weight: 0.1) source
  2. VDCNN (Weight: 0.1) inspired by source
  3. HARNN (Weight: 0.3) inspired by source
  4. SARNN (Weight: 0.5) source

Pretrained Embeddings tụi mình test và sử dụng là:

  • word2vecVN (window-size 5, 400dims) source

Tụi mình chủ yếu train model ở trên Google Colab và sử dụng GPU của Colab. Thời gian train mỗi model khoảng từ 10 - 20 phút (model converge sau khoảng 5-10 epochs). Những model CNN thì train nhanh hơn những model RNN rất nhiều vì có thể nó không phải là sequential model nên nó tận dụng được GPU tốt hơn lúc train.

Chi tiết cách làm:

1. Models:

1.1 TextCNN:

Đây là model CNN cho text classification của bọn mình.

Architecture:

1.2 VDCNN:

Tương tự như TextCNN nhưng ở giữa các layer Convolution có những Residual layer.

Architecture:

1.3 HARNN:

HARNN xử lý text ở hai level:

  1. Tính encoding cho từng sentence bằng word embedding trong paragraph bằng một BiLSTM
  2. Dùng một BiLSTM để tính document encoding theo sentence encoding.

Giữa mỗi layer đều có một Attention layer.

Architecture Word2Sent

Architecture Sent2Doc:

1.4 SARNN:

Đây là model BiLSTM với Attention ở giữa hai layer BiLSTM.

Architecture:

2. Combine models:

Bọn mình đã thử những cách kết hợp các models như Stacking nhưng thấy Weighted Average đưa ra được kết quả khả quan nhất. Về cách lựa chọn weight thì bọn mình đã dựa vào model nào có kết quả tốt nhất trên Public LB và cho model đó weight cao nhất. Bọn mình để nguyên probability và chọn threshold là 0.5 chứ không tìm threshold vì không thấy được kết quả tăng nhiều.

Ngoài lề:

Khó khăn:

  • Có lẽ vấn đề đâu tiên hai đứa gặp phải là vấn đề máy móc. Do hai chiếc máy Macbook 128gb (1 Air, 1 Pro) nên hai đứa không đứa nào đủ chỗ để tải pretrained model về thử mỗi lần tải một cái phải xoá cái cũ đi. Mãi sau này tụi mình chuyển mọi thứ lên Google Colab và Github thì mọi thứ mới bắt đầu nhanh và dễ hơn. Nên bọn mình khuyên các bạn nên xài Google Colab hoặc Kaggle Instance.
  • Bọn mình gặp nhiều vấn đề với việc reproduce được kết quả với hai lý do. Hàm save_weight của Keras có rất nhiều vấn đề và sau khi load lại thì hầu như model bị hư + trong lúc xử lý có nhiều thứ việc bị undeterministic (Python set, keras model). Model đầu tiên trên 0.9 của tui mình cũng là do chạy lại một model cũ mà thành xD.

Những cách tiếp cận bọn mình đã thử:

  • Dùng Language Model như Elmo (source). Approach này có vẻ không phù hợp vì thời gian train quá lâu (thời gian train một epoch bằng thời gian train một model CNN hoặc RNN) và bọn mình cũng không có thời gian để preprocess data lại cho đúng format của Elmo.
  • Một vấn đề mà bọn mình đã thấy là về việc lượng data không đủ để có thể làm model có thể vượt qua được mức 0.89 - 0.9. Bọn mình đã thử một số cách để augment ra data mới như:
  1. Thay ngẫu nhiên những từ trong câu bằng từ đồng nghĩa. Bọn mình làm điều này bằng cách thay mỗi từ bằng từ có word embeddings gần nó nhất trong từ điển của bọn mình (Nearest neighbor). Mặc dù thay đổi này không mang lại improvement đáng kể nhưng mình nghĩ với thesaurus tốt hoặc metrics chọn vector phù hợp thì sẽ có thể có kết quả tốt.
  2. Xáo các câu trong HARNN model để có thể generate được nhiều document khác nhau.
  3. Dịch từ tiếng Việt sang các thứ tiếng khác và dịch ngược lại. Mà giờ Google Translate ban cái này rồi ;__;

Kết:

Một lần nữa cảm ơn BTC và chúc mừng các bạn đã hoàn thành một cái Datathon đầu tiên của Aivivn. Hi vọng những contest trong tương lại sẽ càng nhiều người ủng hộ hơn và cũng sẽ có nhiều discussion trong và ngoài contest hơn vì bọn mình thấy có vẻ thiếu những thảo luận về baseline model lúc thi.

Code:


Tổng kết cuộc thi 'Phân loại sắc thái bình luận'