指令微调(Instruction Tuning)
一句话 TL;DR:用"指令-回答"格式的数据对预训练模型做 微调,让它学会"听人话、按指令办事"。这是把只会续写的基础模型变成可用 ChatGPT 的关键一步,通常缩写为 SFT(Supervised Fine-Tuning)。
L1 · 一句话点破
指令微调(SFT)的本质是:用人类写好的"问题-标准答案"数据,教预训练模型把"用户提问"正确接续成"高质量回答"。
预训练模型只会"续写":给它"中国的首都是",它接"北京";给它"帮我写首诗",它可能接"帮我写首歌"(继续提问而不是回答)。SFT 教它识别"这是指令,应该回答"这种模式,把续写能力导向"听指令、给答案"的行为。
SFT 是 ChatGPT 三段训练(预训练 -> SFT -> RLHF)的第二段,也是让模型"会说话"的关键。
L2 · 通俗类比
预训练完的模型像一个"读了很多书但不会聊天"的书呆子:
- 你问"法国首都是哪?",他可能续写"德国首都是哪?"(继续出题,像背题库)
- 你说"写首诗",他可能续写"写首词"(机械模仿句式)
他不是没知识,是不知道"被问问题时该回答而不是续写"。
SFT 就是给他做"客服培训":用几万条"问-答"示范,让他学会:
- 看到问题就回答(而不是续写问题)
- 回答要完整、清晰、礼貌
- 不知道就说不知道(而不是编)
培训方式很简单:给他看大量"问:XXX 答:YYY"的范例,让他模仿。培训完,他就从"续写机器"变成"对话助手"。
关键洞察:SFT 教的是"行为模式",不是"新知识"。模型的知识在预训练阶段已经学完,SFT 只是教它"何时该用、怎么用"。
L3 · 正经定义
指令微调(Instruction Tuning / Supervised Fine-Tuning, SFT) 是在预训练模型基础上,用"指令-回答"格式的监督数据继续训练的过程。数据形式:
指令: 把下面英文翻译成中文
输入: Hello world
输出: 你好世界训练目标仍是预测下一个 token,但只在"输出"部分计算损失(输入部分被 mask):
$$ \mathcal{L}{SFT} = -\sum{t \in \text{output}} \log P(y_t | \text{instruction}, y_{<t}) $$
SFT 数据的来源:
- 人工标注:雇佣标注员写高质量"问-答"对(InstructGPT 早期做法)
- 开源数据集:Alpaca、Dolly、FLAN 等公开指令数据
- 合成数据:用强模型(如 GPT-4)生成"问-答"对(Alpaca 用 GPT-3.5 生成 52K 条指令)
- 真实对话日志:用户和模型的真实交互,经过筛选和改写(ChatGPT 后期主要数据源)
数据量通常在万到百万级别,远小于预训练的万亿 token,但质量要求极高--每条数据都要准确、有信息量、风格统一。
参考资料:
- Ouyang et al., 2022 - InstructGPT - ChatGPT 的技术前身,SFT + RLHF 完整链路
- Wei et al., 2022 - FLAN - 指令微调的系统研究
- Taori et al., 2023 - Alpaca - 用 GPT-3.5 合成指令数据
- Chung et al., 2022 - FLAN-T5
L4 · 原理深挖
4.1 SFT 在训什么:行为而非知识
理解 SFT 的关键,是分清"知识"和"行为":
- 预训练:把互联网文本里的事实、语法、世界知识编码进参数。这是"知识"。
- SFT:教模型识别"指令-回答"模式,学会何时回答、怎么回答、什么风格。这是"行为"。
一个直观实验:把 GPT-3(预训练模型)和 ChatGPT(加了 SFT + RLHF)对比,它们的知识量几乎一样(都来自同一份预训练),但行为天差地别--GPT-3 会续写、ChatGPT 会回答。差异不在"知道什么",在"做什么"。
这有两个重要后果:
- SFT 数据不需要海量。行为模式比知识简单,几万到几十万条高质量数据足够。预训练要万亿 token,SFT 只要亿级 token,差三个数量级。
- SFT 数据质量 >> 数量。一条错误的示范会教坏模型,比没有更糟。LIMA 论文(Zhou et al., 2023)证明仅 1000 条极高质量数据就能让模型表现接近 ChatGPT。
4.2 SFT 的训练细节:损失只在输出部分
SFT 看起来像普通的下一 token 预测,但有个关键细节:只在"回答"部分计算损失,"指令"部分不参与。
完整序列: [指令tokens] [回答tokens]
损失计算: 忽略 计算为什么?因为我们想让模型学的是"给定指令,生成回答",而不是"生成指令"。如果指令部分也算损失,模型会花精力学怎么生成指令,偏离目标。
实现上,把指令部分的 label 设为 -100(PyTorch 的 ignore_index),交叉熵损失自动跳过这些位置。
这个细节看似简单,但新手常踩坑:如果整个序列都算损失,模型会退化成"模仿用户提问",而不是"回答问题"。
4.3 SFT 数据的演化:从人工到合成
第一代(2022 年初):人工标注。InstructGPT 用雇佣标注员写约 13K 条高质量"问-答"。质量极高,但成本约几美元一条,难规模化。
第二代(2023 年初):合成数据。Alpaca 用 GPT-3.5 自动生成 52K 条指令数据,成本仅 500 美元,让 Stanford 团队能微调出接近 GPT-3 的模型。这引爆了开源大模型生态。Vicuna、Dolly、OpenAssistant 等跟进。
第三代(2023 年下半年):合成 + 筛选。直接合成数据质量参差,开始用"强模型评分"或"规则过滤"筛选高质量子集。WizardLM、OpenHermes 等用这套方法。
第四代(2024 年):合成 + 多样性 + 对抗。用强模型(GPT-4)生成,配合 Evol-Instruct 等技术自动扩展指令复杂度和多样性。当前开源模型的 SFT 数据多为这种。
关键趋势:真实用户数据回流。ChatGPT 等闭源模型从用户交互中筛选优质对话作为 SFT 数据,这种"真实分布"数据比合成数据更有效。但开源模型拿不到这种数据,是闭源模型的优势之一。
4.4 SFT 的失败模式:过拟合与"学舌"
SFT 看起来简单,但有几个常见失败模式:
① 过拟合到 SFT 数据的风格
如果 SFT 数据全是"礼貌但冗长"的回答,模型会过度礼貌、啰嗦。这是早期 ChatGPT 被吐槽"长篇大论"的原因之一。SFT 数据的风格会被模型放大。
② 学到 SFT 数据的偏见
SFT 数据由标注员或强模型生成,会带入他们的偏见。如果标注员倾向于某种政治立场或回答风格,模型会继承。这是 SFT 数据需要"多样性"的原因。
③ 灾难性遗忘
SFT 更新参数会让模型"忘了"预训练学的一些能力。全量 SFT 比较严重,LoRA SFT 较轻。这也是为什么现代 SFT 倾向用 LoRA。
④ 学舌而非理解
低质量 SFT 数据下,模型学到的是"模式匹配"而非"理解指令"。表现为:换个问法就答错、无法泛化到没见过的指令类型。解法是数据多样性 + 复杂度梯度。
4.5 SFT vs RLHF:分工而非替代
SFT 和 RLHF 不是替代关系,是接力:
| 阶段 | 目标 | 数据 | 教什么 |
|---|---|---|---|
| 预训练 | 知识 | 万亿 token 无标注 | 语言、世界知识 |
| SFT | 行为 | 万-百万条"问-答" | 听指令、给答案 |
| RLHF | 偏好 | 万-十万条"偏好对" | 哪个回答更好 |
SFT 教"怎么回答",RLHF 教"哪种回答更好"。SFT 后的模型已经能对话,但可能输出有害、错误、啰嗦的内容;RLHF 进一步对齐到人类偏好(有用、无害、诚实)。
DPO(Direct Preference Optimization, Rafailov et al., 2023)是 RLHF 的简化版,跳过 reward model 直接用偏好对优化,成为当前开源模型主流。但 SFT 阶段不可省略--没有 SFT 的基础模型无法直接做 DPO。
L5 · 沿革与坑
沿革
- 2022 年 3 月:OpenAI 发表 InstructGPT(Ouyang et al.),系统描述 SFT + RLHF 链路。这是 ChatGPT 的技术基础,但当时反响一般。
- 2022 年 4 月:Google 发表 FLAN(Wei et al.),系统研究指令微调,证明 SFT 能让模型泛化到没见过的任务。
- 2022 年 11 月:ChatGPT 发布。GPT-3.5 + SFT + RLHF 的产物,引爆全球。SFT 从学术概念变成大众认知。
- 2023 年 3 月:Stanford Alpaca 用 GPT-3.5 合成 52K 指令数据,微调 LLaMA-7B 接近 GPT-3 效果,成本仅 500 美元。开源大模型 SFT 范式确立。
- 2023 年下半年:Vicuna、WizardLM、OpenHermes 等开源模型用合成 + 筛选数据持续改进 SFT。
- 2024 年:SFT 数据趋于成熟,焦点转向数据多样性、复杂度梯度、真实数据回流。
常见误解
❌ 误解:SFT 教模型新知识。 ✅ 真相:SFT 教行为,不教知识。模型的知识来自预训练。想注入新知识应该用 RAG 或继续预训练,SFT 不擅长这个(见 4.1)。
❌ 误解:SFT 数据越多越好。 ✅ 真相:SFT 数据质量 >> 数量。LIMA 用 1000 条极高质量数据效果接近 ChatGPT。低质量数据多了反而教坏模型(见 4.1)。
❌ 误解:SFT 和 RLHF 二选一。 ✅ 真相:它们是接力关系。SFT 教"怎么回答",RLHF 教"哪种更好"。SFT 不可省略,RLHF 在 SFT 基础上做(见 4.5)。
❌ 误解:用 GPT-4 合成数据 SFT 后,小模型就等于 GPT-4 了。 ✅ 真相:小模型只能学到 GPT-4 回答的"风格和模式",学不到 GPT-4 的"知识和推理能力"(这些来自 GPT-4 的参数规模和预训练)。蒸馏有上限,不要指望 7B 模型 SFT 后真的匹敌 GPT-4。
❌ 误解:SFT 就是"用对话数据训练"。 ✅ 真相:SFT 的关键是"指令-回答"格式和"只在输出算损失"。随便喂对话数据不算 SFT,可能教出乱七八糟的行为。格式和损失计算细节决定成败(见 4.2)。
面试怎么考
- "什么是 SFT?它和预训练的区别?" --必考。预训练教知识,SFT 教行为(见 4.1)。
- "SFT 的损失函数怎么设计?为什么只在输出部分算损失?" --关键细节(见 4.2)。让模型学"给定指令生成回答",而不是"生成指令"。
- "SFT 数据量大概多少?为什么这么少?" --万到百万级。行为比知识简单,质量优先于数量(见 4.1)。
- "SFT 数据来源有哪些?" --人工标注、开源数据集、合成数据、真实对话回流(见 L3 + 4.3)。
- "Alpaca 为什么重要?" --用 GPT-3.5 合成 52K 指令数据,500 美元微调出接近 GPT-3 的模型,引爆开源生态(见 4.3)。
- "SFT 和 RLHF 的关系?" --接力关系。SFT 教怎么回答,RLHF 教哪种更好(见 4.5)。
延伸阅读
- 📄 Ouyang et al., 2022 - InstructGPT - SFT + RLHF 完整链路
- 📄 Wei et al., 2022 - FLAN - 指令微调系统研究
- 📝 Stanford Alpaca - 合成数据 SFT 的里程碑
- 📄 Zhou et al., 2023 - LIMA - 1000 条数据的奇迹
- 📄 Chung et al., 2022 - FLAN-T5
- 🚀 进阶专题·对齐:SFT 监督微调 -- 本词条讲指令微调的轮廓,进阶专题把 SFT 的 loss masking / 数据构造 / 过拟合坑拆到骨头