📑 本页目录(点开跳转)
02c · 为什么都是 Decoder-only
⏱ 48 分钟 | ⭐⭐ 面试公认的 Top-3 必问题,也是教程里一个没补上的「为什么」
🎯 一句话
Encoder-only、Decoder-only、Encoder-Decoder 三种架构的差别,本质上只是一张注意力 mask 长什么样。 现在几乎所有大模型都选了最"笨"的那张(只能往回看),这个选择有几条真实的理由,但也有相当一部分是事后归因和生态惯性——这一章两边都讲。
🚪 为什么要补这一章
第 2 章花了一整节讲因果掩码,讲清了「不许偷看未来 → 模型本质是个续写机 → 所以预训练完的模型不会当助手」。
但它从没解释:为什么要选一个会导致"只会续写"的设计?
这是个逻辑断点。读者知道了「因为有因果掩码,所以模型只能续写」,却不知道「因果掩码不是被迫的,是主动选的」。而且这个问题在面试里出现的频率高得离谱——四个主流的 LLM 面试题库全部收录,其中一个还单独成篇。
⚠️ 先说清楚这一章的边界:这不是「BERT 八股复习」。 BERT 为什么 mask 15%、
[CLS]干什么用,这些是 2019 年的面试题,2026 年的工程里基本用不到。 这一章只关心一件事:三种架构的机制差别,以及那个选择是怎么发生的。
🎛️ 一、三种架构,差别只在一张 mask
先把结论摆出来:这三种架构用的是同一种 Transformer 层、同一套注意力公式。差别只有一个——算注意力分数时,哪些位置被挡住了。
用一句话概括每一种:
| 架构 | 一句话 | 它天生做不了什么 |
|---|---|---|
| Encoder-only | 每个位置都能看全句,但没有"下一个词"这个出口 | 开放式生成 |
| Decoder-only | 每个位置只能往回看,训练目标就是猜下一个词 | 让前面的 token 用上后面的信息 |
| Prefix-LM | 输入那段互相看得见,输出那段只能往回看 | —— |
| Encoder-Decoder | 输入交给一套参数双向编码,输出交给另一套参数因果生成 | —— |
🏆 二、BERT 当年是怎么赢的
2018 年 BERT 出来的时候,它和 GPT-1 是同期的对手,结果是 BERT 完胜:GLUE 榜、SQuAD、11 个 NLP 任务全刷了一遍。当时几乎所有人的判断是「双向就是比单向强」。
它赢在三点,而且这三点在当时的语境下都是对的:
① 双向真的有用
判断"苹果"是水果还是公司,右边的上下文往往是决定性的
→ 分类、命名实体识别、抽取式问答这类【判别式任务】,双向明显有利
② 当时的范式是"每个任务微调一个模型"
预训练一次 → 下游每个任务接一个小头,各自微调
→ 不需要生成能力,只需要一个好的句子表示
③ 参数效率高
BERT-base 只有 1.1 亿参数,一张消费级显卡就能微调 ⭐
而同期的生成式路线要做同样的事,得大得多
🔗 BERT 至今仍是 Kaggle 文本赛的主力——微调 encoder 做分类,比调 API 又快又便宜又稳。 《Kaggle 竞赛方法论》第 5 章讲的就是这条线。
📉 三、然后它输在哪
① 训练信号的密度差了一个量级 ⭐
这是最实在的一条,也是最容易被答漏的一条。
MLM(BERT):一句 100 个 token,挖掉 15 个
→ 只有【15 个位置】产生了梯度信号
→ 另外 85 个位置只是"陪跑",白算了一遍注意力
Next-token(GPT):一句 100 个 token
→ 【每一个位置】都在预测它的下一个词,100 个位置全都产生梯度 ⭐
⚠️ 同样的语料、同样的算力,
Decoder-only 拿到的监督信号大约是 MLM 的【6~7 倍】
在「数据和算力是瓶颈」的时代,这个差距是致命的。
② 预训练和使用之间有个裂缝
BERT 训练时到处是 [MASK] 这个 token,但下游任务的真实输入里根本没有 [MASK]。模型见过的世界和它要工作的世界不一样。
BERT 论文自己意识到了,打了个补丁:被选中的 15% 里,80% 换成 [MASK]、10% 换成随机词、10% 保持原样。这个 80/10/10 就是在缓解这条裂缝——但它是缓解,不是消除。
Next-token 没有这个问题:训练时在做的事(续写)和推理时在做的事(续写)是同一件事。
③ 任务范式变了,它跟不上
真正杀死 BERT 路线的不是技术细节,是范式变了:
| BERT 时代(2018–2020) | GPT-3 之后(2020–) | |
|---|---|---|
| 怎么做一个新任务 | 收几千条标注,微调一个模型 | 写一段提示词 |
| 部署几个模型 | 每个任务一个 | 一个模型全干 |
| 需要的能力 | 好的句子表示 | 上下文学习 + 生成 |
BERT 没有上下文学习(in-context learning)能力——它从来没被训练成一个「看着前文往下写」的东西,你没法给它举几个例子让它照着做。
⭐ 一句话总结这一节:BERT 输的不是"双向 vs 单向"这场比试,是它所在的那个赛场被拆掉了。
🥊 四、真正的问题:为什么不是 Encoder-Decoder
BERT 出局之后,剩下的真正竞争者是 T5 那样的 Encoder-Decoder。它既有双向编码,又能生成,看起来两头都占。为什么最后也输了?
理由 1:预训练任务更难,所以学得更多
双向任务里,很多位置是【可以靠两边夹出来】的:
"今天天气很 [MASK],我们出去玩吧" → 猜"好"几乎不需要理解,靠句式就够
因果任务没有这个便利:
"今天天气很 ___" → 只能靠前文,没有任何后文提示
⭐ 每一步都是一次真正的预测,模型被迫学到更深的东西
还有一条更硬的理由:causal LM 在做的是一个良定义的概率建模——把整句的联合概率分解成 p(x₁)·p(x₂|x₁)·p(x₃|x₁x₂)…,这是完整的密度估计。MLM 学的是一堆条件分布的碎片,拼不回一个联合分布,也因此没法直接用来采样生成。
理由 2:零样本能力,但这条要加个但书 ⚠️
有一篇经常被引用的对照研究(Wang et al., 2022,专门比架构和预训练目标对零样本泛化的影响),结论分成两半:
① 纯自监督预训练 + 直接零样本用
→ causal decoder-only 最强 ⭐
② 但如果做了多任务微调(FLAN 那种)再用
→ encoder-decoder 反超 ⚠️
第二条通常会被面试答案省略掉,但它才是有意思的部分:所谓「Decoder-only 更强」是有前提的,前提是你打算靠 prompt 直接用它,而不是先做一轮大规模多任务微调。而 2020 年之后主流路线恰好选了前者。
⚠️ 另外那项研究的规模只到几十亿参数量级,在千亿尺度上没人做过公平的对照实验——太贵了。
理由 3:低秩问题(理论论证,说服力中等)
一条常见的理论论证是这样的:
双向注意力:mask 全开,注意力矩阵可能是低秩的 → 表达能力受限
因果注意力:mask 是下三角,对角线元素恒为正
→ 注意力矩阵【必然满秩】→ 理论上表达能力更强
⚠️ 这条我建议你知道但别太当真。它是个纸面论证,缺少「满秩 = 实际效果更好」的实证链条。 面试时能说出来是加分,但如果你把它当成主因,反而暴露了没想清楚。
理由 4:工程上 Decoder-only 便宜太多 ⭐
这条才是真正压倒性的。
causal mask 意味着:位置 i 的 K 和 V 只依赖于 0..i
→ 一旦算出来,【后面永远不会变】
→ 可以缓存(KV Cache)、可以跨请求复用(Prefix Caching)⭐
双向编码器不行:
→ 输入末尾加一个 token,整段的表示全部要重算
→ 多轮对话里,每一轮都要把前面所有内容重新编码一遍 💀
再加上:
| 工程优势 | 说明 |
|---|---|
| 结构单一 | 一种层堆到底,没有 cross-attention 这个"第二种层"。流水线并行怎么切、张量并行怎么分,都简单得多 🔗 并行策略 |
| 训练推理同构 | 训练时的前向和推理时的 prefill 是同一件事,代码复用度极高 |
| 批处理友好 | 所有请求都是同一种形状的计算,容易做连续批处理 🔗 推理优化 |
理由 5:causal mask 自带一点位置信息
一个有点绕但很有意思的性质:因果掩码本身打破了置换不变性。
位置 0 只能看到 1 个 token
位置 5 能看到 6 个 token
→ "我能看到几个人"这件事,本身就编码了"我排第几" ⭐
而双向注意力里每个位置看到的都是全部,天然对称,
不加位置编码就完全区分不出顺序
所以理论上 decoder-only 不加任何位置编码也能勉强工作(学界确实做过 NoPE 的研究),encoder-only 绝对不行。这不是主因,但是个漂亮的观察。
🪞 五、诚实的部分:这里面有多少是事后归因
上面五条读起来很有说服力。但你要知道它们大多是 GPT-3 成功之后才被总结出来的。
真实的历史顺序是这样的:
2018 OpenAI 押注 decoder-only + 一路 scale(GPT-1 当时是输给 BERT 的)
2019 GPT-2,开始有人注意到"它好像什么都能写"
2020 GPT-3 展示了上下文学习 —— 这才是转折点
2021+ 所有人跟进 decoder-only
2022+ 各种"为什么 decoder-only 更好"的论证陆续被写出来 ⭐
⚠️ 注意最后两行的顺序。 论证是跟在结果后面来的,不是先有论证再有选择。
生态惯性是个自我强化的循环
到 2026 年,还有一层更现实的原因:整个工具链都是围着 causal decoder 长出来的。
FlashAttention 的因果分支优化 · vLLM 的 PagedAttention · 连续批处理
· 投机解码 · Prefix Caching · 几乎所有量化和微调库的默认假设
→ 就算某个 encoder-decoder 变体理论上更优,
它也要面对"没有这一整套加速生态"的现实劣势 💀
→ 而没人用它,就更没人给它做优化
这本身就构成了一个闭环。 承认这一点,比背五条论证更接近真相。
而且另外两条路线并没有死 ⭐
这是最容易被「大模型都是 decoder-only」这句话误导的地方:
| 场景 | 用的是什么 | 为什么 |
|---|---|---|
| 向量检索的 embedding 模型 | Encoder-only(BGE、E5 这类) | 只要一个好的句子表示,不需要生成。双向编码天然更合适,而且小、快、便宜 |
| 重排(Reranker) | Encoder-only 的 Cross-Encoder | 让查询和文档在同一个序列里互相看,精度远高于双塔 🔗 RAG 深水区 |
| 语音转文字 | Encoder-Decoder(Whisper) | 输入是完整的音频(本来就全都在),输出是文字。这正是 encoder-decoder 的主场 🔗 多模态 |
| 文本分类 / NER | Encoder-only 微调 | 有标注数据时,一个 1 亿参数的微调 encoder 常常打得过调 API |
🔑 所以正确的说法不是「Decoder-only 赢了」,而是: 「通用对话与生成这个赛道被 Decoder-only 拿下了,而这个赛道恰好是现在最大最热的那个。」 其他赛道各有各的赢家,而且活得很好。
🎤 六、如果面试问到,怎么答
一个不背书的答法(按重要性排,别一上来就背低秩):
① 先说清三种架构只差一张 mask,顺手把四张图口述一遍
② 训练信号密度:MLM 只有 15% 的位置出梯度,next-token 是 100%
③ 预训练任务更难 → 学得更多;而且 causal LM 是良定义的密度估计
④ 工程:KV Cache 只在 causal 下成立,结构单一好并行
⑤ 零样本更强 —— ⚠️【但要补上那个但书】:做了多任务微调后 enc-dec 会反超
⑥ 最后加一句:这里有相当一部分是事后归因和生态惯性 ⭐
⭐ 第 ⑤ 和第 ⑥ 条是拉开差距的地方 —— 前四条谁都会背
🔗 这一章连到哪里
| 去哪 | 为什么 |
|---|---|
| 02 · Transformer 原理 | 因果掩码的机制在那里讲。那一章讲「掩码导致了什么」,这一章讲「为什么选它」,合起来才完整 |
| 02b · 现代 LLM 架构的四处改动 | 这一章定的是模型的整体形状,那一章讲这个形状里的零件被换成了什么 |
| 02d · MoE 混合专家 | 架构选型的另一个维度:定了 decoder-only 之后,FFN 还能变成稀疏的 |
| 06 · 推理优化 | Prefix Caching、连续批处理这些优化全部建立在 causal mask 之上,本章理由 4 的落地形态 |
| 08 · RAG 深水区 | Encoder-only 活得最好的地方:embedding 模型和 Cross-Encoder 重排都在那一章 |
| 10 · 多模态 | Whisper 是活跃的 Encoder-Decoder 模型,那一章能看到它为什么适合这个结构 |
| 《AI基础设施》16 · KV Cache | 「KV 算完就不再变」这个性质怎么变成真金白银的显存与吞吐 |
| 《AI基础设施》14 · 并行策略怎么组合 | 「结构单一好并行」不是空话,那一章能看到 cross-attention 会给流水线切分添多少麻烦 |
| 《Kaggle 竞赛方法论》05 · 预训练模型详解 | 想动手微调一个 encoder-only 模型做分类,去那里 |
| 《ML 基础》14 · 通往 Transformer | 「归纳偏置 vs 数据量」的权衡——这一章的架构之争是那条规律的又一个实例 |
✅ 检查点
- 三种架构(Encoder-only / Decoder-only / Encoder-Decoder)的本质差别是什么?
- Prefix-LM 和 Encoder-Decoder 的 mask 形状几乎一样,那它们真正的区别在哪?
- BERT 当年赢在哪三点?
- 训练信号密度这条论证具体是什么?差了多少倍?
- 什么是「预训练和使用之间的裂缝」?BERT 论文用什么补丁缓解它?
- 为什么说 causal LM 是「良定义的概率建模」而 MLM 不是?
- 零样本那条论证的但书是什么?为什么这个但书重要?
- 为什么 KV Cache 只在 causal mask 下成立?双向编码器为什么不行?
- 因果掩码为什么自带一点位置信息?
- 「Decoder-only 赢了」这句话哪里说得不准确?举两个 encoder 路线仍然是最优解的场景。
👀 答案
- 只差一张注意力 mask。同一种 Transformer 层、同一套注意力公式,区别只在算分数时哪些位置被挡住:Encoder-only 全可见、Decoder-only 下三角、Encoder-Decoder 是「双向编码 + 因果解码 + cross-attention」。
- mask 展平后确实同构,真正的区别是参数:Encoder-Decoder 的前缀那半边由一套独立的 encoder 参数算出来、再通过 cross-attention 读进来;Prefix-LM 前后用的是同一套参数。
- ①双向对判别式任务真的有用(分类、NER、抽取式 QA,右边的上下文常常是决定性的)②当时的范式是「每个任务微调一个模型」,不需要生成能力 ③参数效率高,BERT-base 只有 1.1 亿参数,一张消费级显卡就能微调。
- MLM 一句 100 个 token 只挖 15 个,只有 15 个位置产生梯度,另外 85 个白算;next-token 是每个位置都在预测下一个词,100 个位置全部出梯度。同样语料同样算力,Decoder-only 拿到的监督信号约是 MLM 的 6~7 倍。
- BERT 训练时到处是
[MASK],但下游任务的真实输入里根本没有[MASK]——模型见过的世界和它工作的世界不一样。补丁是 80/10/10:被选中的 15% 里 80% 换[MASK]、10% 换随机词、10% 保持原样。它是缓解不是消除。而 next-token 训练时做的事和推理时做的事是同一件事,没有这条裂缝。 - 因为 causal LM 把整句联合概率分解成
p(x₁)·p(x₂|x₁)·p(x₃|x₁x₂)…,是完整的密度估计;MLM 学的是一堆条件分布的碎片,拼不回一个联合分布,也因此不能直接用来采样生成。 - 但书是:纯自监督 + 直接零样本用时 decoder-only 最强,但如果做了大规模多任务微调(FLAN 那种),encoder-decoder 会反超。重要是因为它说明「Decoder-only 更强」是有前提的,前提是你打算靠 prompt 直接用而不是先做多任务微调。⚠️ 而且该研究规模只到几十亿参数,千亿尺度上没人做过公平对照。
- 因为 causal mask 下位置 i 的 K/V 只依赖 0..i,一旦算出来后面永远不会变,所以能缓存、能跨请求复用。双向编码器里末尾加一个 token,整段表示全部要重算,多轮对话每轮都得把前面重新编码一遍。
- 因为因果掩码打破了置换不变性:位置 0 只能看到 1 个 token,位置 5 能看到 6 个——「我能看到几个」本身就编码了「我排第几」。所以 decoder-only 理论上不加位置编码也能勉强工作(NoPE 研究),双向的绝对不行。
- 不准确在于:赢的只是通用对话与生成这一个赛道(恰好是现在最大最热的那个),其他赛道各有赢家。两个例子:① 向量检索的 embedding 模型(BGE、E5 这类 encoder-only——只要好的句子表示,双向更合适且小快便宜);② 重排用的 Cross-Encoder(让查询和文档在同一序列里互相看,精度远高于双塔)。另外 Whisper 这类语音转文字是活跃的 Encoder-Decoder。
🛑 可以停在这里
⚡ 走神救援
三种架构只差一张 mask:Encoder-only 全可见、Decoder-only 下三角、Prefix-LM 前缀全看后段因果、Encoder-Decoder 的 mask 和 Prefix-LM 形状同构——真正区别是前缀那半边用另一套 encoder 参数算、经 cross-attention 读进来。BERT 当年赢在:双向对判别式任务真有用、当时范式是「每任务微调一个模型」不需要生成、BERT-base 只有 1.1 亿参数一张消费卡就能微调。输在三点:⭐训练信号密度——MLM 一句 100 token 只挖 15 个,只有 15 个位置出梯度;next-token 是 100 个位置全出,差 6~7 倍;预训练-使用有裂缝(下游根本没有
[MASK],论文用 80/10/10 打补丁);范式变了(从「微调一个模型」变成「写一段提示词」,而 BERT 没有上下文学习能力)——它输的不是双向 vs 单向,是它的赛场被拆了。真正的对手是 T5 那种 Encoder-Decoder,Decoder-only 赢它靠:①预训练任务更难(双向可以靠两边夹出答案;而且 causal LM 是良定义的密度估计 p(x₁)p(x₂|x₁)…,MLM 拼不回联合分布)②零样本更强 —— ⚠️ 但书:做了多任务微调后 enc-dec 会反超,且对照实验规模只到几十亿 ③低秩论证(纸面的,别当主因)④⭐工程压倒性:causal 下 K/V 算完永不变 → KV Cache 和 Prefix Caching 才成立,双向编码器末尾加一个 token 整段要重算;结构单一好并行 ⑤因果掩码自带位置信息(能看到几个 token 就等于知道排第几)。⭐诚实的部分:这些论证大多是 GPT-3 成功之后才被总结出来的——真实顺序是 OpenAI 先押注 + scale,2020 年 GPT-3 展示上下文学习才是转折点,论证跟在结果后面来。加上生态惯性:FlashAttention、vLLM、投机解码全围着 causal decoder 长,没人用就没人优化,闭环。⚠️而且另外两条路线没死:embedding 模型(BGE/E5)和重排 Cross-Encoder 仍是 encoder-only,Whisper 是活跃的 Encoder-Decoder。正确说法是「通用对话与生成这个赛道被 Decoder-only 拿下了」,不是「Decoder-only 赢了」。
下一节 👉 02d-MoE混合专家.md