目錄web
機器閱讀理解(Machine Reading Comprehension)爲天然語言處理的核心任務之一,也是評價模型理解文本能力的一項重要任務,其本質能夠看做是一種句子關係匹配任務,其具體的預測結果與具體任務有關。數組
記錄一下以後用來實踐的數據集:網絡
閱讀理解任務具備多種類別:單項/多項選擇、完形填空以及抽取式問答。百度發佈的DuReader機器閱讀理解數據集涵蓋了以上三種任務類型,所以選擇用來實踐也是很是合適的。ide
DuReader數據集的樣本可用一個四維數組表示:{q, t, D, A},其中q表示問題,t表示問題類型,D表示文檔集合,A表示答案集合。一半的樣原本源於百度搜索引擎,一半來源於百度知道。下圖展現了DuReader數據集的不一樣類型樣本。(這裏記錄一下數據集,以後要是出了實踐代碼這裏再補上)
函數
這裏記錄一下比較經典的機器閱讀理解模型,或者說記錄一下各類花式 Attention,想要了解細節的小夥伴也能夠去看看原文,這裏也都附上了連接。性能
原文連接:Teaching Machines to Read and Comprehend搜索引擎
這篇文章提出的模型有三個:The Deep LSTM Reader、The Attentive Reader 和 The Impatient Reader。最主要的貢獻仍是 Attentive Reader 和 Impatient Reader 這兩個模型,這兩個模型也是機器閱讀理解一維匹配模型和二維匹配模型的開山鼻祖。
編碼
Attentive Reader 的基本結構如上圖所示,實際上也比較簡單,就是一個簡單的細粒度注意力機制在機器閱讀理解任務中的經典應用。spa
Impatient Reader 就是在 Attentive Reader 的一種變體,模型結構以下圖所示:
.net
由上圖可知,咱們能夠總結出如下幾點區別:
Impatient Reader 在計算注意力的時候,將每一個單詞看成一個單獨的 Query 從而計算該單詞對於 doc 中每一個詞的注意力加權表徵,並用非線性變換將全部的 r 進行反覆累積(單詞的重閱讀能力),即:
\[y_q(i) = \overrightarrow{y_{q}}(i)||\overleftarrow{y_{q}}(i)\\m(i,t) = \tanh{(W_{dm}y_d(t)+W_{rm}r(i-1)+W_{qm}y_q(i))}, 1\leq i \leq |q|\\ s(i,t) \propto \exp{(W^\mathrm{T}_{ms}m(i,t))}\\r(0) = r_0\\ r(i) = y^\mathrm{T}_ds(i)+\tanh{(W_{rr}r(i-1))}, 1\leq i \leq |q|\]
最後將最後一個文檔表示 r(|q|) 和問題表示 u 進行非線性組合用於答案預測。
\[g^{IR}(d,q) = \tanh{(W_{rg}r(|q|)+W_{qg}u)}\]
介紹了模型結構以後,咱們就能夠從兩個模型的區別來總結一下一維匹配模型與二維匹配模型的區別:
原文連接:Text Understanding with the Attention Sum Reader Network
這篇文章的模型主題基本與 Attentive Reader 十分相似,是一種一維匹配模型,主要是在最後的 Answer 判斷應用了一種 Pointer Sum Attention 機制,模型結構以下圖所示:
對該模型作一個簡單的解釋:
這樣一個將注意力分數累加的操做將受到一個詞出現次數的影響,一般,出現次數越多的詞越可能成爲問題的答案,這樣是不是合理的呢?實驗數據代表這樣的假設確實是合理的。該模型的結構以及Attention的求解過程明顯比 Attentive Reader 更簡單,卻取得了更好的效果,這也意味着並非越複雜的模型效果會更好,簡單的結構在合適的場景下能取得很是好的結果。
該模型一樣是對 Attentive Reader 的改進,屬於一種一維匹配模型,咱們先來看看熟悉的模型結構:
模型主體這裏就不講了,主要記錄一下其與 Attentive Reader 不同的部分:
注意力計算方式爲bilinear(較點積的方式更靈活):
\[\alpha_i = softmax(q^TW_sp_i)\\o = \sum_i\alpha_ip_i\]
獲得注意力加權輸出\(o\)以後,而後直接用\(o\)進行分類預測,而 Attentive Reader 是用輸出與 query 又作了一次非線性處理以後才預測的,實驗證實移除非線性層不會傷害模型性能。
原來的模型考慮全部出如今詞彙表V中的詞來作預測。而該模型只考慮出如今文本中的實體(進一步減小參數)
上述三點中,第一點是比較重要的,然後面兩點都是對模型的一個簡化處理。
原文連接:Attention-over-Attention Neural Networks for Reading Comprehension
AOA Reader 屬因而一種二維匹配模型,該論文的亮點是將另外一種注意力嵌套在現有注意力之上的機制,即注意力過分集中機制,其主要模型結構以下圖所示:
利用雙向GRU對 Document 和 Query分別編碼,獲得編碼後的隱藏層表徵,即
\[e(x) = W_e \cdot x, \ where \ x \in D, Q\\ \overrightarrow{h_s}(x) = \overrightarrow{GRU}(e(x))\\ \overleftarrow{h_s(x)} = \overleftarrow{GRU}(e(x))\\ h_s(x) = [\overrightarrow{h_s}(x); \overleftarrow{h_s}(x)]\]
利用pair-wise matching matrix來計算獲得注意力匹配分數:
\[M(i,j)=h_{doc}(i)^T ·h_{query}(j)\]
在列方向上進行 Softmax 歸一化,注意上一個公式,每一列表示 query 一個詞對 doc 全部詞的注意力分數大小,獲得所謂的 query-to-document attention
\[\alpha(t) = softmax(M(1, t), ..., M(|D|, t))\\ \alpha = [\alpha(1), \alpha(2), ..., \alpha(|Q|)]\]
在行的方向進行 Softmax 歸一化,獲得 document-to-query attention
\[\beta(t) = softmax(M(t, 1), ..., M(t, |Q|))\]
將 document-to-query attention 做平均獲得最終的 query-level attention:
\[\beta = \frac{1}{n}\sum_{t=1}^{|D|}\beta (t)\]
最後,用每一個query-to-document attention和剛剛獲得的query-level attention作點乘,獲得document中每一個詞的score。
\[s = \alpha^T\beta\]
與Attentive Sum Reader相似,最後預測答案詞的方式是將同類型的詞的分數累加,得分最高的詞即爲答案,下式中,V爲詞表:
\[P(w|q, d) = \sum_{i \in I(w, d)}s_i, \ w \in V\]
對於損失函數,咱們能夠直接最大化正確詞的機率分數便可,下式中,A爲標註答案詞:
\[L = \sum_i log(p(x)), \ x \in A\]
Match-LSTM:Learning Natural Language Inference with LSTM
Pointer Networks:Pointer Networks
Match-LSTM and Answering Point:Machine Comprehension Using Match-LSTM and Answer Pointer
由論文標題可知,該論文利用 Match-LSTM 以及 Answer Pointer 模型來解決機器閱讀理解問題,Match-LSTM也屬於二維匹配模型的一種,注意力求解方法咱們下面再詳細介紹,該論文的主要貢獻在於將Pointer Net中指針的思想首次應用於閱讀理解任務中。首先,咱們分別看看兩個模型的結構:
Match-LSTM最初提出是用於解決文本蘊含任務的。文本蘊含任務的目標是,給定一個 premise(前提),根據此 premise 判斷相應的 hypothesis(假說)正確與否,若是今後 premise 可以推斷出這個 hypothesis,則判斷爲 entailment(蘊含),不然爲 contradiction(矛盾)。文本蘊含任務也能夠看做是句子關係判斷任務的一種。
模型的主要結構如上圖所示,圖中,\(H^S\)爲 premise 通過LSTM編碼後的隱藏層表徵,同理,\(h_k^t\)爲 hypothesis 中第 \(k\) 個詞的隱藏層表徵。整個模型的計算以下:
Pointer Net的提出解決了一類特殊問題:若是生成的輸出序列中的字符必然出現於輸入序列,則咱們能夠採用Pointer Net的結構來獲得輸出,而不須要事先規定固定詞表。這類模型在文本摘要任務中獲得了普遍的應用,主要思路以下圖所示:
對於左邊的傳統模型,若是給定的詞彙表已經限定,則模型沒法預測大於4的數字,而對於右邊的Ptr-Net,咱們不須要給定詞彙表,只須要在預測的時候每一步都指向輸入序列中權重最大的那個元素,因爲輸出序列徹底來自於輸入序列,則解空間徹底能夠隨着輸入序列變化。而咱們在求 Attention 過程當中的 Softmax 分數,正是每個輸出位置對輸入序列的注意力大小,直接將最大分數的位置做爲該輸出位置的指針便可。
將二者結合起來,在機器閱讀理解任務中,能夠將 question 看成 premise,將 passage 看成 hypothesis,整個模型的思路以下:
原文連接:Bidirectional Attention Flow for Machine Comprehension
在 Match-LSTM 提出以後,question-aware 表徵的構造方式開始出如今各個論文之中。該論文中的 Attention 計算主要有如下三個特徵;
模型結構如上圖所示,由圖可知,模型主要有如下幾個部分:
字符嵌入層:字符嵌入層負責將每一個單詞映射到高維向量空間。使用卷積神經網絡(CNN)在字符級別上對每一個單詞進行編碼,該卷積網絡的應用原理參考Kim在2014年發表的TextCNN。CNN的輸出在整個寬度上被max-pooled,以得到每一個單詞的固定大小向量。
詞嵌入層:使用預訓練的 Glove 詞向量。並將字符嵌入層獲得的詞向量與預訓練詞向量拼接以後,輸入一個2層的Highway層,獲得整合以後的詞表徵。
上下文嵌入層:使用BiLSTM對 Context 和 Query 分別進行編碼。值得注意的是,上述這三層提取了三個不一樣粒度的特徵對 Context 以及 Query 進行編碼,獲得矩陣 \(H \in R^{2d\times T}\) 和 \(U \in R^{2d \times J}\)。
建模層:這一層的輸入爲以前獲得的\(G\),Context 的 query-aware 表示。這一層能夠看做利用 Bi-LSTM 對含 Context 及 Query 信息的矩陣G進行進一步的信息提取,獲得輸出矩陣大小爲\(M \in R^{2d\times T}\),將其用於預測答案。
損失函數爲開始和結束位置的交叉熵之和,與 Match-LSTM 中的 Boundary Model 相似。
原文連接:R-NET: MACHINE READING COMPREHENSION WITH SELF-MATCHING NETWORKS
R-Net主要是在 Match-LSTM 的基礎上進行的,的主要結構如上圖所示,結構已經很是清楚了,主要包括Encoding Layer,Gated Matching Layer,Self-Matching Layer,Boundary Prediction Layer四個部分,咱們先把結構展開講一下,再對該論文的貢獻進行總結。
Question and Passage Encoder:該層將Word Embedding 以及 Character Embedding 拼接,在輸入一個雙向GRU對 Question 以及 Passage 進行編碼,即
\[u^Q_t = BiRNN_Q(u^Q_{t−1}; [e^Q_t ; c^Q_t])\\ u^P_t = BiRNNP (u^P_{t−1}; [e^P_t ; c^P_t])\]
Gated Attention-based Recurrent Networks:論文提出了一種門限注意力循環網絡來將 Question 的信息整合到 Passage 的表徵中,它是基於注意力的循環網絡的一種變體,具備一個附加的門來肯定段落中有關問題的信息的重要性。由 Question 與 Passage 的表徵 \(u^Q_t, u^P_t\) 獲得 Sentence-Pair 表徵 \(v^P_t\):
\[v^P_t = RNN(v^P_{t-1}, c_t)\]
其中,\(c_t = att(u^Q, [u^P, v^P_{t-1}])\),能夠將其看做一個注意力池化向量,具體計算以下:
\[s_t^j = v^T tanh(W_u^Qu^Q_j + W_u^P u^P_t + W_v^P v_{t−1}^P)\\ a^t_i = exp(s^t_i)/sum^m_{j=1}exp(s^t_j) \\ c_t = \sum^m_{i=1}a^t_iu^Q_i\]
則獲得的每個 Sentence-Pair 向量都動態整合了整個問題的匹配信息,借鑑 Match-LSTM 的思想,將 Passage 的表徵輸入到最後的RNN中,獲得 Question-aware Passage 表徵 :
\[v^P_t = RNN(v^P_{t-1}, [u^P_t, c_t])\]
爲了動態判斷輸入向量與 Question 的相關性,還額外加入一個門機制,對RNN的輸入進行控制,所以將其稱爲 Gated Attention-based Recurrent Networks:
\[[u_t^P, c_t]^* = g_t \cdot [u_t^P, c_t]\\ g_t = sigmoid(W_g[u_t^P, c_t])\]
Self-Matching Attention:上一層輸出的 Question-aware 表徵肯定了段落中與問題相關的重要部分,但這種表徵的一個重要問題是其很難包含上下文信息,然而一個答案的肯定不少時候都是很依賴於上下文的。爲了解決這個問題,論文提出了 Self-Matching Attention,其動態地收集整個段落的信息給段落當前的詞語,把與當前段落詞語相關的信息和其匹配的問題信息編碼成段落表示:
\[h^P_t = BiRNN(h_{t-1}^P, [v_t^P, c_t])\]
這裏的\(c_t = att(v^P ; v_t^P )\)爲對整個 Passage 的自注意力池化:
\[s^t_j = v^Ttanh(W_v^P v_j^P + W_v^{\tilde{P}}v_t^P )\\ a^t_i = exp(s^t_i)/\sum^n_{j=1}exp(s^t_j)\\ c_t = \sum^n_{i=1}a^t_iv_i^P\]
一樣,對\([v_t^P, c_t]\)增長與上一層輸入一樣的門控機制,來自適應控制 RNN 的輸入。
根據給定段落表示,把 Attention 權重分數做爲一個 Pointer 來選取答案在段落中的起始位置,也就是基於初始語境信息,計算段落中每一個詞語的 Attention 權重,權重最高的做爲起始位置:
\[s^t_j = v^Ttanh(W_h^P h_j^P + W_h^{a}h_{t-1}^a)\\ a^t_i = exp(s^t_i)/\sum^n_{j=1}exp(s^t_j)\\ p^t = argmax(a_1^t, ..., a_n^t)\]
上式中,\(h^a_{t-1}\) 爲 Point Network 最後的隱藏狀態
在獲得起始位置以後,用注意力分數對 Self-Matching 的 Passage 表徵進行加權,而後利用以前的Question Attention-Pooling表徵,做爲RNN的初識狀態,對加權後的Passage 表徵進行再處理,獲得新的語境,新的語境信息計算方式以下:
\[c_t = \sum^n_{i=1}a^t_ih^P_i\\ h^a_t = RNN(h^a_{t-1}; c_t)\]
當預測開始位置的時候,將對 Question 的表徵使用 Attention-Pooling的向量做爲 Pointer Network 的初始語境。
\[s_j = v^Ttanh(W_u^Q u_j^Q + W_V^{Q}V_r^Q )\\ a_i = exp(s_i)/\sum^m_{j=1}exp(s_j)\\ r_Q = \sum^m_{i=1}a_iu_i^Q\]
上式中\(V_r^Q\)爲參數向量
一樣選擇交叉熵做爲模型的損失函數
瞭解了模型的主要結構,咱們來看看該模型的創新點在什麼地方:
原文連接:QANET
深度可分離卷積:Xception: Deep Learning with Depthwise Separable Convolutions
DCN:Dynamic Connection Network for Question Answering
最後一個模型QANet,是預訓練模型發佈以前排名最優的一個閱讀理解模型了,其與以前模型明顯的不一樣就是,拋棄了RNN,只使用 CNN 和 Self-Attention 完成編碼工做,使得速度與準確率大大贈強。模型的主要結構以下圖(左)所示
該模型與大多與之模型的結構都是相同的,,由五個部分組成:Embedding layer, Embedding encoder layer, Context-query attention layer, Model encoder layer 和 Output layer。其中,整個模型中使用相同的編碼器塊(圖右),僅改變每一個塊的卷積層數,該編碼器塊主要由以下幾個特色:
下面來看看總體結構:
Embedding Encoder Layer:編碼層就是編碼器塊堆疊造成的,此處的編碼器塊層數爲1,將 Input Embedding Layer 輸出的長度爲 500 的向量 映射爲一個長度爲 128 的向量。
Context-Query Attention Layer:咱們用 C 和 Q 分別表示編碼後的 Context 和 Question,根據二維匹配模型,首先計算出 C 和 Q 的類似矩陣 \(S \in R^{n \times m}\),而後對其進行 Softmax 歸一化,獲得 Context 中每一個詞對 Question 全部詞的注意力分數,再將歸一化後的矩陣 \(\bar{S}\) 對問題表徵 Q 進行加權,從而獲得問題的context-to-query attention表徵:
\[A=S \cdot Q^T \ \in R^{n\times d}\]
類似度矩陣的計算方法也是比較傳統的方法:
\[f(q, c) = W_0[q; c; q \cdot c]\]
另外,做者還借鑑了當時高性能的模型中求解雙向注意力的方法(如BiDAF),計算了上下文的 query-to-context attention 表徵,計算方式借鑑的是 DCN 中的計算方法,首先對類似度矩陣 \(S\) 進行列歸一化,獲得 Question 的每一個詞對 Context 全部詞的注意力分數 \(\bar{\bar{S}}\) ,則 query-to-context attention 表徵爲
\[B=\bar{S} \cdot \bar{\bar{S}}^T \cdot C^T \ \in R^{m\times d}\]
Model Encoder Layer:這部分繼續沿用了與 BiADF 中相似的結構,輸入爲 Contest 的 query-aware 表徵 \([c, a, c \cdot a, c \cdot b]\) ,其中 \(a, b\) 爲矩陣 \(A, B\) 中的一行。而編碼器塊處了卷積層數爲2,總的塊數是7之外,其他與 Embedding Encoder Layer 中的結構相同,總共堆疊3組編碼器塊(共有 3*7 個Encoder Block)。
Output layer:這一層一樣沿用與 BiADF 相似的結構,僅僅答案開始以及結束的位置進行預測。
\[p^1=softmax(W_1[M_0;M_1])\\ p^2=softmax(W_2[M_0;M_2])\]
其中,\(W_1, W_2\) 均爲可訓練矩陣,而\(M_0, M_1, M_2\) 分別爲3組編碼器塊的輸出
損失函數一樣爲交叉熵。固然,經過改變輸出層的網絡結構,該模型可以適應其餘類型的閱讀理解任務,如單項多項選擇等。
若是你看到了這裏,就會發現 QANet 基本融合以前全部模型的優勢,從而獲得了當時的最優效果(即便模型性能以後仍是被預訓練模型吊打),在這篇文章的基礎上,最後咱們總結一下機器閱讀理解模型的一些已被證明的十分有效的技巧:
參考連接
https://zhuanlan.zhihu.com/p/22671467
https://zhuanlan.zhihu.com/p/52977813
https://zhuanlan.zhihu.com/p/53132772
https://zhuanlan.zhihu.com/p/53324276
https://zhuanlan.zhihu.com/p/21349199
https://zhuanlan.zhihu.com/p/48959800
https://blog.csdn.net/zhang2010hao/article/details/88387493
https://zhuanlan.zhihu.com/p/53626872
https://zhuanlan.zhihu.com/p/35229701
https://zhuanlan.zhihu.com/p/61502862
https://zhuanlan.zhihu.com/p/58961139