# 第六章: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) **沒有絕對關係**,由機器自行決定輸出多少文字。

### 機器翻譯 (Machine Translation)
* **輸入**:一種語言的句子 (長度 N)。
* **輸出**:另一種語言的句子 (長度 N')。
* N 與 N' 之間的關係**由機器自行決定**。
* 範例:輸入「機器學習」,輸出「machine learning」。

### 語音翻譯 (Speech Translation)
* **輸入**:一種語言的語音。
* **輸出**:另一種語言的文字。
* 對於**沒有文字的語言**尤其重要。
* **台語語音翻譯** [範例](https://sites.google.com/speech.ntut.edu.tw/fsw/home/challenge-2020):
* 輸入台語語音,輸出中文字幕。
* 資料來源:YouTube 鄉土劇 (約 1500 小時)。
* **“硬train一發”**:不太考慮資料雜訊 (背景音樂、雜音、字幕未完全對齊)、直接訓練模型。
* 實驗結果顯示直接訓練是**有可能**成功的。
* 機器在台語語音辨識上仍可能犯錯 (如倒裝句處理)。

### **語音合成 (Text-to-Speech, TTS)**
* 輸入文字,輸出聲音訊號。
* 台語語音合成 範例:
* 資料來源:台灣媠聲2.0。
* 目前模型通常分為兩階段:中文轉台羅拼音,再由台羅拼音轉聲音。
* 後階段 (台羅拼音轉聲音) 可使用類似 Transformer 的 Seq2seq 模型 (如 echotron)。
* 範例:輸入「歡迎來到台大語音處理實驗室」,輸出對應台語語音。

### 對話機器人 (Chatbot)
* **輸入**:文字 (使用者語句)。
* **輸出**:文字 (機器回應)。
* 訓練資料:大量人與人之間的對話 (如電視劇、電影台詞)。
* 範例:輸入 "Hi",期望輸出 "Hello! How are you today?"。

### 問答系統 (Question Answering, QA)
* **輸入**:問題與相關文本 (context)。
* **輸出**:問題的答案。
* 許多自然語言處理 (NLP) 任務可以視為 QA 問題。
* **翻譯**:問題 = "這個句子的德文翻譯是什麼?", 輸入 = 英文句子, 輸出 = 德文句子。
* **摘要**:問題 = "這段文字的摘要是什麼?", 輸入 = 長篇文章, 輸出 = 摘要。
* **情感分析 (Sentiment Analysis)**:問題 = "這個句子是正面還是負面的?", 輸入 = 待分析的句子, 輸出 = 正面/負面。
* 相關論文[[1]](https://arxiv.org/abs/1806.08730)[[2]](https://arxiv.org/abs/1909.03329)

### 句法剖析 (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 模型並達到當時最佳成果。

### Deep Learning for Human Language Processing 深度學習與人類語言處理
* 一圖以蔽之:

* [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)

### 物件偵測 (Object Detection)
* **輸入**:圖片。
* **輸出**:圖片中物件的邊界框與類別。
* 看似與 Seq2seq 模型無關,但可以使用 Seq2seq 模型[硬解](https://arxiv.org/abs/2005.12872)。

---
## Transformer 模型架構

### 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。

* 在輸入端通常會加上 **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))。

* **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 類似,但為了==模擬序列的生成過程==,在產生某個位置的輸出時,**只能考慮之前位置的資訊**。
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)** 來表示結束。

### Autoregressive (AT) Decoder
* **逐步生成** 輸出序列。
* 以語音辨識為例:
1. 輸入 `<START>` 符號。
2. Decoder 根據 `<START>` 和 Encoder 的輸出,預測下一個詞彙 (機率分佈)。
3. 選擇機率最高的詞彙作為輸出 (例如:"機")。
4. 將**剛才輸出的詞彙**作為 Decoder 的**新的輸入**,重複步驟 2-3,直到產生 `<END>` 符號。
* Decoder 的輸入是**先前時間點自己的輸出**。
* 可能存在 **Error Propagation** 問題,一步錯可能導致後續都錯。

### 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)

### 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 進行後續處理。

* **Cross Attention 的運作過程是 Decoder 產生 Query,向 Encoder 提取相關資訊 (Key-Value pairs)**。
* **範例**:"[Listen, Attend and Spell](https://ieeexplore。ieee.org/document/7472621)" 模型 (用於語音辨識,早於 Transformer,使用 LSTM 但概念相似)。
* 展示 Attention 權重如何隨著時間從輸入的聲音訊號對應到輸出的字母。
* Attention 權重通常呈現從左上到右下的趨勢,符合語音辨識的特性。

* Decoder 的每一層**不一定**只關注 Encoder 的最後一層輸出,可以有不同的連接方式 ([研究議題](https://arxiv.org/abs/2005.08081))。

---
## 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)



* 相關技術:**[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**。

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

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

### 優化評估指標? (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/)