SFT
SFT
SFT,即 监督微调,是帮助大模型在后训练中实现其最终目标的 第一步
**监督微调(SFT):**使用高质量的人工编写(或合成)的“指令-回答”配对数据,教会模型理解并遵循人类的指令格式。
SFT 训练数据的核心是高质量的 「指令-输出」 配对数据。模型在训练时,会接收一个 「指令」,尝试生成一个 「输出」,然后将其与数据集中提供的「标准输出」进行比较,计算损失函数,并反向传播以更新模型权重。这个过程明确地「监督」模型去学习对于这个指令,我应该生成那样的回答,因此被称为监督微调。
SFT 训练数据
Qwen3-SFT 最佳实践数据格式模板:
# 通用格式
{"messages": [
{"role": "system", "content": "<system-prompt>"},
{"role": "user", "content": "<query1>"},
{"role": "assistant", "content": "<response1>"}
]}
# 带 think 的格式
{"messages": [
{"role": "user", "content": "Where is the capital of Zhejiang?"},
{"role": "assistant", "content": "<think>\n...\n</think>\n\nThe capital of Zhejiang is Hangzhou."}
]}SFT 的训练数据示例:
{
"messages": [
{"role": "user", "content": "写一首关于春天的诗"},
{"role": "assistant", "content": "春风拂面柳丝长,\n百花争艳满园香。\n燕子归来寻旧巢,\n人间处处是韶光。"}
]
}多轮对话的 SFT 训练数据示例:
{
"messages": [
{"role": "user", "content": "你好!"},
{"role": "assistant", "content": "你好!有什么可以帮助你的吗?"},
{"role": "user", "content": "我想学习Python,应该从哪里开始?"},
{"role": "assistant", "content": "学习Python可以从以下几个步骤开始:\n1. 安装Python环境\n2. 学习基础语法\n3. 练习小项目\n你想先从哪个部分了解?"},
{"role": "user", "content": "基础语法有哪些重要概念?"},
{"role": "assistant", "content": "Python基础语法的核心概念包括:\n- 变量和数据类型\n- 条件语句(if/else)\n- 循环(for/while)\n- 函数定义\n- 列表、字典等数据结构\n建议先掌握这些,然后通过实际编码巩固。"}
]
}Agentic SFT 的训练数据格式示例:
{
// 1. 智能体身份定义
"agent_definition": {
"name":"数据分析助手",
...
},
// 2. 完整的交互轨迹
"interaction_trajectory": [
{
"turn": 1,
"role":"user",
"message":"帮我分析我手上股票的发展前景"
},
{
"turn": 2,
"role":"assistant",
"message":"好的,为了....我现在需要...."
"action":"调取用户数据..."
"plan": [
{"id":"t1","task":"..."},
{"id":"t2","task":"..."}
],
"tool_calls":[
...
],
...
},
],
// 3. 元数据与评估信息
"metadata": {
"task_completed": true,
"tools_used": ["t1", "t2"],
"complexity": "medium",
...
}
}Agentic SFT 需要关注训练模型 “感知需求”、“调用工具”、“获取环境反馈并交互” 等智能体所需要的能力,其格式也随着 Agent 具体要求的变化而变化
OpenAI 在 InstructGPT 和 ChatGPT 的初期开发中,为人机对齐设定了黄金标准。他们的方法核心是通过人类反馈来构建和精炼数据,由于人工标注成本极高、规模有限,目前社区和工业界广泛采用的一种高效方法是:使用一个更强的「教师模型」(如GPT-4、Claude-3 等),通过精心设计的 Prompt,来为大量用户指令生成高质量的回复,从而蒸馏出 SFT 数据集。
SFT 的数学原理与常用技术
数学原理
SFT 通过最大化由人工标注数据定义的条件似然函数,从而使模型输出更接近人类目标响应,并依据此计算损失函数(Loss),反向传播(Backpropagation)更新大模型的参数。在监督微调中,训练的核心目标是是最大化似然函数:
输入(指令、prompt):
输出(长度为 T 的 token):
假设当前语言模型参数为 ,语言模型从 输出 的自回归分布为: ,其中
该公式的含义为每一个输出的 token,计算在已知输入和前序 tokens 生成的情况下,模型输出该 token 的概率,并计算 所有概率的乘积。
在每一个单独的时间步 ,模型接收 和 ,并输出一个未归一化的 logits 向量 , 对该向量施加 softmax,得到整个词汇表上该时间步的条件概率分布。
目标 token 的对数概率为:,其中 为模型输出 token 的 logits 分数, 为词汇表大小
基于上述计算公式,样本总损失可计算为:
参数更新
训练过程中可以使用 全参微调 或 PEFT
SFT 常见问题
如何避免 SFT 的灾难性遗忘
SFT 数据比较多或者 epoch 比较大时,可能会导致 SFT 后大模型的通用能力下降,导致灾难性遗忘,这要根据实际场景判断,如果你只关注特殊领域的性能,通用能力下降你也不需要过度关注,如果想要不失去通用的生成能力,可以考虑以下几点:
- 多任务微调:如果希望模型保持多任务泛化能力,可以一次性对多个任务执行微调。良好的多任务微调可能需要包含许多任务的 50-100,000 个示例
- PEFT 方法:保留了原始LLM的权重。通过训练少量特定于任务的适配器层和参数。PEF T对灾难性遗忘表现出更大的鲁棒性,因为大多数预训练的权重保持不变
- 数据配比:在 SFT 数据中,增加一些通用生成的数据,避免 SFT 过度学习单一训练集内容
- 数据回放:在 SFT 数据后,再做一下通用能力的 SFT,但是这样做的一个风险是之前微调的专业能力会受到影响(死锁了 )
SFT 指令微调数据
SFT 的重点是学习样式,而非知识注入,所以 SFT 的样本在于其质量而非数量,通常情况下,2-10k 数据就会有一个不错的效果。epoch 可以根据 SFT 数据设定为 2-10 个 epoch,epoch 和数据量成反比,SFT 的数据在准确,不在量大,所以在数据比较精确的情况下,一般5k的数据 5 个 epoch,就能得到一个不错的效果。
在评估微调样本质量的过程中,通常需要关注以下几个核心维度:
- 样本多样性
- 答案质量
- 准确性
- 完备性
- 简洁性与清晰度
- 一致性
- 难度适配
- 噪声控制
SFT 是在学什么
- **指令追随和样式学习:**并没有学习到世界知识;
- 领域适用性:特定领域的语言、术语、上下文内容,优化其在特定领域的表现;
- 激发大模型能力:通过 SFT 激发大模型在特定领域的能力;
- **安全性:**在 SFT 中增加一些对抗数据,提高模型的鲁棒性和安全意识。
需要多少显存
分全参 SFT 和 PEFT,他们两个的显存差距比较大
- SFT:全参数微调,包括参数的梯度、优化器都要激活,如果一个1B(fp32)的模型需要显存如下:
- 模型需要显存:1B * 4byte = 4GB
- 梯度显存(每个参数都需要有一个梯度):4GB
- 优化器显存:以 adamw 优化器为例,他需要一阶动量+二阶动量=4GB + 4GB=8GB;
- PEFT:需要的显存与模型没有大的区别,主要看 PEFT 部分,大概是几 M 到几 GB。