跳到主要内容

指令微调 — 把续写机改造成答话机

这一章讲三件事: 模型实际读到的「一问一答」长什么样(比你想的机械得多); 训练时怎么保证它学的是「怎么回答」而不是「怎么提问」;以及数据要多少、 要什么质量。读完你会明白:RLHF 的第一步其实非常朴素——朴素到全部难点 都藏在两个工程决定里。

1. 这一章讲什么

第 02 章的菜谱第一格写着「指令微调:约 1 万条一问一答」。这一章拆的就是这一格: 指令微调(instruction fine-tuning,简称 IFT,也叫 SFT——监督微调(SFT,即 supervised fine-tuning),两种叫法 指同一件事):拿一堆「问题 + 好回答」的样本,继续用预训练那个老损失函数(损失函数:衡量「预测差多远」的公式,训练就是让它变小)训练模型, 让它学会以一问一答的格式接话1

它是整个后训练的地基:没有基本的「听指令」能力,后面收集偏好数据、做在线优化 全都无从谈起——你连「让模型生成两条回答」都做不到2

2. 顶层全景与主走查

主走查:跟着一条真实的问答走完「模型到底读到了什么」。问题取自书里的例子: 「How many helicopters can a human eat in one sitting?」(一个人一顿能吃几架 直升机?)——一个故意无厘头的问题,因为无厘头才看得出模板的形状3

模型不读「问题」这个概念,只读 token 序列(token 连成的串,行话叫序列)。给它的一问一答,实际是这么一串 (书里用 ChatML 风格的模板,<|im_start|><|im_end|> 是两个特殊 token):

<|im_start|>system
You are a friendly chatbot who always responds in the style of a pirate<|im_end|>
<|im_start|>user
How many helicopters can a human eat in one sitting?<|im_end|>
<|im_start|>assistant
← 模型从这里开始往下写,一直写到它吐出 <|im_end|> 为止

图说:三个角色各自开一段;最后那个光杆的「assistant」开头
就是给模型的信号——该你说了。

三个角色各司其职4:system 只出现在对话开头,装给模型看的幕后指令(日期时间、 行为补丁、乃至「用海盗口气说话」这种人设),用户看不见;user 是用户说的; assistant 是模型的回答。多轮对话就是这三段的循环铺开——书里的例子接了一句 「Oh just 6.」,然后用户追问「Are you sure about that?」,模板再开一段 assistant5

把训练数据全部打包成这种格式喂下去,模型对它的跟随会精确到条件反射——书里的话是: 这就是指令模型与用户交换信息用的「语言」6

3. 核心原理

3.1 这个模板不是小事:它是对外的接口(接口=模型与外界约定的连接方式)

管理这套格式的代码叫 chat template(对话模板):一段存在 tokenizer 里的小程序, 负责把「消息列表」翻译成 token 序列7。它不是装饰:

  • 训练与使用必须用同一个模板。 训练时怎么包,推理时就得怎么包;格式错一点, 模型立刻退回「续写网页」的旧习性;
  • 模板各家不同。书里给了 Zephyr 的 <|system|>…</s> 和 Tulu 的 <|user|>… 两种变体, 与 ChatML 并存;如今 OpenAI 等厂商在用户可见的 system 消息之上,还有用户看不见的 更高层指令(分层指令体系)8;
  • 它还能扩展出「调工具」(行话叫工具调用)等专用段落——那是第 12 章的事。

3.2 训练本身毫无新意——新意全在掩码

指令微调用的损失函数和预训练一模一样(预测下一个 token)9。真正不同的有四处:

决定预训练指令微调
每批喂多少(这样的一小组,行话就叫)OLMo 2 的 7B 用 1024 条序列同一模型只用到 256 条——后训练的每批小一个量级10
从哪些 token 学每一个 token问题部分的 token 掩掉(prompt masking):模型不从「怎么提问」里学11
多轮对话学哪几轮不适用两派:只学最末那条回答 vs 掩掉用户说的部分、每一轮回答都学12
数据切分文档切碎跨批整条对话为一个样本

