追一科技CoQA冠軍方案分享:基於對抗訓練和知識蒸餾的機器閱讀理解方案
- 2019 年 11 月 9 日
- 筆記
近日,在由斯坦福大學發起的對話式問答挑戰賽 CoQA (Conversational Question Answering Challenge)中,追一科技AI Lab團隊超越微軟團隊成為榜單第一[1],刷新了之前微軟等團隊創造的CoQA紀錄。值得注意的是,團隊提交的技術方案中,單模型的各項指標表現首次全面超越人類。

CoQA Leaderboard
一直以來,機器閱讀理解都是自然語言處理界最受關注、進步最快的技術方向之一,主要有兩大比賽較受矚目,分別是注重一問一答的SQuAD [2]和多輪對話問答的CoQA [3]。相比於SQuAD,CoQA更注重模型在對話過程中回答關聯問題的能力,答案形式自由,而且數據來自兒童故事、文學、初高中英語考試、新聞、維基百科、Reddit和科學等七個不同的領域,這些改進都極大地提高了挑戰賽的難度,對模型的魯棒性和泛化能力有着更高的要求。團隊針對CoQA數據集的難點,通過對抗訓練(Adversarial training)和知識蒸餾(Knowledge Distillation)等方法,有效地提高了模型的泛化能力,從而依靠單模型刷新了CoQA榜單的記錄,並首次單模型超越人工評測指標。在這裡分別從模型、訓練方法、後處理等方面做一個簡單的介紹。
模型
Baseline模型:RoBERTa
我們的基線模型以Facebook開源的RoBERTa [4]預訓練模型為基礎,之所以選擇RoBERTa,是因為其相較於BERT [5]在語言模型預訓練的過程中用了更多領域的語料,更適合CoQA數據來自不同領域的特點。
在輸入端,由於CoQA的數據集是對話式的,每個問題都依賴於歷史對話,因此在訓練過程中,我們將對話歷史拼接到當前問題之前,問題和答案之間用分隔符分開,組成當前輪次的Query,然後將其與Context拼接,作為模型的輸入。
在輸出端,CoQA數據集的答案有可能是自由文本、Yes、No和Unk。由於頭部的自由文本的答案都能在Context中找到相近的片段,我們採取抽取+Yes/No/Unk分類的輸出層結構。其中,對於抽取的部分,我們使用Pointer-Network的輸出結構得到答案開始和結尾位置的logits;對於分類的部分,則用一個簡單的全連接層得到Yes/No/Unk三分類的logits。

Baseline模型結構
在計算損失函數時,我們將預測答案開始和結尾位置的兩個logits向量分別與Yes/No/Unk三分類的logits拼接,得到兩個最終的logits向量,此時這兩個logits對應的label依然是one-hot的,所以我們可以把這兩個logits向量過softmax,然後用交叉熵計算開始和結尾的損失,取平均,得到基線模型的損失值。
依據標註輔助任務
在CoQA數據集中,每一個回答(除了unknown)都附帶了一段Context中的原文片段作為邏輯依據。為了充分利用該信息,我們在Baseline模型的基礎上,增加了一個依據標註的任務,同步進行多任務訓練。對於Context的每一個token,我們會判斷其是否在邏輯依據中(標成1或者0)。這部分的損失函數用二元交叉熵計算,按照一定比例累加到總的loss上。

依據標註任務
除此之外,我們發現,Yes/No類型答案的邏輯依據中,常常包含了肯定或否定的語義,可以用來輔助Yes/No/Unk的分類,所以我們在RoBERTa池化輸出的基礎上又利用注意力機制融合了邏輯依據的輸出信息,以提高最後模型的表現。
訓練方法
除了模型上的修改,為了提高模型的泛化能力以應付CoQA數據集來源豐富、問題類型多樣的特點,我們還採用了對抗訓練和知識蒸餾等訓練方法。
對抗訓練
對抗訓練 [6]是一種能有效提高模型魯棒性和泛化能力的訓練手段,其基本原理是通過在原始輸入上增加對抗擾動,得到對抗樣本,再利用對抗樣本進行訓練,從而提高模型的表現。由於CoQA數據集對模型的泛化能力較高,我們在訓練時,使用了對抗訓練來提高模型的表現。
由於自然語言文本是離散的,一般會把對抗擾動添加到嵌入層上。在我們的系統中,為了最大化對抗樣本的擾動能力,我們利用梯度上升的方式生成對抗樣本。為了避免擾動過大,我們將梯度做了歸一化處理。

