[ML 筆記] 自注意機制 Self-attention (下)

 Self-attention 筆記(下)

本篇為台大電機系李宏毅老師 Machine Learning (2021) 課程筆記

上課影片:https://youtu.be/gmsMY5kc-zw


延續上一篇 [ML 筆記] 自注意機制 Self-attention (上)


Self-attention 的詳細架構介紹,先複習一下

我們的 Self-attention 的 input 是個 sequence (a1 ~ a4) output 端是另一個 vector (b1 ~ b4)


以下是計算出 b2 的過程:

 

我們把 a2  過一個 Wq 矩陣,算出 q2 ,把 a2  過一個 Wk 矩陣,算出 k2

然後把 q2 跟 v2 做 dot-product,得到 ꭤ’2,2 (這個參數稱為 attention score) 

再把 a2  過一個 Wv 矩陣,算出 v2 乘上跟 ꭤ’2,2  得到 b2


我們可以用矩陣的表示法,來描述上述的運算過程

Q 矩陣,代表 q1 q2 q3 q4 這些 vectors

I 矩陣,代表了 a1 a2 a3 a4 這些 vectors

K 矩陣,代表了 k1 k2 k3 k4 這些 vectors

V 矩陣,代表 v1 v2 v3 v4 這些 vectors

Q = Wq x I

K = Wk x I

V = Wv x I


計算 𝛂1,1 ~ 𝛂1,4


得到過完 softmax 後的矩陣 A’ 後

就可以拿來計算出 b1 ~ b4 值


整個複習一下

I 是 self-attention 的 input

I 經過不同的 W 矩陣運算後,得到 Q, K, V

得到 Q, K, V 之後,可以使用 KTQ 得到 A 矩陣

得到 A 矩陣後過了 softmax 或是其他 activation function 得到 A’

得到 A’ 矩陣後,乘上 V 矩陣就可以得到我們要的 self-attetion layer 的 Output, O

整個過程當中,只有 Wq Wk Wv 是未知的,需要透過 training data 去學起來

其他的運算都是人為已知的設定



Self-attention 進階版本:Multi-head Self-attention


思路:做 “相關” 這件事情,我們可以使用不只一個 q ,可以使用多個 q 來做不同的相關性運算,既然 q 有多個,那 k 跟 v 也會有多個相對應

透過不同組的 q,k,v 得到 output bi,1, bi,2 之後,再把這些 output vector 接起來過一個 WO,就可得到 Multi-head Self-attention 的最後 output bi




目前為止,對於 Self-attention 的 Layer 而言,每一個 input 都是獨立的,放在 sequence 當中哪個位置沒有任何差別,因此接下來介紹 Positional Encoding 把位置的資訊塞下去!

對於每一個不同位置,分別給不同的位置的 encoding ei 

再把這些 encoding ei 加到 attention 裡面去


目前大多的 Positional Encoding 是人為設定的,至於有沒有更好的 positional encoding 的方法,尚待研究!



Self-attention 不只可以用在 NLP 應用上,接下來來介紹其他的應用

例如 語音辨識

隨便講一句話,都是上千個向量,Sequence 的數量如果上千的,在做 Attention 的運算時,就會消耗大量的 memory 跟運算資源

因此在做語音的時候有一招叫做 Truncated Self-attention 只看一個小範圍就好,至於小範圍是多少範圍,也是人為設定的


Self-attention 還可以被用在影像上

Self-attention 的輸入是 vector sets,我們要把一張圖片看作是 Vector set 的做法:

把每一個 pixel 看作是一個三維的 vector 

使用 self-attention 用在圖片上的例子:

Self-attention 跟 CNN 的關聯性

Self-attention 來處理圖片是,選取一個 pixel 當作 query ,而其他pixel 當作 key 來看該 pixel 跟圖片中其他位置的關係

因此,

CNN 可以看作是一種簡化版本的 Self-attention 因為 CNN 裡面的 receptive field 是局部的,而 self-attention 的 receptive field 是全部的 pixel (整張影像的資訊)


或是可以換句話說 Self-attention 是複雜化版本的 CNN


  • CNN 裡面每個神經元只考慮 receptive field 裡面的資訊,而 receptive field範圍跟大小事人為決定的

 

  • Self-attention 裡面,我們用 attention 去找出相關的 pixel,也就是 receptive field 的範圍是讓機器自動決定的,透過training 過程,在整張圖片當中,機器會自己學出哪些pixel 與 pixel 之間,圖片中哪些範圍是比較重要有關聯的


欲深入研究可以追相關的 paper: https://arxiv.org/pdf/1911.03584.pdf

Self-attention 跟 CNN 的比較實驗

在資料比較少時,CNN 訓練起來效果較好,當資料量夠大時,Self-attention 效果超越了 CNN


Self-attention v.s. RNN


簡單快速複習一下 RNN  (RNN介紹可以看這篇)

RNN也是要處理 input 是一個 sequence 的狀況,有一個 input vector,通過 RNN 產生了一個 output 通過 Fully Connected (FC) Network 再去做想做的事情,

接著把第一個時間點產生的輸出,跟第二個時間點的input vector 再一起餵進去 RNN 裡面,然後產生新的輸出,再跟下一個時間點的 input 去做處理,一直循環下去

你會發現 RNN 跟 Self-attention 做的事情很像


比較兩者個不同:在單向的 RNN 來說,前面時間點出現的 vector 只考慮了前面時間點的 vector,看不到後面出現的 input 

而 self-attention 裡面,每一個 vector 都考慮所有的 input,但其實 RNN 也可以是雙向的,因此使用雙向 RNN 也可以考慮進 sequence 當中的所有資訊


Self-attention v.s. RNN 差異點1 

即便是雙向 RNN 跟 Self-attention 最大的差異點在於

如圖:

對 RNN 來說,假設最右邊的紅色的黃色 Vector 要考慮最左邊的紅色框藍色 input vector 必須一直存在 memory 裡面不會被忘掉,才能在最後一個時間點影響到最後一個 vector

而在 self-attention 的架構來說,沒有這個問題,即便在sequence當中離得很遠的兩個 vector,他們還是會被完整地兩兩輕易地抽取出資訊 (attention score)


Self-attention v.s. RNN 差異點2

RNN 無法平行化,因為 RNN 的下一個時間點所需要 input,會需要等前一個時間點的結果出來才能運算下去

Self-attention 當中的運算則是相互獨立的,可以輕鬆地平行化處理所有運算,得到輸出


因此在運算速度上,self-attention 會比 RNN 更有效率

近期很多的應用往往都把 RNN 的架構改成 self-attention 架構

有興趣可以追這篇論文 https://arxiv.org/pdf/2006.16236.pdf


留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking