Attention-over-Attention Neural Networks for Reading Comprehension
論文地址:https://arxiv.org/pdf/1607.04423.pdf
0 摘要
任務:完形填空是閱讀理解是挖掘文檔和問題關系的一個代表性問題。
模型:提出一個簡單但是新穎的模型A-O-A模型,在文檔級的注意力機制上增加一層注意力來確定最后答案
(什么是文檔級注意力?就是每閱讀問題中的一個詞,該詞對文檔中的所有單詞都會形成一個分布,從而形成文檔級別的分布)
模型優點:(1)更簡單,性能更好 (2)提出N-best重新排序策略去二次檢驗候選詞的有效性(3)相比之前模型,實驗結果性能更好
數據集:CNN&Daily Mail以及兒童故事(Children’s Book Test,CBT)數據集介紹
1 引言
(1)引出任務:
閱讀和理解人類語言是機器的挑戰性任務,他需要理解自然語言和推理線索的能力。其中,填充式閱讀理解問題已成為社區的熱門任務,填充式查詢( cloze-style query)是一個問題,即在考慮上下文信息的同時,在給定的句子中填寫適當的單詞。這個單詞答案是文檔中的一個單詞,它需利用文檔和問題中的上下文信息推理得來。
形式上,一般的Cloze-style式閱讀理解問題可以被解釋為一個三元組:D,Q,A三元組:
- 文檔D :Mary sits beside him … he loves Mary
- 查詢Q:he loves __
- 查詢答案A:Mary
(2)對機器進行填充式任務的閱讀理解,需要大規模數據集,現有兩個數據集:
1)CNN /每日郵報新聞數據集(2015年),文檔D由新聞報道組成,查詢Q由文章摘要構成,將文章摘要中的一個實體詞被特殊的占位符替換以指示缺失的詞。被替換的實體詞將是查詢的答案。
2)兒童圖書測試數據集(2016),文檔D由書籍的連續20個句子生成的,並且查詢由第21句形成。
(3)基於上述數據集的相關工作:
在這個數據集上,提出了很多神經網絡的方法,而且大多數都是基於注意力機制的神經網絡,由於注意力機制在學習對於輸入上的重要分布的能力,已經成為了大多數NLP任務的固定模式。
(4)本文思路:
本文提出一種新的神經網絡,稱為attention-over-attention注意模型。我們可以從字面上理解含義:我們的模型旨在將另一種注意機制置於現有文檔級別的注意力機制之上。
與以前的作品不同,之前的模型通常使用啟發式歸並的思想或者設置許多預定義的不可訓練的項,我們的模型可以自動在多個文檔級別的“注意力”上生成一個集中注意力,所以,模型不僅可以從查詢Q到文檔D;還可以文檔D到查詢Q進行交互查看,這將受益於交互式信息。
(5)本文創新點:
綜上所述,我們的工作主要貢獻如下:
-
據我們所知,這是第一次提出將注意力覆蓋在現有關注點上的機制之上,即attention-over-attention mechanism。
-
與以往有關向模型引入復雜體系結構或許多不可訓練的超參數的工作不同,我們的模型要簡單得多,但要大幅優於各種最先進的系統。
-
我們還提出了N-best排名策略,以重新評估候選詞的各個方面並進一步提高表現。
接下來的文章結構:第2節簡明介紹完形填空式閱讀理解任務以及相關的數據集;第3節詳細介紹所提出的attention-over-attention的閱讀器;第4節將介紹N-BEST排名策略;第5節和第6節介紹實驗結果和實驗分析;最后在第7節中給出總結與展望。
2 完形填空式閱讀理解
2.1 任務描述
<D, Q, A>
,其中
D
代表文檔(document),
Q
代表問題(query),
A
則代表問題的答案(Answer),
答案是文檔中某個詞,答案詞的類型為固定搭配中的介詞或命名實體。
作者:損失函數
鏈接:https://www.imooc.com/article/29985
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
<D, Q, A>
,其中
D
代表文檔(document),
Q
代表問題(query),
A
則代表問題的答案(Answer),
答案是文檔中某個詞,答案詞的類型為固定搭配中的介詞或命名實體。
作者:損失函數
鏈接:https://www.imooc.com/article/29985
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
一個完形填空式閱讀理解樣本可描述為一個三元組:<D, Q, A>,其中D代表文檔(document),Q代表問題(query),A則代表問題的答案(Answer),答案是文檔中某個詞,答案詞的類型為固定搭配中的介詞或命名實體。
2.2 現有公共數據集
- CNN/DailyMail
<D, Q, A>
,其中D
代表文檔(document),Q
代表問題(query),A
則代表問題的答案(Answer),答案是文檔中某個詞,答案詞的類型為固定搭配中的介詞或命名實體。
作者:損失函數
鏈接:https://www.imooc.com/article/29985
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
<D, Q, A>
,其中D
代表文檔(document),Q
代表問題(query),A
則代表問題的答案(Answer),答案是文檔中某個詞,答案詞的類型為固定搭配中的介詞或命名實體。
作者:損失函數
鏈接:https://www.imooc.com/article/29985
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
<D, Q, A>
,其中D
代表文檔(document),Q
代表問題(query),A
則代表問題的答案(Answer),答案是文檔中某個詞,答案詞的類型為固定搭配中的介詞或命名實體。
作者:損失函數
鏈接:https://www.imooc.com/article/29985
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
這是一個完形填空式的機器閱讀理解數據集,從美國有線新聞網(CNN)和每日郵報網抽取近一百萬篇文章,每篇文章作為一個文檔(document),在文檔的summary中剔除一個實體類單詞,並作為問題(question),剔除的實體類單詞即作為答案(answer),該文檔中所有的實體類單詞均可為候選答案(candidate answers)。其中每個樣本使用命名實體識別方法將文本中所有的命名實體用類似“@entity1”替代,並隨機打亂表示。
- Children‘s Book Test
一個完形填空式閱讀理解樣本可描述為一個三元組:<D, Q, A>
,其中D
代表文檔(document),Q
代表問題(query),A
則代表問題的答案(Answer),答案是文檔中某個詞,答案詞的類型為固定搭配中的介詞或命名實體。
作者:損失函數
鏈接:https://www.imooc.com/article/29985
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
由於沒有摘要,所以從每一個兒童故事中提取20個連續的句子作為文檔(document),第21個句子作為問題(question),並從中剔除一個實體類單詞作為答案(answer)。在CBTest數據集中,有四種類型的子數據集可用,它們通過應答詞的詞性和命名實體標簽分類,包含命名實體(NE),常用名詞(CN),動詞和介詞。 在研究中,他們發現動詞和介詞的回答相對較少地依賴於文檔的內容,並且人類甚至可以在沒有文檔存在的情況下進行介詞填空。 回答動詞和介詞較少依賴於文檔的存在。 因此,大多數相關工作都集中在解決NE問題上和CN類型。
3 本文模型Attention-over-Attention Reader
我們的模型基於“Text understanding with the attention sum reader network.”論文提出的模型,但是他主要計算文檔級別的關注,而不是計算文檔的混合程度。而我們這篇文章中提出了一個新的方法,在原來的注意力上新增加一層注意力,來描述每一個注意力的重要性。
- Contextual Embedding
首先將文檔D
和問題Q
轉化為one-hot
向量
,然后將one-hot
向量
輸入embedding層,然后用共享嵌入矩陣We將它們轉換為連續表示。通過共享詞嵌入,文檔和問題都可以參與嵌入的學習,它們都將從這種機制中獲益。然后,我們使用兩個雙向RNNS來獲取文檔的上下文表示形式並分別進行查詢,其中每個單詞的表示形式是通過連接向前和向后輸出狀態形成的。在權衡模型性能和訓練復雜度之后,我們選擇門控遞歸單元(GRU) 作為遞歸單元實現。也就是說,用 Bi-GRU 將 query 和 document 分別 encode,將兩個方向的hidden state 拼接起來作為該詞的 state,此時 document 和 query 可以分別用一個 Dxd 和 Qxd 的矩陣來表示,這里 D 是 document 的詞數,Q 是 query 的詞數,d 是embedding 的維度。
1 embedding = tf.get_variable('embedding', 2 [FLAGS.vocab_size, FLAGS.embedding_size], 3 initializer=tf.random_uniform_initializer(minval=-0.05, maxval=0.05)) 4 5 regularizer = tf.nn.l2_loss(embedding) 6 7 doc_emb = tf.nn.dropout(tf.nn.embedding_lookup(embedding, documents), FLAGS.dropout_keep_prob) 8 doc_emb.set_shape([None, None, FLAGS.embedding_size]) 9 10 query_emb = tf.nn.dropout(tf.nn.embedding_lookup(embedding, query), FLAGS.dropout_keep_prob) 11 query_emb.set_shape([None, None, FLAGS.embedding_size]) 12 13 with tf.variable_scope('document', initializer=orthogonal_initializer()): 14 fwd_cell = tf.contrib.rnn.GRUCell(FLAGS.hidden_size) 15 back_cell = tf.contrib.rnn.GRUCell(FLAGS.hidden_size) 16 17 doc_len = tf.reduce_sum(doc_mask, reduction_indices=1) 18 h, _ = tf.nn.bidirectional_dynamic_rnn( 19 fwd_cell, back_cell, doc_emb, sequence_length=tf.to_int64(doc_len), dtype=tf.float32) 20 #h_doc = tf.nn.dropout(tf.concat(2, h), FLAGS.dropout_keep_prob) 21 h_doc = tf.concat(h, 2) 22 23 with tf.variable_scope('query', initializer=orthogonal_initializer()): 24 fwd_cell = tf.contrib.rnn.GRUCell(FLAGS.hidden_size) 25 back_cell = tf.contrib.rnn.GRUCell(FLAGS.hidden_size) 26 27 query_len = tf.reduce_sum(query_mask, reduction_indices=1) 28 h, _ = tf.nn.bidirectional_dynamic_rnn( 29 fwd_cell, back_cell, query_emb, sequence_length=tf.to_int64(query_len), dtype=tf.float32) 30 #h_query = tf.nn.dropout(tf.concat(2, h), FLAGS.dropout_keep_prob) 31 h_query = tf.concat(h, 2)
文檔的Contextual Embedding
表示為h_doc
,維度為|D| * 2d
,問題的Contextual Embedding
表示為h_query
,維度為|Q| * 2d
,d
為GRU的節點數。
D
和問題Q
轉化為one-hot向量
,然后將one-hot向量
輸入embedding層,
作者:損失函數
鏈接:https://www.imooc.com/article/29985
來源:慕課網
本文原創發布於慕課網 ,轉載請注明出處,謝謝合作
- Pair-wise Matching Score
在獲得文檔h_doc和查詢h_query 的contextual embeddings之后,我們計算成對匹配矩陣,其表示一個文檔詞和一個查詢詞的成對匹配程度。 也就是,當給出第i個單詞和第j個單詞時,我們可以通過它們的點積來計算匹配分數
1 M = tf.matmul(h_doc, h_query, adjoint_b=True) 2 M_mask = tf.to_float(tf.matmul(tf.expand_dims(doc_mask, -1), tf.expand_dims(query_mask, 1)))
通過這種方式,我們可以計算每個文檔和查詢詞之間的每一對匹配分數,形成一個矩陣M∈R| D | * | Q | ,其中第i行第j列的值由M(i,j)填充。行數為文檔D的長度,寬度為查詢Q的長度。
這一步本質上就是對兩個矩陣做矩陣乘法,得到所謂的Matching Score矩陣M,這里的M矩陣的維度是DxQ,矩陣中的每個元素表示對應 document 和 query 中的詞之間的matching score。
- Individual Attentions
對 M 矩陣中的每一列做 softmax 歸一化,其中當考慮單個查詢詞時,每列是單獨的文檔級關注,得到所謂的 query-to-document attention的關注,即給定一個query詞,對 document 中每個詞的 attention,本文用下式進行表示:
每一列都是一個文檔級別的注意力,我們表示α(t)∈R |D| 作為在第t個查詢詞的文檔級關注
- Attention-over-Attention
前三個步驟都是很多模型采用的通用做法,這一步是本文的亮點。首先,上一步是對 M 矩陣的每一列做了 softmax 歸一化,這里對 M 矩陣的每一行做 softmax 歸一化,即得到所謂的document-to-query attention。
我們引入另一種注意機制來自動確定每個individual的注意力的重要性,而不是使用簡單的啟發式方法(如求和或平均)來將這些個體注意力集中到最后的注意力上。
首先,我們計算反向注意力,即對於時間t的每個文檔詞,我們計算查詢中的“重要性”分布,即給定單個文檔詞時哪些查詢詞更重要。 我們將逐行方式的softmax函數應用於成對匹配矩陣M,以獲得查詢級別的關注。 我們表示β(t)∈R | Q | 作為關於時間t處的文檔詞的查詢級關注,這可以被視為文檔到查詢的關注。(對M橫向求softmax)
到目前為止,我們已經獲得了查詢到文檔的關注度α(把M豎着soft)和文檔到查詢的關注度β(把M橫着soft)。 我們的動機是利用文檔和查詢之間的交互信息。
1 # Softmax over axis 2 def softmax(target, axis, mask, epsilon=1e-12, name=None): 3 with tf.op_scope([target], name, 'softmax'): 4 max_axis = tf.reduce_max(target, axis, keep_dims=True) 5 target_exp = tf.exp(target-max_axis) * mask 6 normalize = tf.reduce_sum(target_exp, axis, keep_dims=True) 7 softmax = target_exp / (normalize + epsilon) 8 return softmax 9 10 alpha = softmax(M, 1, M_mask)##mask矩陣,非零位置為1,axis=0為batch 11 beta = softmax(M, 2, M_mask)
然后我們對所有β(t)進行平均以得到平均的查詢級別關注β。 請注意,我們不會將另一個softmax應用於β,因為平均個別關注不會破壞正常化條件。
這里的α的維度為|D| * |Q|
,β的維度為|Q| * 1,我們在看問題的時候,並不是問題的每個單詞我們都需要用到解題中,即問題中的單詞的重要性是不一樣的,這一步我們主要分析問題中每個單詞的貢獻,先定位貢獻最大的單詞,然后再在文檔中定位和這個貢獻最大的單詞相關性最高的詞作為問題的答案。
最后,我們計算α和β的點積得到“attended document-level attention”s∈R| D | 即attention-over-attention機制。 直觀地說,該操作是在時間t查看查詢詞時(此時根據上步所得的每個問題詞的貢獻程度)計算每個單獨文檔級關注度α(t)的加權總和。通過每個查詢詞的重要性通過投票結果來做出最終決定(文檔級關注)。
直觀上看,就像把每個query 的word的權重去衡量每個document−level 的權重,由此學習出document 中哪個詞更有可能為answer。
1 query_importance = tf.expand_dims(tf.reduce_mean(beta, 1) / tf.to_float(tf.expand_dims(doc_len, -1)), -1) 2 s = tf.squeeze(tf.matmul(alpha, query_importance), [2])
- Final Predictions
上面我們可以得到一個s 向量,這個s 向量和document長度相等,因此若某個詞在document 出現多次,則該詞也應該在s 中出現多次,該詞的概率應該等於其在s 出現的概率之和。計算單詞w
是答案的條件概率,文檔D
的單詞組成單詞空間V
,單詞w
可能在單詞空間V
中出現了多次,其出現的位置i組成一個集合I(w, D)
,對每個單詞w
,我們通過計算它在s中的得分並求和得到單詞w
是答案的條件概率,計算公式如下所示:
1 unpacked_s = zip(tf.unstack(s, FLAGS.batch_size), tf.unstack(documents, FLAGS.batch_size)) 2 y_hat = tf.stack([tf.unsorted_segment_sum(attentions, sentence_ids, FLAGS.vocab_size) for (attentions, sentence_ids) in unpacked_s])
##unsorted_segment_sum函數是用來分割求和的,第二個參數就是分割的index,index相同的作為一個整體求和
##注意這里面y_hat也就是上面所講的s向量,但是其經過unsorted_segment_sum操作后,其長度變為vocab_size.
那在train 時,object_function 具體是怎樣呢?
實現代碼:
下面代碼中的一波操作不太好理解,其在nlpnlp 代碼中很常見,值得好好琢磨。
1 index = tf.range(0, FLAGS.batch_size) * FLAGS.vocab_size + tf.to_int32(answer)##這里面為啥乘以vocab_size,看下面解釋,求答案在全文中的索引,也就是I(W,D) 2 3 flat = tf.reshape(y_hat, [-1])## 注意每個樣本的y_hat長度為vocab_size,直接將batch_size個flat reshape成一維。 4 relevant = tf.gather(flat, index)##以index為准,找到flat中對應的值,也就是answer中的詞在s向量中的概率值。 5 6 loss = -tf.reduce_mean(tf.log(relevant)) 7 8 accuracy = tf.reduce_mean(tf.to_float(tf.equal(tf.argmax(y_hat, 1), answer)))
4 N最佳重新排名策略 N-best Re-ranking Strategy
- N-best解碼
我們在解碼過程中提取后續候選項,而形成N個最佳列表。而不是僅挑選出具有最高可能性的候選項作為回答。
- 將候選詞填入查詢
作為填充式問題的一個特征,每個候選詞都可以填充到查詢的空白處以形成一個完整的句子。 這使我們能夠根據其上下文來檢查候選詞。
- 特征打分
能夠從很多方面為候選句子打分,本文中我們選取三種特征來進行打分形成N-best表。
(1)Global N-gram LM:這是評分句子的基本指標,旨在評估其流利程度。 基於訓練集中所有的document訓練8-gram模型,判斷候選答案所在句子的合理性;
(2)Local N-gram LM:與全局LM不同,局部LM旨在通過給定文檔來探索信息,因此統計信息是從測試時間文檔中獲得的。 應該注意的是,局部LM是逐個樣本進行訓練的, 它並未在整個測試集上進行訓練,這在真實測試案例中是不合法的。 當測試樣本中有許多未知單詞時,此模型非常有用。基於問題所對應的的document訓練8-gram模型;
(3)Word-class LM:與全局LM類似,詞類LM也在訓練數據的文檔部分進行訓練,但是這些詞被轉換為它的詞類ID。可以通過使用聚類方法獲得該詞類。 在本文中,我們簡單地使用mkcls工具來生成1000個詞類。
- 微調權重和 重新打分和重新排名
采用K-best MIRA
算法對上述三種特征進行權值訓練,最后累加權值,選擇損失函數最小的值作為最終的正確答案。
mkcls是一種通過使用最大似然准則來訓練單詞類的工具。生成的詞類特別適合於語言模型或統計翻譯模型。
MIRA算法是一種超保守算法,在分類,排序,回歸等應用領域都取得不錯的成績。
5 實驗
5.1實驗設置
- 嵌入層(使用未預訓練詞向量)權值初始化:[−0.05, 0.05];
- l2正則化:0.0001;
- dropout:0.1;
- 隱含層:GRU由隨機正交矩陣初始化
- 優化函數:Adam;
- 學習率初始化:0.001;
- gradient clip:5;
- batch size:32;
- 5-Bestlist(影響不大)
對於不同語料,嵌入層維度和隱含層單元數:
5.2 實驗結果
我們的實驗是在公共數據集上CNN news和CBTest NE/CN開展:
CNN News大概包括90k文檔和380k問題;DailyMail包含197k 文檔 和 879k 問題;CBT Test將文本根據單詞屬性分為NE,CN,P,V,這四種的驗證集和測試集都是2000和2500的問題。
實驗結果:
我們的AoA閱讀器在當前先進的系統上有很大的優勢,在CBTest NE和CN測試集中,相比EpiReader有2.3%和2.0%的絕對改進,證明了我們的模型的有效性。此外,通過在重新排序步驟中添加額外的特性,在CBTest NE/CN測試中,相對於AoA閱讀器還有2.0%到3.7%的顯著提升集。我們還發現,我們的單一模型可以保持與以前最好的集成系統的性能,甚至我們有0.9%的絕對改善超過最佳集成模型(迭代注意)在CBTest NE驗證集。當涉及到集成模型時,我們的AoA讀者還顯示了顯著改善了以前最好的集成模型,並建立了一個新的先進的系統。
為了調查采用attention-over-attention機制的有效性,我們也比較模型CAS模型(使用預定義的合並啟發式,比如sum或avg等)。本文不使用預定義的合並啟發式,而是讓模型顯式地學習個體之間的權重關注,使性能比CAS顯著提高4.1%和3.7%可以在CNN的驗證和測試集上 。
6 感悟
- 我看過一些QA、QG等方面的論文,感覺大部分都做了類似論文所說的document−level attention 操作,也就是結合query去attention documentt, 這篇創新的也做了query−level attention 操作。
- 感覺這篇論文實際上做了兩層attention,在第一層中不僅做了document−level attention ,也做了query−level attention,第二層中,把結合query−level attention的信息對document−level attention 又做了attention 操作。
- 考慮在閱讀理解其他方面的應用; 考慮模型是否有別的改進;研究語料庫的應用;
- 單個模型和ensembel模型