Chapter 01
全景与核心词汇
起点页给了一张流水线地图。这一章把地图坐实:拆开三个阶段、认清它们共用的同一台"学习机器"、并把全书的核心分界——能力 vs 对齐——立起来。后面三章是这张地图上的三段放大。
本章你将建立的 schema
- 一个对话模型的"出厂流程"分三段:预训练 → SFT → 偏好优化,各改变什么
- 三段共用同一台机器:把文本切成 token,预测下一个,用交叉熵算错得多离谱,再用梯度往回修
- 贯穿全书的分界:能力(预训练给)vs 对齐(后训练给),以及这条线 2025 年后为何开始模糊
1.1一封邮件的来历:三个阶段
对着一个对话模型输入"帮我给房东写封催修水管的邮件,语气客气但坚定",它几秒钟就给你一封像模像样的邮件。这个能力不是一次训练出来的,而是三个性质完全不同的阶段叠出来的。倒过来看,每一阶段贡献了这封邮件的不同侧面:
- 它认识"水管""房东""催修"这些词,知道一封邮件长什么样、客气的中文怎么说——这些来自预训练:模型把几乎整个互联网的文本压进了参数里,语言、常识、格式都在这一步成形。
- 它听懂了"帮我写"是一条要执行的指令,而不是一段要续写的文本——这来自 SFT(监督微调):有人给它看了大量"指令 → 理想回答"的范例,它学会了"看到请求就给回应"这种对话姿态。
- 它没有写得啰嗦冗长、没有夹带攻击性、在"客气但坚定"之间拿捏得当——这来自偏好优化(RLHF / DPO 等):人类对"哪个回答更好"做了大量比较,模型被推着往人更喜欢的那种风格走。
三个阶段,三种数据,三个不同的训练目标。把它们当成同一件事("训练让模型变好")是初学者最大的误区,也是后面所有困惑的来源。先把这张顺序图刻进脑子:
能不能一步到位,直接拿"指令→好回答"的数据从头训练?理论上可以,现实中行不通:高质量标注数据只有百万量级,而模型要先掌握语言和常识,需要的是万亿量级的文本。用昂贵的小数据学不出能力,用免费的大数据学不出对齐——分段,本质是让每种数据各司其职。
1.2同一台机器:预测下一个 token
三个阶段表面各异,底层是同一台机器:把文本切成 token,让模型预测下一个,用交叉熵衡量预测错得多离谱,再用梯度把参数往"少错一点"的方向推。
如果不先认清这台共用的机器,你会把预训练、SFT、RLHF 当成三种互不相干的黑魔法。认清之后,三章的区别会收敛成一句话:"它们只是在同一台机器上换了不同的 loss 和数据。"
四个零件
Token:模型不直接看字符,先把文本切成 token(子词单元)。"水管"通常是 1 个 token,"catastrophic" 会被切成 cata + strophic 两个。一个模型的词表通常有 5 万–15 万个 token,每个 token 对应词表里的一个编号。
预测下一个 token:给定前面的 token 序列,模型输出一个覆盖整个词表的概率分布——"下一个 token 是 的 的概率 0.31,是 和 的概率 0.08……"。这就是它做的唯一一件事。生成一段话,就是反复"预测下一个、采样、接上、再预测"。
交叉熵 loss:训练时,正确的下一个 token 是已知的。交叉熵 loss 就是 −log P(正确 token):模型给正确 token 的概率越高,loss 越小;如果它给正确 token 只分了 0.01 的概率,loss = −log(0.01) ≈ 4.6,很大,说明错得离谱。
梯度下降:loss 对每个参数求偏导,得到"把这个参数往哪调能让 loss 变小"的方向,再走一小步。几万亿 token 看下来,参数被推到一个能很好预测文本的状态——而"能很好预测文本"这件事,逼着模型内部长出了语法、事实、甚至推理的结构。
要在海量真实文本上把"下一个 token"预测准,模型被迫学会的远不止接词。要续写"法国的首都是____",它得存下事实;要续写"已知 x+3=7,则 x=____",它得会算;要续写一段对话,它得建出人物的意图模型。预测下一个 token 是个幌子,背后是"把世界压缩进参数"——压缩得越好,预测越准,loss 越低。这就是为什么一个看似无聊的目标能长出推理能力。
训练文本里有一句"巴黎是法国的首都"。模型在"巴黎是法国的"之后,对正确 token 首都 给出概率 0.6。这一步的交叉熵 loss 约是多少?如果它给的是 0.6 但正确答案其实是别的词,梯度会把"首都"的概率往上推还是往下压?
展开答案(先停 10 秒再点)
loss = −log(0.6) ≈ 0.51。这是个不算大的 loss——模型已经比较确信了。
梯度永远朝"让实际正确的那个 token 概率更高"的方向推。如果正确答案是"首都",就把"首都"往上推、其余往下压;如果语料里正确答案其实是别的词,那就把那个别的词往上推、"首都"往下压。模型不在乎"事实对不对",只在乎"语料里下一个 token 是什么"——这一点在第 3 章会变成"教模型幻觉"的根源。
1.3能力 vs 对齐:全书的分界线
这是整份教程最该先立住的一条分界。跨过它,后面所有内容会各就各位;跨不过,你会反复在"微调能不能加知识""RLHF 是不是让模型变聪明"这类问题上栽跟头。
能力(知识、推理、语言)几乎全部在预训练阶段灌进参数;后训练几乎不再增加能力,只是把已有的能力对齐成人类想要的行为(听话、有用、无害、风格好)。
一个刚预训练完的基座模型,其实"什么都会",但你没法好好用它。给它输入"法国的首都是哪里?",它往往不回答你,反而续写出"法国的首都是哪里?这是一道常见的地理题。德国的首都又是哪里?……"——因为在它见过的网页里,一个问句后面接的往往是更多问句,而不是答案。它知道巴黎(能力在),但不知道你想要它回答(行为没对齐)。
SFT 和偏好优化做的,就是把这个"什么都会但不好好说话"的模型,调成"好好回答、好好做事"。关键在于:它们动的是行为,几乎不动知识。这条不对称,是图 1.2 要让你一眼记住的:
"公司有很多内部文档,微调一下模型就能让它学会这些知识。"——这句话把"行为条"的工具用在了"能力条"的目标上。后训练这点数据量根本灌不动预训练占满的知识条;强行用它灌新知识,多半的结果是模型学会了"自信地编"(第 3 章详述)。要灌事实,用 RAG(检索);要调行为,才用微调。
1.4三种存档点:base / instruct / reasoning
流水线上每跑完一段,就存一个模型存档点。你在 Hugging Face 上看到同一个模型名后面跟着 -base / -instruct / 或带"思考"标记,指的就是它停在了哪一段。对同一个 prompt,三种存档点的反应截然不同:
| 存档点 | 停在哪一段 | 典型反应 | 怎么来的 |
|---|---|---|---|
| Base 基座模型 | 预训练后 | 续写而非回答:倾向于续接"?这是一个有趣的数学问题。9.12 和 9.10 哪个大?" | 只学了预测下一个 token |
| Instruct 指令模型 | + SFT(+ 偏好优化) | 直接回答,但常答错:"9.9 更大"或"9.11 更大"全凭直觉,不展开 | 额外学了"听指令、好好说话" |
| Reasoning 推理模型 | + 可验证奖励 RL | 先在"草稿"里逐位比较小数 0.11 vs 0.90,自行纠错,再给"9.9 更大" | 额外用 RLVR 训出长链思考(第 4 章) |
这三个名字会贯穿全书。一句话记忆:base 有能力但不听话,instruct 听话但不一定深思,reasoning 会先想再答。注意 reasoning 模型是 2024 年底才规模化的新存档点——它的存在本身,就是图 1.2 那条红色小段被撬动的证据。
1.5反复出现的动作:把目标变成 loss
本章开头说三段共用同一台机器。那台机器只会做一件事:最小化一个 loss。所以每个阶段真正的设计难题,是把这个阶段"想要的东西"翻译成一个能求导的 loss。这恰恰是难点所在——"预测准下一个词"很容易写成 loss,但"回答得有用、无害"压根不是一个能直接求导的函数。
下面这张表是后面三章的总地图。现在表里的名词(KL、奖励模型、价值网络)你还不认识,没关系——把它当成一张"待填的地图",每读完一章回来看一眼,就会多懂一行。读全书时,反复问自己:这个阶段在最小化哪个 loss?信号从哪来?
| 阶段 | 优化的 loss(直觉) | 训练信号从哪来 | 几个模型在显存里 |
|---|---|---|---|
| 预训练(第 2 章) | 交叉熵:−log P(下一个 token) | 文本自身(自监督,无需标注) | 1 |
| SFT(第 3 章) | 同样的交叉熵,但只在"回答"部分计算 | 人写或合成的"指令→回答" | 1 |
| RLHF / PPO(第 4 章) | 最大化 奖励 − β·KL(别跑太远) | 用偏好数据训出的奖励模型打分 | 4(策略/参考/奖励/价值) |
| DPO(第 4 章) | 偏好对上的逻辑回归 loss | 偏好数据,直接用,不训奖励模型 | 2(策略/参考) |
| RLVR / GRPO(第 4 章) | 最大化 可验证奖励(答案对/错) | 确定性验证器(数学答案、代码测试) | 2–3(无价值网络) |
看这张表的"几个模型在显存里"一列:从预训练的 1 个,到 RLHF 的 4 个,再被 DPO 和 GRPO 砍回 2–3 个——后训练这十年的算法演进,很大一部分就是在和这个数字较劲。读完第 4 章,你能讲清每一个数字为什么是它。
§本章 self-check
先合上下面的答案,把你能想到的写在纸上或编辑器里。写完再点开对照——直接点开等于把这一节当再读一遍。
- 一个基座模型"知道"巴黎是法国首都,为什么直接问它"法国首都是哪?"它却往往不回答、反而续写更多问句?
- 用一句话说出预训练和 SFT 在训练机器上的唯一区别(提示:不是数据,是 loss 在哪里算)。
- 交叉熵 loss
−log P(正确 token):当模型给正确 token 的概率从 0.9 掉到 0.1,loss 大约从多少变到多少?这说明 loss 对"很自信却错了"惩罚是轻还是重? - "在公司文档上微调模型来让它掌握这些知识"这个计划,错在把哪条进度条的工具用在了哪条进度条的目标上?正确做法的方向是什么?
答案(先做完再展开)
- 因为基座模型只学过"预测下一个 token"。在它见过的网页里,一个问句后面接的常常是更多问句或题目解析,而不是直接答案。它有知识(能力),但没学过"被提问时应当回答"这种行为(对齐)。回答这个行为是 SFT 教的。
- 预训练在所有 token 上计算交叉熵 loss;SFT 用同样的交叉熵,但只在"回答"部分的 token 上计算(指令部分的 token 被掩码、不算 loss)。机器没变,只是 loss 算在不同位置——细节见第 3 章。
- loss 从 −log(0.9)≈0.105 变到 −log(0.1)≈2.303,涨了约 22 倍。−log 在概率趋近 0 时急剧增大,所以"很自信却把正确答案的概率压得很低"会被重罚。这正是模型有动力别太离谱的原因。
- 把"行为条"的工具(微调)用在了"能力条"的目标(灌知识)上。后训练的数据量灌不动预训练占满的知识条,还容易训出"自信地编"。要加可更新、可溯源的事实,方向是 RAG(检索增强);微调留给调行为/格式/风格。
如果只能保留一个阶段
假设算力被砍到只够做一个训练阶段,但你必须交付一个"能直接回答用户问题"的模型。你会保留预训练,还是保留 SFT?两个选择各自会得到一个什么样的残废模型?这道题没有标准答案,但想清楚它,你就真正理解了"能力"和"对齐"哪个是地基、哪个是装修。
提示(卡住再展开)
问自己:跳过预训练直接 SFT,模型连语言都没学会,再多"指令→回答"范例能教会它什么?反过来,只预训练不 SFT,模型有满脑子知识却不肯好好回答——但你能不能用 prompt 技巧(比如给它几个"问→答"的例子让它续写)骗它进入回答模式?这就指向了地基与装修的区别。