字节笔记本
2026年5月31日
SFT 实战四条铁律:数据质量、学习率、轮数、混合数据
监督微调是当前最常用的大模型定制化方法。但很多团队花了大量时间收集数据训练模型,结果效果还不如直接用 prompt 工程。问题往往出在实训细节上。以下四条铁律可以帮助你避免最常见的坑。
数据质量比数据量重要。这一条怎么强调都不过分。一千条人工审核、输入输出严格对齐的高质量数据,效果往往好于一万条从网上爬来的未清洗数据。每条训练数据都要先检查输入是否清晰明确地表达了一个任务,输出是否准确完整地展示了期望的回答。
高质量数据需要符合几个标准。输入和输出对齐,输出确实是对输入的合理回应。数据覆盖多样化的场景,不仅仅是标准情况,还包括边界情况和异常情况。数据中不含错误信息,所有事实性内容都要经过核对。数据格式统一,方便模型学习一致的输出格式。
学习率的选择是常见陷阱。SFT 不是从头训练,学习率太大,模型会剧烈改变原有参数分布,导致灾难性遗忘。推荐从 1e-5 开始,如果 loss 在下降且验证集效果在提升,可以保持不变。如果 loss 下降太快或验证集波动剧烈,说明学习率偏大,需要降低到 5e-6 甚至更低。如果 loss 几乎不下降,说明学习率偏小,可以提升到 2e-5。
学习率调度器也是重要的配置。线性衰减是最常用的方式,训练开始时学习率最大,然后线性降低到零。余弦衰减是另一种常见选择,学习率按照余弦曲线下降,前期下降慢后期下降快。Warmup 策略在前几个 step 中从很小的学习率逐渐增加到目标学习率,可以避免训练初期的不稳定。
训练轮数的控制也很关键。SFT 不需要很多轮,2 到 3 个 epoch 通常足够了。训练轮数过多会导致过拟合,模型对训练数据中的噪声和特例也学会了,反而降低了泛化能力。每完成一个 epoch 就在验证集上评估一次,当验证集的 loss 开始回升时,说明已经开始过拟合,应该立即停止训练。
一个实用的技巧是混合原始预训练数据。在微调数据中混入 10% 到 20% 的原始预训练数据或通用指令数据,可以显著缓解灾难性遗忘。这些混合数据不需要多,只要能让模型在执行新任务的同时不要忘记原有能力。
数据预处理同样影响微调效果。对话格式的数据需要按照模型的对话模板格式化,确保 role 标签正确。指令数据需要统一指令的格式,避免同样的意思用不同的措辞表达。长文本数据需要适当地截断或分段,不超过模型的最大输入长度。
评估微调效果的方法也值得注意。不能只看训练集上的 loss,因为过低可能意味着过拟合。最好准备一个独立的验证集用于评估,验证集的数据分布应该和训练集一致但不重合。如果验证集上的指标持续上升而训练集上的指标已经很好,说明模型正在过拟合。
LoRA 微调时的参数选择也有规律。Rank 值决定了 LoRA 的表达能力,通常设置为 8 到 64。Alpha 值是 LoRA 的缩放参数,通常设置为 Rank 的两倍。Target modules 选择注意力层的 q_proj 和 v_proj 通常就能取得不错的效果,扩展到所有线性层可能会进一步提升效果但也会增加训练时间。
如果微调后的模型效果还不如预期,先检查这四个方面的问题。大部分情况下,问题都出在这四个环节中的某一个,而不是模型架构或者微调方法本身。数据、学习率、轮数和混合数据,这四个变量调整好了,SFT 的效果至少能满足预期。
Batch size 的配置也很关键。较大的 batch size 使梯度更新更稳定,但需要更多显存。较小的 batch size 收敛更快但梯度噪声更大。实践中常用的 batch size 从 8 到 128 不等,需要根据模型大小和显存容量来调整。梯度累积可以在 batch size 受限时提供帮助。学习率 warmup 是 SFT 中一个实用的技巧。训练的前几百步,学习率从很小的值逐渐增加到目标学习率。这个阶段让模型参数逐步适应新的数据分布,可以减少训练初期的不稳定性。Warmup 的步数通常占总训练步数的 5% 到 10%。数据增强也可以在 SFT 中使用。通过同义词替换、句式变换、回译等方法扩增训练数据,可以提高模型的泛化能力。对于数据量不足的场景,数据增强是简单有效的补充手段。OpenAI 的后训练流程中,SFT 之后还有 RLHF 阶段来进一步优化模型行为。对于大多数应用来说,完成 SFT 后模型已经能达到不错的效果。如果对模型的指令遵循能力和安全性有更高要求,可以进一步实施 RLHF 或其他对齐方法。