Attention用於NLP的一些小結

Part I:背景知識

Part II:Attention形式

Part III:具體Task分析


Part I:背景知識

按照慣例,本節要介紹一下Attention是啥,打字也累請直接看這張圖:

Neural Machine Translation by Jointly Learning to Align and Translate

這張圖很是出名了,第一個將Attention用在NLP領域的論文,機器翻譯,在每一步翻譯的時候都關注不同的原文信息。Attention機制可以理解為一種文本聚焦方法,基本思想是對文本分配注意力權重,把注意力集中在相關的文本內容,增加這部分的貢獻。

Attention機制在16年就開始各種火了,一直到現在還挺多人在用的。

Attention的定義:

參考Attention is All You Need中的說法,假設當前時刻t下,我們有一個query向量,和一段key向量,這裡query可以理解為一個包含比較多信息的全局向量,我們利用這個query對所有key向量進行加權求和,學習到一個更合適的新向量去做分類或者預測等任務。

假設q_t就是時刻t下的query向量,K是key矩陣,k_s是其中一個key向量,V是value矩陣,我們先對q_t和每個key進行相似度計算得到一個非歸一化的score分數:

s(q_t,k_s)=frac{<q_t,k_s>}{sqrt{d_k}}

這裡用到是最簡單的點乘,分母是為了調節內積結果,使得內積不那麼大。

然後對score進行softmax歸一化,作為attention概率權重:

a(q_t,k_s)=frac{exp(s(q_t, k_s))}{sum_{i=1}^{N}{exp(s(q_t, k_i))}}

最後我們對每個位置key所對應的權重和value進行加權求和,得到最終的輸出向量:

Attention(q_t,K,V)=sum_{s=1}^{m}{a(q_t, k_s)v_s}

可以看到,對同一段key,不同query會有不同的輸出向量。

對應到具體任務上,可能會更加清晰一點:

在機器翻譯任務中,query可以定義成decoder中某一步的hidden state,key是encoder中每一步的hidden state,我們用每一個query對所有key都做一個對齊,decoder每一步都會得到一個不一樣的對齊向量。

在文本分類任務中,query可以定義成一個可學的隨機變數(參數),key就是輸入文本每一步的hidden state,通過加權求和得到句向量,再進行分類。


Part II:Attention形式

本節從計算區域、所用信息、結構層次和模型等方面對Attention的形式進行歸類。

1. 計算區域

根據Attention的計算區域,可以分成以下幾種:

1)Soft Attention,這是比較常見的Attention方式,對所有key求權重概率,每個key都有一個對應的權重,是一種全局的計算方式(也可以叫Global Attention)。這種方式比較理性,參考了所有key的內容,再進行加權。但是計算量可能會比較大一些。

2)Hard Attention,這種方式是直接精準定位到某個key,其餘key就都不管了,相當於這個key的概率是1,其餘key的概率全部是0。因此這種對齊方式要求很高,要求一步到位,如果沒有正確對齊,會帶來很大的影響。另一方面,因為不可導,一般需要用強化學習的方法進行訓練。(或者使用gumbel softmax之類的)

3)Local Attention,這種方式其實是以上兩種方式的一個折中,對一個窗口區域進行計算。先用Hard方式定位到某個地方,以這個點為中心可以得到一個窗口區域,在這個小區域內用Soft方式來算Attention。

2. 所用信息

假設我們要對一段原文計算Attention,這裡原文指的是我們要做attention的文本,那麼所用信息包括內部信息和外部信息,內部信息指的是原文本身的信息,而外部信息指的是除原文以外的額外信息。

1)General Attention,這種方式利用到了外部信息,常用於需要構建兩段文本關係的任務,query一般包含了額外信息,根據外部query對原文進行對齊。

比如在閱讀理解任務中,需要構建問題和文章的關聯,假設現在baseline是,對問題計算出一個問題向量q,把這個q和所有的文章詞向量拼接起來,輸入到LSTM中進行建模。那麼在這個模型中,文章所有詞向量共享同一個問題向量,現在我們想讓文章每一步的詞向量都有一個不同的問題向量,也就是,在每一步使用文章在該步下的詞向量對問題來算attention,這裡問題屬於原文,文章詞向量就屬於外部信息。

2)Local Attention,這種方式只使用內部信息,key和value以及query只和輸入原文有關,在self attention中,key=value=query。既然沒有外部信息,那麼在原文中的每個詞可以跟該句子中的所有詞進行Attention計算,相當於尋找原文內部的關係。

還是舉閱讀理解任務的例子,上面的baseline中提到,對問題計算出一個向量q,那麼這裡也可以用上attention,只用問題自身的信息去做attention,而不引入文章信息。

3. 結構層次

結構方面根據是否劃分層次關係,分為單層attention,多層attention和多頭attention:

1)單層Attention,這是比較普遍的做法,用一個query對一段原文進行一次attention。

2)多層Attention,一般用於文本具有層次關係的模型,假設我們把一個document劃分成多個句子,在第一層,我們分別對每個句子使用attention計算出一個句向量(也就是單層attention);在第二層,我們對所有句向量再做attention計算出一個文檔向量(也是一個單層attention),最後再用這個文檔向量去做任務。

3)多頭Attention,這是Attention is All You Need中提到的multi-head attention,用到了多個query對一段原文進行了多次attention,每個query都關注到原文的不同部分,相當於重複做多次單層attention:

head_i = Attention(q_i, K, V)

最後再把這些結果拼接起來:

MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^{O}

4. 模型方面

從模型上看,Attention一般用在CNN和LSTM上,也可以直接進行純Attention計算。

1)CNN+Attention

