一篇瞭解NLP中的注意力機制

一篇瞭解NLP中的注意力機制

一篇瞭解NLP中的注意力機制

一篇瞭解NLP中的注意力機制

文章發佈於公號【數智物語】 (ID:decision_engine),關注公號不錯過每一篇乾貨。

轉自 | AI小白入門(公眾號ID: StudyForAI)

作者 | yuquanle,985在讀碩士,目前研究方向為自然語言處理


一篇瞭解NLP中的注意力機制


01

寫在前面

近些年來,注意力機制一直頻繁的出現在目之所及的文獻或者博文中,可見在NLP中算得上是個相當流行的概念,事實也證明其在NLP領域散發出不小得作用。這幾年的頂會paper就能看出這一點。本文會從近些年自然語言中的注意力機制包括從起源、變體到評價指標方面進行介紹。

據Lilian Weng博主[1]總結以及一些資料顯示,Attention機制最早應該是在視覺圖像領域提出來的,這方面的工作應該很多,歷史也比較悠久。人類的視覺注意力雖然存在很多不同的模型,但它們都基本上歸結為給予需要重點關注的目標區域(注意力焦點)更重要的注意力,同時給予周圍的圖像低的注意力,然後隨著時間的推移調整焦點。

而直到Bahdanau等人[3]發表了論文《Neural Machine Translation by Jointly Learning to Align and Translate》,該論文使用類似attention的機制在機器翻譯任務上將翻譯和對齊同時進行,這個工作目前是最被認可為是第一個提出attention機制應用到NLP領域中的工作,值得一提的是,該論文2015年被ICLR錄用,截至現在,谷歌引用量為5596,可見後續NLP在這一塊的研究火爆程度。

注意力機制首先從人類直覺中得到,在NLP領域的機器翻譯任務上首先取得不錯的效果。簡而言之,深度學習中的注意力可以廣義地解釋為重要性權重的向量:為了預測一個元素,例如句子中的單詞,使用注意力向量來估計它與其他元素的相關程度有多強,並將其值的總和作為目標的近似值。既然注意力機制最早在NLP領域應用於機器翻譯任務,那在這個之前又是怎麼做的呢?

傳統的基於短語的翻譯系統通過將源句分成多個塊然後逐個詞地翻譯它們來完成它們的任務,這導致了翻譯輸出的不流暢。不妨先來想想我們人類是如何翻譯的?我們首先會閱讀整個待翻譯的句子,然後結合上下文理解其含義,最後產生翻譯。

從某種程度上來說,神經機器翻譯(NMT)的提出正是想去模仿這一過程。而在NMT的翻譯模型中經典的做法是由編碼器 - 解碼器架構制定(encoder-decoder),用作encoder和decoder常用的是循環神經網絡。這類模型大概過程是首先將源句子的輸入序列送入到編碼器中,提取最後隱藏狀態的表示並用於解碼器的輸入,然後一個接一個地生成目標單詞,這個過程廣義上可以理解為不斷地將前一個時刻 t-1 的輸出作為後一個時刻 t 的輸入,循環解碼,直到輸出停止符為止。

通過這種方式,NMT解決了傳統的基於短語的方法中的局部翻譯問題:它可以捕獲語言中的長距離依賴性,並提供更流暢的翻譯。

但是這樣做也存在很多缺點,譬如,RNN是健忘的,這意味著前面的信息在經過多個時間步驟傳播後會被逐漸消弱乃至消失。其次,在解碼期間沒有進行對齊操作,因此在解碼每個元素的過程中,焦點分散在整個序列中。對於前面那個問題,LSTM、GRU在一定程度能夠緩解。而後者正是Bahdanau等人重視的問題。

02

Seq2Seq模型

在介紹注意力模型之前,不得不先學習一波Encoder-Decoder框架,雖然說注意力模型可以看作一種通用的思想,本身並不依賴於特定框架(比如文章[15]:Learning Sentence Representation with Guidance of Human Attention),但是目前大多數注意力模型都伴隨在Encoder-Decoder框架下。

Seq2seq模型最早由bengio等人[17]論文《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》中初顯。隨後Sutskever等人[16]在文章《Sequence to Sequence Learning with Neural Networks》中提出改進模型即為目前常說的Seq2Seq模型。

