第 25 章:BERT 与 GPT:理解和生成的分岔路
本章问题:为什么同样是 Transformer,会出现 BERT 和 GPT 两条路线?
Transformer 架构有了。但怎么训练它?同样基于 Transformer,出现了两条截然不同的路——填空和续写。这一章对比 BERT 和 GPT 的设计哲学。
25.1 同一个发动机,两个方向
2018 年,两篇论文重新定义了 NLP。
Google 发布了 BERT——双向编码器表示变换器。OpenAI 发布了 GPT——生成式预训练变换器。
两者的底层架构都是 Transformer。训练数据都是大规模无标注文本。都没有使用人工标注。
但它们是两种截然不同的哲学。
BERT 的核心操作是填空:把句子中的某些词遮住,让模型根据两边的上下文猜出被遮住的是什么。
GPT 的核心操作是续写:给定前面的所有词,预测下一个词——只看左边,不看右边。
这一章把两种架构的设计逻辑和各自的选择讲清楚——以及,为什么今天的主流生成式大语言模型大多站在 GPT 的线路上。
25.2 BERT:用双向信息理解文本
BERT 使用的 Transformer 块是Encoder-only——没有任何 masking(遮罩)——它在每个位置上同时看到左边和右边的词。这意味着对于句子"我 [MASK] 了一个苹果",BERT 在预测 [MASK] 时能同时看到"我"(左边的上下文)和"了一个苹果"(右边的上下文)。
BERT 在大量文本上做的预训练任务叫遮罩语言模型(MLM):
- 随机遮掉输入句子中 15% 的词(用 [MASK] 填上)。
- 对每个被遮住的位置,模型预测原始词是什么。
15% 这个百分比的选取是经过权衡的——太少会减少训练信号,太多会降低上下文对模型的指导力。此外,在这 15% 被选中的位置中——80% 被真实替换为 [MASK]、10% 被替换为随机词、10% 保留原词不变——这种混合设计的目的是让模型不完全依赖 [MASK] 标记的存在,而强迫模型在每一个位置都留意词是否合理。
MLM 是一个双向任务:遮词前后两边的信息都能被模型使用。这也意味着 BERT 天然适合"理解"类的任务——文本分类、情感分析、问题回答(给定问题和段落)、命名实体识别。这些任务不需要生成新的文本——它们需要在给定文本上做出准确的判断或提取。
BERT 发布后在 11 个 NLP 基准上同时达到了当时的最佳,包括 SQuAD(Stanford 问答数据集)、GLUE(通用语言理解评估基准)等。它的规模——BERT-Base(1.1 亿参数)和 BERT-Large(3.4 亿参数)——在当时被视为极大的模型。
25.3 GPT:用单向生成续写世界
GPT 使用的是Decoder-only Transformer——在 Self-Attention 层中使用causal mask(因果遮罩):每个位置只能看它自己以及它之前的词——未来的词被 mask 挡住不可见。这使得 GPT 不能使用"两边的上下文"来填空——它只能从已经知道的过去信息中预测未来。
GPT 做的预训练任务非常直接——下一个词的预测:给定一段文本的前面所有的词,预测紧接着的下一个词。
这个目标听起来比 BERT 的"双向理解"弱。填词可以看两边——显然更容易做准确。续写只能看左边——很多续写在语言层面上有多种合理答案,准确率天生偏低。
但 GPT 的架构有一个隐含的长远优势:它是天然的生成模型。 因为它天然是按从左到右的顺序生成文本的——这正是对话、写作、翻译、代码生成的核心形式。BERT 能做填空,但要在填空产出后拼接成一个完整的连贯生成文本很难——它的架构在每个 [MASK] 产生时会独立预测而彼此间不传递任何序列性的概率约束。GPT 直接就以续写为原生操作——生成就是它的默认姿态。
25.4 为什么 GPT 的方向赢了
BERT 发布后,在 NLP 的研究界迅速主导了 2018-2019 年的主流方向。微调 BERT 成为几乎所有 NLP 任务的标准做法——在预训练的 BERT 上面加一个任务特定的输出层,用几千到几万标注样本微调,就能达到甚至超越以前需要巨量标注数据的定制模型。
但到 2019-2021 年,几条影响力巨大的趋势重叠在一起,让 GPT 路线逐渐成为了"大模型"的代名词。
第一,零样本和少样本能力的涌现。 GPT-2(2019)展示了只用"提示"(提示词语/模板)而不用任务特定的微调就能在翻译、问答和摘要上产生有竞争力的输出。GPT-3(2020)把这个能力进一步提升——在很多任务上,只给几个例子(few-shot)就能逼近甚至超越专门微调过的 BERT。
第二,生成是通用接口。 填空只能产出特定位置的候选词——从几个候选词到认知上的"回答",中间还需要大量的架构和训练设计。而续写作为通用接口——把"回答问题""总结""翻译""推理"都重新格式化成自然语言的续写——每一种能力在不改动架构的情况下可以同时涌现。
第三,Scaling 给了 Decoder-only 更多的甜头。 后续的实验验证了——在同等参数和数据预算下,Decoder-only 模型在增加规模后在非常多的下游任务(尤其是生成类任务)上获得了更显著的收益。Decoder-only 在 scaling 上的边际收益高于 Encoder-only 和 Encoder-Decoder。
第四,Decoder-only 的架构简洁性。 BERT 需要两阶段——预训练 + 下游微调。GPT 希望只需一阶段——预训练后通过提示词(或者最坏情况少样本)直接执行任务。这在产品化和可扩展性方面是巨大的优势。
到 2023 年,主流前沿生成式大模型大多转向 Decoder-only Transformer 或以它为核心的变体——GPT、Claude、Llama、Qwen、DeepSeek 等都沿着这条路线演进。
25.5 预训练 vs 微调——NLP 的两阶段模式
BERT 时代留下了一个极其重要的模式:先预训练,再微调。
这个想法并不是 BERT 首创(ELMo 和其他模型已经有预训练组件),但 BERT 把这个模式推到了 NLP 领域的绝对主流。
预训练阶段:用海量无标注文本(整个维基百科 + 海量书籍)训练模型去做 MLM(填空)和下一句预测任务。这个阶段模型学到的是——词汇、语法、句法、话题、推理模式、世界知识。
微调阶段:拿预训练好的模型,在特定任务(情感分类、问题回答、命名实体识别)上标注几千条数据,用有监督学习再训练几轮。预训练学到的通用语言知识被迁移到具体任务中。
这个模式的效果是戏剧性的:在微调阶段只需要几百到几千条标注数据,就能让 BERT 在许多任务上达到甚至超越之前需要巨量标注训练的专业定制模型。
GPT 系列也在使用预训练,但 GPT-2 和 GPT-3 开始追求的是最小化微调——最好零微调(zero-shot)或最少示例(few-shot)直接完成任务,让预训练阶段产出的模型已经足够通用到用提示方法解决下游任务。
25.6 最小代码:用 Hugging Face 加载 BERT 和 GPT
以下代码用 Hugging Face 的 transformers 库加载预训练的 BERT 和 GPT-2,并比较它们的输出:
如果你有 GPU 环境(或 Colab 免费 GPU),可以把这个脚本直接粘贴运行,换成自己感兴趣的中文句子来实验。
25.7 本章小实验:猜被遮住的词——你是 BERT 还是 GPT?
读下面这句话:
"我今天去超市买了____"
如果让你猜空白处的词——你必须只用左边的信息(只能看到"我今天去超市买了")和你尽量用两边的信息填充(比如你知道整句话是"我今天去超市买了牛奶然后回家")——你的猜测会有什么不同?
你只用左边的信息 → 你在做 GPT 做的事。需要基于常见续写分布:买了什么?东西/牛奶/菜/衣服——统计上超市更多的句子的延续是物品名词。
你用两边的信息 → 你在做 BERT 做的事。有了右边"然后回家"的双向上下文做约束,"东西/牛奶/食物"的概率被进一步收窄——"买了衣服/买了车"的双向合理性就大大下降了。
这就是 BERT 和 GPT 在每一个词上的核心差异。
25.8 本章地图
25.9 本章结语:分开的两条路,一条走到了现在
2018 年 BERT 和 GPT 的分岔是一个历史上的十字路口。两者都证明了 Transformer 在海量预训练后的强大。
BERT 之后的两年,很多 NLP 论文都以微调 BERT 为起点。但 GPT-2 和 GPT-3 逐步证明了——让 Decoder-only 架构做更大的预训练,在足够多的参数和数据的加持下,可以连续展现令人惊讶的通用能力。到 2023 年,BERT 路线的后继者相对沉寂了——Encoder-only 模型仍然在搜索、分类和嵌入任务中广泛使用,但前沿通用生成模型的竞争重心已经明显转向 Decoder-only。
这一章停在分岔口。但继续往前走需要回答一个更底层的问题:什么是预训练? 为什么让模型在大规模文本的语言建模任务上先"读一遍世界",再去做任何事情,都变得显著更容易?
下一章:预训练——先读世界,再学任务。
Discussion
留言区 · GitHub-powered comments via Giscus