Transformer 解剖:从 Attention 到推理系统

第 7 章 预训练范式之战:从 BERT 到 GPT

作者 杨艺韬 · 6,213 字

第 7 章 预训练范式之战:从 BERT 到 GPT

第 6 章我们讲清楚了三种架构的差别。但架构只是骨架——决定一个模型最终能做什么的,是它的预训练目标(pretraining objective)。同样的 Decoder-only 架构,喂不同的训练目标,会变成完全不同的模型。

2018 到 2023 年这五年,预训练范式经历了一场惨烈的大战。BERT 的 MLM 让「填空」一时风光无两,GPT 系列用 CLM 步步推进,T5 试图统一一切,ELECTRA 用判别式重新定义训练效率,最终 Decoder-only + CLM 大获全胜。这场胜利的根本原因不是 GPT 比 BERT 「更聪明」——它们的智能水平很大程度上是由参数和数据决定的——而是两种范式对「语言是什么」的世界观差异:BERT 认为语言是「填空题」,GPT 认为语言是「续写题」,最终我们用了 GPT 的视角。

读完这章你能:

7.1 预训练是为了让模型「读完互联网」

预训练(pre-training)这个词的意义需要先讲清楚。

机器学习里训练模型有两类范式:

  1. 监督学习:用人工标注的数据(输入 → 输出)训练。比如给模型 10 万张「猫的照片 + 标签 cat」,让它学会识别猫。
  2. 自监督学习:用没有人工标注的原始数据,但从数据本身构造出训练信号。比如给模型一段文字,挖掉一个词,让它预测这个词——「答案」是被挖掉的那个词,不需要人工标注。

预训练绝大多数时候是自监督的。我们把维基百科、Common Crawl、GitHub 代码、各种书籍语料、论文等几十 TB 的原始文本扔进去,让模型自监督地从中学习语言规律——这就是「让模型读完互联网」。

为什么自监督?因为人工标注的数据永远不够。GPT-3 训练用了大约 0.5 万亿 token,Llama-3 用了 15 万亿 token——这个量级的人工标注是不可能的。但「自监督地预测下一个词」可以无限取数据:每一段文本本身就提供了无数个「(前 i-1 个词 → 第 i 个词)」的训练样本。

预训练目标的设计,决定了「自监督信号怎么从原始文本里抽出来」——不同的设计抽出不同的信号,模型学到不同的能力。

flowchart LR
  RAW[原始文本<br/>互联网/书籍/代码<br/>15T tokens] --> OBJ[预训练目标<br/>把文本转成<br/>训练样本]
  OBJ --> MLM[MLM: 挖空 → 填空]
  OBJ --> CLM[CLM: 切左右 → 续写]
  OBJ --> SPAN[Span Corruption:<br/>挖整段 → 恢复]
  OBJ --> RTD[RTD: 替换 token<br/>→ 判断真伪]
  MLM & CLM & SPAN & RTD --> MODEL[训练完的模型]

每一种「目标」都是一种「从无监督文本里榨学习信号的方法」。下面我们逐个看。

7.2 MLM:BERT 的填空范式

MLM(Masked Language Modeling,掩码语言建模)是 BERT 的核心预训练目标,2018 年由 Devlin 等人提出。

怎么做

输入一段文本,随机选 15% 的 token 来「mask」。处理这 15% 的策略是:

模型的目标是预测被 mask 位置的原始 token。损失函数是被 mask 位置的交叉熵之和:

LMLM=imaskedlogP(xixmasked)\mathcal{L}_{\text{MLM}} = -\sum_{i \in \text{masked}} \log P(x_i^{\text{原}} | x_{\setminus \text{masked}})
原句:   "the cat sat on the mat with a book"
mask:   "the cat [MASK] on the [MASK] with a book"
                   ↑              ↑
                  15% 的 token 被处理

模型预测:
  位置 3: sat (正确)
  位置 6: mat (正确)

为什么 80/10/10?这是 BERT 论文的精心设计:

MLM 的关键优势:双向上下文

MLM 要预测 [MASK] 位置,必须同时利用左侧和右侧的上下文。这正是 Encoder-only 双向 Self-Attention 的天然用武之地(参考第 6.3 节)。

