今天很多人第一次接触大模型,是从 GPT、ChatGPT、Claude 这类聊天模型开始的。于是很容易形成一个错觉:Transformer 的主流形态似乎天然就是 Decoder-only、自回归生成、next-token prediction。这个印象放在 2020 年以后大体成立,但如果回到 2018 年,最能代表 Transformer 预训练革命的模型不是 GPT,而是 BERT。
BERT 的重要性不在于它“比后来的大模型更强”。它的历史位置在于:它把 Transformer Encoder、双向上下文表示和大规模预训练结合起来,证明了一个模型可以先在海量文本上学通用语言表示,再通过很小的任务头迁移到分类、匹配、抽取、问答等下游任务。它让 NLP 从“每个任务设计一套特征和模型”,转向“预训练模型 + fine-tuning”的范式。
本篇要回答的问题是:为什么同样基于 Transformer,BERT 选择 Encoder-only,而 GPT 选择 Decoder-only? 这个问题不是架构名字之争,而是训练目标、信息流方向和下游任务形态共同决定的结果。
本篇能让你学会三件事:
- Encoder-only 架构和 Decoder-only 架构的根本差异;
- Masked Language Modeling 为什么更像“补洞理解”,而不是从左到右续写;
- 为什么 BERT 适合理解任务,却不适合作为通用生成模型。
一、BERT 之前的 NLP 为什么需要“通用表示”
在 BERT 之前,NLP 已经经历过一轮表示学习革命。word2vec 和 GloVe 让词不再只是离散 ID,而是向量空间里的点;ELMo 引入上下文相关表示,同一个词在不同句子里可以有不同向量;ULMFiT 证明了语言模型预训练再迁移到下游任务的路线是可行的。
但这些工作仍然没有完全解决一个问题:下游任务太多了。情感分类、自然语言推断、命名实体识别、抽取式问答、句子相似度、文本匹配,它们看起来都属于“理解语言”,但传统做法往往需要不同特征、不同模型头、不同训练方式。工程上成本高,研究上也很难判断改进来自语言理解本身,还是来自任务特定技巧。
BERT 的突破在于,它把问题改写成:能不能先训练一个强大的通用文本编码器,让它为每个 token 和整段文本产生上下文表示,然后在不同任务上只加很轻的任务头?如果可以,NLP 的中心就从“手工设计任务模型”转向“构造更好的预训练表示”。
这也是 BERT 全名里的关键词:Bidirectional Encoder Representations from Transformers。它强调的不是生成,而是 representation;不是 decoder,而是 encoder;不是从左到右,而是 bidirectional。
二、Encoder-only 架构意味着什么
在原始 Transformer 里,Encoder 和 Decoder 是成对出现的。Encoder 读完整个输入句子,Decoder 一边看已经生成的目标词,一边 cross-attend 到 Encoder 输出。BERT 只保留 Encoder 堆叠,去掉 Decoder。这一选择决定了它的信息流方式。
Encoder self-attention 没有 causal mask。一个位置的 token 可以同时看左边和右边的 token。比如句子“银行提高了贷款利率”,当模型为“银行”构造表示时,它可以看见后面的“贷款利率”;如果句子是“河边的银行长满青草”,它也能看见后面的“河边”“青草”。这种双向上下文对消歧非常重要。
Decoder-only 模型则不同。为了自回归生成,它必须遵守 causal mask:当前位置只能看过去,不能看未来。这样模型才能被训练成“根据前文预测下一个 token”。这对生成很自然,但对理解任务来说,它不是最直接的信息流。
所以 BERT 和 GPT 的差异,不是“谁更高级”,而是任务目标不同。BERT 的目标是给完整输入做深度编码;GPT 的目标是在前缀条件下继续生成。前者天然适合理解,后者天然适合生成。
三、Masked Language Modeling 到底在学什么
BERT 的核心预训练目标是 Masked Language
Modeling(MLM)。做法是从输入句子中选出一部分
token,把它们替换成 [MASK]、随机 token
或保持原样,然后让模型根据上下文预测原始 token。
这和传统从左到右语言模型很不一样。自回归模型看到的是:
The cat sat on the ___
它要根据左侧前缀预测下一个词。BERT 看到的更像:
The cat [MASK] on the mat
它要同时利用左右上下文推断中间缺失的词。这个任务逼迫模型学习双向语义关系:主语和谓语如何匹配,名词和修饰语如何对应,句子内部哪些词互相约束。
MLM 的一个微妙之处是,预训练时出现
[MASK],下游任务时通常没有
[MASK]。这会造成 pretrain-finetune
mismatch。BERT 原论文用 80/10/10 策略缓解这个问题:被选中的
token 中,80% 替换成 [MASK],10% 替换成随机
token,10% 保持原样。这样模型不能只学会处理
[MASK] 符号,也要对真实 token 位置做预测。
MLM 的优势是双向表示,代价是它不是自然生成过程。BERT 不是一步一步写出句子的模型,而是对已有句子进行编码和补洞。这就是为什么它在理解任务上非常强,但不能像 GPT 那样直接做长文本续写。
四、Next Sentence Prediction 的历史位置
BERT 原论文除了 MLM,还加入了 Next Sentence Prediction(NSP)。NSP 的任务是给模型两段文本 A 和 B,让它判断 B 是否真的是 A 的下一句。设计动机很明确:很多下游任务不是单句理解,而是句子对关系,比如自然语言推断、问答、文本匹配。
NSP 在历史上很重要,因为它体现了 BERT 作者对“句间关系”的关注。但后续 RoBERTa 工作对它提出了质疑。RoBERTa 通过更大 batch、更多数据、更长训练和移除 NSP,取得了更强结果。这说明 BERT 原始配方里的 NSP 未必是性能提升的必要条件。
这里要谨慎:不能简单说“NSP 没用”。更准确的说法是,在 BERT 原始训练条件下,NSP 是一种尝试建模句间关系的目标;后续更强训练配方表明,移除 NSP 并配合更充分的 MLM 训练也能取得更好效果。问题不只是 NSP 本身,而是整个预训练数据、batch、训练步数和任务构造的组合。
这也是阅读模型演化史时常见的陷阱:一个组件在某篇论文里有用,不等于它永远必要;一个组件在后续工作里被移除,也不等于它当初完全错误。
五、为什么 BERT 适合分类、匹配、抽取
BERT 的输出有两类常用表示:一个是每个 token
的上下文表示,另一个是特殊 token [CLS]
对应的整体表示。分类任务通常把 [CLS]
输出接到一个线性层上;序列标注任务使用每个 token
的输出;抽取式问答则预测答案 span 的起点和终点。
这套接口非常自然。情感分类需要理解整句话,[CLS]
可以作为全局摘要;命名实体识别需要判断每个 token
的标签,token-level 表示正合适;SQuAD
这类抽取式问答需要从文章中找一段连续答案,预测 start/end
position 就能完成。
GLUE 和 SQuAD 的流行,让这种 fine-tuning 范式变得非常有影响力。过去一个任务可能需要专门模型,BERT 之后许多任务变成:拿同一个预训练模型,加一个轻量头,整体微调。这个变化对 NLP 工程影响很大。
当然,[CLS]
不是魔法。它能否成为好的整体表示,取决于预训练目标、下游任务和
fine-tuning 数据。BERT 的成功不是因为 [CLS]
这个符号本身,而是因为整个 encoder
在预训练中学到了丰富的上下文表示。
六、BERT fine-tuning 范式
BERT 的 fine-tuning 看起来很简单:把预训练模型加载进来,在下游任务上加一个小任务头,然后端到端训练。真正重要的是,这个简单流程让同一个模型可以迁移到大量任务。
对分类任务,输入通常是:
[CLS] sentence A [SEP] sentence B [SEP]
然后取 [CLS] 表示做分类。对 token
classification,直接在每个 token 表示上预测标签。对 question
answering,则把 question 和 passage 拼接起来,在 passage
token 上预测答案 span。
这种统一接口带来的工程价值很大。模型服务、训练脚本、数据处理、评估流程都可以复用。研究者也能更直接地比较预训练模型本身,而不是每个任务重新发明一套架构。
但 fine-tuning 也带来敏感性。学习率、batch size、训练 epoch、随机种子都会影响结果。早期 BERT 论文和后续经验都表明,小数据集上 fine-tuning 可能不稳定。这和上一篇训练稳定性形成了呼应:预训练模型虽然强,但微调仍然是优化问题。
七、BERT 的局限
BERT 的第一类局限是生成能力。由于它不是自回归模型,不能天然按从左到右方式生成长文本。可以用各种技巧让 BERT 做填空、重排序或辅助生成,但那不是它最自然的工作方式。
第二类局限是预训练目标和下游输入之间的不一致。MLM 需要
[MASK],而真实任务输入通常没有
[MASK]。虽然 80/10/10 策略缓解了这个问题,但
mismatch 仍然存在。这也是后来 ELECTRA、T5、RoBERTa
等工作继续探索预训练目标的原因之一。
第三类局限是长度和效率。BERT 仍然使用标准 self-attention,长序列成本随长度平方增长。对很多理解任务,句子或段落长度有限,这不是最大问题;但对长文档理解,它仍然会遇到上下文窗口和计算成本限制。
第四类局限是任务形态。BERT 擅长“给定文本,输出判断或抽取结果”。它不擅长把所有任务统一成自然语言生成接口。大模型时代最终更偏向 GPT 路线,一个重要原因就是生成接口更通用:分类可以写成生成标签,问答可以写成生成答案,工具调用也可以写成生成结构化文本。
八、从 BERT 到 RoBERTa / ALBERT / DeBERTa
BERT 之后,很多工作沿着它的路线改进。RoBERTa 的核心信息是:BERT 原始模型还没有被充分训练。更大数据、更大 batch、更长训练、动态 masking、移除 NSP,可以显著提升效果。这提醒我们,架构创新之外,训练配方同样重要。
ALBERT 关注参数效率。它使用 factorized embedding parameterization 和跨层参数共享,试图降低参数量并改善训练。它说明 BERT 路线不是只能通过简单变大来提升,也可以通过结构约束重新分配参数。
DeBERTa 则从 attention 表示出发,把内容和位置解耦,改进相对位置建模。它代表另一类思路:BERT 的 encoder 框架保留,但 attention 内部的表示方式仍然可以继续优化。
这些后继模型的细节很多,本篇不逐一展开。重要的是看清主线:BERT 开创的是 Encoder-only 预训练表示路线,后续改进主要围绕训练数据、训练目标、参数效率、位置表示和 attention 机制展开。
九、BERT 和 GPT 的真正分界
把 BERT 和 GPT 放在一起看,最清楚的分界不是模型大小,而是信息流方向和任务接口。
BERT 看完整输入,构造双向表示,然后对输入做判断、匹配或抽取。GPT 只看前缀,预测下一个 token,然后通过连续预测生成文本。前者像阅读理解器,后者像续写机器。后来 GPT 通过指令微调和 RLHF 变成了聊天助手,但底层训练目标仍然是自回归预测。
这也解释了为什么 BERT 在很多企业 NLP 场景里长期有价值。搜索排序、文本匹配、意图识别、分类审核、抽取式问答,并不总需要一个会长篇生成的模型。一个稳定、可控、延迟低的 encoder 模型,往往更适合这些任务。
所以 BERT 不是被 GPT “淘汰”的旧模型,而是另一条任务路线的代表。大语言模型时代当然把生成推到了中心,但理解型 encoder 仍然是很多系统里的基础部件。
十、关键概念回顾
- Encoder-only:只使用 Transformer Encoder,不使用 Decoder,输入 token 可以双向互相注意。
- Masked Language Modeling:随机遮住部分 token,让模型根据上下文预测原始 token。
- Next Sentence Prediction:BERT 原始论文中的句间关系预训练任务,后续工作对其必要性提出修正。
[CLS]:常用于聚合整段输入表示的特殊 token。- fine-tuning:在预训练模型上添加任务头,并用下游数据端到端训练。
- 双向上下文表示:一个 token 的表示同时利用左侧和右侧信息。
十一、常见误解
11.1 “BERT 是过时模型所以不重要”
BERT 不是今天最强的通用生成模型,但它代表的 Encoder-only 表示路线仍然重要。很多理解、匹配、分类和抽取任务并不需要 Decoder-only 大模型。
11.2 “双向一定比单向强”
不成立。双向适合理解完整输入,自回归适合生成未来 token。谁更合适取决于任务,不是单纯比较“看得多不多”。
11.3 “BERT 不能生成所以不算大模型”
BERT 当然是大规模预训练模型,只是它的目标不是自回归生成。把“大模型”等同于“聊天生成模型”,会误解预训练模型的发展史。
11.4 “RoBERTa 移除 NSP 说明 BERT 原论文错了”
更准确地说,RoBERTa 表明在更充分训练和不同配方下,NSP 不是必要组件。这是经验结论的修正,不是简单否定原始工作的历史价值。
十二、下一步
BERT 让我们看清了 Encoder-only 路线:双向、理解、表示、fine-tuning。下一篇转向另一条路线:GPT 为什么选择 Decoder-only,为什么从 GPT-1 到 GPT-4,next-token prediction 这件看似简单的事最终变成了大语言模型时代的主线。
十三、参考文献
- Devlin, J. et al. “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.” NAACL 2019. BERT 原始论文。
- Peters, M. et al. “Deep contextualized word representations.” NAACL 2018. ELMo,上下文表示的重要前置工作。
- Howard, J. and Ruder, S. “Universal Language Model Fine-tuning for Text Classification.” ACL 2018. ULMFiT,预训练语言模型迁移到下游任务的代表工作。
- Liu, Y. et al. “RoBERTa: A Robustly Optimized BERT Pretraining Approach.” arXiv:1907.11692, 2019. 对 BERT 训练配方和 NSP 的重要修正。
- Lan, Z. et al. “ALBERT: A Lite BERT for Self-supervised Learning of Language Representations.” ICLR 2020. 参数效率方向的 BERT 改进。
- He, P. et al. “DeBERTa: Decoding-enhanced BERT with Disentangled Attention.” ICLR 2021. 解耦 attention 与相对位置建模方向的改进。
- Wang, A. et al. “GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding.” ICLR 2019. BERT 时代常用理解任务基准。
- Rajpurkar, P. et al. “SQuAD: 100,000+ Questions for Machine Comprehension of Text.” EMNLP 2016. 抽取式问答代表基准。
← 上一篇:36|训练稳定性 | 下一篇:38|GPT 系列 →
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Transformer 与注意力机制】40|三大路线之争:为什么大模型几乎都是 Decoder-only
Transformer 不是只有一种形态。Encoder-only、Encoder-Decoder、Decoder-only 分别对应理解、条件生成和自回归生成三类信息流。本文横向比较 BERT、T5、GPT 代表的三条路线,解释为什么通用大模型时代 Decoder-only 占主流,以及为什么这不意味着另外两条路线失去价值。
【Transformer 与注意力机制】22|Encoder 详解:6 层堆叠到底在做什么
把 Transformer encoder 从“左半边”这个模糊概念拆成可操作的结构:单层里 self-attention、FFN、残差、LayerNorm 各做什么;6 层堆叠为什么不是重复劳动;encoder 输出为什么适合理解任务而不直接擅长生成;以及它和 decoder-only、encoder-decoder 两条路线到底差在哪。
【Transformer 与注意力机制】30|预训练目标:BERT、GPT、T5 其实在学三种不同的事
预训练不只是“拿海量文本先训一下”这么笼统,而是先决定模型到底要预测什么。本文把三条主线拆开:GPT 的自回归语言建模、BERT 的掩码语言建模、T5/BART 的序列到序列去噪。它们分别擅长什么、牺牲什么,为什么最后大模型主航道几乎都走向了 decoder-only 的 next-token prediction。
【Transformer 与注意力机制】08 嵌入:从 one-hot 到分布式表示
embedding 是把离散的词变成稠密向量的桥梁。从 one-hot 的痛苦出发,经过 Firth 的分布假设、word2vec、GloVe、ELMo、BERT,一路走到现代 LLM 的 embedding 矩阵,本文把这条 70 年的演化讲清楚。