encoder-only、decoder-only、encoder-decoder 三种架构有什么区别?为什么大模型都用 decoder-only?
简化版
Transformer 有三种用法:
- encoder-only(如 BERT):双向注意力,擅长「理解」类任务(分类、抽取、检索),用掩码语言建模预训练,但不能直接做生成。
- decoder-only(如 GPT/Llama):因果(单向)注意力,逐 token 自回归生成,擅长「生成」,也能靠上下文学习做各种任务。
- encoder-decoder(如 T5/BART):编码器双向理解输入 + 解码器自回归生成输出,中间用交叉注意力连接,擅长「输入到输出」的序列转换(翻译、摘要)。
现代大语言模型几乎都选 decoder-only,因为它结构简单、训练高效(每个 token 都是预测目标)、天然支持上下文学习、任务统一为”续写”、且规模化效果最好。
详细版
三种架构的机制对比
| 架构 | 注意力 | 预训练任务 | 强项 | 代表 |
|---|---|---|---|---|
| encoder-only | 双向(全可见) | 掩码语言建模 MLM | 理解、分类、抽取、句向量 | BERT、RoBERTa |
| decoder-only | 因果(只看左侧) | 下一个 token 预测 | 生成、对话、少样本学习 | GPT、Llama、Qwen |
| encoder-decoder | 编码双向 + 解码因果 + 交叉注意力 | 去噪 / seq2seq | 翻译、摘要等输入→输出转换 | T5、BART |
为什么 LLM 选 decoder-only(核心理由)
- 训练信号密集:每个位置都预测下一个词,简要说里每个 token 都提供监督,样本利用率高;而 BERT 的 MLM 只对被掩码的 ~15% token 计算损失。
- 任务统一、通用性强:万物皆「续写」,分类/翻译/问答都能写成文本生成,无需为每类任务设计不同头。
- 上下文学习(in-context learning):decoder-only 在规模化后涌现出「看几个例子就会做新任务」的能力,zero/few-shot 极强。
- 结构简单、易扩展:没有编码器-解码器的分工和交叉注意力,堆同构的层最省心,最契合 Scaling Law。
- KV Cache 友好:自回归 + 因果掩码天然配合 KV 缓存,推理高效。
完整版教学
一、三种架构其实是”注意力可见性 + 有无生成端”的排列组合
理解三者,抓两个维度:
- 注意力能看到哪些位置:双向(每个 token 看全序列)还是因果(只看自己及左侧)。
- 有没有独立的生成端:是否需要一个自回归解码器产出新序列。
由此:
- encoder-only = 纯双向、无生成端(只出表示)。
- decoder-only = 纯因果、生成端即全部(边理解边生成)。
- encoder-decoder = 双向编码端 + 因果解码端,二者用交叉注意力桥接。
二、encoder-only(BERT):为”理解”而生
BERT 用双向注意力,每个 token 能同时看到左右全部上下文,因此对语义的「理解」很充分。预训练用掩码语言建模(MLM):随机遮住一些词让模型还原,配合双向上下文学到深层表示。
- 强项:文本分类、命名实体识别、句子相似度/检索(句向量)、阅读理解等「输入 → 标签/片段」的判别任务。
- 短板:不能自然地生成文本。因为它没有自回归机制,且双向注意力和「逐词生成」不兼容(生成时右侧还不存在)。硬要生成要额外改造,别扭。
三、encoder-decoder(T5/BART):为”序列转换”而生
它把任务显式建模成「一段输入 → 一段输出」:
-
编码器:双向注意力充分理解输入(如源语言句子)。
-
解码器:因果注意力自回归生成输出(如目标语言句子),且每步通过交叉注意力去「看」编码器的输出。
-
预训练:T5 用「填空式去噪」(把连续片段替换成哨兵符再还原),统一成 text-to-text。
-
强项:机器翻译、摘要、语法纠错这类输入和输出边界清晰的转换任务,编码端的双向理解是加分项。
-
代价:结构更复杂(两套栈 + 交叉注意力),参数和工程更重;在「开放式生成 + 通用任务」上不如 decoder-only 灵活。
四、decoder-only(GPT/Llama):为什么它赢下了大模型时代
decoder-only 只有一个因果解码器:每个 token 只能看它左边的,逐个预测下一个词。它成为 LLM 主流,是多重优势叠加的结果:
① 训练信号最密集。 自回归让序列里每一个 token 都是一次预测,都贡献损失;一句 1000 词的话提供近 1000 个监督信号。而 BERT 的 MLM 一次只预测被遮的 ~15%,同样数据的学习效率更低。
② 任务大一统。 把所有任务都写成「续写文本」:问答=续写答案,翻译=续写译文,分类=续写标签词。不需要针对每类任务设计不同输出头,一个模型通吃。
③ 上下文学习涌现。 decoder-only 规模化后展现出强大的 in-context learning——在 prompt 里给几个示例,模型就能模仿完成新任务,无需微调。这种 few-shot 通用性是它统治的关键。
④ 结构简单、最利于 Scaling。 没有编码/解码分工、没有交叉注意力,全是同构的因果 Transformer 层,堆叠、并行、扩展都最省心,最契合「加规模就变强」的规律。
⑤ 推理高效。 因果掩码 + 自回归天然配合 KV Cache,历史算过的 K/V 可复用,逐 token 生成成本低。
有一个常被引用的理论视角:因果掩码让 decoder-only 的注意力矩阵是下三角满秩的,表达能力上不易退化;加上上述工程与训练优势,共同促成了它的胜出。面试点到「训练信号密集 + 任务统一 + in-context learning + 易扩展」这几条即可。
五、那 encoder 系彻底没用了吗
并非。理解类任务里 encoder 仍有价值:
- 做检索/嵌入(如句向量、RAG 的 embedding 模型),双向编码器(BERT 系、E5、BGE)通常比同规模 decoder 更强、更省。
- 判别式任务(分类、NER)在数据充足时,微调 BERT 往往又快又好。
现实是分工共存:生成和通用智能用 decoder-only 大模型;检索、排序、轻量判别用 encoder。近年也有把 decoder 改造成 embedding 模型的趋势,但 encoder 的「双向理解」在表示任务上仍有天然优势。
六、用翻译任务比较两条计算路径
假设输入是 128 个 token,要生成 32 个 token。encoder-decoder 先让编码器双向处理 128 个输入 token,解码器的 32 个位置通过 cross-attention 读取固定的编码结果;decoder-only 通常把输入和输出串成一条 160-token 的因果序列。前者把“读输入”和“写输出”明确分工,后者则用同一套堆叠和同一个 next-token 目标统一所有任务。
Encoder-Decoder: source(128) -> encoder states -> decoder generates 32
Decoder-Only: [source(128), target(32)] -> one causal token stream
| 比较项 | Encoder-Decoder | Decoder-Only |
|---|---|---|
| 输入可见性 | 编码器内双向 | 全程因果 |
| 条件复用 | 编码结果可被每个输出步复用 | 输入 K/V 保存在同一缓存中 |
| 训练接口 | 编码、解码两套路径 | 单一续写接口 |
| 典型优势 | 条件转换、输入理解充分 | 扩展简单、统一生成范式 |
不能仅凭总长度断言谁更快:参数分配、cross-attention 实现、输入输出长度比例都会改变结果。选型时应在同等质量与相近参数预算下比较吞吐、首 token 延迟和部署复杂度。
七、常见误区与追问
- 误区:Decoder-Only 不能做理解任务。 它可以通过生成标签、答案或结构化结果完成理解任务,只是输入采用因果可见性。
- 追问:Encoder-Decoder 为什么适合翻译和摘要? 编码器能双向压缩完整输入,解码器再通过交叉注意力按需读取,天然匹配条件序列生成。
- 误区:相同参数量下两种架构的推理成本只由总 token 数决定。 参数在编码器与解码器间的分配、交叉注意力和输入输出比例都会改变成本。
- 追问:Decoder-Only 为什么更容易统一多任务? 所有任务都可序列化为上下文续写,训练目标、模型堆叠和服务接口都更统一。
- 追问:什么时候仍优先 Encoder-Only? 固定表示、检索向量、分类和抽取等无需生成的任务,双向编码通常更直接且吞吐更高。
八、加强记忆
三种架构记「理解 / 生成 / 转换」:encoder-only(BERT,双向,理解判别,不擅生成)、decoder-only(GPT,因果,自回归生成,通用)、encoder-decoder(T5,双向编码+因果解码+交叉注意力,输入到输出的转换)。 大模型选 decoder-only 的五个理由串成一句:训练信号密集(每 token 都预测)+ 任务统一为续写 + 上下文学习涌现 + 结构简单易扩展 + KV Cache 推理高效。 但别忘了 encoder 在检索/嵌入等理解任务上仍有一席之地——这是加分的「反直觉」认知。