---
# System prepended metadata

title: 自然語言處理 03：Attention
tags: [NLP]

---

# 自然語言處理 03：Attention
###### tags: `NLP`


## 1. Attention

### 1-1. 改良 Encoder

seq2seq 的問題是不管輸入內容長度為何，也會轉換成相同長度的向量，換句話說，即使輸入 100 個字也只會轉換成固定長度的向量，導致資料會從向量中溢出。所以如果可以徹底運用各個時刻的隱藏層向量，就可保留字詞所有資訊。

![](https://i.imgur.com/eklzlK6.jpg)

### 1-2. 改良 Decoder

傳統 Decoder 只會接收最後隱藏層狀態，為了要徹底運用改良 Encoder 後各個時刻的隱藏層向量，並從中選出必要的資料，因此要想辦法計算代表各單字重要度的權重 a。

![](https://i.imgur.com/e6psrug.jpg)

接著從代表各單字重要度的權重 a 與各個字詞的隱藏層向量 hs，計算出加權總和，獲得目標量量，

![](https://i.imgur.com/aBUayrC.jpg)

a 的算法則是將 LSTM 產生的隱藏層權重 h 拿去和 hs 內積，來計算兩個向量的相似程度，

![](https://i.imgur.com/k2ihjSp.jpg)

![](https://i.imgur.com/QhwLLyU.jpg)

這種做法就是 Attention，得出的結果為輸入的每個詞和輸出的每個詞的依賴關係。


## 2. self attention

在一個時間序列資料中，關注自己序列中的其他元素，從中獲得上下文資訊。徹底解決傳統 RNN 無法平行計算的問題。

將輸入序列 $I$ 裡頭的每個位置的向量 $i$ 透過 3 個線性轉換分別變成 3 個向量：$q$、$k$ 和 $v$，並將每個位置的 $q$ 拿去跟序列中其他位置的 $k$ 做匹配，算出匹配程度後利用 softmax 層取得介於 0 到 1 之間的權重值，並以此權重跟每個位置的 v 作加權平均，最後取得該位置的輸出向量 $o$。全部位置的輸出向量可以同時平行計算，最後輸出序列 $O$。

**多數以 RNN 做過的研究，都可以用自注意力機制來取代；多數用 Seq2Seq 架構實現過的應用，也都可以用 Transformer 來替換**

## 3. Multi head attention

多頭注意力機制（Multi-head Attention）是將輸入序列中的每個位置的 $q$、$k$ 和 $v$ 切割成多個 $q_i$、$k_i$ 和 $v_i$ 再分別各自進行注意力機制。各自處理完以後把所有結果串接並視情況降維。這樣的好處是能讓各個 head 各司其職，學會關注序列中不同位置在不同 representaton spaces 的資訊。