从一个问题说起
如果你问一位NLP研究者:“为什么GPT选择了Decoder-only架构,而BERT选择了Encoder-only?“答案可能涉及双向注意力、因果掩码、预训练目标……但如果你追问:“那为什么现在的千亿参数大模型几乎清一色是Decoder-only?“很多人可能就说不清楚了。
这不仅仅是一个架构选择的问题,它触及了Transformer设计的核心——注意力机制的本质。过去七年,三种架构各自走出了不同的道路:Encoder-only一度霸榜GLUE,Decoder-only在生成任务中大放异彩,Encoder-Decoder则在翻译和摘要领域站稳脚跟。但当模型规模突破百亿参数,Decoder-only几乎成了唯一选择。为什么?
要回答这个问题,我们需要从注意力矩阵的数学性质说起,一路追溯到训练效率、推理优化,以及那个被很多人忽视的"低秩瓶颈”。
注意力机制:三种架构的共同基石
在深入架构差异之前,先回顾一下注意力机制的核心公式:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$这个公式看起来简洁,但其中隐藏着一个关键细节:注意力矩阵 $A = \text{softmax}(QK^T/\sqrt{d_k})$ 的形态决定了模型能"看到"什么。
- $Q$ (Query):查询向量,代表"我在找什么”
- $K$ (Key):键向量,代表"我是什么”
- $V$ (Value):值向量,代表"我的内容”
注意力矩阵 $A$ 的每个元素 $A_{ij}$ 表示第 $i$ 个位置对第 $j$ 个位置的关注程度。三种架构的本质区别,就在于对这个矩阵施加了什么约束。
flowchart TB
subgraph 三种注意力模式
A[Encoder双向注意力] --> A1["可看全部位置<br/>无掩码约束"]
B[Decoder因果注意力] --> B1["只能看过去<br/>下三角掩码"]
C[Cross-Attention] --> C1["Query来自解码器<br/>K,V来自编码器"]
end
subgraph 注意力矩阵形态
A1 --> M1["满矩阵<br/>双向信息流"]
B1 --> M2["下三角矩阵<br/>单向信息流"]
C1 --> M3["矩形矩阵<br/>跨序列信息流"]
end
Encoder-Only架构:双向理解的艺术
架构设计
Encoder-only架构最典型的代表是BERT(Bidirectional Encoder Representations from Transformers)。它的核心特点是双向注意力——每个token可以"看到"序列中的所有其他token,无论是它前面的还是后面的。
flowchart LR
subgraph BERT架构
Input[输入序列] --> Embed[词嵌入+位置编码]
Embed --> Enc1[Encoder Layer 1]
Enc1 --> Enc2[Encoder Layer 2]
Enc2 --> EncN["..."]
EncN --> EncLast[Encoder Layer N]
EncLast --> Output[上下文嵌入]
end
subgraph 单个Encoder层
SelfAttn[双向自注意力] --> AddNorm1[Add & Norm]
AddNorm1 --> FFN[前馈网络]
FFN --> AddNorm2[Add & Norm]
end
用数学语言描述,Encoder的注意力矩阵是:
$$A_{ij} = \text{softmax}\left(\frac{q_i \cdot k_j}{\sqrt{d_k}}\right), \quad \forall i, j$$没有任何掩码约束,$A$ 是一个满矩阵。
预训练目标:Masked Language Modeling
BERT的预训练目标是掩码语言模型(MLM):随机将输入序列中15%的token替换为[MASK],然后让模型预测这些被遮盖的token。
输入:我 [MASK] 吃 苹果
目标:[MASK] → 爱
这个目标充分利用了双向注意力的优势——预测中间的词可以同时利用左右两侧的上下文。
双向注意力的"低秩陷阱"
但双向注意力有一个被广泛忽视的缺陷:注意力矩阵的有效秩往往远低于序列长度。
这里需要区分两个概念:
- 代数秩(Algebraic Rank):矩阵中非零奇异值的数量
- 有效秩(Effective Rank):实际携带信息的独立通道数量
从纯数学角度看,只要对角线元素非零,注意力矩阵就是满秩的。但实际测量发现,超过90%的信息能量集中在少数几个主成分上。为什么会这样?
答案藏在softmax和投影维度里:
$$A = \text{softmax}(QK^T/\sqrt{d_k})$$矩阵 $QK^T$ 的秩最多为 $\min(d_k, d_k) = d_k$。这意味着,无论序列多长,注意力矩阵的有效秩都被 $d_k$ 这个瓶颈限制住了。
打个比方:即使你有1000个麦克风,但如果只有64条音频线,有效通道数最多就是64。
典型应用场景
Encoder-only模型在以下任务中表现出色:
- 文本分类:情感分析、主题分类
- 命名实体识别:从文本中提取人名、地名、机构名
- 问答系统:从给定段落中抽取答案
- 语义相似度:判断两个句子的相关程度
这些任务的共同特点是:需要对输入进行深度理解,而非生成新文本。
Decoder-Only架构:单向生成的力量
架构设计
Decoder-only架构的代表是GPT系列。与Encoder不同,Decoder使用因果掩码(Causal Mask),确保每个位置只能看到它之前的位置。
flowchart LR
subgraph GPT架构
Input[输入序列] --> Embed[词嵌入+位置编码]
Embed --> Dec1[Decoder Layer 1]
Dec1 --> Dec2[Decoder Layer 2]
Dec2 --> DecN["..."]
DecN --> DecLast[Decoder Layer N]
DecLast --> Output[下一词预测]
end
subgraph 单个Decoder层
MaskedAttn[因果掩码自注意力] --> AddNorm1[Add & Norm]
AddNorm1 --> FFN[前馈网络]
FFN --> AddNorm2[Add & Norm]
end
数学上,因果掩码将注意力矩阵变为下三角矩阵:
$$A_{ij} = \begin{cases} \text{softmax}_j\left(\frac{q_i \cdot k_j}{\sqrt{d_k}}\right) & \text{if } j \leq i \\ 0 & \text{if } j > i \end{cases}$$预训练目标:Causal Language Modeling
Decoder-only的预训练目标是因果语言模型(CLM):给定前面的词,预测下一个词。
输入:我 爱 吃
目标:苹果
这是一个纯粹的"从左到右"预测任务,模型必须学会在有限的前文信息中做出最佳预测。
为什么Decoder-only在大模型时代胜出
这可能是最关键的问题。当模型规模较小时,三种架构各有千秋。但当参数量突破百亿,Decoder-only逐渐成为主流。原因有三:
1. 注意力矩阵的秩优势
这是一个反直觉的发现。直觉上,双向注意力应该比单向注意力有更多信息。但研究表明,因果掩码的下三角结构有一个隐含优势:
下三角矩阵在对角线非零的条件下,必然是满秩的。 更重要的是,softmax操作在因果掩码下产生的注意力分布更加"尖锐",有效秩的衰减速度更慢。
graph LR
subgraph 双向注意力
A1["代数满秩"] --> A2["有效秩快速衰减"]
A2 --> A3["信息瓶颈"]
end
subgraph 因果注意力
B1["代数满秩"] --> B2["有效秩衰减更慢"]
B2 --> B3["更好的信息传递"]
end
2. 训练效率
Decoder-only架构不需要Cross-Attention层,这意味着:
- 更少的参数
- 更简单的计算图
- 更高的训练吞吐量
当模型规模达到千亿级别,这些效率差异会被放大。
3. KV Cache的推理优化
这是Decoder-only在推理阶段的核心优势。在生成文本时,Decoder-only可以利用KV Cache复用之前计算的Key和Value向量:
sequenceDiagram
participant Token1 as Token 1
participant Token2 as Token 2
participant Token3 as Token 3
Note over Token1: 生成Token 1
Token1->>Token1: 计算Q,K,V
Note over Token2: 生成Token 2
Token1->>Token2: 复用K1,V1
Token2->>Token2: 计算Q2,K2,V2
Note over Token3: 生成Token 3
Token1->>Token3: 复用K1,V1
Token2->>Token3: 复用K2,V2
Token3->>Token3: 计算Q3,K3,V3
Encoder-only架构无法享受这种优化,因为双向注意力要求每次都要重新计算所有token之间的相互关系。
典型应用场景
Decoder-only模型在以下任务中表现出色:
- 文本生成:创意写作、代码补全
- 对话系统:聊天机器人、虚拟助手
- 问答系统:开放域问答
- 文本摘要:生成式摘要
- 翻译:大规模翻译系统
Encoder-Decoder架构:两全其美的折中
架构设计
Encoder-Decoder架构的典型代表是T5(Text-to-Text Transfer Transformer)。它结合了Encoder和Decoder的优势:
- Encoder部分:使用双向注意力,深度理解输入序列
- Decoder部分:使用因果注意力,自回归生成输出
- Cross-Attention:连接Encoder和Decoder的桥梁
flowchart TB
subgraph Encoder-Decoder架构
subgraph Encoder
EInput[输入序列] --> EEmbed[嵌入层]
EEmbed --> ELayer1[双向自注意力]
ELayer1 --> ELayerN["..."]
ELayerN --> EOut[编码器输出]
end
subgraph Decoder
DInput[目标序列] --> DEmbed[嵌入层]
DEmbed --> DLayer1[因果自注意力]
DLayer1 --> CrossAttn[Cross-Attention]
CrossAttn --> DLayerN["..."]
DLayerN --> DOut[解码器输出]
end
EOut --> CrossAttn
end
Cross-Attention:架构的核心
Cross-Attention是Encoder-Decoder架构的灵魂。它的机制是:
- Query:来自Decoder
- Key和Value:来自Encoder
这允许Decoder在生成每个token时,动态地"查询"Encoder编码的输入信息。
数学表达:
$$\text{CrossAttn}(Q_d, K_e, V_e) = \text{softmax}\left(\frac{Q_d K_e^T}{\sqrt{d_k}}\right) V_e$$预训练目标:Span Corruption
T5使用Span Corruption作为预训练目标:随机遮盖连续的文本片段,让模型还原。
输入:我 <extra_id_0> 吃 苹果
目标:<extra_id_0> 爱 <extra_id_1>
与BERT的MLM不同,Span Corruption遮盖的是连续片段,这迫使模型学会更长距离的依赖关系。
效率权衡
Encoder-Decoder架构有一个重要的效率权衡:在计算量相同时,Encoder-Decoder的参数量约为Decoder-only的2倍。
这是因为:
- Encoder和Decoder各有一套独立的参数
- Cross-Attention层增加了额外的计算开销
UL2论文通过实验发现:如果存储空间不是问题,Encoder-Decoder在多任务场景下表现更优;但在参数受限时,Decoder-only是更实用的选择。
典型应用场景
Encoder-Decoder模型在以下任务中表现出色:
- 机器翻译:输入输出长度不同,需要深度理解源语言
- 文本摘要:长文档压缩为短摘要
- 问答生成:根据上下文生成答案
- 数据到文本:表格转文字描述
三种架构的统一视角:UL2的启示
2022年的UL2论文提供了一个重要视角:预训练目标可能比架构选择更重要。
UL2提出了**Mixture-of-Denoisers(MoD)**框架,将多种预训练目标统一:
graph TB
subgraph MoD框架
R[R-Denoiser<br/>常规Span Corruption]
S[S-Denoiser<br/>序列去噪/Prefix LM]
X[X-Denoiser<br/>极端去噪]
end
R --> Mix[混合训练]
S --> Mix
X --> Mix
Mix --> Result[通用模型]
实验发现:
- 使用MoD训练的Decoder-only模型,可以超越传统T5(Encoder-Decoder)14.6%
- 架构选择主要是效率权衡,而非性能绝对差距
- 通用模型可以通过模式切换在不同任务间切换
实际选择指南
面对具体任务,如何选择架构?以下是决策树:
flowchart TD
Start[开始选择] --> Q1{任务类型?}
Q1 -->|理解/分类| Enc[Encoder-only<br/>如BERT]
Q1 -->|生成| Q2{输入输出关系?}
Q2 -->|输出依赖输入| Q3{输入输出长度差异?}
Q2 -->|开放式生成| Dec[Decoder-only<br/>如GPT]
Q3 -->|差异大| EncDec[Encoder-Decoder<br/>如T5]
Q3 -->|差异小| Dec
Enc --> Note1[适合: 分类、NER、语义匹配]
Dec --> Note2[适合: 对话、创意写作、代码生成]
EncDec --> Note3[适合: 翻译、摘要、Seq2Seq]
详细建议
选择Encoder-only,当:
- 任务是分类或标注
- 不需要生成新文本
- 推理速度要求高
- 模型规模有限
选择Decoder-only,当:
- 需要开放式文本生成
- 输入输出关系灵活
- 希望利用大规模预训练优势
- 需要In-Context Learning能力
选择Encoder-Decoder,当:
- 输入和输出有明确的区分
- 输入需要深度理解
- 输出高度依赖输入内容
- 任务是Seq2Seq类型(翻译、摘要)
从理论到实践:一个案例
假设你要构建一个多语言客服系统,需要处理以下任务:
- 意图识别(分类)
- 多轮对话(生成)
- 工单摘要(Seq2Seq)
方案一:单一Decoder-only模型
使用一个大型Decoder-only模型(如GPT-4级别),通过Prompt Engineering处理所有任务。
优点:部署简单,一个模型搞定一切 缺点:推理成本高,分类任务"大材小用"
方案二:混合架构
- 意图识别:使用小型Encoder-only(如DeBERTa)
- 对话:使用Decoder-only(如Llama)
- 摘要:使用Encoder-Decoder(如T5)
优点:每个任务使用最优架构,效率高 缺点:部署复杂,需要维护多个模型
方案三:Encoder-Decoder统一
使用一个Encoder-Decoder模型(如UL2),通过模式切换处理不同任务。
优点:统一框架,兼顾理解和生成 缺点:参数效率不如专门的Decoder-only
实际工程中,方案二最常见,因为不同任务对模型能力的需求确实不同。
写在最后
回顾Transformer的七年演变,三种架构各有其存在的价值:
- Encoder-only开创了预训练+微调的范式,让NLP任务有了统一的解决方案
- Decoder-only证明了规模的力量,让生成式AI成为现实
- Encoder-Decoder提供了理解与生成的平衡,在特定领域保持优势
架构之争的本质,是效率与能力的权衡。双向注意力提供更丰富的信息,但代价是计算复杂度和推理效率;因果掩码限制了信息流,却换来了训练和推理的双重优势。
当我们在谈论"为什么Decoder-only统治了大模型时代"时,答案不仅仅是注意力矩阵的秩,更关乎整个工程生态的选择——从训练框架到推理优化,从硬件适配到应用场景。
未来会怎样?也许是更高效的线性注意力架构,也许是状态空间模型的复兴,也许是全新的范式。但无论技术如何演进,理解这三种架构的差异,是理解大模型本质的第一步。
参考资料
- Vaswani et al. “Attention Is All You Need” (2017)
- Devlin et al. “BERT: Pre-training of Deep Bidirectional Transformers” (2018)
- Radford et al. “Language Models are Unsupervised Multitask Learners” (GPT-2, 2019)
- Raffel et al. “Exploring the Limits of Transfer Learning with T5” (2019)
- Tay et al. “UL2: Unifying Language Learning Paradigms” (2022)
- Wang et al. “What Language Model Architecture and Pretraining Objective Work Best for Zero-Shot Generalization?” (2022)
- Bhojanapalli et al. “Low-Rank Bottleneck in Multi-Head Attention Models” (ICML 2020)