MLM 的两个先天缺陷

缺陷一:学习信号密度低

MLM 一次只预测 15% 的 token——也就是说,给定一段长度为 1000 的文本,只有 150 个位置贡献了训练信号。剩下 850 个位置只是「背景」,没有 loss。

对比 CLM(下一节):每个位置都参与预测下一 token,信号密度是 100%。

直觉上:同样花 1 GPU·小时算前向,MLM 只学了 15% 的内容,CLM 学了 100%——CLM 的「单位算力学习效率」是 MLM 的近 7 倍

这一点在 Scaling 视角下变得致命。当你把模型从 100M 推到 100B、把数据从 1B 推到 10T 时,每一份算力都要尽可能多地榨学习信号。MLM 的低信号密度让它在大模型规模下越来越吃亏——这是后面 BERT 输给 GPT 的核心数学原因之一。

缺陷二:pretrain-finetune gap

预训练时输入里有 [MASK],下游 finetune 时没有 [MASK]——模型见过的训练分布和真实使用分布不一致。BERT 用 80/10/10 策略试图缓解这个问题,但缓解不等于消除。

7.3 CLM:GPT 的续写范式

CLM(Causal Language Modeling,因果语言建模)是 GPT 系列的预训练目标,从 GPT-1 一路用到 GPT-4,今天的 Llama / Mistral / DeepSeek 也都是这个目标。

怎么做

给定一段文本 x1,x2,,xTx_1, x_2, \dots, x_T,模型按顺序预测每个位置的下一 token:

LCLM=i=1TlogP(xix1,,xi1)\mathcal{L}_{\text{CLM}} = -\sum_{i=1}^{T} \log P(x_i | x_1, \dots, x_{i-1})

每个位置都贡献一个 loss——整段文本的每一个 token 都是训练信号。

原句:   "the cat sat on the mat"
       
位置 1 预测 cat: P(cat | the)
位置 2 预测 sat: P(sat | the cat)
位置 3 预测 on:  P(on  | the cat sat)
位置 4 预测 the: P(the | the cat sat on)
位置 5 预测 mat: P(mat | the cat sat on the)

            每个位置都有 loss

CLM 完美匹配 Decoder-only 架构的因果掩码(第 2.10 节)——预测位置 ii 时只能看到 i1\le i-1 的内容,正是因果 Self-Attention 的工作模式。

CLM 的核心优势

优势一:100% 学习信号密度

每个 token 都在被预测——同样长度的文本,CLM 比 MLM 多得 6.7 倍学习信号。这意味着相同算力下 CLM 训练效率高得多。

优势二:无 pretrain-finetune gap

CLM 训练和推理完全一致——都是「给定上下文,预测下一 token」。不需要任何特殊 token、不需要修改输入分布。

优势三:天然支持生成

CLM 训练出的模型直接就能做自回归生成——这是它和 MLM 最根本的能力差异。MLM 预训练后要做生成需要复杂的 hack(XLM、UniLM 等),效果远不如 CLM 原生。

优势四:In-Context Learning 自然涌现

GPT-3 之后我们意识到,规模够大的 CLM 模型会涌现出「上下文学习」能力——只看 prompt 里的几个示例就能解决新任务。这是 BERT/T5 路线极难做到的。

CLM 也有缺陷

缺陷:单向上下文

CLM 只能用左侧上下文预测当前 token——比 MLM 的双向上下文「信息量少」。理论上 BERT 在「需要看后文才能消歧」的任务(如完形填空、阅读理解)上有优势。

但这个优势在大模型时代被吞噬了——一来 CLM 的信号密度让它能用更大模型/更多数据弥补;二来涌现的能力(zero-shot / in-context)让 CLM 在 zero-shot 场景下根本不需要 fine-tune。

flowchart LR
  T[一段长 1000 的文本] --> MLMP[MLM 预训练]
  T --> CLMP[CLM 预训练]
  MLMP --> M1["每段文本贡献 ~150 个 loss<br/>双向上下文<br/>不能生成<br/>有 pretrain-finetune gap"]
  CLMP --> C1["每段文本贡献 1000 个 loss<br/>单向上下文<br/>原生生成<br/>无 gap"]
  M1 --> WORST[Scaling 时<br/>边际效益快速衰减]
  C1 --> BEST[Scaling 时<br/>持续受益]

7.4 Span Corruption:T5 的折中

Span Corruption(片段破坏)是 T5 的预训练目标,可以看作 MLM 的扩展版。

怎么做

不像 MLM 单独 mask 散落的 token,Span Corruption mask 的是连续的多个 token(span)。每个 span 用一个 sentinel token(特殊 ID)替代,模型的目标是按顺序生成被 mask 的所有 spans。

原句:  "Thank you for inviting me to your party last week."

mask:  "Thank you <X> me to your party <Y> week."

target: "<X> for inviting <Y> last </s>"
        ↑ 模型要按顺序生成被破坏的内容

T5 默认 mask 比例 15%,平均 span 长度 3 token。被 mask 的所有 span 拼成 target,用 sentinel token 分隔。

范式特性

Span Corruption 训练目标比 MLM 复杂:模型既要「理解」(哪里该填什么)又要「生成」(按顺序产出 target)。这是为什么它需要 Encoder-Decoder 架构——Encoder 理解被破坏的输入,Decoder 自回归地恢复内容。

学习信号密度仍然受限于 mask 比例(15%),但 span 的结构性让模型学到的不只是「单个词的填空」而是「连续片段的恢复」——这对生成任务(摘要、翻译)有潜在的好处。

T5 用这个目标训出的模型在 GLUE、SuperGLUE 上接近 BERT、在 seq2seq 任务上有时超过 GPT。但综合下来,它没有跑赢 CLM——一来仍然受限于 ~15% 信号密度,二来 Encoder-Decoder 架构的工程开销在 scaling 上吃亏。

7.5 RTD:ELECTRA 的判别式范式

RTD(Replaced Token Detection,替换 token 检测)是 ELECTRA(Clark et al., 2020)的预训练目标,是一个非常巧妙的设计。

怎么做

ELECTRA 用两个网络:一个生成器(generator,小网络,类似 BERT)和一个判别器(discriminator,主模型)。

原句:    "the cat sat on the mat"

生成器 (15% 位置):
  把这些位置预测的 token 替换原 token:
  "the cat ate on the rug"
                   ↑ 替换为 "ate"     ↑ 替换为 "rug"

判别器 (主模型) 的任务:
  对每一个位置 (100% 都参与),判断它是不是「被替换过」的:
  the:  原(real)     cat:  原     ate:  替换(fake)
  on:   原             the:  原     rug:  替换

判别器的损失是所有位置的二分类交叉熵——每个位置都贡献信号。这就解决了 MLM 的最大缺陷:100% 学习信号密度

RTD 的优势与缺陷

优势

  1. 学习信号密度 100%(每个位置都参与判别)
  2. 训练效率比 MLM 高 4–5 倍
  3. ELECTRA-base 在 GLUE 上能匹配 BERT-large 的性能,但参数只有 1/3

缺陷

  1. 预训练目标是判别式(real/fake),下游任务是生成式或分类式——表征上有不匹配。
  2. 仍然不能做生成。
  3. 工程复杂——需要同时维护一个生成器和一个判别器,还要协调训练。

ELECTRA 在判别类任务上证明了「100% 信号密度」的价值,启发了后来的研究。但它本身没成主流——工程复杂度让它没法 scaling 到大模型规模。

ELECTRA 的真正意义:它向工业界证明了『100% 信号密度』是预训练效率的关键变量。这进一步强化了 CLM 路线的合理性——CLM 同样是 100% 密度,且自然得多。

7.6 PLM:XLNet 的置换尝试

PLM(Permutation Language Modeling,置换语言建模)是 XLNet(Yang et al., 2019)的目标,也是个聪明的设计。

怎么做

CLM 是「按从左到右的顺序预测 token」。PLM 把序列的顺序随机打乱,然后按打乱后的顺序做因果预测。

原序列:    x_1, x_2, x_3, x_4
随机置换:  x_3, x_1, x_4, x_2 (置换后的顺序)

模型按置换后的顺序做因果预测:
  位置 1 预测 x_3 (基于空)
  位置 2 预测 x_1 (基于 x_3)
  位置 3 预测 x_4 (基于 x_3, x_1)
  位置 4 预测 x_2 (基于 x_3, x_1, x_4)

每次训练用一个不同的置换。理论上,这让模型同时学到「双向上下文」(因为不同置换里 x_2 的「左侧」可能是任何其他位置)和「自回归预测」(因果结构保留)。

为什么没赢

PLM 数学上漂亮,但工程上头疼:

  1. 实现复杂:需要 Two-stream attention(query stream 和 content stream)才能正确处理「位置已知但内容未知」的情况。
  2. 训练不稳定:置换让 attention 模式高度不规则,难收敛。
  3. 推理不一致:训练时随机置换,推理时是正常顺序——存在分布漂移。

XLNet 在多项基准上短暂超过 BERT,但很快被 RoBERTa(更大数据训的 BERT)追上。PLM 路线之后基本没人再走。

它的价值是:告诉我们「双向 + 自回归」不是不能兼得,但工程代价太高

7.7 范式对照与 Scaling 视角

把五种主流范式放一起对比:

范式 代表模型 学习信号密度 双向上下文 自然支持生成 Scaling 友好度
MLM BERT ~15% 中(信号密度低)
CLM GPT, Llama 100%
Span Corruption T5 ~15% ✓(编解码) 中(架构复杂)
RTD ELECTRA 100% 中(双网络复杂)
PLM XLNet 100% 低(实现复杂)

Scaling 友好度这一栏是 GPT 路线最终胜出的关键。当你要把模型从 1B 推到 100B、把数据从 100B token 推到 10T token 时,所有「实现复杂、架构特殊、信号密度低」的范式都吃亏。CLM 是唯一一个「100% 信号密度 + 单一架构 + 与生成对齐」的目标——它在 Scaling 法则下边际收益最稳定。

这就是为什么 2020 年之后大模型清一色 CLM。不是 CLM 在 「智能」上更强——给定 100M 参数,它和 MLM/RTD 各有千秋——而是它在「scale 把所有问题压平」的剧本里跑得最远

flowchart LR
  PARAMS[模型参数 1B] --> SCALE
  PARAMS2[模型参数 100B] --> SCALE
  PARAMS3[模型参数 1T] --> SCALE
  SCALE[Scaling 维度] --> CLM_END["CLM<br/>持续受益<br/>涌现能力"]
  SCALE --> MLM_END["MLM<br/>边际效益快速衰减<br/>无法生成限制了应用"]
  SCALE --> T5_END["Span Corruption<br/>架构复杂阻碍 scaling"]

7.8 BERT 输给 GPT:不是性能,是世界观

回顾 2018-2023 这五年,BERT 路线和 GPT 路线之间的对决,最终以 GPT 路线全面胜出。但这场胜利不是「GPT 在某个 benchmark 上压了 BERT 一头」——双方在判别任务上你追我赶很多年。胜利的根源在两条路线的世界观差异

BERT 的世界观:「理解是核心,生成是次要的。把语言压缩成上下文向量、用这些向量做下游分类/检索就够了。」

GPT 的世界观:「生成是核心。能生成意味着能理解(生成正确的下一 token 必须理解上下文),而能理解未必能生成。」

这两种世界观各自合理,但和现实世界对模型的需求对齐度不一样

人类对 AI 的需求是什么?看看 ChatGPT 之后用户实际在用什么:

几乎全部是生成式任务。BERT 在这些任务上完全不可用——它的输出是「位置 i 的 token 概率分布」,不是「连贯的文本输出」。

而判别类任务(情感分类、命名实体识别)虽然在工业里也有需求,但量级和生成式比起来小得多。即使有这些需求,GPT-4 用 zero-shot 能在大部分判别任务上达到 BERT-fine-tuned 的水平——而且不需要为每个任务收集标注数据。

所以这场胜利的本质是:GPT 的世界观(生成是核心)和 AI 实际应用的需求对齐。BERT 在「窄」任务上效率高,但「窄」任务的市场远不如「通用生成」的市场。

这件事从一个特别意外的角度也在工业里得到了印证——Encoder-only 模型仍然活在嵌入领域。BGE、E5、Cohere Embed、OpenAI text-embedding-3 这些今天主流的嵌入模型,几乎全是 BERT 派生(双向 Encoder + 对比学习微调)。在「把句子压缩成定长向量」这件事上,Encoder-only 的双向理解力仍然是最优的。BERT 没有被淘汰,只是被收缩到了它真正擅长的领域。

7.9 后训练范式:从 base 到「能用」的一公里

到这里我们讲的都是预训练——从原始文本里自监督地学习。但只做完预训练的模型(叫 base model)其实不能直接用

举个例子:你给 Llama-3-8B-base(只做了 CLM 预训练)一个 prompt:

"Q: How tall is the Eiffel Tower?"

它可能这样续写:

"Q: How tall is the Eiffel Tower?
Q: When was it built?
Q: Who designed it?
A: 330 meters (1,083 feet)..."

它把整个「问答对」当成一段文本,按统计规律续写——完全没意识到「自己应该回答而不是继续提问」。这是因为 CLM 训练没有「这是一个对话,模型应该回答」的标签。

要让模型「能用」,预训练之后还有一系列后训练(post-training)步骤。这条 pipeline 在 2022-2024 年间成熟,今天主流大模型都按这个流程训练:

flowchart TB
  RAW[原始文本<br/>15T tokens] --> PRE[预训练<br/>CLM 目标]
  PRE --> BASE[Base Model<br/>能续写但不能用]
  BASE --> SFT[SFT<br/>指令微调]
  SFT --> SFT_M[Instruction Model<br/>能听懂指令]
  SFT_M --> RLHF[RLHF / DPO<br/>人类偏好对齐]
  RLHF --> CHAT[Chat Model<br/>真正能用]

Supervised Fine-Tuning (SFT)

第一步是 SFT(监督微调):用人类编写的「指令-响应」对数据,继续在 base 模型上训练。每条数据形如:

[Instruction]: 请简要介绍一下机器学习。
[Response]: 机器学习是人工智能的一个分支... (人类写的高质量回答)

SFT 仍然用 CLM 目标——只在 Response 部分计算 loss。模型学到「当看到这种 Instruction 模板时,应该按这种风格输出 Response」。

SFT 数据量通常是几十万到几百万条人工撰写或精选的高质量样例。

RLHF: 人类偏好的反馈

SFT 之后模型「能听懂指令」,但还不够「好」——它的回答可能罗嗦、可能缺礼貌、可能在敏感话题上越线。要进一步对齐人类偏好,需要 RLHF(Reinforcement Learning from Human Feedback):

  1. 采集人类偏好数据:给同一个 prompt,让 SFT 模型生成多个候选回答;人类标注「我更喜欢哪个」(排序或对比)。
  2. 训练奖励模型:在偏好数据上训练一个 reward model(通常是另一个 Transformer 加一个分数头),输出「这条回答的人类喜爱度」。
  3. 用 RL 优化:把 SFT 模型当成 RL agent,把奖励模型当成 environment 的 reward,用 PPO 等算法优化模型让 reward 最大化。

RLHF 是 ChatGPT 和后续所有顶级聊天模型的关键步骤。Anthropic 的 Claude、OpenAI 的 GPT-4 都做了大规模的 RLHF。

DPO 与新一代对齐方法

RLHF 工程复杂——要训奖励模型、要做 PPO(容易不稳定)。DPO(Direct Preference Optimization, Rafailov et al., 2023)提出了一种简化版:不训奖励模型,直接用偏好数据做监督学习

数学上 DPO 把 RLHF 的 RL 优化转化成一个对比损失:

LDPO=logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))\mathcal{L}_{\text{DPO}} = -\log \sigma\left(\beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right)

其中 ywy_w 是被偏好的回答,yly_l 是被拒绝的回答。模型直接学习「让 ywy_w 的概率比 yly_l 高」。

DPO 工程简单得多(一个标准的 SFT 训练流程就能跑),效果在很多任务上接近 RLHF。今天大量开源模型(Llama-3-Instruct、Mistral-Instruct)实际用的是 DPO 或它的变种(IPO、KTO、ORPO)。

Constitutional AI 与 RLAIF

Anthropic 提出的 Constitutional AI(CAI)走得更远:让 AI 自己生成偏好数据。具体做法是用一组「宪法原则」(constitution)——比如「回答应该有帮助、无害、真诚」——让模型自己评判和修改自己的回答。

