0 文章來源

作者:Minjoon Seo、Aniruddha Kembhavi、Ali Farhadi、Hananneh Hajishirzi

發表機構: ICLR 2017

原文下載地址:

Bidirectional Attention Flow for Machine Comprehension?

arxiv.org

原文代碼地址:

allenai/bi-att-flow?

github.com

1 原文概述

原文這篇文章在機器閱讀理解領域所作的貢獻十分的顯著,提出的雙向注意力機制更是成為了一種通用編碼器或者推理單元基礎架構中的一部分。機器理解(Machine comprehension,MC)是在給定的上下文文段中回答一個針對於該段的提問。SQuAD(Stanford Question Answering Dataset )則是有名的機器閱讀角鬥場,該數據集的最大特點就是所回答的答案是給出段落的一個範圍。原文中最大的特點就是利用雙向注意力流(Bi-Directional Attention Flow,BiDAF)得到了一個問題感知的上下文表徵。更深層的講,問題感知的上下文表徵是所給段落和問題之間的交互,可以理解為將問題嵌入段落中去,從某種程度上講相當於一種編碼方式。這個很關鍵,QA任務中如何建模所給段落與問題的關係,對於後續模型給出答案非常重要。

說來說去,原文的創新點是對已有的注意力機制的一個改進。為此,原文作者總結了在MC所用到的注意力機制,大致有三個特點:(1)注意力權重通常通過將上下文概括為固定長度的向量,進而從上下文中提取強相關信息用來回答問題;(2)在文本域中,注意力權重通常在時間上是動態的,其中當前時間步的注意權重是前一時間步參與向量的函數;(3)通常都是單向的從問題到文本的注意力權重。但是原文的BiDAF與以前使用的注意力機制不一樣:

  • BiDAF並不是將文本總結為一個固定長度的vector,而是將vector流動起來,以便減少早期信息加權和的損失
  • Memory-less,在每一個時刻,僅僅對 query 和當前時刻的 context paragraph 進行計算,並不直接依賴上一時刻的 attention,這使得後面的 attention 計算不會受到之前錯誤的 attention 信息的影響
  • 計算了 query-to-context(Q2C)和 context-to-query(C2Q)兩個方向的 attention 信息,認為 C2Q 和 Q2C 實際上能夠相互補充。

本篇閱讀筆記較為簡短,主要分析模型結構,介紹實驗結果。有更深更細層次的方面,請閱讀原文。

2 模型結構

圖1是雙向注意流網路模型:

圖1 Bi-Directional Attention Flow Model

BiDAF共有6層,分別是Character Embedding Layer、Word Embedding Layer、Contextual Embedding Layer、Attention Flow Layer、Modeling Layer和Output Layer。其中前三層是一個多層級上下文不同粒度的表徵編碼器。第四層則是雙向注意流層,這是原文的核心層。第五層是一個編碼層,編碼第四層輸出的問題感知的上下文表徵。第六層就是一個預測答案的範圍。假設context為 left{ oldsymbol { x } _ { 1 } , dots , oldsymbol { x } _ { T } 
ight} ,query為 left{ oldsymbol { q } _ { 1 } , ldots oldsymbol { q } _ { J } 
ight}

2.1 Character Embedding Layer

為context和query中每一個詞使用字元級嵌入, 使用的是字元級的CNN,具體做法是:字元嵌入到向量中,可以將其視為CNN的1D輸入,其大小是CNN的輸入信道大小。CNN的輸出在整個寬度上max-pooling,以獲得每個字的固定大小的嵌入向量。

2.2 Word Embedding Layer

詞嵌入層就是普通的詞嵌入方法,這裡使用的是Glove的預訓練詞向量。

然後將字元級的嵌入和詞嵌入拼接在一起(按每一個詞拼接)經過一個兩層的Highway Network(參考yyHaker:Paper閱讀筆記《Highway Networks》-神經網路上高速不是夢) ,從而得到context vector mathbf { X } in mathbb { R } ^ { d 	imes T } 和 query vector mathbf { Q } in mathbb { R } ^ { d 	imes J } 。這時我們得到了問題和上下文中每一個詞的embedding。

2.3 Contextual Embedding Layer

該層其實是一個編碼器,分別對上一步得到的X和Q分別編碼,編碼的是X和Q句子內部的聯繫,因此這一層是一層雙向的LSTM。這樣的到了上下文編碼 mathbf { H } in mathbb { R } ^ { 2 d 	imes T } 以及問題編碼 mathbf { U } in mathbb { R } ^ { 2 d 	imes J }

到這層為止,上下文和問題原始文本已經整合成具有多層級不同粒度的表徵(character, word, phrase)。

2.4 Attention Flow Layer

原文是這樣介紹BiDAF:

The attention flow layer is not used to summarize the query and context into single feature vectors. instead, the attention vector at each time step, along with the embedding from previous layers, are allowed to flow through to the subsequent modeling layer. This reduces the information loss caused by early summarization.

該層輸入是 H 和 U,輸出是具有問題感知的上下文表徵G。

首先計算H和U的相似度矩陣 mathbf { S } in mathbb { R } ^ { T 	imes J }

mathbf { S } _ { t j } = alpha left( mathbf { H } _ { t } , mathbf { U } _ { i j } 
ight) in mathbb { R }

