編碼器-解碼器(Encoder-Decoder)
3 秒看懂
編碼器-解碼器是一種將輸入序列”壓縮”為中間表示,再”展開”生成輸出序列的兩階段神經網路架構範式。編碼器負責理解輸入,解碼器負責生成輸出,兩者通過一個語義向量(context vector)或注意力機制連線。這是機器翻譯、文本摘要、語音識別等”序列到序列”任務的基石架構。
輸入序列 → [編碼器] → 中間表示 → [解碼器] → 輸出序列
"我愛你" 壓縮理解 語義向量 展開生成 "I love you"
3 分鐘產業解釋
為什麼它重要?
編碼器-解碼器是現代生成式AI的底層架構範式之一。理解它,才能理解:
- T5、BART、mT5 等主流開源大型模型為何如此設計
- Whisper(OpenAI語音模型)、MarianMT(翻譯)為何採用此結構
- Transformer為何能同時支援”編碼器-解碼器”、“僅編碼器”(BERT)、“僅解碼器”(GPT)三種變體
產業位置
| 角色 | 代表模型/產品 | 架構選擇 |
|---|---|---|
| 機器翻譯 | Google Translate、DeepL、MarianMT | 編碼器-解碼器 |
| 文本摘要 | BART、PEGASUS | 編碼器-解碼器 |
| 語音識別 | Whisper(OpenAI)、Wav2Vec2+CTC | Whisper:編碼器-解碼器;Wav2Vec2+CTC:編碼器+CTC頭部(解碼器可選) |
| 多模態生成 | Flamingo | 編碼器-解碼器變體 |
| 通用大型模型 | GPT系列、Claude、Llama | 僅解碼器(主流趨勢) |
| 理解型任務 | BERT、RoBERTa | 僅編碼器(主流趨勢) |
核心洞察
當前大型模型產業的主流是僅解碼器(Decoder-Only)架構(GPT、Llama、Claude等),但這並不意味著編碼器-解碼器過時。在輸入輸出結構不對稱的場景(如翻譯、摘要、語音),編碼器-解碼器仍是主流選擇。T5論文(Google,2019年)證明了”萬物皆可Seq2Seq”的範式力量。
15 分鐘專家深入
1. 架構本質:非對稱的”理解-生成”範式
編碼器-解碼器的核心思想是將”理解”和”生成”解耦為兩個獨立模組,通過一箇中間表示橋接:
┌─────────────────────────────────────────────────────────┐
│ 編碼器-解碼器架構 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 輸入序列 │ ──→ │ 編碼器 │ ──→ │ 中間表示 │ │
│ │ x₁,x₂,...│ │ Encoder │ │ c │ │
│ └──────────┘ └──────────┘ └────┬─────┘ │
│ │ │
│ ↓ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 輸出序列 │ ←── │ 解碼器 │ ←── │ c │ │
│ │ y₁,y₂,...│ │ Decoder │ │ 中間表示 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
為什麼需要非對稱設計?
- 翻譯任務:源語言和目標語言長度通常不同
- 摘要任務:輸入長文件,輸出短摘要
- 語音識別:輸入連續音訊幀,輸出離散文本
- 對稱架構(如BERT)無法自然處理這種長度變化
2. 三種經典實現範式
範式A:RNN-based Seq2Seq(2014-2017主導)
編碼器: 多層LSTM/GRU,逐步處理輸入,最終隱藏狀態 h_T 作為上下文
解碼器: 多層LSTM/GRU,以 h_T 為初始狀態,自迴歸生成輸出
h₀ → [RNN] → h₁ → [RNN] → h₂ → ... → h_T(編碼器輸出)
↓
c = h_T(上下文向量)
↓
s₀=c → [RNN] → s₁ → [RNN] → s₂ → ... → s_T(解碼器生成)
瓶頸:資訊壓縮到單一向量 h_T,長序列資訊丟失嚴重
範式B:注意力機制增強(2014-2017)
Bahdanau等人(2014年)和Luong等人(2015年)引入注意力,允許解碼器動態回看編碼器所有隱藏狀態:
解碼器時刻 t 生成時:
1. 計算當前解碼狀態 s_t 與編碼器每個狀態 h_i 的相關性(注意力權重 α)
2. 加權求和得到上下文向量 c_t = Σ α_i * h_i
3. 用 c_t + s_t 預測下一個詞
注意力權重計算:
e_i = score(s_t, h_i) # 對齊分數
α_i = softmax(e_i) # 歸一化權重
c_t = Σ α_i * h_i # 上下文向量
核心改進:每個解碼步驟都有獨立的上下文檢視,不再被單一向量瓶頸限制
範式C:Transformer Encoder-Decoder(2017-至今)
Vaswani等人(2017年)提出的Transformer完全拋棄RNN,用自注意力+交叉注意力重構編碼器-解碼器:
┌─────────────────────────────────────────────────────────┐
│ Transformer 編碼器-解碼器結構 │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 編碼器堆疊(N層) │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 自注意力(Self-Attention) │ │ │
│ │ │ → 每個token看輸入序列所有其他token │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 前饋網路(FFN) │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ + 殘差連線 + 層歸一化 │ │
│ └─────────────────────────────────────────────┘ │
│ ↓ │
│ 編碼器輸出 K,V │
│ ↓ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 解碼器堆疊(N層) │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 掩碼自注意力(Masked Self-Attention) │ │ │
│ │ │ → 每個token只能看已生成的token(因果)│ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 交叉注意力(Cross-Attention) │ │ │
│ │ │ → Q來自解碼器,K,V來自編碼器輸出 │ │ │
│ │ │ → 解碼器"查詢"編碼器理解的輸入資訊 │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ 前饋網路(FFN) │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ + 殘差連線 + 層歸一化 │ │
│ └─────────────────────────────────────────────┘ │
│ ↓ │
│ 輸出logits → softmax → 生成詞 │
└─────────────────────────────────────────────────────────┘
關鍵創新點:
- 交叉注意力(Cross-Attention) 是編碼器-解碼器的核心連線機制
- 編碼器可並行處理所有輸入token(相比RNN的順序處理)
- 解碼器雖然仍需自迴歸生成,但注意力機制使長程依賴建模能力顯著增強
3. 與”僅解碼器”架構的核心區別
| 維度 | 編碼器-解碼器 | 僅解碼器(GPT/Llama) |
|---|---|---|
| 輸入處理 | 獨立編碼器雙向理解輸入 | 輸入和輸出拼接,單向處理 |
| 注意力型別 | 自注意力 + 交叉注意力 | 僅因果自注意力 |
| 引數效率 | 輸入輸出引數可獨立最佳化 | 輸入處理與生成共享引數 |
| 預訓練任務 | 去噪(T5)、span遮蔽 | 下一token預測(NTP) |
| 典型任務 | 翻譯、摘要、結構化生成 | 開放式對話、程式碼生成 |
| 推論效率 | 編碼器一次前向,解碼器自迴歸 | 全程自迴歸(但可用KV快取) |
技術原理(最深)
核心機制詳解
1. 編碼器的雙向注意力
編碼器中每個token可以同時看到輸入序列的所有位置(雙向注意力),這使得模型能理解完整上下文:
輸入: "The cat sat on the mat"
編碼器注意力矩陣(簡化示意):
The cat sat on the mat
The [ ✓ ✓ ✓ ✓ ✓ ✓ ]
cat [ ✓ ✓ ✓ ✓ ✓ ✓ ]
sat [ ✓ ✓ ✓ ✓ ✓ ✓ ]
on [ ✓ ✓ ✓ ✓ ✓ ✓ ]
the [ ✓ ✓ ✓ ✓ ✓ ✓ ]
mat [ ✓ ✓ ✓ ✓ ✓ ✓ ]
每個token都能聚合所有其他token的資訊 → 完整語義理解
2. 解碼器的因果掩碼
解碼器使用因果掩碼(causal mask) 確保生成時只能看到已生成的token:
生成序列: ["I", "love", "you"]
解碼器自注意力掩碼(1=可見,0=遮蔽):
I love you
I [ 1 0 0 ]
love [ 1 1 0 ]
you [ 1 1 1 ]
第1步只看"I",第2步看"I,love",第3步看"I,love,you"
→ 保證自迴歸生成的因果性
3. 交叉注意力:核心連線機制
這是編碼器-解碼器區別於其他架構的最關鍵元件:
交叉注意力計算:
Q = 解碼器當前層輸出 × W_Q # 查詢來自解碼器
K = 編碼器最終輸出 × W_K # 鍵來自編碼器
V = 編碼器最終輸出 × W_V # 值來自編碼器
注意力權重 = softmax(Q × K^T / √d_k)
輸出 = 注意力權重 × V
物理含義:
解碼器在生成每個詞時,"查詢"編碼器理解的輸入資訊
→ 生成"I"時,可能重點關注"Ich"
→ 生成"love"時,可能重點關注"liebe"
→ 生成"you"時,可能重點關注"dich"
4. Transformer編碼器-解碼器的完整前向計算
┌─────────────────────────────────────────────────────────────┐
│ Transformer Encoder-Decoder 前向傳播 │
│ │
│ 輸入: src_tokens = ["Ich", "liebe", "dich"] │
│ tgt_tokens = ["", "I", "love"](訓練時用teacher forcing)│
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 步驟1: 輸入嵌入 │ │
│ │ src_emb = Embedding(src_tokens) + PositionalEncoding│ │
│ │ tgt_emb = Embedding(tgt_tokens) + PositionalEncoding│ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 步驟2: 編碼器處理(N層) │ │
│ │ for i in 1..N: │ │
│ │ src_emb = MultiHeadSelfAttention(src_emb) │ │
│ │ src_emb = LayerNorm(src_emb + residual) │ │
│ │ src_emb = FFN(src_emb) │ │
│ │ src_emb = LayerNorm(src_emb + residual) │ │
│ │ encoder_output = src_emb │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 步驟3: 解碼器處理(N層) │ │
│ │ for i in 1..N: │ │
│ │ # 3a. 掩碼自注意力(只看已生成token) │ │
│ │ tgt_emb = MaskedMultiHeadSelfAttn(tgt_emb) │ │
│ │ tgt_emb = LayerNorm(tgt_emb + residual) │ │
│ │ │ │
│ │ # 3b. 交叉注意力(查詢編碼器輸出)← 核心! │ │
│ │ Q = tgt_emb × W_Q │ │
│ │ K = encoder_output × W_K │ │
│ │ V = encoder_output × W_V │ │
│ │ cross_out = MultiHeadAttention(Q, K, V) │ │
│ │ tgt_emb = LayerNorm(tgt_emb + cross_out) │ │
│ │ │ │
│ │ # 3c. 前饋網路 │ │
│ │ tgt_emb = FFN(tgt_emb) │ │
│ │ tgt_emb = LayerNorm(tgt_emb + residual) │ │
│ │ decoder_output = tgt_emb │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 步驟4: 輸出投影 │ │
│ │ logits = decoder_output × W_vocab + b │ │
│ │ next_token = argmax(softmax(logits)) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 輸出: "you"(然後拼接到tgt_tokens,重複直到生成) │
└─────────────────────────────────────────────────────────────┘
關鍵引數量分析(以T5-Base為例估算)
T5-Base 配置估算:
- 編碼器層數: 12層
- 解碼器層數: 12層
- 隱藏維度: 768
- 注意力頭數: 12
- FFN中間維度: 3072 (4×隱藏維度)
引數量分佈估算:
- 詞嵌入: V × d = 32128 × 768 ≈ 25M
- 每層編碼器:
自注意力 Q/K/V/O: 4 × 768 × 768 ≈ 2.4M
FFN: 2 × 768 × 3072 ≈ 4.7M
層歸一化等: ≈ 0.003M
小計: ≈ 7.1M/層
- 每層解碼器:
掩碼自注意力: ≈ 2.4M
交叉注意力: ≈ 2.4M ← 額外引數
FFN: ≈ 4.7M
層歸一化等: ≈ 0.003M
小計: ≈ 9.5M/層(比編碼器多~2.4M)
- 編碼器總計: 12 × 7.1M + 25M ≈ 110M
- 解碼器總計: 12 × 9.5M + 25M ≈ 139M
- 總引數量: ≈ 249M(官方標稱220M,含共享嵌入等因素)
注: 解碼器每層比編碼器多一個交叉注意力模組
推論時的KV快取最佳化
┌─────────────────────────────────────────────────────────────┐
│ KV快取最佳化示意 │
│ │
│ 問題: 解碼器每生成一個token,都要重新計算所有token的K,V │
│ → 計算量隨生成長度平方增長 │
│ │
│ 解決: KV快取(Key-Value Cache) │
│ │
│ 第1步生成 "I": │
│ 計算 , "I" 的 K,V,存入快取 │
│ │
│ 第2步生成 "love": │
│ 只計算 "love" 的 Q(新token) │
│ 從快取讀取 , "I" 的 K,V(不重新計算) │
│ 注意力計算: Q_love × [K_, K_I]^T │
│ 更新快取: 新增 K_love, V_love │
│ │
│ 第3步生成 "you": │
│ 只計算 "you" 的 Q │
│ 從快取讀取 , "I", "love" 的 K,V │
│ 更新快取... │
│ │
│ 效果: 每步計算量從O(t)降到O(1),推論速度顯著提升 │
│ │
│ 注意: 編碼器側的KV只需計算一次,全程複用 │
└─────────────────────────────────────────────────────────────┘
技術演進史
時間線
2014.09 Sutskever等: Seq2Seq(LSTM編碼器+LSTM解碼器)
→ 首次證明端到端神經機器翻譯可行性
→ 瓶頸: 單一向量資訊壓縮
2014.09 Bahdanau等: 注意力機制(Attention)
→ 解碼器動態回看編碼器所有狀態
→ 解決長序列資訊丟失問題
2015.06 Luong等: 簡化注意力變體(Global/Local Attention)
→ 工程化最佳化,更易實現
2017.06 Vaswani等: Transformer ("Attention is All You Need")
→ 完全拋棄RNN,純注意力架構
→ 引入多頭注意力、交叉注意力
→ 成為現代NLP基石
2018.10 BERT(僅編碼器)、GPT-1(僅解碼器)
→ 架構分裂:編碼器-解碼器 vs 僅解碼器 vs 僅編碼器
→ 預訓練範式興起
2019.10 T5(Google): "Text-to-Text Transfer Transformer"
→ 萬物皆可Seq2Seq,統一為文本到文本
→ 編碼器-解碼器的巔峰代表
2019.10 BART(Facebook): 去噪自編碼器
→ 結合BERT的雙向編碼和GPT的自迴歸解碼
2020.05 GPT-3: 僅解碼器架構在大規模下展現湧現能力
→ 產業重心開始轉向僅解碼器
2022.09 Whisper(OpenAI): 編碼器-解碼器用於語音識別
→ 證明該架構在多模態領域仍有生命力
2022.11 ChatGPT: 僅解碼器成為大型模型主流
→ 編碼器-解碼器退居特定任務
2023-24 混合架構探索(如Jamba: Mamba+Transformer混合)
→ 編碼器-解碼器與新架構的融合仍在演進
演進主線
RNN Seq2Seq → +注意力 → Transformer Encoder-Decoder → 分化為三大範式
│
┌─────────────────────────────┼─────────────────┐
↓ ↓ ↓
僅編碼器 編碼器-解碼器 僅解碼器
(BERT) (T5/BART) (GPT)
↓ ↓ ↓
理解型任務 翻譯/摘要等 大型模型主流
分類/NER/問答 不對稱任務 對話/生成
技術路線對比
三大架構範式量化對比
| 維度 | 僅編碼器 (BERT) | 編碼器-解碼器 (T5) | 僅解碼器 (GPT/Llama) |
|---|---|---|---|
| 注意力型別 | 雙向自注意力 | 雙向(編碼)+因果(解碼)+交叉 | 因果自注意力 |
| 輸入處理 | 雙向理解 | 雙向理解(編碼器) | 單向(與輸出拼接) |
| 生成能力 | ❌ 無 | ✅ 自迴歸生成 | ✅ 自迴歸生成 |
| 預訓練目標 | MLM(遮蔽語言模型) | 去噪/span預測 | NTP(下一token預測) |
| 引數效率 | 僅編碼器引數 | 編碼+解碼引數(約2倍) | 單組引數 |
| 推論效率 | 一次前向(無生成) | 編碼一次+解碼自迴歸 | 全程自迴歸 |