监督微调(SFT)
监督微调(Supervised Fine-Tuning,SFT)是将预训练语言模型从"预测下一个 Token 的机器"转化为"有用对话助手"的关键步骤。通过在精心构建的指令-回答数据集上微调,模型学会理解和遵循用户指令。
SFT 的目的
预训练完成的 LLM 本质上是一个语言概率模型:给定上文,它会预测最可能出现的下一个 Token。这意味着:
- 如果输入"如何制作炸弹",模型可能生成相关技术内容(因为互联网上确实存在此类文本)
- 如果输入"翻译以下文本:Hello World",模型可能继续生成更多英文文本而非翻译
- 模型没有"助手"角色意识,不会自然地回答问题
SFT 的目标是通过监督训练,让模型:
- 理解"指令"的概念,并遵循指令执行任务
- 以对话助手的角色和语气回应用户
- 拒绝有害请求,输出符合人类期望的内容
- 保持一定的格式规范(结构化输出、列表、代码块等)
指令微调数据格式
SFT 数据以"对话轮次"为单位组织,通常包含三个角色:
ChatML 格式(OpenAI,Qwen 使用)
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
请解释量子纠缠的概念。<|im_end|>
<|im_start|>assistant
量子纠缠是量子力学中...<|im_end|>
LLaMA 2 / LLaMA 3 格式
<s>[INST] <<SYS>>
You are a helpful assistant.
<</SYS>>
请解释量子纠缠的概念。 [/INST]
量子纠缠是量子力学中... </s>
训练时的损失计算
SFT 与预训练的关键区别在于哪些 Token 计算损失:
- 预训练:所有 Token 都计算损失(语言模型损失)
- SFT:通常只对 Assistant 部分的 Token 计算损失,System 和 User 部分的 Token 作为输入上下文,不计入损失
这样做的原因:让模型学习"如何回答",而非学习"如何提问"。
数据来源
1. 人工标注(最高质量)
- 雇佣专业标注员(通常要求本科及以上学历,特定领域需专业背景)
- 标注员直接编写高质量的指令-回答对
- 成本最高,但质量最可控
- OpenAI 的 InstructGPT 使用约 40 名专业标注员
2. GPT 蒸馏(知识蒸馏)
- 调用 GPT-4 等强大模型生成回答,作为微调数据
- 成本远低于人工标注
- 法律风险:OpenAI 服务条款禁止用 ChatGPT 输出训练竞争模型
- 代表数据集:Alpaca(使用 GPT-3 text-davinci-003 生成),Vicuna 数据集
3. Self-Instruct
- 由 Wang 等人(2022)提出,让模型自己生成指令数据
- 流程:种子指令(175 条)→ 模型生成更多指令和回答 → 过滤低质量数据 → 迭代
- 不依赖外部 API,完全自洽
- 质量参差不齐,需要严格的质量过滤
4. 人工精选开源数据
- ShareGPT:用户自愿分享的真实 ChatGPT 对话,包含大量高质量多轮对话
- OpenAssistant(OASST1/2):志愿者协作构建的多语言对话数据集
- Dolly(Databricks):1.5 万条由 Databricks 员工编写的高质量指令数据
- LIMA(Meta):1000 条精心挑选的高质量样本,证明"少而精"的有效性
代表性数据集
FLAN(Fine-tuned Language Net)
Google 于 2021-2022 年提出的指令微调数据集系列:
- 覆盖 1800+ 任务(NLP 任务的统一指令化)
- 证明了指令多样性对零样本泛化的重要性
- FLAN-T5 系列是学术界最重要的开源指令模型之一
Alpaca
Stanford 基于 Self-Instruct 方法,用 GPT-3 生成的 52K 指令数据集:
- 总成本约 600 美元,展示了低成本 SFT 的可行性
- 在 LLaMA 7B 上微调,效果接近 GPT-3.5(早期)
- 引发了大量低成本 SFT 实验热潮
Chat 模板的重要性
不同模型使用不同的 Chat 模板(对话格式),使用错误的模板会严重影响模型性能:
- 模型在 SFT 时对特定格式的 Token 形成强烈条件反射
- 使用 Hugging Face
tokenizer.apply_chat_template()方法可自动获取正确格式 - 推理时必须与训练时格式完全一致
全量微调 vs 参数高效微调(PEFT)
SFT 的实现方式分为两类:
全量微调(Full Fine-tuning)
- 更新模型的所有参数
- 效果最好,可充分适配新任务
- 资源需求:7B 模型约需 4-8 块 A100(80GB),70B 模型约需 32 块 A100
- 耗时长,适合资源充足的场景
参数高效微调(PEFT)
- 只更新少量参数(通常不到 1% 的总参数量)
- LoRA、Adapter、Prefix Tuning 等方法
- 可在消费级 GPU(如 RTX 4090)上微调 7B 模型
- 详见 LoRA 与参数高效微调章节
SFT 数据量与质量的权衡
LIMA 论文(Meta,2023)的核心发现:"1000 条精心挑选的高质量样本,可达到与大量低质量数据相当甚至更好的效果"。
这揭示了 SFT 中"质量 >> 数量"的规律:
- 低质量数据(如格式错误、内容矛盾、回答肤浅)会"污染"已从预训练中学到的知识
- 高质量数据(如逻辑清晰、内容准确、格式规范)能有效"激活"预训练中潜在的能力
- 因此 SFT 数据量通常在 1 万到 100 万条之间,远小于预训练数据量
关键训练超参
SFT 的关键超参设置(以 7B 模型为例):
| 超参 | 典型取值 | 说明 |
|---|---|---|
| Epochs | 1-3 | 少于预训练;轮次过多会过拟合,降低泛化性 |
| 学习率 | 1e-5 到 5e-5 | 比预训练低 1-2 个数量级,防止灾难性遗忘 |
| Batch Size | 128-512 Token(累积) | 受显存限制,通过梯度累积实现大 batch |
| Warmup | 3-5% 的总步数 | 较短的 Warmup,防止破坏预训练权重 |
| 序列长度 | 2K-8K Token | 截断过长序列以控制显存 |
| Weight Decay | 0.01-0.1 | 正则化,防止过拟合 |
SFT 完成后,模型通常会进行进一步的偏好优化(RLHF 或 DPO),以提升安全性和输出质量。