---
# System prepended metadata

title: 第六章：Transformer
tags: [機器學習]

---

# 第六章：Transformer 
>上課筆記

* 上課影片連結
    * ==[**Transformer(上)**](https://youtu.be/n9TlOhRjYoc)==
    * ==[**Transformer(下)**](https://youtu.be/N6aRv06iv2g)==

---

## 簡介

### [Transformer](https://arxiv.org/abs/1706.03762) 簡介
Transformer，又稱變形金剛，是一個 **Sequence-to-sequence (Seq2seq)** 模型。與 **BERT** (Bidirectional Encoder Representations from Transformers) 有非常強烈的關係。

### [Sequence-to-sequence](https://arxiv.org/abs/1409。3215) (Seq2seq) 模型
*   **輸入一個序列，輸出一個序列**。
*   輸出序列的長度由模型**自行決定**。

---

## Seq2seq 模型的應用

### 語音辨識 (Speech Recognition)
*   **輸入**：聲音訊號 (一串向量)。
*   **輸出**：對應的文字序列。
*   輸入聲音訊號長度 (T) 與輸出文字長度 (N) **沒有絕對關係**，由機器自行決定輸出多少文字。
![image](https://hackmd.io/_uploads/SkShVwunke.png)
### 機器翻譯 (Machine Translation)
*   **輸入**：一種語言的句子 (長度 N)。
*   **輸出**：另一種語言的句子 (長度 N')。
*   N 與 N' 之間的關係**由機器自行決定**。
*   範例：輸入「機器學習」，輸出「machine learning」。
![image](https://hackmd.io/_uploads/HJxGhLDu3kl.png)
### 語音翻譯 (Speech Translation)
*   **輸入**：一種語言的語音。
*   **輸出**：另一種語言的文字。
*   對於**沒有文字的語言**尤其重要。
*   **台語語音翻譯** [範例](https://sites.google.com/speech.ntut.edu.tw/fsw/home/challenge-2020):
    *   輸入台語語音，輸出中文字幕。
    *   資料來源：YouTube 鄉土劇 (約 1500 小時)。
    *   **“硬train一發”**：不太考慮資料雜訊 (背景音樂、雜音、字幕未完全對齊)、直接訓練模型。
    *   實驗結果顯示直接訓練是**有可能**成功的。
    *   機器在台語語音辨識上仍可能犯錯 (如倒裝句處理)。
![image](https://hackmd.io/_uploads/B1qfHvuhkx.png)
### **語音合成 (Text-to-Speech, TTS)**
*   輸入文字，輸出聲音訊號。
*   台語語音合成 範例:
    *   資料來源：台灣媠聲2.0。
    *   目前模型通常分為兩階段：中文轉台羅拼音，再由台羅拼音轉聲音。
    *   後階段 (台羅拼音轉聲音) 可使用類似 Transformer 的 Seq2seq 模型 (如 echotron)。
    *   範例：輸入「歡迎來到台大語音處理實驗室」，輸出對應台語語音。
![image](https://hackmd.io/_uploads/ByQrrPuhkx.png)
### 對話機器人 (Chatbot)
*   **輸入**：文字 (使用者語句)。
*   **輸出**：文字 (機器回應)。
*   訓練資料：大量人與人之間的對話 (如電視劇、電影台詞)。
*   範例：輸入 "Hi"，期望輸出 "Hello! How are you today?"。
![image](https://hackmd.io/_uploads/S1eXuDO21l.png)
### 問答系統 (Question Answering, QA)
*   **輸入**：問題與相關文本 (context)。
*   **輸出**：問題的答案。
*   許多自然語言處理 (NLP) 任務可以視為 QA 問題。
    *   **翻譯**：問題 = "這個句子的德文翻譯是什麼？", 輸入 = 英文句子, 輸出 = 德文句子。
    *   **摘要**：問題 = "這段文字的摘要是什麼？", 輸入 = 長篇文章, 輸出 = 摘要。
    *   **情感分析 (Sentiment Analysis)**：問題 = "這個句子是正面還是負面的？", 輸入 = 待分析的句子, 輸出 = 正面/負面。
*   相關論文[[1]](https://arxiv.org/abs/1806.08730)[[2]](https://arxiv.org/abs/1909.03329)
![image](https://hackmd.io/_uploads/Sk_YdwO21l.png)
### 句法剖析 (Syntactic Parsing)
*   **輸入**：一段文字 (序列)。
*   **輸出**：句子的文法剖析樹。
*   剖析樹可以表示為一個**序列**。
    *   範例："deep learning is very powerful" 可表示為 "(S (NP deep learning ) (VP is (ADJV very powerful ) ) )"。
*   可以使用 Seq2seq 模型訓練，輸入句子，輸出對應的剖析樹序列。
*   論文 "[grammar as a Foreign Language](https://arxiv.org/abs/1412.7449)" 將文法剖析視為翻譯問題，使用 Seq2seq 模型並達到當時最佳成果。
![image](https://hackmd.io/_uploads/rJw_pw_hke.png)
### Deep Learning for Human Language Processing 深度學習與人類語言處理
* 一圖以蔽之：
![image](https://hackmd.io/_uploads/HJsM6vun1g.png)
* [2020課程](https://speech.ee.ntu.edu.tw/~hylee/dlhlp/2020-spring.html)

### 多標籤分類 (Multi-label Classification)
*   一個物件可以屬於**多個類別**。
*   與**多類別分類 (Multi-class Classification)** 不同，後者只從數個類別中選擇一個。
*   範例：一篇文章可能同時屬於 Class 1 和 Class 3.
*   可以使用 Seq2seq 模型解決，輸入是資料，輸出是類別序列，由機器決定輸出多少個類別。
*   相關論文[[1]](https://arxiv.org/abs/1707.05495)[[2]](https://arxiv.org/abs/1909.03434)
![image](https://hackmd.io/_uploads/ByI1CDu3yx.png)
### 物件偵測 (Object Detection)
*   **輸入**：圖片。
*   **輸出**：圖片中物件的邊界框與類別。
*   看似與 Seq2seq 模型無關，但可以使用 Seq2seq 模型[硬解](https://arxiv.org/abs/2005.12872)。
![image](https://hackmd.io/_uploads/B1LWyddhkl.png)

---

## Transformer 模型架構
![image](https://hackmd.io/_uploads/rJG6tSK2yg.png)
### Encoder
*   **輸入**：一排向量。
*   **輸出**：另一排向量。
*   可以使用 **RNN**, **CNN**, 或 **Self-attention** 實現。
*   Transformer 的 Encoder 使用**多個 Block**。
*   每個 Block 的結構 (原始 Transformer):
    1.  **Self-attention**：考慮整個序列的資訊，輸出另一排向量。
    2.  **Residual Connection (+)**：將 Self-attention 的輸入直接加到輸出。
    3.  **Layer Normalization ([Layer Norm](https://arxiv.org/abs/1607.06450))**：對同一個樣本中不同維度計算均值與標準差進行歸一化。 公式:
        $$x_i' = \frac{x_i - \mu}{\sigma} + a$$
        *   $\mu$：均值
        *   $\sigma$：標準差
        *   $a$：可學習參數
    4.  **Fully Connected (FC)**：全連接網路，屬於 Feedforward Neural Network (FFN)
    5.  **Residual Connection (+)**：將 FC 的輸入直接加到輸出。
    6.  **Layer Normalization (Layer Norm)**：對 FC 的 residual 輸出再次進行 Layer Norm。
![image](https://hackmd.io/_uploads/ByDFzHt2Jx.png)
*   在輸入端通常會加上 **Positional Encoding** 以提供位置資訊。
*   **Multi-Head Attention**：Self-attention 的進階版本 (參考[第五章](https://hackmd.io/@Jaychao2099/imrobot5#%E5%A4%9A%E9%A0%AD%E6%B3%A8%E6%84%8F%E5%8A%9B%E6%A9%9F%E5%88%B6-Multi-head-Self-attention))。
![image](https://hackmd.io/_uploads/rJxXjNFnJl.png)
*   **BERT** 使用 Transformer 的 Encoder 部分。
*   關於 Encoder 架構的討論:
    *   Layer Normalization 的**位置**可能影響效能 ("[On Layer Normalization in the Transformer Architecture](https://arxiv.org/abs/2002.04745)")。
    *   論文探討 Layer Norm 與 [Batch Norm](https://hackmd.io/@Jaychao2099/imrobot3#%E4%BA%94-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E8%A8%93%E7%B7%B4%E6%8A%80%E5%B7%A7%EF%BC%9A%E6%89%B9%E6%AC%A1%E6%A8%99%E6%BA%96%E5%8C%96-Batch-Normalization-%E7%B0%A1%E4%BB%8B) 在 Transformer 中的差異 ("[PowerNorm：Rethinking Batch Normalization in Transformers](https://arxiv.org/abs/2003.07845)")。

### Decoder
*   **輸入**：Encoder 的輸出 (context) 以及**自身的先前輸出**。
*   **輸出**：輸出序列。
*   Transformer 的 Decoder 也有多個 Block。
*   Decoder Block 的結構 (與 Encoder 類似，但加入 Cross Attention):
    1.  **Masked Self-attention**：與 Self-attention 類似，但為了==模擬序列的生成過程==，在產生某個位置的輸出時，**只能考慮之前位置的資訊**。![image](https://hackmd.io/_uploads/Hk_a1IY3ke.png)
    2.  **Add & Norm**：Residual Connection 後接 Layer Normalization。
    3.  **Cross Attention**：**連接 Encoder 與 Decoder 的橋樑**，Decoder 根據自身的狀態 (query) 從 Encoder 的輸出 (keys & values) 中提取資訊。
    4.  **Add & Norm**：Residual Connection 後接 Layer Normalization。
    5.  **Fully Connected (FC)**：全連接網路，屬於 Feedforward Neural Network (FFN)
    6.  **Add & Norm**：Residual Connection 後接 Layer Normalization。
*   最終輸出會經過 **Softmax** 得到每個詞彙的機率分佈。
*   Decoder 需要決定輸出的序列長度，透過產生一個特殊的 **"停止符號" (END Token)** 來表示結束。
![image](https://hackmd.io/_uploads/Hke5gLKhyg.png)
### Autoregressive (AT) Decoder
*   **逐步生成** 輸出序列。
*   以語音辨識為例:
    1.  輸入 `<START>` 符號。
    2.  Decoder 根據 `<START>` 和 Encoder 的輸出，預測下一個詞彙 (機率分佈)。
    3.  選擇機率最高的詞彙作為輸出 (例如："機")。
    4.  將**剛才輸出的詞彙**作為 Decoder 的**新的輸入**，重複步驟 2-3，直到產生 `<END>` 符號。
*   Decoder 的輸入是**先前時間點自己的輸出**。
*   可能存在 **Error Propagation** 問題，一步錯可能導致後續都錯。
![image](https://hackmd.io/_uploads/rylfJLYhkg.png)
### Non-autoregressive (NAT) Decoder
*   **一次性平行生成** 整個輸出序列。
*   輸入一排 `<START>` Token。
*   Decoder 直接輸出整個詞彙序列。
*   **如何決定輸出長度?**
    *   使用額外的**長度預測器 (Classifier)**，根據 Encoder 的輸出預測目標序列長度。
    *   輸出一個很長的序列，忽略 `<END>` 之後的 Token。
*   **優點**：**平行化**，生成速度快；在某些任務上生成更穩定 (如 TTS)。
*   **缺點**：通常效能比 AT Decoder **差** (可能與 **[Multi-modality](https://en.wikipedia.org/wiki/Multimodality)** 問題有關)。
*   自從有了 Self-Attention 的 Decoder 後，NAT 成為一個熱門研究主題。
*   在[語音合成 (TTS)](###**語音合成-(Text-to-Speech,-TTS)**) 中，NAT Decoder (如 FastSpeech) 常用於控制輸出長度 (語速)。
*   參考[2020課程](https://youtu.be/jvyKmU4OM3c)
![image](https://hackmd.io/_uploads/BJmgjStn1x.png)
### AT vs。 NAT
| 特點         | Autoregressive (AT) | Non-autoregressive (NAT) |
|--------------|-----------------------|--------------------------|
| 生成方式     | 逐步生成             | 平行生成                 |
| 速度         | 較慢                  | 較快 :heavy_check_mark:|
| 效能         | 通常較好 :heavy_check_mark:| 通常較差                 |
| 控制輸出長度 | 較難                  | 較易 (透過長度預測)      |

### Cross Attention
*   允許 Decoder **關注** Encoder 的輸出。
*   運作方式:
    1.  Decoder 的 Masked Self-attention 層輸出一個向量。
    2.  該向量經過線性轉換得到 **Query (q)**。
    3.  Encoder 的輸出 $(a_1, a_2, a_3 \cdots)$ 分別經過線性轉換得到 **Keys $(k_1, k_2, k_3 \cdots)$** 和 **Values $(v_1, v_2, v_3 \cdots)$**。
    4.  計算 "Query" 與 "每個 Key" 的 **Attention 分數** $(\alpha_1, \alpha_2, \alpha_3 \cdots)$ (通常使用 Softmax 進行歸一化為$(\alpha_1', \alpha_2', \alpha_3' \cdots)$)。
    5.  將 Attention 分數與對應的 Value 相乘並加總，得到 **Context Vector $(v')$**。
    6.  Context Vector 會被送到 Decoder 的 Fully-Connected Network 進行後續處理。
![image](https://hackmd.io/_uploads/Syo3zIKnJe.png)
*   **Cross Attention 的運作過程是 Decoder 產生 Query，向 Encoder 提取相關資訊 (Key-Value pairs)**。
*   **範例**："[Listen, Attend and Spell](https://ieeexplore。ieee.org/document/7472621)" 模型 (用於語音辨識，早於 Transformer，使用 LSTM 但概念相似)。
    *   展示 Attention 權重如何隨著時間從輸入的聲音訊號對應到輸出的字母。
    *   Attention 權重通常呈現從左上到右下的趨勢，符合語音辨識的特性。
![image](https://hackmd.io/_uploads/H1ri7Ut2ke.png)
*   Decoder 的每一層**不一定**只關注 Encoder 的最後一層輸出，可以有不同的連接方式 ([研究議題](https://arxiv.org/abs/2005.08081))。
![image](https://hackmd.io/_uploads/B1Nam8Y3kl.png)

---

## Transformer 的訓練

### 訓練資料
需要大量的 **輸入-輸出序列對** (例如：語音訊號 - 對應文本)。

### 損失函數 (Loss Function)
對於每個時間步，Decoder 的輸出 (詞彙機率分佈) 會與**正確答案 (Ground Truth, One-Hot Vector)** 計算 **交叉熵 ([Cross Entropy](https://hackmd.io/@Jaychao2099/imrobot3#%E4%BA%A4%E5%8F%89%E7%86%B5-Cross-entropy))**。
*   **目標**：**最小化所有時間步的交叉熵之和**。
*   訓練過程可以視為在每個時間步進行**多類別分類**。
*   對於輸出序列的結束，也需要學習輸出 `<END>` 符號。

### Teacher Forcing
在**訓練時**，將**正確的答案 (Ground Truth)** 作為 Decoder 在**上一個時間步的輸入**。
*   **目標**：Decoder 在訓練時可以看到正確的歷史資訊，有助於模型快速學習。
*   **問題**：**訓練 (看到正確答案) 和測試 (看到自己的預測) 之間存在不一致 (Mismatch)**。

---

## 訓練 Seq2seq 模型的技巧 (Tips)

### 複製機制 (Copy Mechanism)
允許 Decoder **從輸入序列中複製部分內容** 到輸出。
*   **適用範圍**：需要複述輸入信息的任務。
*   **應用**:
    *   **聊天機器人**：回應中可能包含使用者提到的專有名詞。
    *   **機器翻譯**：翻譯人名、地名等專有名詞。
    *   **摘要**：摘要中可能直接引用原文詞句。[[論文]](https://arxiv.org/abs/1704.04368)
![image](https://hackmd.io/_uploads/ByQZP8K3kx.png)
![image](https://hackmd.io/_uploads/SJC1PLFnyx.png)
![image](https://hackmd.io/_uploads/B1SQD8Y3Jx.png)
*   相關技術：**[Pointer Network](https://youtu.be/VdOyqNQ9aww)**, **[Copy Network](https://arxiv.org/abs/1603.06393)**。

### 導引式注意力 (Guided Attention)
**強迫 Attention 權重呈現特定的模式**，例如在語音合成和辨識中，期望 Attention 從左向右移動，避免漏字或重複。
*   **適用範圍**：於輸入和輸出之間存在**單調對齊 (Monotonic Alignment)** 關係的任務 (如語音、TTS)。
*   **相關概念**：**Monotonic Attention**, **Location-aware attention**。
![image](https://hackmd.io/_uploads/S1-1dUKhJx.png)

### 集束搜尋 (Beam Search)
在每個 Decoding 步驟，**保留多個 (beam size) 最有希望的候選序列**，而非只選擇機率最高的詞彙 (Greedy Decoding)。
*   **優點**：有助於找到**整體機率更高**的輸出序列，即使在某些步驟選擇了較低機率的詞彙。
*   **缺點**:
    *   計算成本較高。
    *   在某些需要創造性的任務 (如文本生成) 中，可能導致輸出重複或不自然 ("The Curious Case Of Neural Text Degeneration")。
*   **適用範圍**：對於答案較明確的任務 (如語音辨識)，通常有幫助。
*   **注意**：對於需要創造力的任務，可能需要加入隨機性。
![image](https://hackmd.io/_uploads/rk9GdUKnyg.png)

### 取樣 (Sampling)
在 Decoding 過程中引入**隨機性**，不總是選擇機率最高的詞彙。
*   **目的**：有助於生成更多樣化和自然的輸出。
*   **適用範圍**：尤其是在**需要創造性**的任務中 (如文本生成、TTS)。
    *   在語音合成 (TTS) 中，測試時加入適當的雜訊反而能產生更自然的聲音。
*   *"Accept that nothing is perfect。 True beauty lies in the cracks of imperfection。"*
*   [[論文]](https://arxiv.org/abs/1904.09751)
![image](https://hackmd.io/_uploads/ryrDu8thyx.png)

### 優化評估指標？ (Optimizing Evaluation Metrics?)
*   訓練時最小化的是 **交叉熵 (Cross Entropy)**，但評估時可能使用 **BLEU Score** 等**句子層級**的指標。(產生完整的句子以後，再跟正確的答案一整句比較)
    *   最小化交叉熵**不一定**能最大化 BLEU Score，因為它們是不同的度量方式。
    *   BLEU Score **不可微分**，無法直接作為損失函數進行梯度下降。
*   **權宜之計**：Validation 時使用 BLEU Score 選擇最佳模型。
*   **[進階方法](https://arxiv.org/abs/1511.06732)**：將 BLEU Score 等不可微分的指標作為**強化學習 (Reinforcement Learning, RL)** 的獎勵 (Reward)，訓練 Decoder (Agent)。

### 排程取樣 (Scheduled Sampling)
旨在彌合**訓練 (Teacher Forcing) 和測試 (Decoder 自行預測) 之間的不一致性 (Exposure Bias)**。
*   **作法**：在訓練過程中，**逐漸用 Decoder 自己的預測替換 Ground Truth 作為下一個時間步的輸入**。
*   **目的**：使模型在訓練時也能看到自己的錯誤，提高對錯誤的[強健性(robustness)](https://en.wikipedia.org/wiki/Robustness_(computer_science))。
*   **注意**：
    *   與 [Schedule Learning Rate](https://hackmd.io/@Jaychao2099/imrobot3#%E5%AD%B8%E7%BF%92%E9%80%9F%E7%8E%87%E6%8E%92%E7%A8%8B-Learning-Rate-Scheduling) 是不同的概念。
    *   Scheduled Sampling 可能會影響 Transformer 的平行化能力，因此 Transformer 可能有其特定的排程策略。
*   **不同方法**：
    *   [Original Scheduled Sampling](https://arxiv.org/abs/1506.03099)
    *   [Scheduled Sampling for Transformer](https://arxiv.org/abs/1906.07651)
    *   [Parallel Scheduled Sampling](https://arxiv.org/abs/1906.04331)

---

## 總結
*   Transformer 是一個強大且廣泛應用的**序列到序列模型**。
*   存在多種訓練技巧可以提升 Transformer 在不同任務上的效能。

---

回[主目錄](https://hackmd.io/@Jaychao2099/aitothemoon/)