2014年,Google Mind發(fā)表的《Recurrent Models of Visual Attention》論文點(diǎn)燃了Attention機(jī)制在圖像領(lǐng)域的應(yīng)用。隨后,Bahdanau等人發(fā)表論文《Neural Machine Translation by Jointly Learning to Align and Translate》第一次將Attention機(jī)制應(yīng)用在自然語言領(lǐng)域。之后Attention機(jī)制被廣泛應(yīng)用于基于RNN神經(jīng)網(wǎng)絡(luò)模型的深度學(xué)習(xí)任務(wù)中。2017年,Google發(fā)表的論文《Attention is all you need》中提出在機(jī)器翻譯上大量使用self-attention來學(xué)習(xí)文本表示。
深度學(xué)習(xí)中的注意力機(jī)制借鑒了人類的注意力思維方式。人類視覺通過快速掃描全局圖像,獲得需要重點(diǎn)關(guān)注的目標(biāo)區(qū)域,也就是所說的注意力焦點(diǎn),然后對這一區(qū)域投入更多的注意力資源,以獲取更多所需要關(guān)注目標(biāo)的細(xì)節(jié)信息,從而抑制其他無用信息。人類視覺注意力機(jī)制極大地提高了視覺信息處理的效率與準(zhǔn)確性。深度學(xué)習(xí)中的注意力機(jī)制本質(zhì)上也是和人類視覺注意力類似,也是從眾多信息中選擇出對當(dāng)前任務(wù)目標(biāo)更關(guān)鍵的信息。
先說說encoder-decoder
目前大多數(shù)注意力機(jī)制都附著在encoder-decoder框架下,但是我們應(yīng)該清楚,attention是一種思想,其本身并不依賴于任何框架。encoder-decoder是深度學(xué)習(xí)中非常常見的一個模型框架。在Image Caption應(yīng)用中,encoder-decoder是CNN-RNN框架;在神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯模型中,encoder-decoder是LSTM-LSTM框架。特別地,在機(jī)器翻譯中文本到文本的轉(zhuǎn)換,這樣的encoder-decoder模型也被叫做sequence to sequence learning。encoder,就是將輸入序列編碼成一個定長向量;decoder,就是將前面生成的定長向量再解碼成輸出序列。

如上圖,這里我們設(shè)定encoder-decoder是RNN-RNN框架。
當(dāng)前時刻的隱狀態(tài)。
編碼:獲得各個時刻隱狀態(tài)后,把這些隱狀態(tài)匯總,生成最終的語義編碼向量,
是非線性神經(jīng)網(wǎng)絡(luò),在這里表示多層RNN。
解碼:根據(jù)語義向量C和已經(jīng)生成的輸出序列預(yù)測下一個輸出詞
由于我們這里是RNN,所以上式可以簡寫:
其中是decoder中RNN神經(jīng)元的隱狀態(tài),
是前一時刻的輸出,
是語義向量。
是一個非線性的多層神經(jīng)網(wǎng)絡(luò),可以輸出
的概率。一般情況下
是多層RNN后接softmax。
encoder-decoder最大的局限性在于編碼器和解碼器之間的唯一聯(lián)系是一個定長的語義向量。編碼器要將整個序列的信息壓縮進(jìn)一個定長的向量中。這樣做有兩個缺點(diǎn):一是
可能無法完全代表整個序列的信息; 二是先輸入到網(wǎng)絡(luò)的內(nèi)容攜帶的信息會被后輸入的信息覆蓋,輸入序列越長,問題越突出。
請出今天的主角:Attention
下圖是Bahdanau等人在論文《Neural Machine Translation by Jointly Learning to Align and Translate》中使用的加入了Attention機(jī)制的encoder-decoder模型:

