自注意力機制-Self-Attention

一、注意力機制和自注意力機制的區別

Attention機制與Self-Attention機制的區別

傳統的Attention機制發生在Target的元素和Source中的所有元素之間。

簡單講就是說Attention機制中的權重的計算需要Target來參與。即在Encoder-Decoder 模型中,Attention權值的計算不僅需要Encoder中的隱狀態而且還需要Decoder中的隱狀態。

Self-Attention:

不是輸入語句和輸出語句之間的Attention機制,而是輸入語句內部元素之間或者輸出語句內部元素之間發生的Attention機制。

例如在Transformer中在計算權重參數時,將文字向量轉成對應的KQV,只需要在Source處進行對應的矩陣操作,用不到Target中的信息。

二、引入自注意力機制的目的
神經網絡接收的輸入是很多大小不一的向量,並且不同向量向量之間有一定的關係,但是實際訓練的時候無法充分發揮這些輸入之間的關係而導致模型訓練結果效果極差。比如機器翻譯問題(序列到序列的問題,機器自己決定多少個標籤),詞性標註問題(一個向量對應一個標籤),語義分析問題(多個向量對應一個標籤)等文字處理問題。

針對全連接神經網絡對於多個相關的輸入無法建立起相關性的這個問題,通過自注意力機制來解決,自注意力機制實際上是想讓機器注意到整個輸入中不同部分之間的相關性。

三、Self-Attention詳解
針對輸入是一組向量,輸出也是一組向量,輸入長度爲N(N可變化)的向量,輸出同樣爲長度爲N 的向量。

3.1 單個輸出

對於每一個輸入向量a,經過藍色部分self-attention之後都輸出一個向量b,這個向量b是考慮了所有的輸入向量對a1產生的影響纔得到的,這裏有四個詞向量a對應就會輸出四個向量b。

下面以b1的輸出爲例

首先,如何計算sequence中各向量與a1的關聯程度,有下面兩種方法

 

Dot-product方法是將兩個向量乘上不同的矩陣w,得到q和k,做點積得到α,transformer中就用到了Dot-product。

上圖中綠色的部分就是輸入向量a1和a2,灰色的Wq和Wk爲權重矩陣,需要學習來更新,用a1去和Wq相乘,得到一個向量q,然後使用a2和Wk相乘,得到一個數值k。最後使用q和k做點積,得到α。α也就是表示兩個向量之間的相關聯程度。

上圖右邊加性模型這種機制也是輸入向量與權重矩陣相乘,後相加,然後使用tanh投射到一個新的函數空間內,再與權重矩陣相乘,得到最後的結果。

可以計算每一個α(又稱爲attention score),q稱爲query,k稱爲key

 

另外,也可以計算a1和自己的關聯性,再得到各向量與a1的相關程度之後,用softmax計算出一個attention distribution,這樣就把相關程度歸一化,通過數值就可以看出哪些向量是和a1最有關係。

 

下面需要根據 α′ 抽取sequence裏重要的資訊:

先求v,v就是鍵值value,v和q、k計算方式相同,也是用輸入a乘以權重矩陣W,得到v後,與對應的α′ 相乘,每一個v乘與α'後求和,得到輸出b1。

如果 a1 和 a2 關聯性比較高, α1,2′ 就比較大,那麼,得到的輸出 b1 就可能比較接近 v2 ,即attention score決定了該vector在結果中佔的分量;

3.2 矩陣形式
用矩陣運算表示b1的生成:

Step 1:q、k、v的矩陣形式生成

寫成矩陣形式:

把4個輸入a拼成一個矩陣,這個矩陣有4個column,也就是a1到a4,乘上相應的權重矩陣W,得到相應的矩陣Q、K、V,分別表示query,key和value。

三個W是我們需要學習的參數

Step 2:利用得到的Q和K計算每兩個輸入向量之間的相關性,也就是計算attention的值α, α的計算方法有多種,通常採用點乘的方式。

先針對q1,通過與k1到k4拼接成的矩陣K相乘,得到拼接成的矩陣。

