Self-attention + transformer 和其他一些總結


首先感謝台大李宏毅老師和[b站up主涼飯爺上傳的視頻](台大李宏毅21年機器學習課程 self-attention和transformer_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili)。

之前自己也有看過原論文,看的懵懵懂懂,然后由於看到了CCnet(Criss-Cross Attention for Semantic Segmentation 十字交叉注意力機制),於是又回過頭來看注意力機制。

於是就有了下面的自我總結的筆記吧。


首先transformer是首先應用於 NLP問題上的,自注意力機制是其中尤為關鍵的一個組成部分。

先簡單介紹一下NLP是如何進行transformer的;

NLP的三種輸出情況:

  1. 每一個詞向量對應一個標簽
    對於第一個例子,則是輸入一句話得到句子中的所有詞匯的詞性。
    對於第二個例子,是輸入一段音頻,期望的輸出是每一個的音標結果。
    第三個例子,則是通過用戶畫像的詞向量,期望的輸出是判斷是否用戶會購買。

  1. 一個完整的序列對應一個標簽

  1. 讓機器模型自行決定輸出的結果.


具體實現過程

  1. 進行詞編碼,將詞變成向量(下面的兩種方法:

一種是全部所有的單詞進行編碼,假如有5000單詞需要進行編碼,那么就下面的one-hot Encoding 的編碼長度就為5000.這樣的編碼方式很明顯對算力的要求高,同時沒有相關類別的語義關聯信息

二是Word Embedding 詞嵌入,在上一種方法的基礎上進行改進的,將文本空間中的某個word,通過一定的方法,映射或者說嵌入(embedding)到另一個數值向量空間(之所以稱之為embedding,是因為這種表示方法往往伴隨着一種降維的意思。能夠包含語義關聯信息,如下圖所示)

  1. 將一個連串的句子的詞向量依次作為輸入進入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矩陣同WkWv 進行運算得到decoder需要的兩個矩陣K,V
於此同時decoder自身產生
q
矩陣


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM