全书导航
大模型之路:从图灵、感知机到 ChatGPT · 卷 3

第 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)

  1. 随机遮掉输入句子中 15% 的词(用 [MASK] 填上)。
  2. 对每个被遮住的位置,模型预测原始词是什么。

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,并比较它们的输出:

python
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM, \    AutoModelForMaskedLM# ---- BERT (fill-mask) ----bert_fill = pipeline("fill-mask", model="bert-base-uncased")print("BERT 填空:",      bert_fill("Paris is the [MASK] of France.")[0]["sequence"])# → paris is the capital of france.# ---- GPT-2 (text generation) ----gpt2 = pipeline("text-generation", model="gpt2")print("GPT 续写:",      gpt2("Paris is the", max_length=15, do_sample=False)[0]      ["generated_text"])# → paris is the capital of france.# 两种架构都可以得出正确的地理常识,但完成这个常识的方法截然不同——# BERT 是双向地拉取填空题被遮掩处的语句间统计关系;# GPT 是按因果顺序从左到右预测下一个词分布的最可能延续。

如果你有 GPU 环境(或 Colab 免费 GPU),可以把这个脚本直接粘贴运行,换成自己感兴趣的中文句子来实验。


25.7 本章小实验:猜被遮住的词——你是 BERT 还是 GPT?

读下面这句话:

"我今天去超市买了____"

如果让你猜空白处的词——你必须只用左边的信息(只能看到"我今天去超市买了")和你尽量用两边的信息填充(比如你知道整句话是"我今天去超市买了牛奶然后回家")——你的猜测会有什么不同?

你只用左边的信息 → 你在做 GPT 做的事。需要基于常见续写分布:买了什么?东西/牛奶/菜/衣服——统计上超市更多的句子的延续是物品名词。

你用两边的信息 → 你在做 BERT 做的事。有了右边"然后回家"的双向上下文做约束,"东西/牛奶/食物"的概率被进一步收窄——"买了衣服/买了车"的双向合理性就大大下降了。

这就是 BERT 和 GPT 在每一个词上的核心差异。


25.8 本章地图

text
问题:为什么同样是 Transformer,会出现 BERT 和 GPT 两条路线?BERT:Encoder-only Transformer — 双向 Self-Attention — 遮罩语言模型(填空)— 适合理解类任务 — 两阶段(预训练 + 微调)。GPT:Decoder-only Transformer — 因果遮罩(只看左边)— 下一个词预测(续写)— 天然生成模型 — 追求零/少样本提示。为什么 GPT 胜出:续写是通用接口;Decoder-only 的 Scaling 边际收益更优越;架构简洁(一阶段部署)。今天:主流前沿生成式大语言模型大多采用 Decoder-only Transformer 或其变体,但 BERT 的两阶段训练模式(预训练→微调)遗留为今天模型训练的核心流程。

25.9 本章结语:分开的两条路,一条走到了现在

2018 年 BERT 和 GPT 的分岔是一个历史上的十字路口。两者都证明了 Transformer 在海量预训练后的强大。

BERT 之后的两年,很多 NLP 论文都以微调 BERT 为起点。但 GPT-2 和 GPT-3 逐步证明了——让 Decoder-only 架构做更大的预训练,在足够多的参数和数据的加持下,可以连续展现令人惊讶的通用能力。到 2023 年,BERT 路线的后继者相对沉寂了——Encoder-only 模型仍然在搜索、分类和嵌入任务中广泛使用,但前沿通用生成模型的竞争重心已经明显转向 Decoder-only。

这一章停在分岔口。但继续往前走需要回答一个更底层的问题:什么是预训练? 为什么让模型在大规模文本的语言建模任务上先"读一遍世界",再去做任何事情,都变得显著更容易?

下一章:预训练——先读世界,再学任务。

SECTION §02 · ENGAGE

Discussion

留言区 · GitHub-powered comments via Giscus