深度學習中的Attention機制

RNN做機器翻譯有它自身的弱點,Attention正是為了克服這個弱點而出現的。所以,要理解Attention,就要搞明白兩件事:

  • RNN在做機器翻譯時有什麼弱點

  • Attention是如何克服這個弱點的

本文試圖從解答這兩個問題的角度來理解Attention機制。

一、RNN做機器翻譯的經典思路 encoder-decoder

用RNN做機器翻譯時,通常需要兩個RNN網路,一個用來將接收待翻譯語句,對其進行編碼,最後輸出一個vector,這個網路叫encoder。然後,該vector會作為輸入,傳給另一個RNN網路,該網路用來根據vector產生目標語言的翻譯語句,這個網路叫做decoder。如下圖所示:

《机器学习面试之Attention》

上圖中間的Context就是我們這裡說的第一個RNN產生的vector。

二、encoder-decoder的缺點在哪裡?

encoder-decoder最大的缺點是,encoder接收了不管多長的語句,最後輸出的只是最後一個vector,當語句很長時,這個vector能否有效地表示該語句是很值得懷疑的。

如何解決這個問題呢?我們很自然會想到,第一個RNN其實在中間會產生很多輸出,這些輸出都被我們拋棄了,我們只用了最後的一個。如果能利用上中間的輸出,興許可以解決問題。Attention正是利用上了這些中間的輸出。

三、Attention是如何利用中間的輸出的

先上圖,再來解釋:

《机器学习面试之Attention》

上圖中的A是我們的encoder, B是我們的decoder。
可以想像,A網路接收了一個四個字的句子,對每個字都產生了一個輸出(這些輸出都是一個vector),我們稱其為s1,s2,s3,s4。

我們看上圖的B網路,在第一個B產生的hidden state(稱其為h1)除了傳給下一個cell外,還傳到了A網路,這裡就是Attention發揮作用的地方,我們來看看發生了什麼。

第一步:
h1 分別與s1,s2,s3,s4做點積,產生了四個數,稱其為m1,m2,m3,m4(這些都是標量,不是向量了!)

第二步:
m1,m2,m3,m4 傳到一個softmax層,產生一個概率分布a1,a2,a3, a4。

第三步:
將a1,a2,a3, a4 與s1,s2,s3,s4分別相乘,再相加,得到得到一個vector,稱其為Attention vector。

第四步:

Attention vector 將作為輸入傳到B網路的第二個cell中,參與預測。

以上就是Attention機制的基本思想了。我們看到,Attention vector 實際上融合了s1,s2,s3,s4的資訊,具體的融合是用一個概率分布來達到的,而這個概率分布又是通過B網路上一個cell的hidden state與s1,s2,s3,s4進行點乘得到的。

Attention vector實際上達到了讓B網路聚焦於A網路輸出的某一部分的作用。

四、Attention中產生概率分布的兩種方法

在第3部分中,我們的概率分布來自於h與s的點積再做softmax,這只是最基本的方式。在實際中,我們可以有不同的方法來產生這個概率分布,每一種方法都代表了一種具體的Attention機制。

  • 1 加法Attention
    在加法Attention中,我們不再讓h與s做點積,而是做如下的運算:

    《机器学习面试之Attention》

va和Wa都是可以訓練的參數。h與s之間的分號表示將二者接到一起產生一個更長的vector。這樣產生的數再送往softmax層,進而產生一個概率分布。

當然,我們還可以這麼做:

《机器学习面试之Attention》

這裡只是不再把h與s接到一起而已,本質上沒有什麼區別的。

  • 2 乘法Attention
    乘法Attention將h與s做如下的運算:

    《机器学习面试之Attention》

顯然,乘法Attention的參數更少,效率自然也會更高一些。

五、Attention機制的擴展

Attention機制的核心在於對一個序列數據進行聚焦,這個聚焦是通過一個概率分布來實現的。這種機制其實有很強的普適性,可以用在各個方面。

比如,根據圖片產生描述該圖片的文字, 首先,圖片會經過CNN進行特徵的提取,提取的數據會輸入到產生描述文字的RNN中,這裡,我們可以引入Attention機制,讓我們在產生下一個文字時,聚焦於我們正在描述的圖片部位。

其次,在句子表示中,self Attention機制是成功擴展的Attention的範例。其基本原理如下:

假如我們用一個RNN讀入了一個句子,產生了h1, h2,h3,h4四個hidden state。
為了得到該句子的摘要,我們可以這樣做:
對每一個h計算一個分數:

《机器学习面试之Attention》

四個h共產生了4個分數,將這四個分數送入一個softmax層,產生一個概率分布,根據這個概率分布對四個h進行加和,得到句子摘要的第一個vector。如下圖所示:

《机器学习面试之Attention》

為了得到更多的vector,我們可以把上面圖中的小寫va換成一個矩陣,然後,我們的a也就變成了多個概率分布組成的矩陣,每個概率分布都可以用來與h進行加和產生一個vector,這樣我們就產生了摘要的多個vector,如下圖所示:

《机器学习面试之Attention》

六、總結

通過以上的內容,我們了解到,Attention機制最初用來克服RNN做機器翻譯時的缺點,然後,人們發現,Attention機制具有廣泛的適用性,於是它又被擴展到了產生圖片描述,做句子摘要等任務上。

我們也清楚了,不同的Attention機制的核心區別在於產生概率分布的方法不同。