PaperWeekly 第47期 | 開學啦!咱們來做完形填空:「訊飛杯」參賽歷程
作者丨蘇劍林
學校丨中山大學碩士生
研究方向丨NLP,神經網路
個人主頁丨http://kexue.fm
1. 前言
從今年開始,CCL 會議將計劃同步舉辦評測活動。筆者這段時間在一創業公司實習,公司也報名參加這個評測,最後實現上就落在我這裡,今年的評測任務是閱讀理解,名曰《第一屆「訊飛杯」中文機器閱讀理解評測》。
雖說是閱讀理解,但事實上任務比較簡單,是屬於完形填空類型的,即一段材料中挖了一個空,從上下文中選一個詞來填入這個空中。最後我們的模型是單系統排名第 6,驗證集準確率為 73.55%,測試集準確率為 75.77%,大家可以在這裡觀摩排行榜。(「廣州火焰信息科技有限公司」就是文本的模型)。
事實上,這個數據集和任務格式是哈工大去年提出的,所以這次的評測也是哈工大跟科大訊飛一起聯合舉辦的。哈工大去年的論文Consensus Attention-based Neural Networks for Chinese Reading Comprehension就研究過另一個同樣格式但不同內容的數據集,是用通用的閱讀理解模型做的(通用的閱讀理解是指給出材料和問題,從材料中找到問題的答案,完形填空可以認為是通用閱讀理解的一個非常小的子集)。
雖然,在這次評測任務的介紹中,評測方總有意無意地引導我們將這個問題理解為閱讀理解問題。但筆者覺得,閱讀理解本身就難得多,這個就一完形填空,只要把它作為純粹的完形填空題做就是了,所以本文僅僅是採用類似語言模型的做法來做。這種做法的好處是思路簡明直觀,計算量低(在筆者的 GTX1060 上可以跑到 batch size 為 160),便於實驗。
2. 模型
回到模型上,我們的模型其實比較簡單,完全緊扣了「從上下文中選一個詞來填空」這一思想,示意圖如下。
初步分析
首先留意到,這個任務就是從上下文中挑選一個詞來填到空缺的位置,如:
熟悉自然語言處理的朋友會聯想到,這個任務本身跟語言模型差不多,甚至說這個任務應該更簡單一些,因為語言模型是從前 n 個詞中預測下一個詞,這個預測要遍歷詞表中所有詞,而這個完形填空任務只需要從上下文中挑,大大縮小了收縮範圍。當然,兩者的焦點是不一樣的,語言模型關心的是概率分布,而完形填空關心的是預測正確率。
上下文編碼
按照經驗,對於語言模型建模來說,LSTM 效果是最好的,因此這裡同樣使用 LSTM,為了更好地捕捉全局語義信息,堆疊了多層的雙向 LSTM,當然,對於 NLP 來說,這都是套路了。
首先,我們以「XXXXX」斷開材料,分為上文和下文,然後上文和下文依次輸入到同一個雙向 LSTM 中(算兩次,而不是拼在一起分別算),得到各自的特徵。也就是說,上下文的 LSTM 是共享參數的。
為什麼這樣呢?原因很簡單,因為我們自己在閱讀上下文時,用的只是同一個大腦呀,沒必要區別對待。有了一層 LSTM,那就可以層疊多個,這也是套路了。至於多少層適合,則需要看具體的數據集了。對於這個比賽任務來說,兩層比單層有明顯提升,而三層比兩層則沒有提高,甚至有些下降。
最後,為了得到整段材料的特徵向量(用來做下面的匹配),只需要將雙向LSTM的最後的狀態向量拼接起來,得到上下文各自的特徵向量,然後將兩個向量求平均,就得到全局特徵向量。
值得指出的是,如果換成論文Consensus Attention-based Neural Networks for Chinese Reading Comprehension裡邊的數據集(格式一樣,內容換成了人民日報的),同樣是本文的模型,LSTM 的層數需要 3 層,最終的準確率也比論文中最好結果有 0.5% 的提升。
預測概率
接下來的一個問題是:怎麼才能實現「在上下文中搜索」而不是在整個詞表中搜索呢?
回憶我們做語言模型的時候,如果要在整個詞表中搜索,那就要做一個全連接層,節點數是詞表的單詞數,然後 softmax 預測概率。我們可以這樣看全連接層:我們為詞表中的每一個詞都分配一個與輸出特徵維度一樣的向量,然後做內積運算,然後做 softmax。
也就是說,特徵與詞做配對,是通過內積來實現的。這就提供了參考思路:如果我們讓 LSTM 輸出的特徵與詞向量維度一樣大,然後將這個特徵與輸入的詞向量一一做內積(配對),然後就可以做 softmax 了,這樣就實現了只在上下文搜索。
筆者一開始也是用這樣的思路的,但這個思路的準確率只能到 69%~70%。後來分析了一下,原始的詞向量經過多層的 LSTM 編碼後,事實上已經遠離了原來詞向量的向量空間了,所以,與其「長途跋涉」地與輸入的詞向量配對,倒不如直接跟 LSTM 的中間狀態向量配對?至少在同一層 LSTM 中,狀態向量之間是比較接近的(指的是處於同一的向量空間),匹配起來應該容易一點。
實驗證明了筆者的猜想,經過改進後的模型,在官方提供的驗證集達到了 73%~74% 左右的準確率,測試集能達到 75%~76% 的準確率。後來再經過一段時間的實驗,也沒有明顯提高,所以就把這個模型提交上去了。
實驗細節
事實上筆者不是很懂調參,因此下面的代碼的參數不一定是最優,期待有興趣的調參高手能優化各個參數,給出更好的結果。筆者認為,哪怕對於本文的模型來說,我們自己給出的結果還不是最優的。
下面是在模型的實現中,一些較為重要的細節:
3. 代碼
數據集:https://github.com/ymcui/cmrc2017
訓練腳本:https://github.com/bojone/CCL_CMRC2017/blob/master/train.py
預測腳本:https://github.com/bojone/CCL_CMRC2017/blob/master/predict.py
點擊訪問作者博客原文
關於PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智慧前沿論文成果的學術平台。如果你研究或從事 AI 領域,歡迎在公眾號後台點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
微信公眾號:PaperWeekly
新浪微博:@PaperWeekly
推薦閱讀:
※Hey,在 MOOC 上你該這樣學習 | 論文訪談間 #11
※嘿,朋友,老夫掐指一算你就是「水軍」 | 論文訪談間 #13
※評測時如何構造訓練數據分布與測試數據分布一致
※多輪對話之對話管理(Dialog Management)
※PaperWeekly 第37期 | 論文盤點:檢索式問答系統的語義匹配模型(神經網路篇)