在編碼部分使用了雙向RNN。在前向RNN中,數(shù)據(jù)按順序輸入,所以第j個隱層狀態(tài)攜帶了第j個詞本身及之前的一些信息;在逆向RNN中,數(shù)據(jù)是逆序輸入的,所以第j個隱層狀態(tài)
攜帶了第j個詞本身及之后的信息。把這兩個隱狀態(tài)結(jié)合起來,
=
包含了第j個輸入的前后信息。
再看看解碼部分。
- 計算上一步得到的各個隱狀態(tài)
與解碼器隱狀態(tài)
之間的相關(guān)程度,然后進(jìn)行softmax得到每個隱狀態(tài)的權(quán)重
:
表示第t個輸出前一個隱層
與第j個輸入隱層向量
之間的相關(guān)性,可以通過一個MLP神經(jīng)網(wǎng)絡(luò)進(jìn)行計算。有了
后,進(jìn)行softmax就可以得到歸一化的權(quán)重
。
這里計算輸入隱狀態(tài)和輸出隱狀態(tài)之間的相關(guān)程度常見的方法有:求兩者的向量點(diǎn)積、求兩個向量的夾角余弦值、通過引入額外的神經(jīng)網(wǎng)絡(luò)求值。
- 計算當(dāng)前輸入對應(yīng)的編碼向量
:
- 根據(jù)編碼向量
計算解碼器t時刻的隱狀態(tài)
和輸出
:
上述Attention機(jī)制稱為Soft Attention,對所有的編碼器隱狀態(tài)都分配了權(quán)重。這里可以理解為對齊模型,作用是匹配輸出序列與輸入序列的對應(yīng)關(guān)系。
繼Bahdanau等人之后,Luong等人在Attention機(jī)制方面也發(fā)表了一篇很有代表性的論文《Effective approaches to attention-based neural machine translation》,提出兩種Attention機(jī)制:Global Attention 和 Local Attention;對后續(xù)各種基于Attention機(jī)制的模型在NLP中的應(yīng)用起到了很大的促進(jìn)作用。
Global Attention其實也是Soft Attention,與Bahdanau等人提出的模型基本相同,不同的是權(quán)重的計算方式,這里提出三種計算選擇:內(nèi)積、general、concat,并且實驗結(jié)果是general的效果比較好。
Soft Attention的缺點(diǎn)是每次decoder的時候都要計算所有的編碼器隱層狀態(tài),導(dǎo)致計算復(fù)雜度高。另外,當(dāng)source比較長時,Soft Attention的效果也會有所下降。
Local Attention每次只選擇一部分source進(jìn)行計算。其基本思路是:先為decoder端當(dāng)前詞預(yù)測一個source端對齊位置(Aligned Position) pt,然后基于pt為中心選擇一個窗口用于計算語言編碼向量C。這里比較重要的是怎么選取pt的位置,文中給出兩種計算方法:
Monotonic alignment:直接選擇source中第t個作為中心pt,然后向兩側(cè)取窗口大小個詞。
Predictive alignment:將decoder的隱狀態(tài)經(jīng)過一個激活函數(shù)tanh和sigmoid兩個函數(shù)之后變成0-1,再乘以S(source序列長度)變成0-S,也就是我們需要的原序列所對應(yīng)的中心位置pt,取出窗口大小個隱層,再進(jìn)行加權(quán)求和。這里權(quán)重乘以了一個高斯分布,目的是讓靠近中心pt的詞權(quán)重更大一些。
我們再來看看近幾年比較熱的一種Attention機(jī)制——Self Attention
Self Attention也被稱為Intra Attention(內(nèi)部Attention),近年也獲得比較廣泛的使用;google翻譯模型內(nèi)部就大量使用了Self Attention。
通過前面的介紹,我們知道Soft Attention的計算是建立在source和target之間的。而Self Attention有點(diǎn)不一樣,從名字可能我們也能猜出個大概,這里的Attention計算是建立在Source或Target內(nèi)部的。這里可以做個不恰當(dāng)?shù)募僭O(shè),我們假設(shè)source和target一樣,然后根據(jù)soft attention的方式來計算attention。
下面兩張圖展示了Self Attention學(xué)習(xí)到同一個句子內(nèi)部詞之間的句法特性和語義特征。


Self Attention更容易捕獲句子中長距離的相互依賴特征。如果是RNN,需要依據(jù)序列計算,對于遠(yuǎn)距離的相互依賴特征,要經(jīng)過若干時間步的信息積累才能將兩者聯(lián)系起來;距離越遠(yuǎn),有效捕獲的可能性越小。Self Attention在計算過程中直接將句子中任意兩個單詞通過一個計算步直接聯(lián)系起來,所以遠(yuǎn)距離依賴特征之間的距離被縮短。另外,Self Attention對于增加計算的并行性也有直接幫助作用。
參考:
https://aclweb.org/anthology/D15-1166