從廣義上講,它的目的是將輸入序列(源序列)轉換為新的輸出序列(目標序列),這種方式不會受限於兩個序列的長度,換句話說,兩個序列的長度可以任意。以NLP領域來說,序列可以是句子、段落、篇章等,所以我們也可以把它看作處理由一個句子(段落或篇章)生成另外一個句子(段落或篇章)的通用處理模型。

對於句子對,我們期望輸入句子Source,期待通過Encoder-Decoder框架來生成目標句子Target。Source和Target可以是同一種語言,也可以是兩種不同的語言,若是不同語言,就可以處理翻譯問題了。若是相同語言,輸入序列Source長度為篇章,而目標序列Target為小段落則可以處理文本摘要問題 (目標序列Target為句子則可以處理標題生成問題)等等等。

seq2seq模型通常具有編碼器 - 解碼器架構:

編碼器encoder: 編碼器處理輸入序列並將序列信息壓縮成固定長度的上下文向量(語義編碼/語義向量context)。期望這個向量能夠比較好的表示輸入序列的信息。

解碼器decoder: 利用上下文向量初始化解碼器以得到變換後的目標序列輸出。早期工作僅使用編碼器的最後狀態作為解碼器的輸入。

編碼器和解碼器都是循環神經網絡,比較常見的是使用LSTM或GRU。


一篇瞭解NLP中的注意力機制


編碼器 - 解碼器模型

03

NLP中注意力機制的起源

前面談到在Seq2Seq結構中,encoder把所有的輸入序列都編碼成一個統一的語義向量context,然後再由decoder解碼。而context自然也就成了限制模型性能的瓶頸。

譬如機器翻譯問題,當要翻譯的句子較長時,一個context可能存不下那麼多信息。除此之外,只用編碼器的最後一個隱藏層狀態,感覺上都不是很合理。

實際上當我們翻譯一個句子的時候,譬如:Source: 機器學習-->Target: machine learning。當decoder要生成"machine"的時候,應該更關注"機器",而生成"learning"的時候,應該給予"學習"更大的權重。所以如果要改進Seq2Seq結構,一個不錯的想法自然就是利用encoder所有隱藏層狀態解決context限制問題。

Bahdanau等人[3]把attention機制用到了神經網絡機器翻譯(NMT)上。傳統的encoder-decoder模型通過encoder將Source序列編碼到一個固定維度的中間語義向量context,然後再使用decoder進行解碼翻譯到目標語言序列。

前面已經談到了這種做法的侷限性,而且,Bahdanau等人[3]在其文章的摘要中也說到這個context可能是提高這種基本編碼器 - 解碼器架構性能的瓶頸,那Bahdanau等人又是如何嘗試緩解這個問題的呢? 別急,讓我們來一探究竟。

作者為了緩解中間向量context很難將Source序列所有重要信息壓縮進來的問題,特別是對於那些很長的句子。提出在機器翻譯任務上在 encoder–decoder 做出瞭如下擴展:將翻譯和對齊聯合學習。這個操作在生成Target序列的每個詞時,用到的中間語義向量context是Source序列通過encoder的隱藏層的加權和,而傳統的做法是隻用encoder最後一個時刻輸出

一篇瞭解NLP中的注意力機制

作為context,這樣就能保證在解碼不同詞的時候,Source序列對現在解碼詞的貢獻是不一樣的。

想想前面那個例子:Source: 機器學習-->Target: machine learning (假如中文按照字切分)。decoder在解碼"machine"時,"機"和"器"提供的權重要更大一些,同樣,在解碼"learning"時,"學"和"習"提供的權重相應的會更大一些,這在直覺也和人類翻譯也是一致的。

通過這種attention的設計,作者將Source序列的每個詞(通過encoder的隱藏層輸出)和Target序列 (當前要翻譯的詞) 的每個詞巧妙的建立了聯繫。想一想,翻譯每個詞的時候,都有一個語義向量,而這個語義向量是Source序列每個詞通過encoder之後的隱藏層的加權和。 由此可以得到一個Source序列和Target序列的對齊矩陣,通過可視化這個矩陣,可以看出在翻譯一個詞的時候,Source序列的每個詞對當前要翻譯詞的重要性分佈,這在直覺上也能給人一種可解釋性的感覺。

論文中的圖也能很好的看出這一點:


一篇瞭解NLP中的注意力機制


生成第t個目標詞

一篇瞭解NLP中的注意力機制


更形象一點可以看這個圖:


一篇瞭解NLP中的注意力機制


現在讓我們從公式層面來看看這個東東 (加粗變量表示它們是向量,這篇文章中的其他地方也一樣)。 假設我們有一個長度為n的源序列x,並嘗試輸出長度為m的目標序列y:


一篇瞭解NLP中的注意力機制


作者採樣bidirectional RNN作為encoder(實際上這裡可以有很多選擇),具有前向隱藏狀態

一篇瞭解NLP中的注意力機制

和後向隱藏狀態

一篇瞭解NLP中的注意力機制

。為了獲得詞的上下文信息,作者採用簡單串聯方式將前向和後向表示拼接作為encoder的隱藏層狀態,公式如下:


一篇瞭解NLP中的注意力機制


對於目標(輸出)序列的每個詞(假設位置為t),decoder網絡的隱藏層狀態:


一篇瞭解NLP中的注意力機制


其中

一篇瞭解NLP中的注意力機制

,語義向量

一篇瞭解NLP中的注意力機制

是源(輸入)序列的隱藏狀態的加權和,權重為對齊分數:


一篇瞭解NLP中的注意力機制


(注意:這裡的score函數為原文的a函數,原文的描述為:

一篇瞭解NLP中的注意力機制

is an alignment model)

對齊模型基於

一篇瞭解NLP中的注意力機制

(在i時刻的輸入)和

一篇瞭解NLP中的注意力機制

(在t時刻的輸出)的匹配程度分配分數

一篇瞭解NLP中的注意力機制

一篇瞭解NLP中的注意力機制

是定義每個目標(輸出)單詞應該考慮給每個源(輸入)隱藏狀態的多大的權重(這恰恰反映了對此時解碼的目標單詞的貢獻重要性)。

在Bahdanau[3]的論文中,作者採用的對齊模型為前饋神經網絡,該網絡與所提出的系統的所有其他組件共同訓練。因此,score函數採用以下形式,tanh用作非線性激活函數,公式如下:


一篇瞭解NLP中的注意力機制


其中

一篇瞭解NLP中的注意力機制

一篇瞭解NLP中的注意力機制

和都是在對齊模型中學習的權重矩陣。對齊分數矩陣是一個很好的可解釋性的東東,可以明確顯示源詞和目標詞之間的相關性。


一篇瞭解NLP中的注意力機制


對齊矩陣例子

而decoder每個詞的條件概率為:


一篇瞭解NLP中的注意力機制


g為非線性的,可能是多層的輸出

一篇瞭解NLP中的注意力機制

概率的函數,

一篇瞭解NLP中的注意力機制

是RNN的隱藏狀態,

一篇瞭解NLP中的注意力機制

為語義向量。

04

NLP中的注意力機制

隨著注意力機制的廣泛應用,在某種程度上緩解了源序列和目標序列由於距離限制而難以建模依賴關係的問題。

現在已經湧現出了一大批基於基本形式的注意力的不同變體來處理更復雜的任務。讓我們一起來看看其在不同NLP問題中的注意力機制。

其實我們可能已經意識到了,對齊模型的設計不是唯一的,確實,在某種意義上說,根據不同的任務設計適應於特定任務的對齊模型可以看作設計出了新的attention變體,讓我們再回過頭來看看這個對齊模型(函數):

一篇瞭解NLP中的注意力機制

。再來看看幾個代表性的work。

1. Citation[5]等人提出Content-base attention,其對齊函數模型設計為:


一篇瞭解NLP中的注意力機制


2. Bahdanau[3]等人的Additive(*),其設計為:


一篇瞭解NLP中的注意力機制


3. Luong[4]等人文獻包含了幾種方式:


一篇瞭解NLP中的注意力機制


4. 以及Luong[4]等人還嘗試過location-based function:


一篇瞭解NLP中的注意力機制


這種方法的對齊分數僅從目標隱藏狀態學習得到。

5. Vaswani[6]等人的Scaled Dot-Product(^):


一篇瞭解NLP中的注意力機制


細心的童鞋可能早就發現了這東東和點積注意力很像,只是加了個scale factor。當輸入較大時,softmax函數可能具有極小的梯度,難以有效學習,所以作者加入比例因子

一篇瞭解NLP中的注意力機制

6. Cheng[7]等人的Self-Attention(&)可以關聯相同輸入序列的不同位置。 從理論上講,Self-Attention可以採用上面的任何 score functions。在一些文章中也稱為“intra-attention” 。

Hu[7]對此分了個類:


一篇瞭解NLP中的注意力機制


前面談到的一些Basic Attention給人的感覺能夠從序列中根據權重分佈提取重要元素。而Multi-dimensional Attention能夠捕獲不同表示空間中的term之間的多個交互,這一點簡單的實現可以通過直接將多個單維表示堆疊在一起構建。Wang[8]等人提出了coupled multi-layer attentions,該模型屬於多層注意力網絡模型。作者稱,通過這種多層方式,該模型可以進一步利用術語之間的間接關係,以獲得更精確的信息。

05

Hierarchical Attention

再來看看Hierarchical Attention,Yang[9]等人提出了Hierarchical Attention Networks,看下面的圖可能會更直觀:


一篇瞭解NLP中的注意力機制


Hierarchical Attention Networks

這種結構能夠反映文檔的層次結構。模型在單詞和句子級別分別設計了兩個不同級別的注意力機制,這樣做能夠在構建文檔表示時區別地對待這些內容。Hierarchical attention可以相應地構建分層注意力,自下而上(即,詞級到句子級)或自上而下(詞級到字符級),以提取全局和本地的重要信息。自下而上的方法上面剛談完。那麼自上而下又是如何做的呢?讓我們看看Ji[10]等人的模型:


一篇瞭解NLP中的注意力機制


Nested Attention Hybrid Model

和機器翻譯類似,作者依舊採用encoder-decoder架構,然後用word-level attention對全局語法和流暢性糾錯,設計character-level attention對本地拼寫錯誤糾正。

06

Self-Attention

那Self-Attention又是指什麼呢?

Self-Attention(自注意力),也稱為intra-attention(內部注意力),是關聯單個序列的不同位置的注意力機制,以便計算序列的交互表示。它已被證明在很多領域十分有效比如機器閱讀,文本摘要或圖像描述生成。

比如Cheng[11]等人在機器閱讀裡面利用了自注意力。當前單詞為紅色,藍色陰影的大小表示激活程度,自注意力機制使得能夠學習當前單詞和句子前一部分詞之間的相關性。


一篇瞭解NLP中的注意力機制


當前單詞為紅色,藍色陰影的大小表示激活程度

比如Xu[12]等人利用自注意力在圖像描述生成任務。注意力權重的可視化清楚地表明瞭模型關注的圖像的哪些區域以便輸出某個單詞。


一篇瞭解NLP中的注意力機制


我們假設序列元素為

一篇瞭解NLP中的注意力機制

,其匹配向量為

一篇瞭解NLP中的注意力機制

。讓我們再來回顧下前面說的基本注意力的對齊函數,attention score通過

一篇瞭解NLP中的注意力機制

計算得到,由於是通過將外部u與每個元素

一篇瞭解NLP中的注意力機制

匹配來計算注意力,所以這種形式可以看作是外部注意力。當我們把外部u替換成序列本身(或部分本身),這種形式就可以看作為內部注意力(internal attention)。

我們根據文章[7]中的例子來看看這個過程,例如句子:"Volleyball match is in progress between ladies"。句子中其它單詞都依賴著"match",理想情況下,我們希望使用自注意力來自動捕獲這種內在依賴。換句話說,自注意力可以解釋為,每個單詞

一篇瞭解NLP中的注意力機制

去和V序列中的內部模式

一篇瞭解NLP中的注意力機制

匹配,匹配函數

一篇瞭解NLP中的注意力機制

一篇瞭解NLP中的注意力機制

很自然的選擇為V中其它單詞

一篇瞭解NLP中的注意力機制