同樣,q1到q4也可以拼接成矩陣Q直接與矩陣K相乘:

公式爲:

矩陣形式:

矩陣A中的每一個值記錄了對應的兩個輸入向量的Attention的大小α,A'是經過softmax歸一化後的矩陣。

Step 3:利用得到的A'和V,計算每個輸入向量a對應的self-attention層的輸出向量b:

寫成矩陣形式:

對self-attention操作過程做個總結,輸入是I,輸出是O:

矩陣Wq、 Wk 、Wv是需要學習的參數。

四、Multi-head Self-attention
self-attention的進階版本Multi-head Self-attention,多頭自注意力機制

因爲相關性有很多種不同的形式,有很多種不同的定義,所以有時不能只有一個q,要有多個q,不同的q負責不同種類的相關性。

對於1個輸入a

首先,和上面一樣,用a乘權重矩陣W得到,然後再用乘兩個不同的W,得到兩個不同的,i代表的是位置,1和2代表的是這個位置的第幾個q。

這上面這個圖中,有兩個head,代表這個問題有兩種不同的相關性。

同樣,k和v也需要有多個,兩個k、v的計算方式和q相同,都是先算出來ki和vi,然後再乘兩個不同的權重矩陣。

對於多個輸入向量也一樣,每個向量都有多個head:

算出來q、k、v之後怎麼做self-attention呢?

和上面講的過程一樣,只不過是1那類的一起做,2那類的一起做,兩個獨立的過程,算出來兩個b。

對於1:

 

 

對於2:

 

 

這只是兩個head的例子,有多個head過程也一樣,都是分開算b。

最後,把拼接成矩陣再乘權重矩陣W,得到,也就是這個self- attention向量ai的輸出,如下圖所示:

 

 

五、Positional Encoding
在訓練self attention的時候,實際上對於位置的信息是缺失的,沒有前後的區別,上面講的a1,a2,a3不代表輸入的順序,只是指輸入的向量數量,不像rnn,對於輸入有明顯的前後順序,比如在翻譯任務裏面,對於“機器學習”,機器學習依次輸入。而self-attention的輸入是同時輸入,輸出也是同時產生然後輸出的。

如何在Self-Attention裏面體現位置信息呢?就是使用Positional Encoding

也就是新引入了一個位置向量,非常簡單,如下圖所示:

 

 

每一個位置設置一個vector,叫做positional vector,用表示,不同的位置有一個專屬的ei。

如果ai加上了ei,就會體現出位置的信息,i是多少,位置就是多少。

vector長度是人爲設定的,也可以從數據中訓練出來。

六、Self-Attention和RNN的區別
Self-attention和RNN的主要區別在於:

1.Self-attention可以考慮全部的輸入,而RNN似乎只能考慮之前的輸入(左邊)。但是當使用雙向RNN的時候可以避免這一問題。
2.Self-attention可以容易地考慮比較久之前的輸入,而RNN的最早輸入由於經過了很多層網絡的處理變得較難考慮。
3.Self-attention可以並行計算,而RNN不同層之間具有先後順序。

1.Self-attention可以考慮全部的輸入,而RNN似乎只能考慮之前的輸入(左邊)。但是當使用雙向RNN的時候可以避免這一問題。

比如,對於第一個RNN,只考慮了深藍色的輸入,綠色及綠色後面的輸入不會考慮,而Self-Attention對於4個輸入全部考慮

 

 

2.Self-attention可以容易地考慮比較久之前的輸入,而RNN的最早輸入由於經過了很多層網絡的處理變得較難考慮。

比如對於最後一個RNN的黃色輸出,想要包含最開始的藍色輸入,必須保證藍色輸入在經過每層時信息都不丟失,但如果一個sequence很長,就很難保證。而Self-attention每個輸出都和所有輸入直接有關。

 

 

3.Self-attention可以並行計算,而RNN不同層之間具有先後順序。

Self-attention的輸入是同時輸入,輸出也是同時輸出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章