又是一篇之前讀的paper,最近把之前讀的paper整理整理…
文章目錄
今天的主角又是在斯坦福的SQuAD的基礎上,雖然是一篇比較早的文章,但是該文章是第一個在SQuAD上實現的端到端的神經網絡(end-end),對於入門attention,QA的小夥伴來說還是很不錯的~
前言
SQuAD 是由 Rajpurkar 等人提出的一個最新的閱讀理解數據集。該數據集:
- 包含 10 萬個(問題,原文,答案)三元組(500多篇文章,2萬多個段落,10萬個問題);
- 原文來自於 536 篇維基百科文章,而問題和答案的構建主要是通過衆包的方式,讓標註人員提出最多 5 個基於文章內容的問題並提供正確答案,且答案出現在原文中。每個問題3人標註,降低了人工標註誤差
- SQuAD 和之前的完形填空類閱讀理解數據集如CNN/DM,CBT等最大的區別在於:SQuAD 中的答案不再是單個實體或單詞,而可能是一段短語,這使得其答案更難預測。
- SQuAD 包含公開的訓練集和開發集,以及一個隱藏的測試集,其採用了與 ImageNet 類似的封閉評測的方式,研究人員需提交算法到一個開放平臺,並由 SQuAD 官方人員進行測試並公佈結果。
幾乎所有做 SQuAD 的模型都可以概括爲同一種框架:Embed 層,Encode 層,Interaction 層和 Answer 層。
- Embed 層負責將原文和問題中的 tokens 映射爲向量表示;
- Encode 層主要使用 RNN 來對原文和問題進行編碼,這樣編碼後每個 token 的向量表示就蘊含了上下文的語義信息;、
- Interaction 層是大多數研究工作聚焦的重點,該層主要負責捕捉問題和原文之間的交互關係,並輸出編碼了問題語義信息的原文表示,即 query-aware 的原文表示;
- 最後 Answer 層則基於 query-aware 的原文表示來預測答案範圍。
1.模型概述
Match-LSTM模型的輸入由兩部分組成:段落(passage)和問題(question)。passage使用一個矩陣P[d * P]表示,其中d表示詞向量維度大小,P表示passage中tokens的個數;question使用矩陣Q[d * Q]表示,其中Q表示question中tokens的個數。
Match-LSTM模型的輸出即問題的答案有兩種表示方法:
- 其一是使用一系列整數數組,其中是中的一個整數,表示在段落中某個token具體的位置,這裏的整數數組不一定是連續的,對應Sequence Model ;
- 第二種表示方法是假設答案是段落中一段連續的token組合,即僅使用兩個整數來表示答案,表示答案在段落中開始的位置,則表示結束位置,和是中的整數,對應Boundary Model 。
故對Match-LSTM模型的訓練集樣本來說,其可用下面的三維數組來表示:
總結一下,在模型實現上,Match-LSTM 的主要步驟如下:
(1) LSTM預處理層(LSTM preprocessing Layer):
- Embed 層使用詞向量表示原文和問題;
- Encode 層使用單向 LSTM 編碼原文和問題 embedding;
(2) match-LSTM層(Match-LSTM Layer):匹配原文和問題
- Interaction層對原文中每個詞,計算其關於問題的注意力分佈,並使用該注意力分佈彙總問題表示,將原文該詞表示和對應問題表示輸入另一個 LSTM編碼,得到該詞的 query-aware 表示;
- 在反方向重複步驟 2,獲得雙向 query-aware 表示;
(3) Ans-Ptr層(Answer Pointer(Ans-Ptr) Layer):從原文中選取答案
- Answer 層基於雙向 query-aware 表示使用Sequence Model 或 Boundary Model預測答案範圍。其中:
- 序列模型(Sequence Model):使用Ptr-Net網絡,不做連續性假設,預測答案存在與原文的每一個位置
- 邊界模型(Boundary Mode):直接使用Ptr-Net網絡預測答案在原文中起始和結束位置
模型結構圖:
簡單的說:帶着問題去閱讀原文,然後用得到的信息去回答問題:
- 先利用LSTM閱讀一遍passage,得到輸出的encoding 序列。
- 然後帶着question的信息,重新將passage的每個詞輸入LSTM,再次得到passage的encoding信息。但是這次的輸入不僅僅只有passage的信息,還包含這個詞和question的關聯信息,它和question的關聯信息的計算方式就是我們在seq2seq模型裏面最常用的attention機制。
- 最後將信息輸入answer模塊,生成答案。
2.LSTM preprocessing Layer
LSTM preprocessing Layer的目的是將token的上下文信息包含到passage和question中的每個token的向量表示中。分別將passage和question輸入LSTM preprocessing Layer,直接使用單向LSTM,故而每一個時刻的隱含層向量輸出只包含左側上下文信息.
經過LSTM preprocessing Layer後,passage和question表示如下矩陣:
其中是passage的向量矩陣表示,其大小爲,表示隱藏層的節點個數;是question的向量矩陣表示,其大小爲。
3.match-LSTM
在文本蘊含任務中,輸入一個文本對,假設句T和蘊含句H,這裏將question當做T,passage當做H。下面是match-LSTM的構建,實質上就是一個attention機制。
其中:
- ,這都是需要訓練的參數。
- 是attention時的中間結果,表示passage中第i個詞和query中每個詞的交互信息(對應的每一列對應query中每一個詞);
其維度變化過程爲:[l Q] = [l l] [l Q] + ([l l] [l 1] + [l l] [l 1] + [l 1]) |Q|
- 是attention計算出來的權重,表示在passage的第i個token對question中每個詞的注意力權重向量。
其維度變化過程爲:[1 Q] = ([1 l] [l Q] + 1 * |Q|)
- 表示mathch-LSTM中,第 個token的隱藏層輸出,計算方式如下公式(3-4)
- 表示將x複製次,公式中同理
上式中公式3-1,3-2這種 attention 被稱爲 BahdanauAttention。 Passage 中第 t 個上下文向量會根據 所有 Question 的隱向量 & Passage 中 t-1 時刻的上下文向量 來確定對Question 每個 token 的權重。可以把下圖的 Y 理解爲 passage,把 X 理解爲question。
這裏可以針對passage每一個詞語輸出一個向量,這個向量維度是question詞長度,故而這種方法也叫做question-aware attention passage representation。
下面將attention向量()與原query編碼向量()點乘,得到passage中第i個token的question關聯信息,再與passage中第i個token的編碼向量做concat,粘貼爲一個向量,然後輸出到LSTM網絡中。
其中,是attention的結果。
這裏所有的資料都寫成了的形式,但是熟悉lstm內部結構(可參考本博)的應該知道,lstm需要的previous state是個tuple,也就是(),而這裏只提到了我覺得是因爲attention只用到了,但是公式中隻字未提是不是有點缺乏嚴謹~~~(當然源碼中用了state這個“tuple”而不只是)
上述就是match-LSTM的標準結構,這裏更進一步,爲了捕捉到更豐富的上下文信息,再增加一個反向match-LSTM網絡。基本結構同上。最終,只需要將正向match-LSTM輸出的隱含層向量和反向match-LSTM輸出的隱含層向量拼接起來即可。
其中
4.Answer Pointer Layer
將Match-LSTM Layer的輸出作爲這一層的輸入。Match-LSTM 的 Answer Pointer Layer 層包含了兩種預測答案的模式:
- Sequence Model 將答案看做是一個整數組成的序列,每個整數表示選中的 token 在原文中的位置,因此模型按順序產生一系列條件概率,每個條件概率表示基於上輪預測的 token 產生的下個 token 的位置概率,最後答案總概率等於所有條件概率的乘積。(其實有點懷疑這種方式產生的答案,人能讀得懂嗎?)
- Boundary Model 簡化了整個預測答案的過程,只預測答案開始和答案結束位置,相比於 Sequence Model 極大地縮小了搜索答案的空間,最後的實驗也顯示簡化的 Boundary Model 相比於複雜的 Sequence Model 效果更好,因此 Boundary Model 也成爲後來的模型用來預測答案範圍的標配。
4.1.Sequence Model
序列模型不限定答案的範圍,即可以連續出現,也可以不連續出現,因此需要輸出答案每一個詞語的位置。又因答案長度不確定,因此輸出的向量長度也是不確定的,需要手動制定一個終結符。假設passage長度爲P,則終結符爲P+1。
pointer net網絡,實質上仍然是一個attention機制的應用,只不過直接將attention向量作爲匹配概率輸出。
其中:
- 是與0向量的concat,即
- 這裏的來自:
答案a第k個詞對應passage位置爲:
也就是對於答案中的每個詞,其產生過程是:
- 在P的末尾設置一個停止標記,如果選擇它,則停止迭代。新的
- 先用上個狀態中的隱狀態輸出、match-lstm的輸出結果做attention,產生的權重結果;並將attention權重向量作爲預測結果,用最大值的index作爲k狀態的答案輸出,如果預測的index是P+1則停止,答案生成完畢;
- 將LSTM中的上一狀態,並用attention結果作爲輸入重新輸入LSTM,得到當前狀態隱狀態
- 步驟二和步驟三循環,直到步驟二中預測的index是P+1,或者超出設置的超參數(答案最長長度)。
Sequence Model的模型評判計算公式如下:
其中:
這裏公式中的表示的是最大的softmax值。
對上面公式4-1-4取對數函數,就得到了模型訓練loss:
4.2.Boundary Model
邊界模型直接假設答案在passage中連續出現,因此只需要輸出起始位置s和終止位置e即可。基本結構同Sequence Model,只需要將輸出向量改爲兩個,並去掉終結符。那麼同理loss定義爲:
Boundary Model的計算步驟可以根據上面修改爲:
- 先用上個狀態中的隱狀態輸出、match-lstm的輸出結果做attention,產生的權重結果;並將attention權重向量作爲預測結果,用最大值的index作爲k狀態的起始位置或者;
- 將LSTM中的上一狀態,並用attention結果作爲輸入重新輸入LSTM,得到當前狀態隱狀態
- 步驟一和步驟二執行兩次,得到和。
5.實驗
模型參數設置:
- 隱藏層大小:150
- 優化方法:Adamax(β1 = 0.9,β2 = 0.999)
- minibatch:30
- 沒有用L2正則
最終結果: