注意力機(jī)制

目錄

  1. Attention機(jī)制由來
  2. Encoder-Decoder 框架
  3. 最常見的attention模型——Soft Attention
  4. 其他attention模型

本文大部分的內(nèi)容來自于深度學(xué)習(xí)中的注意力機(jī)制

1. Attention機(jī)制由來

意力機(jī)制借鑒了人類注意力的說法,比如我們在閱讀過程中,會把注意集中在重要的信息上。在訓(xùn)練過程中,輸入的權(quán)重也都是不同的,注意力機(jī)制就是學(xué)習(xí)到這些權(quán)重。最開始attention機(jī)制在CV領(lǐng)域被提出來,但后面廣泛應(yīng)用在NLP領(lǐng)域。

2. Encoder-Decoder 框架

需要注意的是,注意力機(jī)制是一種通用的思想和技術(shù),不依賴于任何模型,換句話說,注意力機(jī)制可以用于任何模型。只是我們介紹注意力機(jī)制的時候更多會用encoder-decoder框架做介紹。

Encoder-Decoder 框架可以看作是一種深度學(xué)習(xí)領(lǐng)域的研究模式,應(yīng)用場景異常廣泛。下圖是文本處理領(lǐng)域里Encoder-Decoder 框架最抽象的一種表示。

圖1:Encoder-Decoder框架

在NLP領(lǐng)域,可以把Encoder-Decoder框架看作是:將一個句子(篇章)轉(zhuǎn)換成另一個句子(篇章)。最直觀的例子就是機(jī)器翻譯,將一種語言的表達(dá)翻譯成另一種語言。對于句子對<source,target>,將給定輸入句子
source,通過Encoder-Decoder框架生成目標(biāo)句子target。其中,source和target都是一組單詞序列:
source = <x_1, x_2, ..., x_m> ; target = <y_1, y_2, ..., y_n>

Encoder是對source進(jìn)行編碼,轉(zhuǎn)換成中間語義C
C = F(x_1, x_2, ..., x_m)
對于解碼器Decoder,其任務(wù)是根據(jù)中間語義C和當(dāng)前已經(jīng)生成的歷史信息來生成下一時刻要生成的單詞:
y_i = G(C, y_1, y_2, ..., y_{i-1})

3. 最常見的attention模型——Soft Attention

我們從最常見的Soft Attention模型開始介紹attention的基本思路。

在上一節(jié)介紹的Encoder-Decoder框架是沒有體現(xiàn)出“注意力模型”的,為什么這么說呢?我們可以看下target的生成過程:
y_1 = f(C) \\ \\ y_2 = f(C, y_1) \\ \\ y_3 = f(C, y_1, y_2)
其中,f是Decoder的非線性變換函數(shù)。從上面式子中可以看出,在生成目標(biāo)句子的單詞時,不論生成哪個單詞,它們使用的輸入句子source的語義編碼\textbf{C}都是一樣的,沒有任何區(qū)別。而語義編碼\textbf{C}又是通過對source經(jīng)過Encoder編碼產(chǎn)生的,因此對于target中的任何一個單詞,source中任意單詞對某個目標(biāo)單詞y_i來說影響力都是相同的,這就是為什么說圖1中的模型沒有體現(xiàn)注意力的原因。

沒有引入注意力的模型在輸入句子比較短的時候問題不大,但是如果輸入句子比較長,此時所有語義完全通過一個中間語義向量來表示,單詞自身的信息已經(jīng)消失,因此很多細(xì)節(jié)信息會被丟失。這也是為何要引入注意力模型的重要原因。

下面從一個例子入手,具體說明下注意力機(jī)制是怎么做的。

比如機(jī)器翻譯任務(wù),輸入source是英文句子:Tom chase Jerry;輸出target想得到中文:湯姆 追逐 杰瑞。在翻譯“Jerry”這個單詞的時候,在普通Encoder-Decoder模型中,source里的每個單詞對“杰瑞”的貢獻(xiàn)是相同的,很明顯這樣不太合理,因?yàn)椤癑erry”對于翻譯成“杰瑞”更重要。如果引入Attention模型,在生成“杰瑞”的時候,應(yīng)該體現(xiàn)出英文單詞對于翻譯當(dāng)前中文單詞不同的影響程度,比如給出類似下面一個概率分布值:
(Tom,0.3)(Chase,0.2)(Jerry,0.5)

每個英文單詞的概率代表了翻譯當(dāng)前單詞“杰瑞”時注意力分配模型分配給不同英文單詞的注意力大小。同理,對于target中任意一個單詞都應(yīng)該有對應(yīng)的source中的單詞的注意力分配概率,可以把所有的注意力概率看作A \in R^{n*m},其中m表示source長度,n表示target長度。而且,由于注意力模型的加入,原來在生成target單詞時候的中間語義C就不再是固定的,而是會根據(jù)注意力概率變化的C_i,加入了注意力模型的Encoder-Decoder框架就變成了如圖2所示。

圖2: 加入Attention模型的Encoder-Decoder框架

根據(jù)圖2,生成target的過程就變成了下面形式:
y_1 = f_1(C_1)\\ y_2 = f_1(C_2, y_1)\\ y_3 = f_1(C_3, y_1,y_2)
因?yàn)槊總€\textbf{C}_i可能對應(yīng)著不同的注意力分配概率分布,比如對于上面的英漢翻譯來說,其對應(yīng)的信息可能如下:
C_{湯姆} = g(0.6*f_2("Tom"), 0.2*f_2("Chase"),0.2*f_2("Jerry")) \\ C_{追逐}= g(0.2*f_2("Tom"), 0.7*f_2("Chase"),0.1*f_2("Jerry")) \\ C_{杰瑞}= g(0.3*f_2("Tom"), 0.2*f_2("Chase"),0.5*f_2("Jerry")) \\
其中,f_2表示Encoder對輸入英文單詞的某種變換函數(shù),比如如果Encoder是用RNN模型的話,這個f_2函數(shù)的結(jié)果往往是某個時刻輸入x_i后隱層節(jié)點(diǎn)的狀態(tài)值;g代表Encoder根據(jù)單詞的中間表示合成整個句子中間語義表示的變換函數(shù),一般的做法中,g函數(shù)就是對構(gòu)成元素加權(quán)求和,即:
C_i = \sum_{j=1}^{L_x} a_{ij}h_j
其中,L_x代表輸入句子Source的長度,a_{ij}代表在Target輸出第i個單詞時Source輸入句子第j個單詞的注意力分配系數(shù),而h_j則是Source輸入句子中第j個單詞的語義編碼。假設(shè)下標(biāo)i就是上面例子所說的“湯姆”生成如下圖:

圖3: C(湯姆)的計(jì)算過程

那另一個問題來了:注意力概率分布是怎么得到的呢?為了便于說明,我們假設(shè)圖1的Encoder-Decoder框架中,Encoder和Decoder都采用RNN模型,那么圖1變成下圖4:

圖4: RNN作為具體模型的Encoder-Decoder框架

那么注意力分配概率分布值的通用計(jì)算過程如圖5:

圖5: 注意力分配概率計(jì)算

上圖中h_j表示Source中單詞j對應(yīng)的隱層節(jié)點(diǎn)狀態(tài)h_j,H_i表示Target中單詞i的隱層節(jié)點(diǎn)狀態(tài),注意力計(jì)算的是Target中單詞i對Source中每個單詞對齊可能性,即F(h_j, H_{i-1}),而函數(shù)F可以用不同的方法,然后函數(shù)F的輸出經(jīng)過softmax進(jìn)行歸一化就得到了注意力分配概率分布。