,這樣便可以計算成對注意力得分。為了完全捕捉序列中單詞之間的複雜相互作用,我們可以進一步擴展它以計算序列中每對單詞之間的注意力。這種方式讓每個單詞和序列中其它單詞交互了關係。


一篇瞭解NLP中的注意力機制


另一方面,自注意力還可以自適應方式學習複雜的上下文單詞表示。譬如經典文章[14]:A structured self-attentive sentence embedding。這篇文章提出了一種通過引入自關注力機制來提取可解釋句子嵌入的新模型。使用二維矩陣而不是向量來代表嵌入,矩陣的每一行都在句子的不同部分,想深入瞭解的可以去看看這篇文章,另外,文章的公式感覺真的很漂亮。

值得一提還有2017年穀歌提出的Transformer[6],這是一種新穎的基於注意力的機器翻譯架構,也是一個混合神經網絡,具有前饋層和自注意層。論文的題目挺霸氣:Attention is All you Need,毫無疑問,它是2017年最具影響力和最有趣的論文之一。

這篇文章提出許多改進,在完全拋棄了RNN的情況下進行seq2seq建模。那這篇文章的Transformer的廬山真面目到底是怎樣的呢?接下來一起來詳細看看吧。

01

Key, Value and Query

眾所周知,在NLP任務中,通常的處理方法是先分詞,然後每個詞轉化為對應的詞向量。接著一般最常見的有二類操作,第一類是接RNN(變體LSTM、GRU、SRU等),但是這一類方法沒有擺脫時序這個侷限,也就是說無法並行,也導致了在大數據集上的速度效率問題。第二類是接CNN,CNN方便並行,而且容易捕捉到一些全局的結構信息。很長一段時間都是以上二種的抉擇以及改造,

直到谷歌提供了第三類思路:純靠注意力,也就是現在要講的這個東東。

將輸入序列編碼表示視為一組鍵值對(K,V)以及查詢 Q,因為文章[6]取K=V=Q,所以也自然稱為Self Attention。


一篇瞭解NLP中的注意力機制


K, V像是key-value的關係從而是一一對應的,那麼上式的意思就是通過Q中每個元素query,與K中各個元素求內積然後softmax的方式,來得到Q中元素與V中元素的相似度,然後加權求和,得到一個新的向量。其中因子為了使得內積不至於太大。

以上公式在文中也稱為點積注意力(scaled dot-product attention):輸出是值的加權和,其中分配給每個值的權重由查詢的點積與所有鍵確定。

而Transformer主要由多頭自注意力(Multi-Head Self-Attention)單元組成。那麼Multi-Head Self-Attention又是什麼呢?以下為論文中的圖:


一篇瞭解NLP中的注意力機制


Multi-head scaled dot-product attention mechanism

Multi-Head Self-Attention不是僅僅計算一次注意力,而是多次並行地通過縮放的點積注意力。 獨立的注意力輸出被簡單地連接併線性地轉換成預期的維度。論文[6]表示,多頭注意力允許模型共同關注來自不同位置的不同表示子空間的信息。 只有一個注意力的頭,平均值就會抑制這一點。


一篇瞭解NLP中的注意力機制


一篇瞭解NLP中的注意力機制

是需要學習的參數矩陣。既然為seq2seq模式,自然也包括encoder和decoder,那這篇文章又是如何構建這些的呢?莫急,請繼續往下看。

02

Encoder


一篇瞭解NLP中的注意力機制


The transformer's encoder

編碼器生成基於自注意力的表示,其能夠從可能無限大的上下文中定位特定信息。值得一提的是,上面的結構文章堆了六個。

1. 每層都有一個多頭自注意力層

2. 每層都有一個簡單的全連接的前饋網絡

3. 每個子層採用殘差連接和層規範化。 所有子層輸出相同維度dmodel = 512。

03

Decoder

一篇瞭解NLP中的注意力機制

The transformer's decoder.

解碼器能夠從編碼表示中檢索。上面的結構也堆了六個。

1. 每層有兩個多頭注意機制子層。

2. 每層有一個完全連接的前饋網絡子層。

3. 與編碼器類似,每個子層採用殘差連接和層規範化。

