---
# System prepended metadata

title: Transformer
tags: [架構設計, 李宏毅, 深度學習]

---

## 介紹 sequence-to-sequence（Seq2Seq）
輸入是多個向量序列，輸出也是多個向量序列，輸出的向量數量由機器決定，例如語音辨識、機器翻譯、語音翻譯、語音合成、聊天機器人、QA、文法剖析、Multi-lable classification(分類)、物件偵測等，Seq2Seq 能夠應用的範圍相當廣泛。

在 Seq2Seq2 的模型中，使用到的方式就是 Encoder 以及 Decoder，將 input sequence 丟進 Encoder 中，再將資訊傳給 Decoder 並由機器決定 output sequence，而本文章主角 Transformer 的技術中同樣有用到 Encoder 以及 Decoder，並且會探討兩者間是如何傳遞資訊的。

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

## 解析 Encoder
在 Encoder 中，輸入為一組(n 維)向量而輸出也是一組(n 維)向量，那該如何計算這組(n 維)輸出向量呢？在 Transformer 中的 Encoder，先輸入一排向量至 self-attention，得到粉紅色向量後再加上原本的藍色向量，此步驟稱為 Residual，接著丟入 Layer Norm，對同一個 feature 但不同 dimension 進行標準化，得到綠色向量（右半邊接續），經過 FC（Fully Connected）得到棕色向量再加上原本的綠色向量，沒錯再做一次 Residual，得到桃色向量，再經過 Layer Norm 得到紫色向量，即完成 Transformer 之 Encoder 負責的工作。

:::info
比較 Batch normalization 與 Layer normalization
1. Batch normalization
不同的 Training sample 但同一個 dimension 進行數值標準化。
2. Layer normalization
同一個 Training sample 但不同的 dimension 進行數值標準化。

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

:::

Positional Encoding 加上位置資訊，Add & Norm 即為 Residual + Layer Norm，Feed Forward 即為 FC（Fully Connected)，而 Multi-head attention 的介紹在「[自注意力機制（Self-attention）](https://hackmd.io/@lcaMuWOwR1Ox5o5yeTEupA/HyxuCj-rC)」的文章中，最後 Encoder 中的這些順序是可以做調換的，不一定按照上述的流程作計算。

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

## 解析 Decoder
### Autoregressive（AT）
將 Encoder 的資訊傳遞至 Decoder 中，若要開始產生輸出，需要先輸入一個 START 向量可以將其視為一個 Special token，代表正式開始，接著丟入 Decoder 得到一個機率分布，而該分布的長度為所有方塊字的數量，例如常用的方塊字有 3000 個，它的長度就有 3000 個方塊字，並且找出對應到最大數值的方塊字，即輸出該方塊字，以此類推，在最後輸出「息」並將「息」當作輸入丟進 Decoder 時，預期它會產生 End 一樣可視為一個 Special token，即結束 Decoder 輸出的動作。

可以發現在 Transformer 中 Decoder 與 Encoder 架構有一個不同之處在於 Masked Multi-Head Attention，由於 AT 的方法是前一個輸出結束後再產生下一個輸出，並且在輸出 b¹ 只會看 a¹ 的輸入，在輸出 b² 只會看 a¹、a² 的輸入，不會看到後面的 Input vector sequence，因此稱為 Masked Multi-Head Attention，此與一般的 self-attention 機制有所不同。

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

### Nonautoregressive（NAT）
與 AT 最大的不同在於，Input vector sequence 全部都是 BEGIN（或是 START）的 Special token，也能夠想像成丟入這些代表開始的 token 後，輸出將可以一次產生，而不用等上一個輸出結束後才能輸出下一個，具有平行運算的能力。

那如何控制輸出的長度呢？Seq2Seq 就是給機器自行決定輸出長度，在 NAT 中，能使用一個預測輸出長度的 classifier 來決定，另外，若看到 End 的 token，後面所有的輸出皆可忽略。

![image](https://hackmd.io/_uploads/SJn-rAwrA.png)

:::info
AT v.s. NAT
NAT 的優勢在於具有平行運算的能力，也就是說完成輸出所需時間較短，甚至能夠預測輸出長度，這是在 LSTM、GRU 等 RNN 模型架構後近期備受矚目的技術，但 AT 的表現仍比 NAT 來的好，NAT 需要花大量的資源調整才能接近 AT 的模型表現。
:::

## Encoder 資訊該如何傳進 Decoder 中呢？
### Cross-attention

可以看到 Encoder 最後的輸出結果會再傳至 Decoder 中，用兩個藍色圈圈標記的地方，以及一個綠色圈圈是來自 Decoder 的 Masked Multi-Head attention 輸出，乘上對應的矩陣生成 q 向量，而 Encoder 的輸出 a¹、a²、a³、a⁴ 乘上對應的矩陣生成 k, v，q 與 k 作相乘得到 α，再丟入 softmax 中得到 α'，乘上對應之 v 向量再相加，最後丟入 FC 中就完成 Cross-attention 了，相信如果你熟悉 Self-attention 的機制，這邊的過程就是大同小異了。

當然，上述的流程可以經過不同的設計，例如不一定是要 Encoder 最後的輸出結果，依照任務的需求，可挑選最適合自己的架構。

![image](https://hackmd.io/_uploads/H16ayf_B0.png =45%x)![image](https://hackmd.io/_uploads/HJigeMOSA.png =50%x)

## 如何訓練 Seq2Seq？
以上內容屬於驗證（validation）或是測試（testing）階段，接下來說明如何訓練 Seq2Seq 的模型。

在訓練階段，有一組 Training set 代表擁有 x（feature） 以及 y（label），將 Encoder 輸出的 vector sequence 丟入 Decoder 中，此過程就是 cross attention 在做的事情，接著輸入 BIGIN 的 special token 再經過 softmax 得到一個分布，分布長度是常見的方塊字數量例如 3000 個，並輸出最大數值對應的方塊字例如「機」，透過 Loss function 這裡使用 Cross entropy 來計算 loss 數值大小，預期 loss 能愈小愈好，再經過最佳化（optimization）更新參數，希望得到一個好的 Seq2Seq model。

在訓練過程中使用的誤差函式，與驗證或測試過程中使用的誤差函式不同，前者是 Cross entropy 數值愈小愈好，而後者是 BLEU score 數值愈大愈好，為什麼不使用其中一個就好？因為 BLEU score 無法微分，對更新參數沒有幫助。

這裡特別一提，在訓練時機器都是吃正確答案，也就是下面用紅色框框標記的位置，使用正確答案（Ground truth）作為輸入，稱為 Teacher Forcing，可以想像成是老師在強迫灌輸新知識一樣。

![image](https://hackmd.io/_uploads/SkOTSVtBA.png)
:::info
BLEU Score 是一種自動評估指標，用來比較「機器產生的句子（candidate）」與「人類撰寫的正確參考句子（reference）」之間的相似程度。

最早由 Papineni 等人在 2002 年提出，是機器翻譯領域最早被廣泛採用的自動化評估標準之一。
:::
:::info
不知道你會不會有一個疑問，在訓練時模型吃入的資料都是正確答案，但是在驗證或測試時機器不可能總是輸出正確答案，如果輸出錯誤的答案，再當成輸入丟進模型中，會不會造成後面的答案都走鐘呢？答案是會的，此種狀況稱為 Mismatch。

那可以如何避免 Mismatch 呢？很直觀的方式，就是在訓練資料中也加入一些錯誤的資料，讓機器自己去學習，避免它在驗證或測試時出現 Mismatch。
:::

### 訓練 Seq2Seq 的小技巧
#### 1. Copy mechanism
只需要從特定的句子或者是文章中複製相同的字，不需要讓機器創造新的詞彙，例如人名、專有名詞、文章摘要等。

a. 機器翻譯
![image](https://hackmd.io/_uploads/r12K94tS0.png)
b. 聊天機器人
![image](https://hackmd.io/_uploads/HJFOqNYSC.png)

c. 寫摘要
![image](https://hackmd.io/_uploads/H1qmqEtrR.png)
#### 2. Guided attention 
機器偶爾會犯下低級的錯誤，這時可以給它一點引導，例如語音合成（Text-To-Speech，TTS），在念句子時要由最左邊的文字開始一直到最右邊，如果跳來跳去反而會聽不懂機器在說什麼話。

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

#### 3. Beam search
假設 Decoder 的輸出只有 A 跟 B 兩種，可以看到紅色路徑在一開始的數值是較高的，但最後數值是較差的，而綠色路徑雖然一開始較差，但最後的結果是好的，那怎麼知道要走哪一條，方塊字總共有上千個，也不可能全部都走過一遍，這時就可以使用 Beam search。

特別注意的是，Beam search 適合用在有正確的輸出答案上，例如語音辨識，如果是需要一點創造力的任務，例如 Sentence completion、語音合成等，則可加入一點隨機性(randomness)使模型效果更佳。

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

## 總結，Transformer
在文章中，一開始介紹了 Transformer 的 Encoder 以及 Decoder 分別負責的工作，並拆解各個專有名詞與計算過程，也說明了如何訓練 Seq2Seq 的模型，最後是一些值得留意的 Seq2Seq 訓練小技巧。

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