8 Tổng kết
7.2 thị hàm mất mát trên tập phát triển (dev) trong quá trình huấn luyện
Trên hình 7.1 và hình 7.2 có thể thấy đến 85k bước thì hàm mất mát ở tập phát triển đã hội tụ. Mặc dù hàm mất mát trên tập phát triển tiếp tục train dao động quanh ở giá trị 1.5 tuy nhiên hàm mất mát trên tập phát triển vẫn dao động quanh 2.8 và giảm không đáng kể.
7.2.2 Kết quả kiểm thử
Bảng 7.1 là kết quả của các thử nghiệm mà nhóm đã thử nghiệm trong quá trình làm luận văn. Bảng 7.2 thể hiện cấu hình chi tiết của mô hình ở bảng 7.1. Ví dụ như mô hình QANet1 chúng tôi đề cập trong bảng 7.2: bộ mã hóa từ vựng là GLoVe, vector mã hóa có chiều dài 100, kích thước tầng ẩn hay số bộ lọc là 96, số lượng head trong self-attention là 1 và huấn luyện với batch là 32. Mô hình đạt kết quả nhất mà nhóm thử nghiệm được với F1/EM là80/70.6. Từ bảng
chúng ta có thể thấy rằng chiều dài của vector mã hóa có ảnh hưởng đến độ chính xác khi kiểm thử, ví dụ: khi thay đổi vector mã hóa từ 100-D sang 300-D trên bộ GLoVe điểm F1 là 78.9
THÍ NGHIỆM VÀ KẾT QUẢ Mô hình F1 EM QANet1 78.4 69 QANet2 78.9 69.7 QANet3 79.26 70.22 QANet4 80 70.6
Bảng 7.1: Các kết quả thử nghiệm trên mô hình QANet trên tập SQuAD v1.1
Mô hình Thông tin chi tiết
QANet1 GLoVe, word dim = 100, connector dim = 96,multihead = 1,batch size = 32 QANet2 GLoVe, word dim = 300, connector dim = 128,multihead = 2,batch size = 16 QANet3 fasttext,word dim = 300, connector dim = 128,batch size =32 multihead = 1, QANet4 fasttfext,word dim = 300, connector dim = 128,multihead = 4,batch size =32
Bảng 7.2: Thông tin cấu hình chi tiết các mô hình QANet
(+0.5) và điểm EM là 69.7 (+0.7). Tập mã hóa fasttext được tạo ra gần đây, hiện tại là bộ mã hóa từ ngữ tốt hơn so với GLoVe, vì vậy khi thay bộ GLoVe bằng fasttext với cùng kích thước là 300-D, điểm F1/EM lần lượt là 79.26/70.2 (+0.36/+0.32) đều tăng so với GLoVe 300-D với F1/EM là 78.9/69.7. Ngoài ra số lượng head trong cơ chế self-attention cũng là một yếu tố giúp mô hình xây dựng trên Transformer có hiệu quả cao, nhóm đã thử nghiệm với số head là 4 và kết quả là tốt nhất trên mô hình QANet mà nhóm đã huấn luyện. Nhóm cũng đã cân nhắc thay số head là 8 nhưng do giới hạn phần cứng nên nhóm chưa thử nghiệm.
So với mô hình gốc trong bài báo thì F1/EM là 82.7/73.6thì kết quả vẫn kém. Tuy nhiên nhóm nhận thấy rằng kết quả của sự thấp hơn này là do các yếu tố sau. Thứ nhất, vì giới hạn tài nguyên tính toán nhóm chỉ dùng tối đa là 4 head so với 8 sead trong tầng self-attention trong bài báo gốc. Thứ hai, chúng tôi xây dựng mô hình trên framework là PyTorch khác với mô hình nhóm tác giả hiện thực trên framework là TensorFlow.
Kết quả cải tiến
Chúng tôi có một chút cải tiến khi áp dụng khối Encoder trong mô hình Universal Trans- former để áp dụng vào mô hình QANet và thu được một vài kết quả khả quan. Mô hình QANet với kiến trúc Universal Transformer chúng tôi chọn các cấu hình giống như mô hình QANet3, chỉ khác ở một chỗ chúng tôi thay thế khối Encoder Block trong tầng Embedding Encoder Layer trong mô hình QANet bằng khối Recurrent Encoder Block trong Universal Trasformer Block. Chúng tôi cũng đã có thử thay thế khối Recurrent này ở tầng Model Encoder nhưng chúng tôi thấy không hiệu quả bởi vì tầng này là tầng suy diễn ra vị trí bắt đầu và vị trí kết thúc của câu trả lời, việc dùng tùy ý số lần tính toán để dự đoán vị trí của câu trả lời như vậy là không hợp lí. Chúng tôi thử nghiệm với số lần tối đa tính toán lần lượt là 2 và 4. Trong đó với số lần tính toán tối đa trong cơ chế ACT khiến cho kết quả giảm đi: F1/EM là 78.83/69.59 (-0.43/-0.64), tuy nhiên khi dùng với số lần tính toán tối đa là 4 mô hình thì F1/EM đều tăng: 79.98/70.9
(+0.72/+0.68). Điểm EM tốt nhất của cơ chế cải tiến này còn cao hơn cả mô hình tốt nhất bên QANet (+0.3) với số head là 4 trong khi ở cơ chế cải tiến này chúng tôi chỉ dùng số head là 1.
Thời gian huấn luyện mô hình với cải tiến này cũng khoảng 12h tuy nhiên số lượng GPU cần cho việc tính toán tăng lên vì số khối Encoder tính toán trong mạng tăng lên mặc dù là chung
THÍ NGHIỆM VÀ KẾT QUẢ Mô hình Thông tin chi tiết
QANetUT1 fasttext, word dim = 300, connector dim = 128,multihead = 1,batch size =32,numblock = 2 QANetUT2 fasttext, word dim = 300, connector dim = 128,multihead = 1,batch size =16,numblock = 4
Bảng 7.3: Thông tin cấu hình chi tiết các mô hình QANet cải tiến
F1 EM
QANet3 79.26 70.22 QANetUT1 78.83 69.59
QANetUT2 79.98 70.9
Bảng 7.4: Mô hình QANet với Universal Transformer trên tập SQuAD v1.1trọng số mô hình. trọng số mô hình.
7.2.3 Trên tập dữ liệu SQuAD v2.0
Khi hiện thực mô hình này thì tập dữ liệu SQuAD v2.0 [15] cũng ra đời và đặt ra nhiều thách thức cho các mô hình Hỏi-đáp hiện tại, vì trong tập dữ liệu này có những câu hỏi không có câu trả lời trong khi trong SQuAD v1.1 là chắc chắn có câu trả lời. Điều này khiến mô hình phải học ở những trường hợp chi tiết hơn chứ không dễ dàng suy đoán ra kết quả; mô hình cũng sẽ dễ bị "lừa" bởi các từ gần nghĩa trong tập dữ liệu.
Chúng tôi đã đặt ra mục tiêu huấn luyện mô hình QANet trên tập SQuAD v2.0. Nhìn chung khi huấn luyện trên SQuAD v2.0 không có thay đổi so với SQuAD v1.1, tuy nhiên điểm khác biệt ở những câu hỏi không có câu trả lời khiến chúng tôi phải thay đổi lại cách tiền xử lý dữ liệu.
Vì mô hình chúng tôi đang hiện thực, sẽ trả về vị trí bắt đầu và vị trí kết thúc cho câu hỏi nằm trong đoạn văn. Những câu hỏi không có câu trả lời vẫn phải là một điểm dữ liệu trong tập huấn luyện. Tuy nhiên làm sao chỉ ra rằng với điểm dữ liệu này không có câu trả lời? Vì vector biểu diễn đoạn văn lúc này mỗi vị trí trong mảng là giá trị index tương ứng của mỗi từ mà từ vị trí index này có thể tra ra vector biểu diễn của từ đó. Ở bước tiền xử lý dữ liệu, với những câu hỏi không có câu trả lời chúng tôi sẽ gán cho vị trí bắt đầu và kết thúc đều là-1và những câu hỏi có câu trả lời sẽ không thay đổi gì so với cách tiền xử lý ở trước. Tiếp đến chúng tôi lưu lại dữ liệu ở dạng numpy, đến khi load dữ liệu lên để tạo tập dữ liệu, chúng tôi sẽ thêm giá trị1vào đầu đoạn văn; giá trị index 1 tương ứng với từ “–OOV–” (out of vocabularry). Ví dụ với chiều dài tối đa của văn bản là 400 mà chúng tôi đã xét ở bước tiền xử lý, thì lúc nãy sẽ là 401 sau chèn thêm 1 phần tử. Sau đó chúng tôi sẽ tăng giá trị cho vị trí bắt đầu và kết thúc lên 1. Như vậy với câu hỏi không có câu trả lời lúc này vị trí bắt đầu và kết thúc là0, còn những câu hỏi có
câu trả lời vị trí bắt đầu và kết thúc tăng lên 1, do chúng tôi đã thêm 1 phần tử vào đầu mảng nên đã giải quyết được chuyện này. Mô hình lúc này có thể huấn luyện được rồi, với những câu hỏi không có câu trả lời thì mô hình sẽ có giá trị thực tế cho từ bắt đầu và kết thúc là 0. Còn những câu hỏi còn lại thì sẽ là nhưng từ trong đoạn văn.
Thời gian huấn luyện cho SQuAD v2.0 tốn khoảng 32 tiếng huấn luyện. Vì vậy với tập SQuAD v2.0 này chúng tôi không áp dụng cải tiến như ở SQuAD v1.1 mà chỉ chạy mô hình cơ bản để quan sát kết quả.
THÍ NGHIỆM VÀ KẾT QUẢ
F1 EM
QANet on SQuAD2 66.5 63.1
Bảng 7.5: Kết quả huấn luyện mô hình QANet trên tập dữ liệu SQuAD v2.0
nghiệm trên tập dữ liệu SQuAD v1.1 trong bảng 7.2, đây cũng là cấu hình duy nhất mà chúng tôi thử nghiệm trên tập SQuAD v2.0. Kết quả mà chúng tôi thu được với F1/EM là 66.5/63.1 gần ngang hoặc thấp hơn 1 điểm % với các kết quả thống kê khi chạy QANet trên tập dữ liệu này. Tuy nhiên như vậy là chúng tôi đã áp dụng đúng cơ chế để thực hiện huấn luyện SQuAD v2.0 trên PyTorch. Điều chúng ta có thể thấy là tập dữ liệu này làm giảm kết quả F1/EM đáng kể; ví dụ F1_score từ 80% xuống 66.5%. Tập dữ liệu sẽ là một tập dữ liệu được dùng cho các mô hình về hỏi đáp sau này. Trong quá trình huấn luyện trên SQuAD v2.0 chúng tôi đã tham khảo nhiều mã nguồn khác nhau và có những cách dẫn đến huấn luyện kết quả rất kém, sau cùng cách chúng tôi đã áp dụng đã được trình bày ở trên áp dụng mã nguồn từStanford CS224n1.
7.3 Kết quả trên tập dữ liệu tiếng ViệtTập dữ liệu Tập dữ liệu
Tập dữ liệu mà chúng tôi
Trước tiền xử lý Sau tiền xử lý Tỉ lệ
Dữ liệu huấn luyện 5247 5110 80%
Dữ liệu đánh giá 672 650 10%
Dữ liệu kiểm thử 710 687 10%
Tổng cộng 6629 6447 100%
Bảng 7.6: Số lượng tập dữ liệu tiếng Việt trước và sau khi xử lý.
Quá trình huấn luyện và kiểm thử
Cấu hình chung của mô hình QANet trên ngôn ngữ tiếng Việt không có thay đổi nhiều so với trên tiếng Anh. Kích thước bó chúng tôi chọn là 16 trên mô hình tiếng Việt. Như đã trình bày ở mục 6.2, tập mã hóa từ vựng nhóm chúng tôi dùng tập mã hóa với mỗi từ có kích thước 100-D và dùng thư viện Pyvi hỗ trợ cho việc tiền xử lý.
Với tập dữ liệu huấn luyện khoảng 6600 điểm dữ liệu, mô hình chúng tôi huấn luyện xấp xỉ khoảng 30 phút huấn luyện trên Google Colab. Vì mô hình được huấn luyện nhanh nên chúng tôi có nhiều thử nghiệm trên mô hình này.
Hình 7.3 ta thấy rằng mô hình hội tụ ở bước 6000, với mỗi bước là mỗi một bó dữ liệu được huấn luyện, hàm mất mát của tập huấn luyện dao động quanh giá trị 2; trên hình 7.4 từ bước 3500 đến bước 6000, hàm mất mát của mô hình không thay đổi nhiều mà dao dộng ở quanh giá trị 3. Vì vậy sau một vài quá trình huấn luyện, chúng tôi đã áp dụng cơ chế early stopping để dừng quá trình huấn luyện mô hình lại. Trong huấn luyện mô hình học sâu điều chúng ta quan tâm nhất là hàm mất mát trên tập phát triển hoặc tập kiểm thử vì chính kết quả này phần nào phản ánh dữ liệu thực tế mà chúng ta có thể gặp phải.
THÍ NGHIỆM VÀ KẾT QUẢ