1. Encoder 和 Decoder 概述
在序列到序列(sequence-to-sequence,簡稱 seq2seq)的模型中,整個系統通常分為兩大部分:Encoder(編碼器)和 Decoder(解碼器)。
- Encoder(編碼器):
輸入一段序列(例如一句話),經過編碼器(一般使用 RNN、LSTM、GRU 或者 Transformer Encoder)后,將整個序列的信息壓縮成一個(或多個)固定維度的向量表示,這個向量通常被認為是整個輸入序列的語義表示。 - Decoder(解碼器):
解碼器接收 Encoder 輸出的向量信息(可以是單個向量,也可以是多個隱藏狀態組成的序列),再利用另一個 RNN(或其他結構)生成目標序列。例如,對于機器翻譯任務,Decoder 會利用編碼得到的源語言表示生成目標語言句子。
這種 Encoder-Decoder 結構最初由 Sutskever 等人(2014)的 seq2seq 模型成功應用于機器翻譯任務,開創了自然語言生成新紀元。
2. Encoder 部分詳細說明
2.1 Encoder 的基本角色
Encoder 的任務是將輸入序列(如一整句話、一個段落或整個文檔)轉換成一個緊湊的向量表示。這一步驟通常有以下特點:
- 信息匯聚:
Encoder 通常會逐步處理輸入序列(例如使用 RNN 從左到右遍歷),在每一步都更新隱藏狀態,最終在序列結束時獲得一個包含全局信息的向量(或一組向量)。 - 使用最后的隱藏狀態或全序列:
有時,簡單的做法是取 RNN 在最后一個時刻的隱藏狀態作為整個序列的表示(此時稱為“accepter”,即僅用最后一個狀態來生成預測)。但更復雜的 Encoder 會輸出整個隱藏狀態序列,并將其提供給 Decoder,在解碼過程中每一步都可利用(見第 5 部分)。
2.2 雙向 Encoder 和多層結構
- 雙向 RNN:
為了更全面地捕捉輸入句子的上下文信息,Encoder 常常使用雙向 RNN(BiRNN),即同時利用從左到右的(正向)和從右到左的(反向)信息,最后將兩邊隱藏狀態拼接或加權融合,得到更為豐富的文本表示。 - 多層模型:
為了提高表示能力,還會采用多層(堆疊)RNN,每一層可以捕捉不同層次(如語法、語義)的信息。實際系統中可能會有 2 層、甚至更多層的 Encoder。
例如,機器翻譯中常見的設置包括 2 個 Encoder 層(甚至可以把雙向 RNN 作為第一層,后面再堆疊一層單向或雙向 RNN),以確保充分捕捉輸入句子的細節信息。
3. Decoder 部分詳細說明
3.1 Decoder 的基本角色與架構
Decoder 的任務是生成一個序列(例如翻譯句子、摘要、對話回復或代碼),其工作流程如下:
- 接收 Encoder 的輸出:
Decoder 通常接收 Encoder 輸出的向量表示(可能是單個向量,也可能是整個隱藏狀態序列),然后將其作為生成目標序列的初始信息或在每一步的條件輸入。 - RNN 解碼器:
最常見的 Decoder 是基于 RNN(或其變種,如 LSTM、GRU),每一步輸出一個 token,并更新自身狀態,然后繼續生成下一個 token。
3.2 解碼時如何決定停止
生成序列時需要一個停止條件來決定何時結束輸出。常用的策略有兩種:
- 固定長度輸出:
預先設定生成的 token 數量,例如固定生成 10 個詞。這種方法簡單但缺乏靈活性。 - 特殊停止符( <EOS> 或 “stop”)輸出:
在訓練時設置一個特殊的停止標記,當 Decoder 生成這個標記時,認為序列結束。這種方法更靈活,適應于長度可變的任務,如機器翻譯和對話生成。
實際模型往往采用后者,即在輸出詞匯表中包含一個停止符,解碼過程持續直到生成停止符。
3.3 Teacher Forcing (教師強制)
- 定義:
教師強制是一種訓練技巧,在訓練 Decoder 時,將真實的目標 token 作為下一步的輸入(而不是使用 Decoder 自己生成的 token),以加速訓練收斂并穩定訓練過程。 - 作用:
通過教師強制,Decoder 在初期訓練階段可以直接獲得正確的上下文信息,提高生成序列的質量;同時,訓練過程中可以逐漸減少教師強制的比例,逼迫模型在推斷時依賴自身生成的序列。
3.4 Beam Search 與評分調整
在測試時,為了生成高質量的輸出序列,常用的方法是 Beam Search:
- Beam Search:
在每一步解碼時,保留概率最高的 N 個候選序列而非僅選取最優的一個。這樣可以在后續生成過程中通過搜索多個候選序列來避免局部最優。 - 長度歸一化:
由于較長的序列總的概率(對數和)較小,實際評分時通常會調整為每個詞的平均概率(例如 1 ∣ w o r d s ∣ ∑ log ? P ( w o r d ∣ c o n t e x t ) ∣ w o r d s ∣ \frac{1}{|words|}\sum \log P(word|context)∣words∣ ∣words∣1?∑logP(word∣context)∣words∣這樣能避免偏好生成太短的序列,從而獲得更符合人類語言習慣的輸出。
4. 典型應用場景
Encoder-Decoder 架構被廣泛應用于各類 NLP 任務,以下是幾個典型案例:
4.1 機器翻譯
- 過程:
Encoder 將源語言句子轉換成向量表示,Decoder 利用該表示生成目標語言句子。 - 成功案例:
Google 的 Neural Machine Translation(NMT)系統就是基于 Encoder-Decoder 架構實現的。
4.2 文本摘要
- 過程:
輸入為長文檔,通過 Encoder 編碼,Decoder 生成該文檔的簡短摘要,保留關鍵信息。
4.3 對話生成(如 GPT)
- 過程:
模型接收對話歷史(作為上下文輸入),Decoder 生成下一句回復。這里往往采用較深的 Decoder 和大規模預訓練方法。
4.4 代碼生成
- 過程:
將自然語言的需求描述(request)經過 Encoder 得到語義表示,Decoder 根據該表示生成對應的代碼。
5. 模型設計中的補充細節
5.1 Encoder 與 Decoder 的信息傳遞
最初的 Encoder-Decoder 模型存在“瓶頸”問題,即所有信息必須通過 Encoder 輸出的那個固定向量傳遞,這往往導致信息不足。為了解決這一問題,后續改進方法包括:
- 注意力機制(Attention):
在每一步解碼時,Decoder 不僅使用最后的編碼向量,而是通過注意力機制對 Encoder 的所有輸出進行加權求和,動態獲取對當前生成最有幫助的信息。這樣大大緩解了信息瓶頸問題,也使得模型能夠更好地處理長序列。
5.2 多層和混合結構
- 多層 Encoder-Decoder:
可以使用多層(例如2層 Encoder 與 1層 Decoder、甚至 Encoder 與 Decoder 都為多層)提高模型表達能力,每一層可以處理不同層次的語言信息。 - 雙向 Encoder:
尤其在 Encoder 部分,使用雙向 RNN 可以更全面捕捉上下文;而 Decoder 部分通常采用單向生成,但可在輸入(通過注意力)中引入 Encoder 輸出的雙向信息。
5.3 訓練與推理的差異
- 訓練階段:
采用教師強制,使用真實的 token 作為 Decoder 的輸入,可以快速收斂。 - 推斷階段:
則完全依賴模型自身生成的 token,由于前后依賴性強,每一步必須依據前一步的輸出,導致難以并行計算。為此使用 Beam Search 等解碼策略,但推斷效率相對較低,是目前 Encoder-Decoder 模型在實際應用中常見的計算瓶頸問題。
6. 模型存在的問題與改進挑戰
6.1 瓶頸問題
如前所述,Encoder-Decoder 模型要求 Encoder 將所有輸入信息壓縮到一個固定大小的向量中,這往往造成信息丟失。注意力機制、記憶網絡以及使用層次化編碼器都被提出用以緩解這一問題。
6.2 推理過程難以并行化
由于 Decoder 每一步生成都依賴前一步的輸出(自回歸),解碼過程是串行的,因此難以利用現代硬件(如 GPU)的并行能力進行快速推理。Transformer 模型的設計在一定程度上可以并行化編碼部分,但解碼依舊存在自回歸問題。
6.3 訓練難度和解碼策略
教師強制雖然加速了訓練,但可能導致訓練期間與推斷期間的分布不匹配;同時,為了生成較優解碼序列需要精心設計 Beam Search 的參數(如 beam width、長度歸一化策略),這也增加了系統的復雜性與調優成本。
7. 實際案例演示(以機器翻譯為例)
以機器翻譯為例,我們可以看到 Encoder-Decoder 模型如何工作:
- Encoder 部分:
– 輸入:英文句子 “I love natural language processing.”
– 使用雙向 LSTM 將整句話編碼成一組隱藏狀態(或經過注意力整合為一個上下文向量)。 - Decoder 部分:
– 接收 Encoder 輸出,開始生成目標語言句子(例如中文翻譯)。 – 采用教師強制在訓練中,指導模型在每一步預測正確的中文詞匯。 – 在推斷時,使用 Beam Search 選擇多個候選詞,直到生成特殊的結束符 “”。 - 訓練與推斷:
– 訓練中計算損失函數時通常采用交叉熵損失,對每個生成詞的概率取對數后求和再求平均。
– 在 Beam Search 時,對候選序列的總分調整為平均每個詞的對數概率,以防短序列得分偏高。
這種完整的流程是機器翻譯的早期成功案例,也為后來的對話生成、文本摘要等任務提供了模型框架。