上面就是經(jīng)典的soft Attention模型的基本思想,區(qū)別只是函數(shù)F會有所不同。

Attention機(jī)制的本質(zhì)思想

從我的角度看,其實(shí)Attention機(jī)制可以看作,Target中每個單詞是對Source每個單詞的加權(quán)求和,而權(quán)重是Source中每個單詞對Target中每個單詞的重要程度。因此,Attention的本質(zhì)思想會表示成下圖6:

圖6: Attention機(jī)制的本質(zhì)思想

將Source中的構(gòu)成元素看作是一系列的<Key, Value>數(shù)據(jù)對,給定Target中的某個元素Query,通過計(jì)算Query和各個Key的相似性或者相關(guān)性,即權(quán)重系數(shù);然后對Value進(jìn)行加權(quán)求和,并得到最終的Attention數(shù)值。將本質(zhì)思想表示成公式如下:
Attention(Query, Source) = \sum_{i=1}^{L_x} Similarity(Query, Key_i) * Value_i
其中,L_x表示Source的長度。

深度學(xué)習(xí)中的注意力機(jī)制中提到:

因?yàn)樵谟?jì)算 Attention 的過程中,Source 中的 Key 和 Value 合二為一,指向的 是同一個東西,也即輸入句子中每個單詞對應(yīng)的語義編碼,所以可能不容易看出這種 能夠體現(xiàn)本質(zhì)思想的結(jié)構(gòu)。
另一種解釋是將Attention機(jī)制看作一種軟尋址。

因此,Attention機(jī)制的具體計(jì)算過程實(shí)際上分成了3個階段,如圖7:


圖7: Attention機(jī)制的具體計(jì)算過程

第一階段可以引入不同的函數(shù)和計(jì)算機(jī)制,根據(jù)Query和某個Key_i,計(jì)算兩者的相似性或者相關(guān)性,最常見的方法包括:求兩者的向量點(diǎn)積、求兩者的向量cosine相似性或者引入額外的神經(jīng)網(wǎng)絡(luò)來求值,如下:
加性模型:Similarity(Query, Key_i) = V^T * tanh(WKey_i + UQ)\\ 點(diǎn)積:Similarity(Query, Key_i) = Query \cdot Key_i \\ Cosine 相似性: Similarity(Query, Key_i) = \frac{Query \cdot Key_i}{|Query| \cdot |Key_i|}\\ MLP網(wǎng)絡(luò):Similarity(Query, Key_i) = MLP(Query, Key_i)

第二階段引入類似SoftMax的計(jì)算方式,對第一階段的得分進(jìn)行數(shù)值轉(zhuǎn)換,一方面可以進(jìn)行歸一化,將原始計(jì)算分值整理成所有元素權(quán)重之和為1的概率分布;另一方面也可以通過SoftMax的內(nèi)在機(jī)制更加突出重要元素的權(quán)重。即一般采用的公式如下:
a_i = Softmax(Sim_i)=\frac{e^{Sim_i}}{\sum_{j=1}^{L_x} e^{Sim_j}}
第三階段的計(jì)算結(jié)果a_i即為value_i對應(yīng)的權(quán)重系數(shù),然后進(jìn)行加權(quán)求和即可得到Attention數(shù)值:
Attention(Query, Source) = \sum_{i=1}^{L_x} a_i \cdot Value_i
通過如上三個階段的計(jì)算,就可以求出針對Query的Attention數(shù)值。

4. 其他attention模型

soft vs. hard

上面介紹的是soft Attention,hard Attention的區(qū)別在于soft Attention中a_{ij}是概率分布,而hard Attention取值為0/1。Hard Attention在圖像上有使用,具體可見 引入attention機(jī)制。

global vs. local

這里的global attention其實(shí)就是soft Attention,global attention需要考慮encoder中所有的h_j;而local Attention直觀上理解是只考慮局部的h_j。

self-attention

