🏠 总目录📚 本教程 02c · 为什么 Decoder-only
📑 本页目录(点开跳转)

02c · 为什么都是 Decoder-only

48 分钟 | ⭐⭐ 面试公认的 Top-3 必问题,也是教程里一个没补上的「为什么」


🎯 一句话

Encoder-only、Decoder-only、Encoder-Decoder 三种架构的差别,本质上只是一张注意力 mask 长什么样。 现在几乎所有大模型都选了最"笨"的那张(只能往回看),这个选择有几条真实的理由,但也有相当一部分是事后归因和生态惯性——这一章两边都讲。


🚪 为什么要补这一章

第 2 章花了一整节讲因果掩码,讲清了「不许偷看未来 → 模型本质是个续写机 → 所以预训练完的模型不会当助手」。

但它从没解释:为什么要选一个会导致"只会续写"的设计?

这是个逻辑断点。读者知道了「因为有因果掩码,所以模型只能续写」,却不知道「因果掩码不是被迫的,是主动选的」。而且这个问题在面试里出现的频率高得离谱——四个主流的 LLM 面试题库全部收录,其中一个还单独成篇。

⚠️ 先说清楚这一章的边界:这不是「BERT 八股复习」。 BERT 为什么 mask 15%、[CLS] 干什么用,这些是 2019 年的面试题,2026 年的工程里基本用不到。 这一章只关心一件事:三种架构的机制差别,以及那个选择是怎么发生的。


🎛️ 一、三种架构,差别只在一张 mask

先把结论摆出来:这三种架构用的是同一种 Transformer 层、同一套注意力公式。差别只有一个——算注意力分数时,哪些位置被挡住了。

四种架构的差别,全在这张 mask 上 行 = 谁在看 列 = 能看到谁 实心 = 可见,空心 = 被挡住 Encoder-only BERT / RoBERTa 挖空填词(MLM) 分类 / 抽取 / 打分 Decoder-only GPT / LLaMA / Qwen 猜下一个词 生成 / 对话 / 通用 Prefix-LM GLM / UniLM 前缀全看 → 后段续写 半理解半生成 Encoder-Decoder T5 / BART / Whisper 绿框那块是另一套参数 翻译 / 语音转写
四张 mask。⭐ 注意最右两张形状几乎一样——这不是画错了:Encoder-Decoder 展平之后,mask 结构和 Prefix-LM 确实同构。真正的区别是绿框那半边由一套独立的 encoder 参数算出来,再通过 cross-attention 读进来,而 Prefix-LM 前后用的是同一套参数。

用一句话概括每一种

架构 一句话 它天生做不了什么
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 数据量」的权衡——这一章的架构之争是那条规律的又一个实例

✅ 检查点

  1. 三种架构(Encoder-only / Decoder-only / Encoder-Decoder)的本质差别是什么?
  2. Prefix-LM 和 Encoder-Decoder 的 mask 形状几乎一样,那它们真正的区别在哪?
  3. BERT 当年赢在哪三点?
  4. 训练信号密度这条论证具体是什么?差了多少倍?
  5. 什么是「预训练和使用之间的裂缝」?BERT 论文用什么补丁缓解它?
  6. 为什么说 causal LM 是「良定义的概率建模」而 MLM 不是?
  7. 零样本那条论证的但书是什么?为什么这个但书重要?
  8. 为什么 KV Cache 只在 causal mask 下成立?双向编码器为什么不行?
  9. 因果掩码为什么自带一点位置信息?
  10. 「Decoder-only 赢了」这句话哪里说得不准确?举两个 encoder 路线仍然是最优解的场景。
👀 答案
  1. 只差一张注意力 mask。同一种 Transformer 层、同一套注意力公式,区别只在算分数时哪些位置被挡住:Encoder-only 全可见、Decoder-only 下三角、Encoder-Decoder 是「双向编码 + 因果解码 + cross-attention」。
  2. mask 展平后确实同构,真正的区别是参数:Encoder-Decoder 的前缀那半边由一套独立的 encoder 参数算出来、再通过 cross-attention 读进来;Prefix-LM 前后用的是同一套参数
  3. 双向对判别式任务真的有用(分类、NER、抽取式 QA,右边的上下文常常是决定性的)②当时的范式是「每个任务微调一个模型」,不需要生成能力 ③参数效率高,BERT-base 只有 1.1 亿参数,一张消费级显卡就能微调。
  4. MLM 一句 100 个 token 只挖 15 个,只有 15 个位置产生梯度,另外 85 个白算;next-token 是每个位置都在预测下一个词,100 个位置全部出梯度。同样语料同样算力,Decoder-only 拿到的监督信号约是 MLM 的 6~7 倍
  5. BERT 训练时到处是 [MASK]但下游任务的真实输入里根本没有 [MASK]——模型见过的世界和它工作的世界不一样。补丁是 80/10/10:被选中的 15% 里 80% 换 [MASK]、10% 换随机词、10% 保持原样。它是缓解不是消除。而 next-token 训练时做的事和推理时做的事是同一件事,没有这条裂缝。
  6. 因为 causal LM 把整句联合概率分解成 p(x₁)·p(x₂|x₁)·p(x₃|x₁x₂)…是完整的密度估计;MLM 学的是一堆条件分布的碎片,拼不回一个联合分布,也因此不能直接用来采样生成。
  7. 但书是:纯自监督 + 直接零样本用时 decoder-only 最强,但如果做了大规模多任务微调(FLAN 那种),encoder-decoder 会反超。重要是因为它说明「Decoder-only 更强」是有前提的,前提是你打算靠 prompt 直接用而不是先做多任务微调。⚠️ 而且该研究规模只到几十亿参数,千亿尺度上没人做过公平对照。
  8. 因为 causal mask 下位置 i 的 K/V 只依赖 0..i,一旦算出来后面永远不会变,所以能缓存、能跨请求复用。双向编码器里末尾加一个 token,整段表示全部要重算,多轮对话每轮都得把前面重新编码一遍。
  9. 因为因果掩码打破了置换不变性:位置 0 只能看到 1 个 token,位置 5 能看到 6 个——「我能看到几个」本身就编码了「我排第几」。所以 decoder-only 理论上不加位置编码也能勉强工作(NoPE 研究),双向的绝对不行。
  10. 不准确在于:赢的只是通用对话与生成这一个赛道(恰好是现在最大最热的那个),其他赛道各有赢家。两个例子:① 向量检索的 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

打卡记录保存在你的浏览器里,首页能看到总进度