mathbf { S } _ { t j } 表示的是上下文H中第t列向量h和問題U中第j列向量u的相似度值,它是一個實值。 alpha 表示的是可訓練的是指映射函數,其中 alpha ( mathbf { h } , mathbf { u } ) = mathbf { w } _ { ( mathbf { S } ) } ^ { 	op } [ mathbf { h } ; mathbf { u } ; mathbf { h } circ{mathbf { u }}] , 其中mathbf { w } _ { ( mathbf { S } ) } in mathbb { R } ^ { 6 d }。後面用得到的S作為共享相似矩陣context-to-query(C2Q)以及query-to-context(Q2C)兩個方向的 attention,其中每i行表示的是上下文文本中第i個詞與問題文本中每一個詞之間的相似度,第j列表示的是問題中第j個詞與上下文文本中每一個詞的相似度。下面是兩個方向的注意力的計算方式。
  • Context-to-query Attention(C2Q)計算的是對每一個 context word 而言哪些 query words 和它最相關。計算如下: a _ { t } = operatorname { softmax } left( S _ { t : } 
ight) in R ^ { J } hat { U } _ { : t } = sum _ { j } a _ { t j } U _ { : j } 具體講,就是將S相似度矩陣每一行經過softmax層直接作為注意力值,因為S中每一行表示的是上下文文本中第i個詞與問題文本中每一個詞之間的相似度,C2Q表示的是文本對問題的影響,所以得到 a_t 就直接與U中的每一列加權求和得到新的 hat { U } _ { : t } ,最後拼成新的問題編碼 hat { U } ,它是一個 2d	imes{T} 的矩陣。
  • query-to-context Attention(Q2C)計算的是對每一個 query word 而言哪些 context words 和它最相關,因為這些 context words 對回答問題很重要,故直接取相關性矩陣中最大的那一列,對其進行 softmax 歸一化計算 context 向量加權和,然後重複T次得到 hat { H } in R ^ { 2 d * T }計算公式如下: b = operatorname { softmax } left( max _ { c o l } ( S ) 
ight) in R ^ { T } hat { h } = sum _ { t } b _ { t } H _ { : t } in R ^ { 2 d }這時就得到了 hat { U } hat { H} ,這兩個矩陣都是 2d	imes{T} 的。

得到了hat { U } hat { H} 兩個注意力方向的新問題編碼和文本編碼之後,再經過一個MLP的函數 eta 將兩者拼接起來得到問題感知的上下文文本表示G,即 G _ { : t } = eta left( H _ { : t } , hat { U } _ { t } , hat { H } _ { : t } 
ight) in R ^ { d G } ,實驗中嘗試比較好的拼接方式為 eta ( h , hat { u } , hat { h } ) = [ h ; hat { u } ; h odot hat { u } ; h odot hat { h } ] in R ^ { 8 d * T }

2.5 Modeling Layer

編碼層輸入是上層的輸出G,再經過一次 Bi-LSTM 得到 M in R ^ { 2 d * T } ,這一層的作用和第三層的作用一樣,都是來捕獲輸入矩陣的在時序上依賴關係,從結果上看則是一層編碼降維的過程,與第三層不同的是,這一層的編碼向量裡面是與問題相關的表徵。

2.6 Output Layer

這一層和以往的QA任務使用的一樣,輸出層就是用來預測答案起始位置 mathbf { p } ^ { 1 } 和結束位置 mathbf { p } ^ { 2 } 的,起始位置計算公式如下: p ^{ 1 } = operatorname { softmax } left( W _ { left( p ^ { 1 } 
ight) } ^ { T } [ G ; M ] 
ight)

預測終止位置時M需要經過另一個雙向LSTM得到 mathbf { M } ^ { 2 } in mathbb { R } ^ { 2 d 	imes T }p ^{ 2 } = operatorname { softmax } left( W _ { left( p ^ { 2 } 
ight) } ^ { T } left[ G ; M ^ { 2 } 
ight] 
ight)

最後訓練時的損失函數為: L ( 	heta ) = - frac { 1 } { N } sum _ { i } ^ { N } left[ log left( p _ { y _ { i } ^ { 1 } } ^ { 1 } 
ight) + log left( p _ { y _ { i } ^ { 2 } } ^ { 2 } 
ight) 
ight]

其中 y _ { i } ^ { 1 }y _ { i } ^ { 2} 是真實的起始終止位置。

3 實驗結果

這篇閱讀筆記關注點在於模型的實現,因為時間較早,實驗自然結果比以往模型取得的性能要好但是畢竟過去一年了尤其BERT出來以後,,,,它的結果更加。。。不再贅述,會有討論一些有趣的結果。

實驗數據集使用的是SQuAD還有一個完形填空閱讀理解任務(這裡不在列出,有興趣可以看原文)。SQuAD是斯坦福問題回答數據集,這是一個閱讀理解數據集,最大特點是所回答的答案是給出段落的一個片段(現在已經出了SQuAD2.0,詳細需要訪問The Stanford Question Answering Dataset,比較詳細而且給出了目前較新的性能)。

實驗結果如圖1所示:

目前該模型在SQuAD1.0的排行是42名,最高的如BERT的 F_1 已經達到91.221,但是需要明白該模型的亮點在於雙向注意力機制的提出,這種雙向注意力機制在QA任務中充當編碼器或者推理單元中的一環對後續的性能產生更大的影響,這纔是最為重要的。


推薦閱讀:
相關文章