Self-attention是Google在transformer模型中提出的,上面介紹的都是一般情況下Attention發(fā)生在Target元素Query和Source中所有元素之間。而Self Attention,指的是Source內(nèi)部元素之間或者Target內(nèi)部元素之間發(fā)生的Attention機(jī)制,也可以理解為Target=Source這種特殊情況下的注意力機(jī)制。當(dāng)然,具體的計(jì)算過程仍然是一樣的,只是計(jì)算對象發(fā)生了變化而已。

上面內(nèi)容也有說到,一般情況下Attention本質(zhì)上是Target和Source之間的一種單詞對齊機(jī)制。那么如果是Self Attention機(jī)制,到底學(xué)的是哪些規(guī)律或者抽取了哪些特征呢?或者說引入Self Attention有什么增益或者好處呢?仍然以機(jī)器翻譯為例來說明,如圖8和圖9:


圖8: self-attention 實(shí)例1
圖9: self-attention實(shí)例2

從圖8和圖9可以看出,self-attention可以捕獲同一個句子之間的一些句法特征(如圖8有一定距離的短語結(jié)構(gòu))或者語義特征(如圖9展示的its的指代對象Law)。

很明顯,引入 Self Attention 后會更容易捕獲句子中長距離的相互依賴的特征,因?yàn)槿绻荝NN或者LSTM,需要依次序列計(jì)算,對于遠(yuǎn)距離的相互依賴的特征,要經(jīng)過若干時間步步驟的信息累積才能將兩者聯(lián)系起來,而距離越遠(yuǎn),有效捕獲的可能性越小。但是Self-Attention在計(jì)算過程中會直接將句子中任意兩個單詞的聯(lián)系通過一個計(jì)算步驟直接聯(lián)系起來,所以遠(yuǎn)距離依賴特征之間的距離被極大縮短,有利于有效地利用這些特征。除此之外,Self-Attention對于增加計(jì)算的并行性也有直接幫助作用。這是為何Self-Attention逐漸被廣泛使用的主要原因。

Scaled Dot-Product Attention

具體做法是點(diǎn)乘KQ,然后除以\sqrt{d_k},并經(jīng)過Softmax,以此得到V的權(quán)重。也就是說Attention計(jì)算過程如下式,其中\frac{1}{\sqrt{d_k}}是scaled factor:
Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V

注意力的計(jì)算一般有兩種:加性注意力(additive attention)、乘法(點(diǎn)積)注意力(multiplicative attention)。(這里可以和第3部分計(jì)算相似度對應(yīng))

加性注意力是最經(jīng)典的注意力機(jī)制,它使用了有一個隱藏層的前饋網(wǎng)絡(luò)(全連接)來計(jì)算注意力; 乘法注意力就是Transformer用的方式。這兩種注意力在復(fù)雜度上是相似的,但是乘法注意力在實(shí)踐中要更快速、具有高效的存儲,因?yàn)樗梢允褂镁仃嚥僮鞲咝У貙?shí)現(xiàn)。

Transformer原文:

While the two are similar in theoretical complexity, dot-product attention is much faster and more space-efficient in practice, since it can be implemented using highly optimized matrix multiplication code.

Multi-Attention

Multi-Head Attention是用不同的W^Q、W^K、W^V得到不同的Attention,最后將這些Attention拼接起來作為輸出。公式如下:
MultiHead(Q,K,V) = Concat(head_1, head_2, head_h)W^o \\ where head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)
其中,W_i^Q \in R^{d_{model} \times d_k},W_i^K \in R^{d_{model} \times d_k},W_i^V \in R^{d_{model} \times d_k},W^o \in R^{hd_v \times d_{model}} ;在Transformer模型中,d_k=d_v=d_{model}/h=64

Scaled Dot-Product Attention和Multi-Attention如下圖所示:


圖:(left) Scaled Dot-Product Attention. (right)Multi-Head Attention

學(xué)習(xí)資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容