顺带把两个格式名词说掉:schema 常用 JSON(一种「键: 值」成对的文本格式)来写。

用 JSON 写的参数格式规范,行话叫 JSON Schema。

「掩码」值得掰开说:训练信号只来自回答的 token,因为我们要的是「教它答」, 不是「教它问」——让它花力气学怎么生成用户的问题,不但浪费,还会学出一身 「自问自答」的怪癖。多轮的两派没有胜负,书里的口径是:掩掉用户轮、学全部 回答轮,能让中间那些回答也被直接训练到;只学最后一轮,则可以把一条长对话 展开成多条训练样本。

3.3 数据:多少、什么质量

书里的四条经验13:

  1. 高质量压倒一切——模型真正学的是回答(completion),回答脏,一切白搭;
  2. 量级:约 100 万条 prompt 就足以支撑一次优秀的后训练,再多收益迅速递减;
  3. prompt 分布要贴着下游任务——想强哪科,就问哪科;
  4. 后面还有多阶段训练时,单阶段的噪音可以被后续阶段修复——整体优化比单点 完美重要。

时间线上的一个转折值得记住:ChatGPT 刚发布那会儿,1 万条级的人写数据集 (No Robots)就是最好水平;几年后,主流最佳实践换成了百万条级的合成数据—— 为什么以及怎么换,第 11 章整章讲14

4. 作者的判断与证据

书里给了证据的部分:小数据也能打——1 万条的人写数据(No Robots、LIMA 一系)曾是 SOTA,有论文可查;OLMo 2 的每批条数出自其公开报告。书里给判断的部分:作者断言 「~1M 是够用的量级」「多阶段能修复单阶段噪音」——这两条是经验法则的口吻,书里 没有给出独立实验,注明为作者的实践判断。

5. 边界与局限

  • 怎么选模板没有定论:书里列了三种模板并存,选哪个、自造行不行,没有给出 判据;
  • 多轮掩码两派均无定论:书里只并列了两种做法,没有给「谁在什么场景下赢」;
  • 指令微调教不会的能力:格式和形式之外的能力(推理、硬技能)主要靠后面的 RLVR 与偏好阶段——这一步造不出聪明,只造得出「像样的一问一答」。

6. 可带走的

  1. 模型读到的一问一答,就是一串带角色标签的 token;system/user/assistant 三段循环;
  2. 训练与推理必须用同一个 chat template,格式一错模型就退化;
  3. prompt masking:只从回答学,不从问题学;多轮对话有「只学末轮」和「全轮回答」 两派;
  4. 损失函数与预训练相同——指令微调的特殊性全在数据和掩码,不在训练方法;
  5. 约 100 万条高质量 prompt 是实践量级,每批喂的条数比预训练小一个量级;
  6. 单阶段有噪音不怕,后续阶段能修——看整体,别抠单步

7. 原文地图

主题原书章原文位置
IFT 的定位与两线汇合Instruction Fine-tuningtext/07-ch04-4-instruction-fine-tuning.txt:32(搜「text-to-text」) · text/07-ch04-4-instruction-fine-tuning.txt:38(搜「foundation for RLHF」)
base 模型的三个特殊 tokenInstruction Fine-tuningtext/07-ch04-4-instruction-fine-tuning.txt:50(搜「beginning-of-sequence」)
chat template 与三角色Instruction Fine-tuningtext/07-ch04-4-instruction-fine-tuning.txt:69(搜「chat template」) · text/07-ch04-4-instruction-fine-tuning.txt:127(搜「system, user, and assistant」)
吃直升机例子的完整序列Instruction Fine-tuningtext/07-ch04-4-instruction-fine-tuning.txt:145(搜「helicopters」) · text/07-ch04-4-instruction-fine-tuning.txt:162(搜「final tokens in the sequence」)
多轮与模板变体Instruction Fine-tuningtext/07-ch04-4-instruction-fine-tuning.txt:174(搜「multiple turns」) · text/07-ch04-4-instruction-fine-tuning.txt:201(搜「ChatML」) · text/07-ch04-4-instruction-fine-tuning.txt:207(搜「Zephyr」)
最佳实践四条Instruction Fine-tuningtext/07-ch04-4-instruction-fine-tuning.txt:270(搜「High-quality data」) · text/07-ch04-4-instruction-fine-tuning.txt:273(搜「~1M prompts」)
小数据时代Instruction Fine-tuningtext/07-ch04-4-instruction-fine-tuning.txt:258(搜「No Robots」)
实现:批大小/掩码Instruction Fine-tuningtext/07-ch04-4-instruction-fine-tuning.txt:296(搜「batch size of 256」) · text/07-ch04-4-instruction-fine-tuning.txt:299(搜「Prompt masking」) · text/07-ch04-4-instruction-fine-tuning.txt:302(搜「Final-turn only」)

