今天終於開始技術博客的第一章,從閱讀理解的非預訓練model開始,第一篇SAN for SQUAD 2.0windows
SAN for SQUAD 2.0 主要包含兩個組件:a span detector and a binary classifier for judging whether the question is unanswerable,and both components are jointly optimized.
也就是一個跨度檢測器和一個線性分類器,其中線性分類器用來判斷當前問題是否有答案(畢竟這是SQUAD2.0相比於 1.1的最大改變之處,也爲閱讀理解提供了難度),跨度檢測器用來檢測答案的span。整個模型能夠看做,總體包含五(四)層。網絡
如下是模型的總體架構圖
模型分爲兩部分:左邊的上半部分也就是剛纔所寫的跨度檢測器(a span detector),也就是SAN Answer Module,右邊的上半部分也就是線性分類器(a binary classifier),並且模型包括兩種不一樣的layers。
幾個關鍵點:架構
a lexicon encoding layer, contextual encoding layer and memory generation layer
下面詳細介紹整個模型的各個層級函數
事先將question劃分位Q={q_0,q_1,q_2,..,q_m-1} ,passage/paragraph劃分爲P={p_0,p_1,p_2,...,p_m-1},answer 計算爲 A={abegin , aend},A也就是P中的一個字串,當問題沒法回答時,A指向段落的最後一個標記。學習
Eq=Rd*m編碼
使用兩層的BiLSTM做爲上下文信息編碼層spa
最後經過兩層的BiLSTM的輸出獲得最終的Hq∈ R4d×mfor questions and Hp∈ R4d×nfor passages.code
本層的主要做用的是將前面獲得的Hq、 Hp進行融合從而產生一個 working memory,在此層中使用attenion機制來計算qustion and passage之間的類似度:
先獲得question-aware passage representation:
Up= concat(Hp, HqC)
而後對passage進行self-attention:
本層的數學公示建議去看論文。😂
最後也是經過一層BiLSTM造成了最後的M = BiLSTM([Up];ˆUp]).component
這一層對於有答案的文章來講其實也就是最後一層,該層輸出最後答案的span。
本文中使用的是multi-turn answer module 來進行 span detector
輸入初始狀態s0(s0是Q每一個token的加權之和),最後經過一個線性函數來找begin and end point of answer spans at each reasoning step t ∈ {0, 1, . . . , T − 1}
blog
針對SQUAD 2.0中的不可回答問題,特有的一個機制。
論文中僅僅採用了一層的神經網絡來做爲線性分類器。公式以下:
Pu= sigmoid([s0; m0]W4)
Pu也就是最後判斷問題是否可回答的機率值。
y=1時表示問題不可回答,y=0時表示問題可回答
從實驗結果來看,SAN在2.0上的確取得了當今非預訓練模型幾乎最好的成績,至於實驗細節,論文寫的仍是很詳細的。
實驗細節
分詞: spaCy word embedding: GloVe 300-D character encoding: 利用CNN訓練, embedding size設爲20. windows設爲1,3,5 hidden size設爲{50, 100, 150} word embedding和character embedding拼接, 最終的lexicon embedding就是600維. LSTM hidden size: 128 注意力層的projection size: 256 dropout: 0.2 batch size: 32 optimizer: Adamax learning rate: 0.002
但本身在對於代碼的復現中並無在2.0上取得像論文同樣的實驗效果,(可能哪兒參數不對?歡迎你們給我留言討論😁)
就整篇文章看完,我的以爲 SAN的模型其實十分簡單,並且整個的訓練時間也不長.實力點贊!!
SAN與其餘模型主要的區別在於,它的預測輸出結果,並非最後直接輸出,而是每一個時間步驟迭代的結果,最後取平均獲得最後輸出,這點的確很特別。。。
下期預告:QANET