CNN的卷積操作可以提取重要特徵,我覺得這也算是Attention的思想,但是CNN的卷積感受視野是局部的,需要通過疊加多層卷積區去擴大視野。另外,Max Pooling直接提取數值最大的特徵,也像是hard attention的思想,直接選中某個特徵。

CNN上加Attention可以加在這幾方面:

a. 在卷積操作前做attention,比如Attention-Based BCNN-1,這個任務是文本蘊含任務需要處理兩段文本,同時對兩段輸入的序列向量進行attention,計算出特徵向量,再拼接到原始向量中,作為卷積層的輸入。

b. 在卷積操作後做attention,比如Attention-Based BCNN-2,對兩段文本的卷積層的輸出做attention,作為pooling層的輸入。

c. 在pooling層做attention,代替max pooling。比如Attention pooling,首先我們用LSTM學到一個比較好的句向量,作為query,然後用CNN先學習到一個特徵矩陣作為key,再用query對key產生權重,進行attention,得到最後的句向量。

2)LSTM+Attention

LSTM內部有Gate機制,其中input gate選擇哪些當前信息進行輸入,forget gate選擇遺忘哪些過去信息,我覺得這算是一定程度的Attention了,而且號稱可以解決長期依賴問題,實際上LSTM需要一步一步去捕捉序列信息,在長文本上的表現是會隨著step增加而慢慢衰減,難以保留全部的有用信息。

LSTM通常需要得到一個向量,再去做任務,常用方式有:

a. 直接使用最後的hidden state(可能會損失一定的前文信息,難以表達全文)

b. 對所有step下的hidden state進行等權平均(對所有step一視同仁)。

c. Attention機制,對所有step的hidden state進行加權,把注意力集中到整段文本中比較重要的hidden state信息。性能比前面兩種要好一點,而方便可視化觀察哪些step是重要的,但是要小心過擬合,而且也增加了計算量。

3)純Attention

Attention is all you need,沒有用到CNN/RNN,乍一聽也是一股清流了,但是仔細一看,本質上還是一堆向量去計算attention。

5. 相似度計算方式

在做attention的時候,我們需要計算query和某個key的分數(相似度),常用方法有:

1)點乘:最簡單的方法, s(q, k) = q^{T}k

2)矩陣相乘: s(q, k) = q^{T}Wk

3)cos相似度: s(q, k) = frac{q^{T}k}{||q||cdot||k||}

4)串聯方式:把q和k拼接起來, s(q, k) = W[q;k]

5)用多層感知機也可以: s(q, k) = v_{a}^{T}tanh(Wq + Uk)


Part III:Task分析

Attention機制只是一種思想,可以用到很多任務上,個人覺得Attention機制比較適合有以下特點的任務:

1)長文本任務,document級別,因為長文本本身所攜帶的信息量比較大,可能會帶來信息過載問題,很多任務可能只需要用到其中一些關鍵信息(比如文本分類),所以Attention機制用在這裡正適合capture這些關鍵信息。

2)涉及到兩段的相關文本,可能會需要對兩段內容進行對齊,找到這兩段文本之間的一些相關關係。比如機器翻譯,將英文翻譯成中文,英文和中文明顯是有對齊關係的,Attention機制可以找出,在翻譯到某個中文字的時候,需要對齊到哪個英文單詞。又比如閱讀理解,給出問題和文章,其實問題中也可以對齊到文章相關的描述,比如「什麼時候」可以對齊到文章中相關的時間部分。

3)任務很大部分取決於某些特徵。我舉個例子,比如在AI+法律領域,根據初步判決文書來預測所觸犯的法律條款,在文書中可能會有一些罪名判定,而這種特徵對任務是非常重要的,所以用Attention來capture到這種特徵就比較有用。(CNN也可以)

下面介紹我了解到的一些task,其中機器翻譯、摘要生成、圖文互搜屬於seq2seq任務,需要對兩段內容進行對齊,文本蘊含用到前提和假設兩段文本,閱讀理解也用到了文章和問題兩段文本,文本分類、序列標註和關係抽取屬於單文本Attention的做法。

1)機器翻譯:encoder用於對原文建模,decoder用於生成譯文,attention用於連接原文和譯文,在每一步翻譯的時候關注不同的原文信息。

2)摘要生成:encoder用於對原文建模,decoder用於生成新文本,從形式上和機器翻譯都是seq2seq任務,但是從任務特點上看,機器翻譯可以具體對齊到某幾個詞,但這裡是由長文本生成短文本,decoder可能需要capture到encoder更多的內容,進行總結。

3)圖文互搜:encoder對圖片建模,decoder生成相關文本,在decoder生成每個詞的時候,用attention機制來關注圖片的不同部分。

4)文本蘊含:判斷前提和假設是否相關,attention機制用來對前提和假設進行對齊。

5)閱讀理解:可以對文本進行self attention,也可以對文章和問題進行對齊。

6)文本分類:一般是對一段句子進行attention,得到一個句向量去做分類。

7)序列標註:Deep Semantic Role Labeling with Self-Attention,這篇論文在softmax前用到了self attention,學習句子結構信息,和利用到標籤依賴關係的CRF進行pk。

8)關係抽取:也可以用到self attention


參考文獻:Deep Learning for NLP Best Practices

最後給大家安利這位Sebastian Ruder小哥,笑起來很燦爛,NLP領域在讀Phd,感覺研究思路比較靠譜,小哥教你做科研:Requests for Research

推薦閱讀:

【機器閱讀理解】Fast and Accurate Reading Comprehension by Combining Self-Attention and Convolution
流程圖識別(1)
基於注意力的循環神經網路模型用於聯合意圖推測和槽位填充
Bag of Word
[本人原創]思維(意識)整體論圖Graph假設(記憶-抽象實體化,聯結記憶(工作記憶)-邊關係化)

TAG:自然語言處理 |