Footnotes

  1. 出处:「Instruction Fine-tuning」第 32 段(text/07-ch04-4-instruction-fine-tuning.txt:32,搜「instruction fine-tuning (IFT)」)。原文:IFT「teaches the model to respond in an instruction-response format rather than just continuing text」,别称 supervised fine-tuning。

  2. 出处:「Instruction Fine-tuning」第 38 段(text/07-ch04-4-instruction-fine-tuning.txt:38,搜「Without a basic level」)。原文:没有基本的指令跟随能力,「most of the pipelines we discuss in this book…cannot be performed」。

  3. 出处:「Instruction Fine-tuning」第 145 段(text/07-ch04-4-instruction-fine-tuning.txt:145,搜「helicopters」)与第 133 段(text/07-ch04-4-instruction-fine-tuning.txt:133,搜「friendly chatbot」)。

  4. 出处:「Instruction Fine-tuning」第 127 段(text/07-ch04-4-instruction-fine-tuning.txt:127,搜「system, user, and assistant」)与第 133 段(text/07-ch04-4-instruction-fine-tuning.txt:133,搜「friendly chatbot who always responds」)。

  5. 出处:「Instruction Fine-tuning」第 186 段(text/07-ch04-4-instruction-fine-tuning.txt:186,搜「Oh just 6」)。

  6. 出处:「Instruction Fine-tuning」第 168 段(text/07-ch04-4-instruction-fine-tuning.txt:168,搜「perfect consistency」)。

  7. 出处:「Instruction Fine-tuning」第 195 段(text/07-ch04-4-instruction-fine-tuning.txt:195,搜「piece of Jinja code」)。

  8. 出处:「Instruction Fine-tuning」第 201 段(text/07-ch04-4-instruction-fine-tuning.txt:201,搜「ChatML」)与第 201 段(text/07-ch04-4-instruction-fine-tuning.txt:201,搜「hierarchical system」)。

  9. 出处:「Instruction Fine-tuning」第 305 段(text/07-ch04-4-instruction-fine-tuning.txt:305,搜「Same loss function as pretraining」)。

  10. 出处:「Instruction Fine-tuning」第 296 段(text/07-ch04-4-instruction-fine-tuning.txt:296,搜「batch size of 256」)。原文:OLMo 2 预训练批 1024(7B)/2048(13B),后训练两者都用 256。

  11. 出处:「Instruction Fine-tuning」第 299 段(text/07-ch04-4-instruction-fine-tuning.txt:299,搜「Prompt masking」)。

  12. 出处:「Instruction Fine-tuning」第 302 段(text/07-ch04-4-instruction-fine-tuning.txt:302,搜「Final-turn only」)。

  13. 出处:「Instruction Fine-tuning」第 270 段(text/07-ch04-4-instruction-fine-tuning.txt:270,搜「High-quality data」)至第 273 段(text/07-ch04-4-instruction-fine-tuning.txt:273,搜「~1M prompts」)、第 279 段(text/07-ch04-4-instruction-fine-tuning.txt:279,搜「recover from some noise」)。

  14. 出处:「Instruction Fine-tuning」第 258 段(text/07-ch04-4-instruction-fine-tuning.txt:258,搜「No Robots」)。