📚 本文是《Transformer 由浅入深》系列第 8 篇 · 阶段四「走向现代 LLM」
上一篇我们搭出了原版完整的 Encoder-Decoder。但有意思的是:今天你听说的大模型——GPT、Claude、LLaMA、Qwen——几乎都不用那个完整结构,而是只取了一半。
这一篇,我们就来理清 Transformer 的三大流派:它们是怎么从同一套积木里分叉出来的,各自擅长什么,以及——为什么 Decoder-only 最终一统天下。
本篇目标
读完你应该能:
- 区分 Encoder-only / Decoder-only / Encoder-Decoder 三种架构;
- 说出各自的代表模型、预训练目标和适用任务;
- 理解为什么现在的主流 LLM 几乎清一色是 Decoder-only。
阅读前提
第 7 篇(完整架构),尤其是"编码器双向自注意力"和"解码器因果掩码"的区别。
1. 三种拼法概览
上一篇我们见过两个关键部件:双向自注意力(编码器,能看全文)和带因果掩码的自注意力(解码器,只能看左边)。三大流派,本质就是对这两者的不同取舍:
| 流派 | 注意力方向 | 代表模型 | 预训练目标 | 擅长 |
|---|---|---|---|---|
| Encoder-only | 双向 | BERT | 掩码语言模型(MLM) | 理解类(分类、抽取) |
| Decoder-only | 单向(因果) | GPT 系列 | 预测下一个词 | 生成类(几乎全部) |
| Encoder-Decoder | 编码双向 + 解码单向 | T5、BART | 多种 | 明确的序列到序列 |
打个总的比方:同样是面粉(注意力)和水(前馈网络)这套基础食材,三大流派像是三种厨师。BERT 是"阅读理解高手":它把整篇文章反复读个透,然后回答关于这篇文章的各种问题。GPT 是"接龙作家":你给它开个头,它就能源源不断地往下写。Encoder-Decoder 是"翻译流水线":左半边专人负责"读懂原文",右半边专人负责"写出译文",中间用传送带(cross-attention)把理解的结果递过去。
这里有个容易混淆的点要先说清:“双向 vs 单向"决定的不是"聪不聪明”,而是"适合干什么"。双向(能看全文)适合理解——因为判断一个词的含义,左右文都是线索,缺一不可;单向(只能看左边)适合生成——因为人写东西时本来就只能依据"已经写出来的部分"去推下一个字,你不可能参考"还没落笔的内容"。所以这不是谁强谁弱的问题,而是两种能力天生服务于两类不同的活儿。理解了这条,后面三大流派为什么各擅胜场,也就顺理成章了。
下面逐个看。
2. Encoder-only:BERT
BERT 只保留编码器那一半:双向自注意力,每个词都能同时看到左右全文。
它怎么预训练?用掩码语言模型(Masked Language Model, MLM):随机遮住句子里约 15% 的词,让模型根据两侧上下文把它们猜回来。
输入: 今天 天气 [MASK] 好,我们 去 [MASK] 吧
目标: 真 公园
这其实就是我们小时候做的完形填空:句子被抠掉几个空,你得结合前后文一起判断填什么。“今天天气___好”——光看左边"今天天气"还不够,再看右边一个"好"字,你立刻知道空里多半是"真"。这种两头都能看的能力,正是 BERT 理解力的来源。
为什么"两头都能看"这么关键?设想一个有歧义的词:“我去银行取钱"和"我坐在河的银行边”(英文里 bank 既是银行也是河岸)。要判断这个"银行/bank"到底指什么,光看左边是不够的,右边的"取钱"还是"边"才是决定性线索。BERT 因为能同时吸收左右两侧的信息,对每个词的理解都建立在完整语境之上,这让它在需要"吃透整句话"的任务上格外靠谱。你可以把 BERT 想成一个反复通读全文的批改老师:它不急着往下写,而是把整段话来回读上好几遍,把每个词放进上下文里掂量清楚,然后给出判断。
因为能双向看上下文,BERT 对句子的"理解"特别到位,在判别类任务上表现极强:文本分类、情感分析、命名实体识别、抽取式问答、做句向量供检索……你可以把它想成一个只读不写的资深审稿人:给它一段话,它能精准告诉你这段话是什么情感、提到了哪些人名、和另一段话是不是一个意思——但你别指望它替你把文章写出来。
但它有个根本短板:不擅长生成。它的训练方式是"填空",而不是"从左往右续写",所以你没法让它流畅地一句接一句往下写文章。原因不难理解:写文章是"已知前文、猜下一个词"的活儿,而 BERT 训练时总能偷看到后文,从没练过"蒙着右边往下写"这件事。理解很强,生成很弱——这是 Encoder-only 的天花板。
3. Decoder-only:GPT 家族
GPT 走了另一条路:只保留解码器那一半(并去掉了 cross-attention,因为没有编码器可查),核心是带因果掩码的自注意力——每个词只能看到它左边的词。
它的预训练目标朴素到极致:预测下一个词。给定前文,猜下一个 token 是什么:
输入: 今天 天气 真
预测: 天气 真 好 ← 每个位置都在预测它的下一个词
这就像文字接龙:我说"今天天气真",你接"好";再加上去变成"今天天气真好,我们",你接"去"……一个只会接龙的人,看起来没什么了不起。但你想想,要想每次都把下一个词接得像样,它不得不顺带学会语法(不能接出病句)、事实(说"地球绕着___转"得接"太阳")、逻辑(前面立的人设后面不能崩)、甚至风格(古诗的下一句不能蹦出网络热词)。就这么一个简单目标,在海量文本上训练,模型却学会了语法、事实、推理、风格……几乎一切。
为什么 Decoder-only 后来居上? 因为"预测下一个词"这个生成框架,有一种惊人的统一性:几乎任何任务都能改写成"续写"。
- 翻译? → 输入"把这句翻成英文:猫\n英文:",让它续写。
- 分类? → 输入"这条评论的情感是(正面/负面):……",让它续写答案。
- 问答、摘要、写代码? → 全是"给定提示,续写答案"。
为什么"续写"能统一一切?关键在于:人类几乎所有的智力活动,落到纸面上都是"给定一段文字、再产出一段文字"。问答是"问题→答案",翻译是"原文→译文",写代码是"需求→代码",摘要是"长文→短文"。它们表面五花八门,本质上都是"文本进、文本出"。而 Decoder-only 恰好就是一台极致的"文本续写机",于是所有这些任务都被它一网打尽——不用为每个任务改架构,只要把任务说成一段文本就行。
这一点和 BERT 的范式形成了鲜明对比。BERT 时代,做一个新任务往往要在它头上"接一个专用的小帽子"(分类头、抽取头……),再用该任务的标注数据训练一遍——换个任务就得换顶帽子、再训一次。而 Decoder-only 把这套流程彻底简化成了"换一段话":今天让它写诗,明天让它写 SQL,后天让它扮演面试官,你要做的只是改写 prompt 里的文字描述,模型本身一动不动。一个出口(下一个词的概率分布),却能通向无数个任务,这种"以不变应万变"的优雅,正是它能横扫各行各业的根本原因。
这就是 prompt(提示) 的威力:不用为每个任务改架构,只要把任务说成一段文本,模型续写即可。比如你想让它当翻译,不用重新训练,只要写一句"请把下面这句中文翻译成英文:今天天气真好。“模型就会顺着这个开头续写出"The weather is really nice today."——任务是用自然语言布置的,而不是用代码改出来的。
再加上后来发现的 in-context learning(在 prompt 里给几个例子,模型当场就会照做,无需重新训练),Decoder-only 的通用性彻底碾压了其他流派。这个能力有多神奇?举个例子,你可以在 prompt 里这样"举一反三”:
苹果 -> apple
香蕉 -> banana
橘子 ->
模型看到前两组示例,立刻就明白"哦,这是要我做中译英",于是续写出 orange。它没有被重新训练过,只是从你给的几个例子里当场领悟了规则——这就像一个聪明的实习生,你不用送他去培训,做两个示范他就上手了。传统做法要为"中译英"专门收集数据、训练一个模型;而 Decoder-only 大模型只需要你临时给几个例子。这种灵活性,是 BERT 那种"一个任务训练一个专用头"的范式完全比不了的。
这种"举例子"的本事还能玩出更多花样。你甚至不用给完整示例,只要描述清楚你想要什么风格,它就能照办:
请用鲁迅的口吻,把"今天天气不错"改写一遍:
模型会顺着这个开头,续写出一段带着那种冷峻、反讽味道的文字。你想要的"风格"“格式"“角色”,全都可以写进 prompt 里用自然语言交代,而不必去改模型的任何一行参数。一个模型,通过千变万化的提示词,就能扮演翻译、客服、程序员、诗人、辩手……这种"一人千面"的能力,本质上都源自那个朴素到极点的训练目标:把下一个词接好。
4. Encoder-Decoder:T5 / BART
完整的 Encoder-Decoder 流派也没消失,代表是 T5 和 BART。它们保留了编码器(双向理解输入)+ 解码器(生成输出)+ 中间的 cross-attention。
还是那个"翻译流水线"的比方:编码器是车间里的"读者”,把整段原文吃透、做成一份浓缩的理解笔记;解码器是"写手",一边写译文一边时不时回头查那份笔记(这就是 cross-attention);两人分工明确、各司其职。这种结构天然适合输入和输出是两段明确不同文本的序列到序列(seq2seq) 任务:机器翻译、摘要、语法纠错。T5 还提出了一个漂亮的统一思路——把所有任务都变成 “text-to-text”:输入一段文本、输出一段文本,连分类都让它输出类别这个词。
它在专门的 seq2seq 任务上很强,但结构比 Decoder-only 复杂(要维护两套栈 + cross-attention),在"一个模型通吃万物"的通用大模型竞赛里,逐渐被更简单的 Decoder-only 盖过了风头。打个比方:流水线式分工在"专门翻译"这类固定活儿上效率很高,但当你想造一个什么都能干的全才时,养两班人马、还要协调传送带,反而成了负担——不如让一个全能选手从头写到尾来得干脆。
值得一提的是,Decoder-only 其实并没有"丢掉"理解输入的能力,它只是用了另一种更省事的方式:把输入和输出直接首尾相连,塞进同一个序列里。当模型读到输入部分时,它依然在用注意力消化这些内容——只不过受因果掩码限制,只能从左往右地看。换句话说,Encoder-Decoder 是"先把原文读完、再开始动笔"的两阶段做法,而 Decoder-only 是"边读边写、一气呵成"的单阶段做法。后者牺牲了一点点对输入的双向理解,却换来了结构上的极大简化,这笔交易在通用大模型的语境下显然非常划算。
5. 为什么现在 Decoder-only 一统天下
把账算总:
- 生成即统一范式:“预测下一个词"能把几乎所有任务收编成续写,一个模型通吃,无需为任务改结构;
- 结构更简单:只有一个栈、没有 cross-attention,更容易把规模做大、把工程做稳;
- 扩展性极好:它在"更多数据 + 更大模型 = 更强能力"的缩放定律(scaling law) 上表现优异;
- in-context learning:仅凭 prompt 里的几个示例就能适应新任务,灵活到不可思议。
再看一眼那个对比:MLM(完形填空)和"预测下一个词"到底差在哪? MLM 是"挖空—回填”,模型练的是"在已知上下文的包围中,推断被藏起来的那个词",它的产物是"对一段已存在文本的理解";“预测下一个词"是"顺着写下去”,模型练的是"在只知道前文的前提下,创造出后面的内容",它的产物是"新的文本"。一个偏向"看懂已有的",一个偏向"造出没有的"——这条分野,几乎决定了 BERT 与 GPT 此后命运的全部走向。
这里多说一句缩放定律(scaling law),因为它是 Decoder-only 胜出的隐藏推手。它说的是一个朴素却惊人的规律:只要你持续往里堆更多数据、更大参数、更多算力,模型的能力就会平滑地、可预测地变强,而且短期内看不到天花板。这就好比发现了一条"充钱就能变强"的明确路径——既然有这么一条确定的上升通道,大家自然愿意往简单、好放大的架构上押注。而 Decoder-only 只有一个栈、没有 cross-attention,正是最好"无脑放大"的那一个:层数翻倍、参数翻倍,工程上几乎不用动结构。相比之下,Encoder-Decoder 要同时放大两套栈、还要照顾它们之间的 cross-attention,放大起来更别扭。
再补一个常被忽略的优势:训练效率。BERT 的 MLM 每次只遮住约 15% 的词、也就只从这 15% 的位置上学到信号,剩下 85% 的位置"白读了";而 Decoder-only 的"预测下一个词"是每个位置都在预测、每个位置都在学,同样一段文本,它榨取的训练信号要密集得多。在"数据和算力就是燃料"的大模型时代,这种把每一滴燃料都用上的特性,又给它加了一道筹码。
当然这不代表 Decoder-only 在每件事上都最优——在某些纯理解任务上,BERT 类的双向模型仍有优势;在固定的翻译/摘要管线里,Encoder-Decoder 依然好用。只是当目标变成"造一个尽可能通用的智能体“时,Decoder-only 的简单 + 统一 + 可扩展,成了压倒性的选择。可以这样收个尾:三大流派没有绝对的优劣,只有"合不合适”。但历史的天平之所以倒向 Decoder-only,是因为它恰好踩中了这个时代最稀缺、也最值钱的那个目标——通用。
6. 一张「族谱图」
2017 原版 Transformer(Encoder-Decoder)
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
只留编码器 只留解码器 保留两者
(双向) (因果单向) (seq2seq)
│ │ │
BERT GPT-1/2/3 T5 / BART
RoBERTa 等 │
▼
GPT-4 / Claude / LLaMA / Qwen …
(今天的主流 LLM)
主干一目了然:原版分叉成三支,而 Decoder-only 这一支,长成了今天 LLM 的参天大树。另外两支并没有枯死,只是从"主干竞赛"退到了各自更专精的生态位——BERT 一族扎根在分类、检索这些"理解密集型"的角落,Encoder-Decoder 一族则在翻译、摘要等"输入输出泾渭分明"的场景里继续发挥所长。一棵树长得最高,不等于其他枝条毫无价值。
常见疑问与易错点
问:BERT 能像 ChatGPT 那样陪我聊天吗? 答:基本不能。BERT 是"完形填空高手",训练时总能看到右边的词,从没练过"蒙着右边一字一字往下写"这件事,所以它没有流畅的生成能力。它的主场是"读懂一段已有的话并做出判断"(分类、抽取、检索),而不是"凭空生成新内容"。想聊天,得用 GPT 这类 Decoder-only 模型。
问:GPT 为什么要去掉 cross-attention? 答:cross-attention 是解码器用来"回头查编码器笔记"的通道。可 GPT 压根没有编码器——它把输入和输出拼成同一段连续文本,统统交给一个解码器栈处理。既然没有"另一边"可查,这条 cross-attention 通道自然就多余了,去掉它结构更简单,也更好放大。
问:既然"预测下一个词"这么简单,模型怎么可能学会推理? 答:正因为目标是"每次都把下一个词接对",模型被逼着学会了背后的一切——要接对"2 加 3 等于___",它就得会算数;要接对一段论证的下一句,它就得跟上逻辑。简单的目标 + 海量数据 + 足够大的模型,涌现出了远超"接龙"本身的能力。这也是缩放定律的迷人之处。
问:Decoder-only 真的样样都比 BERT、T5 强吗? 答:不是。在一些纯理解的任务上(比如海量文本的快速分类、做检索用的句向量),双向的 BERT 往往又快又准,因为它能同时利用左右上下文;在固定的 seq2seq 管线(专门的翻译、语法纠错)里,Encoder-Decoder 的分工结构也很高效。Decoder-only 赢的是"通用性"这盘大棋,而非每一个单项。
问:那现在还需要 BERT 和 T5 吗? 答:需要,只是退到了更专门的岗位。当你的需求是"把上亿条评论又快又便宜地分好类"“给搜索引擎做语义向量"这类单一、量大、要省成本的理解任务时,一个小巧的 BERT 通常比动用一个庞大的通用 LLM 更划算。工程上"够用且便宜"常常比"全能但昂贵"更重要。
问:in-context learning 和"重新训练模型"是一回事吗? 答:完全不是。重新训练(微调)会真的改动模型的参数,需要数据、算力和时间。in-context learning 一个参数都不改,只是你在 prompt 里临时给几个例子,模型当场照葫芦画瓢——对话一结束,它什么也没"记住”。前者像送员工去脱产培训,后者像开会前临时给他看两份范例。
问:Encoder-Decoder 的 cross-attention 和 Decoder 自己的注意力有什么区别? 答:可以这样记。自注意力是"自己人开会",序列里的词互相看、互相参考;cross-attention 是"写手回头查读者的笔记",解码器一边写、一边去看编码器对输入的理解。Decoder-only 因为没有编码器这位"读者",自然也就没有这条回查的通道,全部信息都在同一段序列的自注意力里流动。
问:GPT 只能从左往右看,会不会"理解"得比 BERT 差? 答:在逐句精读式的纯理解任务上,确实可能稍逊一筹,这也是 BERT 至今没被淘汰的原因。但对生成而言,“只看左边"恰恰是必须的——你写文章时本来就不可能"看到还没写出来的下文”。而且当模型足够大、读过足够多的文本后,它哪怕只看左边,也积累了极强的语境推断力,实际表现往往足以满足绝大多数需求。
小结 & 下一篇预告
这一篇我们俯瞰了 Transformer 的三大流派:
- Encoder-only(BERT):双向、MLM 预训练,强于理解,弱于生成;
- Decoder-only(GPT):因果单向、预测下一个词,强于生成,并凭 prompt + in-context learning 实现惊人的通用性;
- Encoder-Decoder(T5/BART):适合明确的 seq2seq;
- Decoder-only 因统一、简单、可扩展而成为今天主流。
说到底,这一篇的核心只有一句话:同一套积木,因为对"双向 vs 单向"的不同取舍,长成了三种性格迥异的模型;而其中那个看似最朴素的"预测下一个词",却凭着统一、简单、可扩展三件法宝,成了通往通用人工智能最宽的那条路。
我们多次提到 GPT 的训练目标是"预测下一个词",也多次提到"自回归生成"。但训练时模型是怎么高效学习的?生成时又是怎么一字一字蹦出来、还能控制风格的?下一篇,我们就深入训练与生成的内部机制。
📖 系列目录
见 第 1 篇 文末完整目录。