與encoder不同的是,第一個多頭注意子層被設計成防止關注後續位置,因為我們不希望在預測當前位置時查看目標序列的未來。最後來看一看整體架構:

一篇瞭解NLP中的注意力機制

The full model architecture of the transformer.

07

Memory-based Attention

那Memory-based Attention又是什麼呢?我們先換種方式來看前面的注意力,假設有一系列的鍵值對

一篇瞭解NLP中的注意力機制

存在內存中和查詢向量q,這樣便能重寫為以下過程:


一篇瞭解NLP中的注意力機制


這種解釋是把注意力作為使用查詢q的尋址過程,這個過程基於注意力分數從memory中讀取內容。聰明的童鞋肯定已經發現了,如果我們假設

一篇瞭解NLP中的注意力機制

,這不就是前面談到的基礎注意力麼?然而,由於結合了額外的函數,可以實現可重用性和增加靈活性,所以Memory-based attention mechanism可以設計得更加強大。

那為什麼又要這樣做呢?在NLP的一些任務上比如問答匹配任務,答案往往與問題間接相關,因此基本的注意力技術就顯得很無力了。那處理這一任務該如何做才好呢?這個時候就體現了Memory-based attention mechanism的強大了,譬如Sukhbaatar[19]等人通過迭代內存更新(也稱為多跳)來模擬時間推理過程,以逐步引導注意到答案的正確位置:


一篇瞭解NLP中的注意力機制


在每次迭代中,使用新內容更新查詢,並且使用更新的查詢來檢索相關內容。一種簡單的更新方法為相加

一篇瞭解NLP中的注意力機制

。那麼還有其它更新方法麼?

當然有,直覺敏感的童鞋肯定想到了,光是這一點,就可以根據特定任務去設計,比如Kuma[13]等人的工作。這種方式的靈活度也體現在key和value可以自由的被設計,比如我們可以自由地將先驗知識結合到key和value嵌入中,以允許它們分別更好地捕獲相關信息。看到這裡是不是覺得文章灌水其實也不是什麼難事了。

08

Soft/Hard Attention

最後想再談談Soft/Hard Attention,是因為在很多地方都看到了這個名詞。

據我所知,這個概念由《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》提出,這是對attention另一種分類。SoftAttention本質上和Bahdanau等人[3]很相似,其權重取值在0到1之間,而Hard Attention取值為0或者1。

09

Global/Local Attention

Luong等人[4]提出了Global Attention和Local Attention。Global Attention本質上和Bahdanau等人[3]很相似。Global方法顧名思義就是會關注源句子序列的所有詞,具體地說,在計算語義向量時,會考慮編碼器所有的隱藏狀態。而在Local Attention中,計算語義向量時只關注每個目標詞的一部分編碼器隱藏狀態。由於Global方法必須計算源句子序列所有隱藏狀態,當句子長度過長會使得計算代價昂貴並使得翻譯變得不太實際,比如在翻譯段落和文檔的時候。


一篇瞭解NLP中的注意力機制


10

評價指標

在看一些帶有attention的paper時,常常會伴隨著為了說明自己文章attention是work的實驗,但實際上嘗試提供嚴格數學證明的文章極少。

Hu[7]把Attention的評價方式分為兩類:Quantitative(定量指標)和Qualitative(定性指標)。

定量指標顧名思義就是對attention的貢獻就行量化,這一方面一般會結合下游任務,最常見的當屬機器翻譯,我們都知道機器翻譯的最流行評價指標之一是BLEU,我們可以在翻譯任務設計attention和不加attention進行對比,對比的指標就是BLEU,設置我們可以設計多種不同的attention進行對比。

定性指標評價是目前應用最廣泛的評價技術,因為它簡單易行,便於可視化。具體做法一般都是為整個句子構建一個熱力圖,其熱力圖強度與每個單詞接收到的標準化注意力得分成正比。也就是說,詞的貢獻越大,顏色越深。其實這在直覺上也是能夠接收的,因為往往相關任務的關鍵詞的attention權值肯定要比其它詞重要。比如Hu[7]文中的圖:


一篇瞭解NLP中的注意力機制


一篇瞭解NLP中的注意力機制

一篇瞭解NLP中的注意力機制


分享到:


相關文章: