---
# System prepended metadata

title: 自注意力機制（Self-attention）
tags: [架構設計, 李宏毅, 深度學習]

---

## 介紹 self-attention
### 複雜多變的輸入
1. 輸入是一個向量
2. 輸入是一組向量且各向量長度不相同
    a. 句子 ex: This is a cat.
    b. 語音（在語音處理領域，一個向量稱作 frame）
    c. 圖片（每個節點都是不同的向量）
    
### 複雜多變的輸出
1. 一組輸入向量各有一個輸出向量 ex: 詞性標註 POS tagging 
2. 一組輸入向量只有一個輸出向量 ex: 正負面分析、講者辨識
3. 一組輸入向量由機器決定有幾個輸出向量，又稱為 seq2seq ex: 文字翻譯、語音辨識

一個完整的英文句子是由許多單字組合而成，如果說句子裡出現相同的單字但表達的意思不同，機器如何辨別得出來呢？答案是可以的，藉由判斷前後文，就能夠推敲出該單字的意思，但若是句子非常長，需要考慮多少的前後文才能夠推敲出該單字呢？考慮前後五個字？考慮一整個句子？這兩個都有風險存在，利用 FC（Fully Connected） 考慮前後五個字可能沒辦法完整地理解這個單字的意思，考慮一整個句子可能會有參數量過多的問題，而 self-attention 正能解決這個問題。

從下圖可以看到，輸入向量或者是隱藏層的輸出向量作為輸入向量為 a¹, a², a³, a⁴，經過一連串運算後，同時平行產生輸出向量為 b¹, b², b³, b⁴，接下來的內容也會介紹如何將 a¹, a², a³, a⁴ 變成 b¹, b², b³, b⁴ 的過程。

:::info
以下的內容以「一組輸入向量各有一個輸出向量」為主，讓我們一起解密 self-attention 的世界。
:::

![image](https://hackmd.io/_uploads/SJtwqabS0.png)

### 解密 self-attention（數學警報！需熟悉線性代數！）
輸入向量為 a¹, a², a³, a⁴，分別乘上對應的矩陣產生 q(query)、k(key)、v 三個向量，很重要的是先了解 q 是由 a¹, a², a³, a⁴ 所提供的，再將 q 跟 k 作內積得到 α，上面都有編號，請仔細對照，再經過 softmax 得到 α'，最後將 α' 乘上 v 值，全部作加總即可得到 b。

備註：第二張圖片直接產生 α' 是為了節省版面，但其實也是有經過 softmax 的步驟喔！

:::info
self-attention 的最大好處是 b¹, b², b³, b⁴ 可以同時產生，也就是經過平行運算後一次生成。
:::

![image](https://hackmd.io/_uploads/BycfmTbSR.png)
![image](https://hackmd.io/_uploads/SyL5cTZS0.png =49%x)  ![image](https://hackmd.io/_uploads/S17T56WS0.png =49%x)

![image](https://hackmd.io/_uploads/BJYzoaWBA.png)

## 介紹 Multi-head self-attention
什麼是 multi-head self attention 呢？可以發現最主要差異在於 aⁱ 乘上對應的矩陣後得到 qⁱ, kⁱ, vⁱ，接著再拆分成兩個 qⁱ'¹, qⁱ'² 其餘也是如此，這個稱為 2 head。

而計算方式，qⁱ'¹ 與 kⁱ'¹ 相乘得到 αⁱ'¹，只需要關注到上標後方的數字，相同數字才作加、乘的動作，其餘計算過程與上述相同。

![image](https://hackmd.io/_uploads/rkUwkAZr0.png)

## self-attention 中沒有位置資訊
由於 self-attention 一次看所有的輸入，沒有所謂的前後位置或是先後順序的概念，可以想像成天涯若比鄰，即使在視覺上看到兩個向量之間的距離相當遙遠，但對於 self-attention 來說沒有任何的影響。

但有時位置資訊是相當重要的！例如，一個完整的句子很少將動詞擺在句首(除非是 V-ing)，如此詞與詞之間的位置資訊就顯得不可忽略，一般若要加上位置資訊，會直接將位置向量(e¹)加上詞向量(a¹)，而該位置向量目前較多仍是人工設定，仍有待更多的研究探討。

![image](https://hackmd.io/_uploads/r1E1HcfrA.png =30%x)

## self-attention 之應用
1. 自然語言處理 ex: Transformer、Bert
2. 語音處理 ex: Truncated self-attention
3. 圖像辨識

:::info
a. Self-attention vs. CNN
還記得前面有一篇文章有介紹到 Convolutional Neural Network, CNN，對於 CNN 來說，Self-attention 是更加複雜的架構，因為 CNN 有所謂的 Receptive field 關注在一個區域較小的 pattern 上，而 self-attention 則是一次看了所有的輸入向量，因此在有龐大的訓練資料時，Self-attention 的表現會較 CNN 來的好。

b. Self-attention v.s. RNN
RNN 全名為 Recurrent Neural Network，目前 self-attention 已逐漸取代 RNN，兩者最主要差異在於輸出向量的效率，Self-attention 可藉由平行運算一次產生輸出向量，而 RNN 則需要等待上一個輸出再丟至模型中繼續生成下一個輸出，可見 self-attention 效率要來的更好。
![image](https://hackmd.io/_uploads/HktLF5fr0.png)

:::

## 總結，self-attention
在文章中，從介紹輸入與輸出向量開始，並以「一組輸入向量各有一個輸出向量」為出發點，探討 self-attention 的運作機制，並且也初步了解 multi-head self-attention，最後說明該神經網路架構之應用相當廣泛。

---
:::info 
以上就是這篇文章「自注意力機制（Self-attention）」的所有內容，第一次看的人會花比較多時間消化吸收，這是很正常的事情，若有任何問題，歡迎在下方與我聯繫、討論，接下來也會繼續分享相關文章，敬請期待。