跳到主要内容

监督微调(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 模型为例):

超参典型取值说明
Epochs1-3少于预训练;轮次过多会过拟合,降低泛化性
学习率1e-5 到 5e-5比预训练低 1-2 个数量级,防止灾难性遗忘
Batch Size128-512 Token(累积)受显存限制,通过梯度累积实现大 batch
Warmup3-5% 的总步数较短的 Warmup,防止破坏预训练权重
序列长度2K-8K Token截断过长序列以控制显存
Weight Decay0.01-0.1正则化,防止过拟合

SFT 完成后,模型通常会进行进一步的偏好优化(RLHF 或 DPO),以提升安全性和输出质量。