其中,v為嵌入向量。實際訓練過程中,我們在訓練完一個batch的原始輸入數據時,保存當前batch對輸入詞向量的梯度,得到對抗樣本後,再使用對抗樣本進行對抗訓練。
除了對抗訓練,我們還利用虛擬對抗訓練做半監督訓練。
知識蒸餾
與對抗訓練類似,知識蒸餾也是一種常用的提高模型泛化能力的訓練方法。
知識蒸餾[7] 這個概念最早由Hinton在2015年提出。一開始,知識蒸餾通往往應用在模型壓縮方面,利用訓練好的複雜模型(teacher model)輸出作為監督信號去訓練另一個簡單模型(student model),從而將teacher學習到的知識遷移到student。Tommaso [8]在18年提出,如果student和teacher的模型完全相同,蒸餾後則會對模型的表現有一定程度上的提升。
在我們的訓練過程中,我們先用RoBERTa + 對抗訓練得到teacher model,再用知識蒸餾的方法得到student模型。訓練student時,我們同時採用真實label和teacher的輸出來計算損失。
後處理
在CoQA數據集中,有一小部分的問題是多選題,比如問題是「How Jack goes to school? Walk or ride? 」,而Context中的片段是「walked」。即使模型抽取到了「walked」,也並不能得分。因此,針對這類問題,我們做了一個簡單的後處理。通過一定規則識別到多選題型的問題,然後抽取出問題中出現的選項,找到與我們模型抽取的Context片段語義相似度最高的選項,作為我們系統最終的回答。
結果分析與消融實驗
最終,我們的單模型在CoQA Leaderboard上超越了微軟團隊2.6個百分點,並首次超過了人工評測的水平。值得一提的是,與微軟和其他團隊不同,我們在模型訓練的過程,沒有用任何CoQA以外的有監督的數據集,進行多任務訓練或是數據增強。

驗證集結果分析
為了驗證各個技巧的作用,我們進行了消融實驗。從實驗結果中可以看出,依據標記和對抗訓練帶來的提升較大,知識蒸餾和後處理也能帶來一定程度的提升。

驗證集消融實驗結果
最終可以看到,利用對抗訓練、知識蒸餾等方法,我們的單模型在RoBERTa Baseline的基礎上提升了1.8個百分點。
總結
這次的CoQA挑戰賽經歷,是我們團隊站在巨人肩膀上的一次眺望。在優化模型的過程中,我們發現由於預訓練模型已經相當強大,以往一些屢試不爽的優化技巧在RoBERTa上卻並不能奏效。這就需要我們在比賽的過程中,大膽地設想,仔細地實驗,驗證不同方法的有效性和穩定性,從而找到真正行之有效的解決方案。希望我們的這次分享也能給其他團隊帶來一些經驗上的啟發。
Reference
[1] CoQA Leaderboard. https://stanfordnlp.github.io/coqa/
[2] SQuAD: 100,000+ Questions for Machine Comprehension of Text. https://arxiv.org/abs/1606.05250
[3] CoQA: A Conversational Question Answering Challenge. https://arxiv.org/abs/1808.07042
[4] RoBERTa: A Robustly Optimized BERT Pretraining Approach. https://arxiv.org/abs/1907.11692
[5] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. https://arxiv.org/abs/1810.04805
[6] Adversarial Training Methods for Semi-Supervised Text Classification. https://arxiv.org/abs/1605.07725
[7] Distilling the Knowledge in a Neural Network. https://arxiv.org/abs/1503.02531
[8] Born Again Neural Networks. https://arxiv.org/abs/1805.04770