一、预训练模型,到底"想说什么"

设想一个刚训练完预训练阶段(第 13–15 讲)的模型——业内把这种模型叫基础模型(base model)。给它一个问题:“什么是光合作用?”

⭐ 回忆第 1 讲的核心警告:预训练的目标函数只有一个——让续写在统计上尽量合理,它从来没有被教过"看到问题就该直接给出答案"这件事。互联网上包含"什么是光合作用?“这句话的文本,统计上最常见的后续内容,可能是更多类似的问题(比如一份生物课复习题列表),也可能是论坛里另一个人的追问,甚至是这句话原封不动地重复出现在另一处——“给出一个直接、有帮助的回答"只是众多统计上合理的续写方式之一,不是被特别标记出来、优先选择的那一种。

这一讲要解决的问题就是:怎么让模型知道,看到一个问题,正确的行为是像一个助手那样直接、有帮助地回答,而不是随便续写下去。

二、打个比方:博览群书的应届生

想象一位应届毕业生,读过图书馆里几乎所有的书,知识面极其广博。但他从没做过客服工作——第一天上岗接到客户提问,他可能会滔滔不绝地讲一大段背景知识,或者顺着话题扯到别的地方,因为没有人具体教过他"客户问了这句话,标准的回应方式应该是什么样子”。

知识(读过的书)和该怎么应对具体场景(客服的应答方式)是两件不同的事——前者靠博览群书积累,后者需要几段实际的示范和练习。SFT 要做的,正是给这位博览群书的应届生,配上一批"客户这样问,你应该这样答"的实际范例,让他在已有的广博知识基础上,学会这个具体的应对方式。

三、把直觉钉成机制

SFT 数据:真正意义上的监督数据

第 13 讲对比过监督学习和自监督学习:预训练的"标签"是从文本自身的顺序里免费凿出来的(自监督);SFT 用的是真正意义上的监督数据——由人工准备的一批 (指令, 理想回答) 配对,每一条里的"理想回答”,是人工编写或者人工审核筛选过的、代表"一个助手应该这样回答"的高质量示范。

SFT(Supervised Fine-Tuning,监督微调):在已经完成预训练的模型基础上,用人工准备的"指令-回答"配对数据继续训练,让模型学会以助手的身份、按预期的格式回应用户输入。

数据格式:把第 11 讲的伏笔变成具体做法

第 11 讲讲过一个例子——把翻译任务拼接成"把这句话翻译成英文:你好。答案是:Hello"这样一整段文本,“只在’答案是:‘之后的部分计算损失”。这正是 SFT 数据实际的组织方式:把用户的指令和助手的理想回答,用特殊的分隔标记拼接成一整段文本,让模型清楚地知道"哪部分是别人说的,哪部分该是我说的"。

训练机制:和第 13 讲完全相同,只改了两件事

SFT 的训练循环,和第 13 讲讲的预训练一模一样——同一个 Decoder-only 模型,同一套教师强制(第 13 讲),同一个交叉熵损失(第 4、6 讲),同一套梯度下降更新参数(第 6 讲)。唯一变化的是两件事:数据的来源,和损失计算的范围。

用一个具体例子把"损失计算的范围"讲清楚。指令是"翻译成英文:你好",理想回答是"Hello",拼接成一段 7 个 token 的序列(<sep> 是标记"用户说完了,该助手说话了"的特殊分隔符):

位置:  1     2    3     4    5     6      7
token: 翻译  成   英文  :   你好  <sep>  Hello

按第 13 讲教师强制的做法,每个位置都要预测紧跟着的下一个 token,但只有目标 token 落在"助手该说的部分"时,才计算损失:

位置 当前上下文 要预测的下一个 token 这个 token 属于谁说的 计算损失吗
1 “翻译” “成” 用户的指令 ✗ 不计算
2 “翻译成” “英文” 用户的指令 ✗ 不计算
3 “翻译成英文” “:” 用户的指令 ✗ 不计算
4 “翻译成英文:” “你好” 用户的指令 ✗ 不计算
5 “翻译成英文:你好” <sep> 该轮到助手开口了 ✓ 计算
6 “…你好<sep>” “Hello” 助手的回答 ✓ 计算

⭐ 前四个位置虽然也被喂给了模型(第 13 讲讲过,整段文本一次性输入),但预测"用户接下来会打什么字"这件事,完全不是训练的目标,不计算损失——训练真正要教会模型的,只有"轮到我说话时,该说什么"这一件事,对应表格里最后两行。这正是第 11 讲那句"只在答案部分计算损失"的完整实现方式。

“微调"这个词,到底"微"在哪

⚠️ 这里要纠正一个常见的误解:SFT 的主要作用不是给模型灌注新知识。模型绝大部分的知识和语言能力,来自第 13、14 讲讲的预训练——那是在海量、多样的文本上完成的。SFT 用的数据量,相对预训练而言小得多(人工准备高质量的示范数据成本很高,不可能做到预训练那种互联网规模),训练消耗的计算量也小得多——这正是"微调"这个词的字面含义:在一个已经具备海量知识的模型基础上,用相对小规模、但高度有针对性的数据,快速调整模型的"行为方式”,而不是重新灌注知识。

⭐ 用一句话概括这个分工:预训练决定模型"知道什么",SFT 决定模型"该怎么说"。

四、这一讲机制自带的代价

⚠️ SFT 数据的规模和质量,都受限于人力成本——高质量的示范回答需要人工编写或者仔细审核,这比预训练数据的自动化抓取(第 14 讲)昂贵得多。这直接决定了 SFT 数据集的规模,天然远小于预训练数据集,也让"数据质量"这个第 14 讲讨论过的问题,在 SFT 阶段变得更加关键——每一条数据的"含金量"都比预训练阶段的一段网页文本高得多。

⚠️ SFT 本质上是模仿学习,模型学到的好坏,取决于被模仿的示范本身的质量——如果某类问题人类专家给出的示范回答本身参差不齐甚至有错误,模型会原样继承这些问题,这是第 14 讲"垃圾进、垃圾出"在 SFT 阶段的翻版,只是这里的"数据"从海量网页变成了少量但更贵的人工示范。

⭐⭐ SFT 没有"哪个回答更好"这个概念,这是它留给下一讲最大的空白——SFT 的每一条数据都是"要么完全模仿这个示范,要么不参考",这种训练方式里,不存在"这个回答尚可、那个回答更好"这种相对优劣的信号。如果同一个问题存在多个都还不错、但有优劣之分的候选回答,SFT 这套机制没有办法把这种"更好一点"的信息喂给模型——它只能告诉模型"应该长这样",没法告诉模型"在几个还不错的选项里,哪个更受欢迎"。这个空白,正是第 17 讲 RLHF 要专门填补的地方。

⚠️ 训练过头有过拟合的风险:因为 SFT 数据规模远小于预训练,如果训练迭代次数过多、学习率设置不当,模型有可能只是"记住"了 SFT 数据集里具体的问答样例,而没有学到更泛化的"该怎么组织一个回答"这种行为模式——这是需要小心控制的训练超参数问题,回应第 13 讲提到的训练规模讨论。

五、和后面课程的关系

  • 第 17 讲(RLHF)要填补这一讲第四节留下的空白:用人类对多个候选回答的相对偏好(这个比那个好),而不是单一的模仿目标,进一步调整模型。
  • **第 18 讲(DPO)**是另一种利用偏好数据训练模型的方法,目标和 RLHF 类似,但训练机制不同,同样建立在这一讲讲的 SFT 基础之上。
  • **第 25–28 讲(Agent 与工具调用)**要训练的那些能力,数据格式本质上是这一讲讲的思路的扩展——只是"用户输入"和"助手该输出"的内容,从普通问答换成了工具调用的格式。

六、本讲小结

  • 预训练只教会模型"续写统计上合理的文本",不教会它"像助手一样直接回答问题"——这是 SFT 存在的根本原因。
  • ⭐ SFT 数据是真正意义上的监督数据:人工准备的指令-回答配对,代表"助手应该这样回答"的示范。
  • 训练机制和第 13 讲的预训练完全相同(同一个模型、教师强制、交叉熵损失、梯度下降),唯一的区别是数据来源和损失计算的范围——本讲用一个具体例子验证了"只在助手该说的部分计算损失"这句话的精确含义。
  • ⭐ “微调"的含义:预训练决定模型"知道什么”(海量、廉价的自监督数据),SFT 决定模型"该怎么说"(少量、昂贵的人工示范)——两者分工明确。
  • ⭐⭐ SFT 没有"相对优劣"的信号——它只能模仿"应该长这样"的单一范例,没法表达"这个比那个更好",这正是第 17 讲 RLHF 要解决的问题。

思考题

  1. 为什么说预训练模型收到"什么是光合作用?“这个问题时,最统计合理的续写不一定是一个直接的回答?请举一个你觉得互联网上更常见的续写方式(提示:想想包含这句话的网页最可能是什么类型)。
  2. 本讲第三节的表格里,如果把损失计算范围扩大到全部 6 个位置(包括预测用户指令部分的 token),这样训练出来的模型,会额外多学到什么行为?这是不是我们想要的?
  3. 结合"预训练决定知道什么,SFT 决定怎么说"这句话,如果一个模型在 SFT 阶段第一次接触到某个它在预训练阶段从没见过的具体事实,SFT 训练能不能让模型"学会"这个事实?为什么(提示:SFT 数据的规模和预训练相比)?
  4. 为什么说"SFT 没有相对优劣的信号”?如果对同一个问题,SFT 数据集里恰好收录了两条质量不同、但都还算合理的回答示范,模型分别学习这两条数据时,会不会意识到"这两条里有一条更好"?
  5. 如果 SFT 阶段的训练数据里,某一类问题的示范回答格式高度一致(比如全部以"根据我的分析"开头),你觉得模型会不会把这种表面的格式特征也一起学进去?这对第 14 讲讲的"数据分布决定模型性格"这句话是不是一个新的例证?