###### tags: `Machine learning` {%hackmd @kk6333/theme-sty1 %} # Self-Attention ## 簡介 Self-Attention 是很常用在 " input 為一個 Sequence " 時的處理模組 什麼叫 input 為一個 Sequence ? 譬如說一段句子、 聲音訊號、Graph( 關聯圖 )、甚至於圖片輸入 是由 Vector 組成的串列都可稱之為 Sequence <br> Sequence 可以解決的問題又分下列三種 - **輸入 N 長度 Sequence,輸出 N 長度 Sequence** : ex 詞彙辨識 - **輸入 N 長度 Sequence,輸出一個值** : ex 語句情緒辨識 - **輸入 N 長度 Sequence,輸出 $N^{'}$ 長度 Sequence** : ex : 語音辨識 ![](https://i.imgur.com/rysVkRJ.png =500x350) <br> 而 Self-Attention 就很適合處理未知長度的 Sequence --- <br> ## 外部架構 Self-Attention 就是我們在進行全連接層之前先做的處理, 1. 先將 Sequence 整段丟入 Self-Attention 2. 通過 Self-Attention 後會產生另一 Vector 3. 將產生的 Vector 丟入全連接層做訓練,並產生預測結果 很不錯的是 Self-Attention 可以平行化(同時)輸出 Vector,減少訓練時間 ( BTW Self-Attention 不一定只有一層,可以多層 ) ![](https://i.imgur.com/V84MFsg.png =500x330) --- <br> ## 內部架構 那要如何產生一個新的 Sequence 呢 ? 1. 計算 Sequence 間 Vector 的關聯性 2. 通過 Softmax 做 normalize 3. 將處理後的關聯性乘上各個 Vector 計算 output vector ### 1. 計算關聯性 ($\alpha$) : 使用 Dot Product ![](https://i.imgur.com/S4QM4Qy.png =500x300) 為了計算某 Vector ( $a_1$ ) 與其他 Vector 的關係, 要先將 $a_z$ 乘上一係數 $W^q$ ,並將另一 Vector $a_2$ 也呈上係數 $W^k$ 分別成為 $q , k$ (這裡 k,q 分別代表 key、quora) 並將 $q , k$ 做內積得到關聯性 $\alpha$ :::info - $\alpha = q \cdot k$ ::: ![](https://i.imgur.com/AO61ApP.png =300x400) <br> ### 2. 通過 Softmax 算出 $\alpha$ 後會將此值通過 Softmax 作正規化,做 $\alpha^{'}$ 其實這邊不一定要用 Softmax,使用其他 Activation function 也可 :::info - $\alpha^{'} = Softmax(\alpha)$ ::: ![](https://i.imgur.com/0z6Cwg5.png =500x250) <br> ### 3.計算輸出 Vector 最後將最初的輸入 $a_1$ 乘一權重 $W^v$ 為 $v$ 並將 v 乘上處理後的相關性輸出 Vector $b_1$ :::info - $v_1 = W^va_1$ - $b_1 = v_1\alpha_{11} ^{'}+v_2\alpha_{12}^{'}+v_3\alpha_{13}^{'}=\sum{_j}v_j\alpha_{1j}^{'}$ <br> 這邊要注意一下 $\alpha_{ij}^{'}$ 的底數分別是指 $a_i、a_j$ 間的關聯性 ex : $\alpha_{12}^{'}$ 是指 $a_1、a_2$ 間的關聯性 ::: ![](https://i.imgur.com/ECrlqWN.png =540x300) --- <br> ## Multi-head Self-Attation Multi-head Self-Attation 其實就是將原本算出的 $q、k、v$ 再另外分別乘上另外的矩陣 (ex $W^{q1},W^{q2}$) 並各自與對應值做計算 ex : $q^{i1}$ 會與 $k^{j1}$ 相乘並與 $v^{i1}a_i$ 算出新 Vector <br> ![](https://i.imgur.com/WPY3eZ4.png =540x350) --- <br> ## Positional Encoding 當訓練的 Sequence 有需要 Vector 間的順序資訊時,譬如動詞比較不會在句首... 可以用 Positional Encoding 的方式加入位置的資訊 Positional Encoding 會將每個順序位置產生一個向量 $e^i$ 並將這個資訊加到 input 當中 ![](https://i.imgur.com/KiKjjQ5.png =150x120) 這樣就可辨別此 Vector 的位置資訊了 --- <br> ## 圖片與 Self-Attention 那圖片要怎麼使用 Self-Attention 來訓練呢 ? 可以將圖片的 Channel 視為一個 input Vector,多個 Channel 就是一個 Sequence 以此種方式輸入 <br> ![](https://i.imgur.com/EdDeEz3.png =500x300) 但此種方法需要大量的圖片資料,否則訓練結果不一定可以比 CNN 好 ! <br> ## Masked Attention Masked Attention **通常會被用在 "Trasnsformer" 的 Decoder** 概念就是在計算 input vector 相關性 $\alpha$ 與 output 時 不會跟比自己**後面的 vector 計算** :::warning ex : - input $a_1, a_2, a_3$ - output $b_1,b_2,b_3$ $b_1$ 會是 $a_1$ 做 Attention 後的輸出 $b_2$ 會是 $a_1,a_2$ 做 Attention 後的輸出 $b_3$ 會是 $a_1,a_2,a_3$ 做 Attention 後的輸出... <br> ![](https://i.imgur.com/kqCHS9y.png) :::