🎓 SFT(有监督微调)
一、什么是 SFT?
SFT(Supervised Fine-Tuning,有监督微调) 是在预训练模型的基础上,使用人工标注的(输入,输出)对进一步训练模型的过程。
- 输入:通常是一条指令(Instruction)或问题(Prompt)。
- 输出:人类期望模型给出的正确回答。
经过 SFT,模型从“只会接话茬”转变为“能听懂人话、按指令办事”。
🧱 类比:预训练模型像一个读完整个图书馆的“天才书生”,他知道很多知识,但不会答题。SFT 就像让一位老师给他做“模拟考试”,每道题都告诉他标准答案,他学会了解题套路。之后,你再问他问题,他就能直接回答,而不是接话茬。
二、为什么需要 SFT?
2.1 预训练模型的根本问题:只会“接话茬”
PDF 第 83 页明确指出:
“预训练模型(Pretrain)说起话来非常像‘接话茬’,并不是在‘做任务’。”
举个例子:
- 你问:“法国的首都是哪里?”
- 预训练模型可能回答:“法国的首都是巴黎,也是浪漫之都,每年吸引数百万游客。” —— 这看起来像是在回答,但实际上它只是在续写“法国的首都是哪里”这句话,并没有“回答问题”的意图。
如果你给它一个不完整的句子,比如“今天天气真”,它会很自然地接“好”、“不”、“冷”等。它的本能是预测下一个词,而不是响应指令。
2.2 SFT 如何解决这个问题?
SFT 使用 (指令,标准回答) 对训练模型。例如:
| 指令 (Instruction) | 标准回答 (Response) |
|---|---|
| 法国的首都是哪里? | 巴黎。 |
| 解释什么是机器学习。 | 机器学习是人工智能的一个分支,让计算机从数据中学习规律,而不是通过明确编程。 |
| 把这句中文翻译成英文:我爱你 | I love you. |
模型通过成千上万个这样的例子,逐渐学会:当用户以某种格式提问时,应该输出对应的答案,而不是胡乱续写。
三、有监督 vs. 无监督 vs. 自监督 vs. 半监督
PDF 第 85-92 页介绍了这几个概念。以下根据严谨性检查进行修正说明。
3.1 有监督学习(Supervised Learning)
- 定义:使用 有标签 的数据进行训练。
- 例子:
- 评论分类:
“送货速度快” → 正向,“质量太差了” → 负向 - 文本相似度:
“这道菜好吃”与“味道真不错”→ 相似
- 评论分类:
- SFT 就是典型的有监督学习,标签就是人工写的标准回答。
3.2 无监督学习(Unsupervised Learning)
- 定义:使用 无标签 的数据,让模型自己发现结构或规律。
- 例子:聚类、降维、关联规则挖掘。
3.3 自监督学习(Self-supervised Learning)
- 定义:从数据本身自动生成标签,属于无监督学习的一种特例。
- 例子:预训练中的“预测下一个词”——上一段文字就是“上文”,下一个词就是“标签”。标签来自数据本身,不需要人工标注。
- PDF 第 91 页说:“上面讲过的 Pretrain 阶段的处理方式,就叫做自监督。”
3.4 半监督学习(Semi-supervised Learning)—— 严谨说明
传统定义:同时利用少量有标签数据和大量无标签数据在同一个训练过程中进行学习。
在 LLM 中的用法:PDF 第 92 页写道:“Pretrain + SFT 两个阶段组合起来就叫做半监督(不缺数据,但缺标签)。” 这是一种简化的行业说法,意在说明:我们先用了大量无标签数据做预训练,再补充少量标签做微调。严格意义上,这是“预训练+微调”两阶段范式,而非经典的半监督学习。
结论:可以接受 PDF 的表述作为行业通俗说法,但需注意这不是严格的学术定义。本文沿用 PDF 的表述,但请读者知晓其简化性。
总结对比表:
| 学习类型 | 是否需要人工标签 | 典型阶段 | 数据量 | 备注 |
|---|---|---|---|---|
| 有监督 | ✅ 是 | SFT | 小(几十万条) | 标签是标准回答 |
| 无监督 | ❌ 否 | (极少直接使用) | - | 模型自己找规律 |
| 自监督 | ❌ 否(标签自动生成) | Pretrain | 超大(万亿 token) | 无监督的特例 |
| 半监督 | 少量是,大量否 | Pretrain + SFT(两阶段) | 超大 + 小 | PDF 中的通俗用法 |
四、指令微调(Instruction Tuning)
4.1 是什么?
Instruction Tuning 是 SFT 的一种最常见形式。它的特点是:训练数据明确包含 “指令” 部分,模型学习的是“遵循指令”。
常见数据格式:
- 结构化 JSON 格式(现代指令微调常用):
{
"instruction": "解释什么是梯度下降。",
"response": "梯度下降是一种优化算法,用于最小化损失函数……"
}
- 简化 Q/A 格式(也常见):
Q: 法国的首都是哪里?
A: 巴黎。
实际应用中,JSON 格式更便于混合多种任务和元数据。
4.2 为什么指令微调有效?
因为真实世界的用户交互都是以“指令”形式出现的。如果模型只在“续写”任务上训练,它不知道 “Q: xxx A: xxx” 这种格式是一种命令。通过指令微调,模型学会了把输入当成任务描述,输出对应的答案。
PDF 第 96 页说:
“如果未来你希望做什么类型的任务,就用什么样的数据去做‘指令微调’——对话任务、分类任务、判断任务、推理任务、代码生成任务。”
4.3 多任务指令微调
为了让模型具备通用能力,通常会在成百上千种不同任务的数据上混合微调,包括:
- 问答
- 摘要
- 翻译
- 代码生成
- 数学解题
- 情感分析
- 逻辑推理
这样模型就能“举一反三”,即使遇到没见过的任务类型,也能尝试理解并回答。
五、SFT 的数据:从哪来?有多少?
5.1 数据来源
主要有三种渠道:
- 人工撰写:雇佣标注员按照规范写出问题和标准答案。成本高,质量可控。
- 现有数据集转换:将已有的 NLP 数据集(如 SQuAD 问答、CNN/DailyMail 摘要)改写成指令格式。
- 模型生成 + 人工筛选:用更强的模型(如 GPT-4)生成候选回答,再由人工修改、验证。这是目前高效的方法。
5.2 数据量
PDF 第 99 页明确指出:
“SFT 阶段的数据量普遍不大。Llama 3 使用了 15t Tokens(预训练),SFT 阶段使用的数据量大概只有几十万条。”
- 预训练:15 万亿 token ≈ 37.5 亿个段落(每段 4000 token)
- SFT:几十万条(instruction, response)对
比例说明:PDF 中使用“大约是预训练阶段的 1/5000”作为举例估算。严格来说,这是估算值,非官方精确数字(Llama 3 技术报告未披露 SFT 具体条数)。按段落数计算:37.5 亿 ÷ 几十万 ≈ 1/5000,数字本身合理,但需明确为估算。
✅ 修正后表述:SFT 数据量大约为预训练段落数的 1/5000(估算值,非官方精确数字)。
5.3 为什么几十万条就够了?
预训练已经让模型学会了语言和知识,SFT 只需要“点醒”它,告诉它对话的格式和意图。几百到几十万条高质量示例就足以让模型“开窍”。这类似于:一个精通英语的人,只需要看他做几道“问答题”的示范,就能学会如何按格式回答。
六、SFT 的训练过程
6.1 输入输出格式
对于每个训练样本,输入是 instruction + response 拼接在一起,但训练时通常会让模型只对 response 部分计算损失(忽略 instruction 部分的损失)。这样模型学会的是“在给定 instruction 的情况下,生成 response”,而不是复述 instruction。
6.2 损失函数
仍然使用交叉熵损失,但只计算 response 部分的 token 预测误差。
6.3 超参数设置
- 学习率:通常比预训练小 10 倍左右(如 1e-5 而不是 1e-4),避免破坏预训练学到的知识。
- Epoch 数:通常 1~3 个 epoch,多了容易过拟合。
- 批量大小:根据显存调整,通常 32~128。
6.4 训练技巧
- 混合精度:用 FP16/BF16 加速。
- LoRA(低秩适配):一种参数高效微调方法,只训练少量额外参数,大幅降低显存需求。对于大规模模型(70B 以上),LoRA 几乎是必需品(否则单卡显存不足);而对于小模型(7B),可以直接进行全量微调。
七、SFT 后的模型能力与局限
7.1 获得的能力
- 指令遵循:能理解“解释”“翻译”“总结”“写代码”等动词。
- 对话交互:能够多轮对话,记住上下文。
- 任务泛化:即使没见过的指令形式,也能尝试回答(得益于多任务微调)。
- 格式控制:可以输出 JSON、列表、表格等结构化内容。
7.2 存在的局限
PDF 第 102 页指出:
“会做任务,和能优秀的做任务,还是有很大差距。”
具体问题包括:
- 回答冗长啰嗦:模型倾向于“多说几句”,而不是简洁回答。
- 不够有用:可能提供不相关或冗余的信息。
- 不够安全:可能生成有害、偏见内容(因为 SFT 数据未充分覆盖安全边界)。
- 缺乏偏好对齐:模型不知道用户更喜欢哪种风格(简洁 vs 详细,正式 vs 亲切)。
这些问题正是下一阶段——强化学习(RLHF / PPO / DPO) 要解决的。
八、SFT 的成本与时间
| 项目 | 估算值(严谨说明) |
|---|---|
| 数据标注成本 | 因任务复杂度而异:简单分类任务每条可能低至 0.5 美元,高质量指令撰写(如专业领域)可能需要 5-20 美元。几十万条的总成本在数十万到数百万美元之间。 |
| 训练 GPU 资源 | 单张 A100 (80G) 可微调 7B 模型;70B 模型需要 8 张以上(若用 LoRA 可减少显存需求)。 |
| 训练时间 | 7B 模型:数小时;70B 模型使用几十万条数据,在 8 张 A100 上通常需要 1-3 天。 |
| 总成本(含数据) | 数十万到数百万美元。 |
相比于预训练的 数亿美元,SFT 的成本已经大大降低。这也是为什么开源社区能广泛进行微调的原因。
⚠️ 注意:以上成本为业界常见估算,实际因数据质量、标注地区、算力资源等差异可能有较大波动。
九、总结:SFT 在整个训练范式中的位置
| 维度 | Pretrain | SFT | RLHF (PPO/DPO) |
|---|---|---|---|
| 目标 | 学习语言和知识 | 学习遵循指令 | 学习人类偏好(有用、无害、有趣) |
| 数据 | 海量无标签文本 | 少量人工标注(指令,回答) | 偏好排序数据或 RM |
| 成本 | 极高(亿美元) | 中等(数十万~百万美元) | 较低(万美元级) |
| 产出 | 基础模型(会接话) | 指令模型(会做任务,但不够优) | 对齐模型(优秀助手) |
| 典型代表 | Llama 3 base | Llama 3 instruct (SFT only) | ChatGPT, Claude |
一句话总结:
SFT 是让大语言模型从“书呆子”变成“实习生”的关键一步——它学会了按照指令做事,但还不够老练。接下来的强化学习,才是把它打磨成“专家”的工序。
您说得对,之前的 SFT 章节也缺少了专业术语表和参考对比表。以下是 SFT 章节的补充附录,建议直接添加到《SFT(有监督微调)完整详解》的末尾。
附录 A:专业术语表(SFT 相关)
| 术语 | 英文 | 通俗解释 | 技术定义 |
|---|---|---|---|
| 有监督微调 | Supervised Fine-Tuning (SFT) | 用人工标注的问答对训练模型,让它学会“按指令办事” | 在预训练模型基础上,使用有标签的 (instruction, response) 数据进行全参数或部分参数的微调 |
| 指令微调 | Instruction Tuning | 专门教模型理解“请做某事”这类指令的训练方式 | SFT 的一种特殊形式,训练数据以任务指令的形式呈现(如“请翻译:我爱你”) |
| 有监督学习 | Supervised Learning | 老师给标准答案,学生照着学 | 使用包含输入和期望输出的标签数据进行训练 |
| 无监督学习 | Unsupervised Learning | 没有标准答案,模型自己找规律 | 仅使用输入数据,让模型发现隐藏结构或模式 |
| 自监督学习 | Self-supervised Learning | 模型自己从数据中造出“伪标签” | 无监督学习的特例,利用数据内部关系自动生成训练目标(如下一个词预测) |
| 半监督学习 | Semi-supervised Learning | 少量带标签 + 大量无标签数据一起学习 | 在 LLM 领域常指“预训练+微调”两阶段范式(非严格定义) |
| 提示词 | Prompt | 用户输入的指令或问题 | 作为模型输入的文本,用于触发特定任务 |
| 标准回答 | Response / Completion | 人类期望模型给出的正确答案 | SFT 训练中的目标输出,与 prompt 配对的标签 |
| 交叉熵损失 | Cross-Entropy Loss | 衡量预测概率和真实答案之间差距的指标 | -log P(正确答案),鼓励模型给正确答案更高概率 |
| 过拟合 | Overfitting | 模型死记硬背训练数据,不会举一反三 | 在训练集上表现极好,但验证/测试集上表现差 |
| LoRA | Low-Rank Adaptation | 一种轻量级微调方法,只训练极少量参数 | 在原始权重旁添加低秩矩阵进行微调,大幅降低显存需求 |
| 全量微调 | Full Fine-Tuning | 更新模型的所有参数 | 传统微调方式,需要保存完整梯度,显存需求高 |
| 少样本学习 | Few-shot Learning | 给模型看几个例子,让它学会做同类任务 | 在 prompt 中提供 2~3 个示例,模型利用上下文学习能力完成新任务 |
| 零样本学习 | Zero-shot Learning | 不给例子,直接要求模型做任务 | 仅通过指令描述任务,模型依靠预训练知识执行 |
附录 B:SFT vs 预训练 vs 强化学习 对比表
| 对比维度 | 预训练 (Pretrain) | SFT (有监督微调) | 强化学习对齐 (PPO/DPO) |
|---|---|---|---|
| 目标 | 学习语言统计规律、世界知识 | 学习遵循指令、回答问题 | 学习人类偏好(有用、无害、有趣) |
| 数据类型 | 海量无标注纯文本 | 少量人工标注 (指令, 回答) 对 | 偏好排序数据或奖励信号 |
| 数据量级 | 万亿 tokens | 几十万~百万条 | 几万~几十万条偏好对 |
| 标签来源 | 自监督(下一个词就是标签) | 人工标注 | 人工排序 / RM 打分 |
| 损失函数 | 交叉熵(预测下一个词) | 交叉熵(仅对 response 部分) | PPO: RL 损失;DPO: 分类损失 |
| 是否需新模型 | 从零训练 | 预训练模型基础上微调 | SFT 模型基础上优化 |
| 训练复杂度 | 极高(数亿美元) | 中等(数十万美元) | 较低(数万美元) |
| 产物 | 基础模型(会接话) | 指令模型(会做任务) | 对齐模型(优秀助手) |
| 典型耗时 | 数月(万卡级别) | 数小时~数天(单卡~八卡) | 数小时~数天(单卡~八卡) |
| 适合团队 | 巨头公司 | 高校、中小公司、个人 | 有一定资源的团队 |
附录 C:SFT 中的常用符号与公式说明
| 符号 | 含义 | 在 SFT 中的作用 | |
|---|---|---|---|
| ( \pi_{\text{SFT}} ) | SFT 训练后的模型 | 指令微调得到的模型参数 | |
| ( x ) | 输入 prompt / instruction | 用户的问题或指令 | |
| ( y ) | 输出 response | 模型生成的回答 | |
| ( y^* ) | 标准答案(gold response) | 人工标注的正确回答 | |
| ( \mathcal{D}_{\text{SFT}} ) | SFT 数据集 | 包含 (x, y^*) 对的集合 | |
| ( L_{\text{CE}} ) | 交叉熵损失 | `-∑ log π(y_t^* | y_{<t}^*, x)` |
| ( \theta ) | 模型参数 | 预训练参数初始值,SFT 更新后的值 | |
| ( \eta ) | 学习率(learning rate) | 控制参数更新步长,SFT 中通常比预训练小 | |
| ( \text{epoch} ) | 遍历完整数据集的次数 | SFT 通常 1~3 个 epoch,过多易过拟合 | |
| ( \text{batch size} ) | 批量大小 | 每次更新使用的样本数,受显存限制 |
附录 D:常用缩略语对照表(SFT 补充)
| 缩略语 | 全称 | 中文 |
|---|---|---|
| SFT | Supervised Fine-Tuning | 有监督微调 |
| Instruction Tuning | - | 指令微调 |
| RLHF | Reinforcement Learning from Human Feedback | 基于人类反馈的强化学习 |
| PPO | Proximal Policy Optimization | 近端策略优化 |
| DPO | Direct Preference Optimization | 直接偏好优化 |
| RM | Reward Model | 奖励模型 |
| CE | Cross-Entropy | 交叉熵 |
| LoRA | Low-Rank Adaptation | 低秩适配(微调方法) |
| QLoRA | Quantized LoRA | 量化版 LoRA,更省显存 |
| FLAN | Fine-tuned Language Net | Google 的指令微调数据集/模型系列 |
| Alpaca | - | 斯坦福的指令微调数据集(基于 self-instruct) |
| ShareGPT | - | 真实用户对话数据,常用于 SFT |
附录 E:SFT 数据集的常见类型与规模参考
| 数据集名称 | 规模(条数) | 特点 |
|---|---|---|
| Alpaca | 52k | 自指令生成,涵盖多种任务 |
| ShareGPT | 90k+ | 真实用户与 ChatGPT 对话 |
| Dolly 2.0 | 15k | Databricks 开源,人工编写 |
| OpenAssistant | 66k+ | 多语言,社区贡献 |
| LIMA | 1k | 极少量但高质量,验证“少即是多” |
| UltraChat | 1.5M | 大规模合成对话 |
| FLAN | 1.8M | Google 混合多种 NLP 任务 |
| WildChat | 100k+ | 真实用户与 ChatGPT 对话(与 ShareGPT 类似) |
参考说明:以上数据量为典型公开数据集规模。实际商用模型的 SFT 数据通常为几十万到百万条,但具体数字因公司而异,一般不公开。
附录 F:SFT 训练中常用超参数范围
| 超参数 | 典型范围 | 说明 |
|---|---|---|
| 学习率(LR) | 1e-5 ~ 5e-5(全量微调);1e-4 ~ 1e-3(LoRA) | 比预训练小一个数量级 |
| Epoch | 1 ~ 3 | 过多易过拟合 |
| 批量大小(Batch Size) | 32 ~ 256(取决于显存) | 梯度累积可实现更大有效 batch |
| 最大序列长度 | 512 ~ 4096 | 取决于模型上下文窗口 |
| 学习率调度 | 线性衰减 / 余弦衰减 | 通常配合 warmup |
| Warmup 步数 | 总步数的 1%~5% | 防止初始学习率过大 |
| 权重衰减 | 0.01 ~ 0.1 | 正则化,防止过拟合 |
| LoRA rank | 8 ~ 64 | 秩越高表达力越强,但参数量增加 |
| LoRA alpha | 16 ~ 32 | 缩放系数,通常设为 rank 的 1-2 倍 |
📚 参考文献
| 序号 | 来源 | 说明 |
|---|---|---|
| [10] | Wei, J., Bosma, M., Zhao, V., et al. "Finetuned Language Models are Zero-Shot Learners." arXiv preprint arXiv:2109.01652, 2021. | 提出指令微调,通过在多样任务上微调提升零样本能力 |
| [11] | Sanh, V., Webson, A., Raffel, C., et al. "Multitask Prompted Training Enables Zero-Shot Task Generalization." arXiv preprint arXiv:2110.08207, 2021. | T0 模型,多任务提示训练,展示跨任务泛化能力 |
| [12] | Ouyang, L., Wu, J., Jiang, X., et al. "Training language models to follow instructions with human feedback." Advances in Neural Information Processing Systems, Vol. 35, 2022. | InstructGPT 论文,首次系统描述 RLHF 流程,含 SFT + RM + PPO 完整框架 |
| [13] | Taori, R., Gulrajani, I., Zhang, T., et al. "Alpaca: A Strong, Replicable Instruction-Following Model." Stanford CRFM, 2023. | 斯坦福基于 LLaMA 的指令微调模型,52k 自生成指令数据 |
| [14] | Chiang, W. L., Li, Z., Lin, Z., et al. "Vicuna: An Open-Source Chatbot Impressing GPT-4 with 90% ChatGPT Quality." LMSYS, 2023. | 基于 ShareGPT 对话数据微调的高质量助手模型 |