# 第六章: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/)