这条路线把人工偏好标注成本压到很低,是 Claude 系列的核心训练技术。现在被泛化为 RLAIF(RL from AI Feedback)。

完整的训练 pipeline

把所有阶段放一起:

阶段 目标 数据 数据量 算力占比
Pretraining 学习语言规律 Web/书籍/代码 1T-15T tokens 95%+
SFT 学会听指令 高质量指令-响应对 数十万-数百万条 1-3%
RLHF / DPO 对齐人类偏好 人类偏好对比对 数万-数十万条 1-3%
RLAIF / CAI 进一步对齐 AI 自评数据 大量 可选

预训练算力占绝大头——今天主流大模型(Llama 3、DeepSeek V3)一次预训练要消耗几千万美元的算力,后训练只是其中很小一部分。但「base 到 chat」的这一公里是用户感知质量的核心——同一个 base 模型,后训练做得好和不好可能差出 30% 的胜率。

7.10 一些特别重要的工程经验

经验一:base 模型不需要 finetune 也能很强。GPT-3 之后我们意识到,规模够大的 base 模型用 zero-shot prompt 就能在很多任务上接近 finetuned 模型。这件事从根本上改变了「为每个任务收集标注数据」的传统机器学习范式。

经验二:post-training 不能修补 base 模型的根本能力。如果 base 模型没在预训练里见过某个领域(比如法律、医学),后训练加再多数据也补不上来。预训练阶段的数据覆盖度决定了模型的能力上限——这就是为什么 Llama 3 把训练数据扩到 15T tokens、为什么所有大模型都拼命扫数据。

经验三:SFT 数据质量远重要于数量。LIMA(Zhou et al., 2023)证明用 1000 条精心挑选的高质量 SFT 数据,能训出和用 50000 条普通数据相当的模型。RLHF / DPO 数据同理——人类偏好数据的质量是关键。

经验四:long context 是 post-training 阶段才能稳定的。预训练时通常用较短上下文(如 4K 或 8K)训练,然后在 SFT 阶段用长上下文样本(最高 1M)做继续训练。这是 GPT-4 / Claude 长上下文模型的标准做法。

经验五:能力涌现需要规模。In-context learning、reasoning、tool use 这些 GPT-3 之后的关键能力都是「规模够大才出现」的——10B 模型上几乎没有,100B 模型上明显,1T 模型上更强。这个现象(emergent abilities)是 Scaling 信仰的核心证据。

本章小结

  1. 预训练目标决定模型从原始文本学到什么——MLM 学填空、CLM 学续写、Span Corruption 学恢复、RTD 学判别真伪、PLM 学置换预测。
  2. MLM 和 CLM 的关键差异是学习信号密度——MLM ~15%、CLM 100%。这个差距在 Scaling 时被放大成 GPT 全面碾压 BERT 的根本原因。
  3. CLM 还有四个独立优势:100% 信号密度、无 pretrain-finetune gap、原生支持生成、ICL 自然涌现。
  4. BERT 输给 GPT 不是性能问题,是世界观问题——AI 应用的真实需求 95% 是生成式的,BERT 的「填空」世界观天生不对齐。
  5. Encoder-only 没死,活在嵌入领域——BGE / E5 / OpenAI Embed 等都是 BERT 派生的双向 Encoder,对比学习微调而成。
  6. 完整训练 pipeline = Pretraining + SFT + RLHF/DPO——预训练占 95% 算力但只产出 base,后训练用很少算力把 base 调成「能用」。
  7. DPO / Constitutional AI 在简化 RLHF 的工程复杂度——今天开源模型主流走 DPO 路线。
  8. 能力涌现需要规模——in-context learning、reasoning、tool use 都不是小模型能学出来的,必须 scaling 到 100B 量级。

到这里第三部分完结。我们已经讲清楚了三种架构和七种训练范式——读者应该建立起了 Transformer 设计空间的全景。下一部分(第 8、9、10 章)从纸面走到代码——你将动手用 PyTorch 实现一个 Self-Attention、训练一个能写古诗的 mini-GPT、搭一个生产级的 Tokenizer。

延伸阅读