首先感謝台大李宏毅老師和[b站up主涼飯爺上傳的視頻](台大李宏毅21年機器學習課程 self-attention和transformer_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili)。
之前自己也有看過原論文,看的懵懵懂懂,然后由於看到了CCnet(Criss-Cross Attention for Semantic Segmentation 十字交叉注意力機制),於是又回過頭來看注意力機制。
於是就有了下面的自我總結的筆記吧。
首先transformer是首先應用於 NLP問題上的,自注意力機制是其中尤為關鍵的一個組成部分。
先簡單介紹一下NLP是如何進行transformer的;
NLP的三種輸出情況:
- 每一個詞向量對應一個標簽
對於第一個例子,則是輸入一句話得到句子中的所有詞匯的詞性。
對於第二個例子,是輸入一段音頻,期望的輸出是每一個的音標結果。
第三個例子,則是通過用戶畫像的詞向量,期望的輸出是判斷是否用戶會購買。
- 一個完整的序列對應一個標簽
- 讓機器模型自行決定輸出的結果.
具體實現過程
- 進行詞編碼,將詞變成向量(下面的兩種方法:
一種是全部所有的單詞進行編碼,假如有5000單詞需要進行編碼,那么就下面的one-hot Encoding 的編碼長度就為5000.這樣的編碼方式很明顯對算力的要求高,同時沒有相關類別的語義關聯信息
二是Word Embedding 詞嵌入,在上一種方法的基礎上進行改進的,將文本空間中的某個word,通過一定的方法,映射或者說嵌入(embedding)到另一個數值向量空間(之所以稱之為embedding,是因為這種表示方法往往伴隨着一種降維的意思。能夠包含語義關聯信息,如下圖所示)
- 將一個連串的句子的詞向量依次作為輸入進入Self-attention模塊,然后通過attention模塊產生同樣大小個數的包含了上下文語義信息的詞向量序列。之后進行全連接層(FC)得到每一個向量對應的label.
Self-attention的具體內部執行:
以α1 為例:
通過進行矩陣運算,生成對應的query,key,value向量
q1 = Wq α1
k1 = Wk α1
v1 = Wv α1
然后計算α{1,2,3,4} 之間的相關性,通過 q1 與 k{1,2,3,4} 得到α1,1 α1,2 α1,3 α1,4 這些實際上就表示了 詞向量α{1,2,3,4} 之間的相關性.
將其進行Soft-max 使其能夠成為我們所需要的權重。
之后就通過上面得到的權重α'1,1 α'1,2 α'1,3 α'1,4 和 每一個詞向量與Value矩陣運算得到的v{1,2,3,4}
運算得到 b1
同樣的可以得到 b2 b3 b4 ,這就是self-attention模塊了。
下面就是矩陣運算的表示了:
對於多頭注意力機制:
實際上就是 對於αi 與Wq 進行矩陣乘法之后 得到 qi ,然后將qi 與 N個不同的矩陣(N表示N頭注意力機制) 相乘得到 qi,n 。
同樣原理得到 ki,n v i,n
然后對應的上標進行運算 ,以此得到bi,1 bi,2 ... bi,n 然后 疊加在一起進行之后的運算。
位置編碼(Positional Encoding):
1.位置編碼出現的原因:在上面介紹的self-attention 中沒有位置信息
2.每一個位置都有獨一無二的位置向量ei
3.可以手工設置
4.也可以學習生成
self-attention vs rnn
接下來介紹Self-attention 在圖像方面的應用
把一張三通道的rgb圖像,把每一個像素點按通道方向考慮為向量,進行self-attention
Self-attention 和 CNN 的比較
CNN僅僅只能關注到人為設置的receptive field (感受野)
self-attention 能夠學習整張圖片的receptive field (感受野),通過權重 (如上面的α'1,1 α'1,2 α'1,3 α'1,4 )可以讓機器自行選擇感受野。
可以認為Self-attention 是復雜的CNN ,或者CNN是簡化的Self-attention.
如何選擇:
接下來就開始進行transformer 的總結:
推薦一篇好的博文:什么是Transformer
transformer的整體結構圖
在trasformer中的normalization,不是傳統的batch_normalization,而是layer_normalization
encoder層
Feed Forward Neural Network
由於在之前的Multi-Headed Attention中,我們初始化了多組q k v 矩陣進行運算,導致經過多頭注意力模塊之后產生了多個矩陣。(如下圖所示)
所以我們需要一種方式,把 8 個矩陣降為 1 個,首先,我們把 8 個矩陣連在一起,這樣會得到一個大的矩陣,再隨機初始化一個矩陣和這個組合好的矩陣相乘,最后得到一個最終的矩陣。
這一操作就是FFN network
decoder層
從transformer的結構圖中我們可以看到decoder層的self-attention比encoder中的描述多了一個Masked
實際上多了這個Masked 我們要從下圖中了解為什么是這樣。
在上圖中,我們可以看到,首先Decoder層中同樣有輸入,剛開始的輸入我們需要一個BEGIN來表示開始(同樣也需要一個END詞向量來表示結束,於是詞編碼處我們需要的編碼是所有的詞匯數+1(表示開始和結束))。
因此:
於是:要產生b1時 我們只需要 計算q1 和 k1 ,然后將b1 作為輸入
這樣就開始需要產生b2,這時我們需要計算 k1 k2 和 q2 ,然后將b2作為輸入
Cross-attention:
對於Cross-attention模型:encoder模塊傳到Decoder模塊的參數有兩部分,表示的是q矩陣和v矩陣(實際上對於經過Encoder的向量來說,我們生成的僅僅只有一個b矩陣(下圖中的a矩陣),於是將a矩陣同Wk 和 Wv 進行運算得到decoder需要的兩個矩陣K,V )
於此同時decoder自身產生q矩陣