土法炼钢兴趣小组的算法知识备份

【强化学习与大模型后训练】07|监督微调(SFT):指令数据、模板与训练细节

文章导航

分类入口
rl-posttraining
标签入口
#sft#instruction-tuning#chat-template#loss-mask#packing#lima#self-instruct#alpaca

目录

SFT 看起来像最普通的语言模型微调:给定 prompt 和 response,继续做 next-token prediction。 真正容易出错的地方不在损失函数名字,而在聊天模板、特殊 token、loss mask、packing 和数据质量。

这篇文章把 SFT 当作后训练系统的策略初始化来讲。 它既要让模型学会像助手一样回答,也要给后续奖励模型、DPO 或 PPO 留出稳定起点。

一、SFT 的目标函数

监督微调(Supervised Fine-Tuning)把每条样本写成指令与回答对。 模型看到指令、系统消息、历史对话和角色标记后,只在助手回答部分计算 next-token loss。

\[ \mathcal{L}_{SFT}(\theta)=-\sum_{t\in \mathcal{M}}\log \pi_\theta(y_t|x,y_{<t}) \]

这里 \(\mathcal{M}\) 是 loss mask 选中的 token 集合。 对话 prompt、system message、用户输入通常不参与 loss;assistant response 才是被监督的目标。

二、聊天模板决定模型看到的任务

同一段对话用不同模板展开,会变成不同 token 序列。 角色标记、开始结束符、换行、工具调用标签都会进入模型上下文。

元素 作用 常见错误
system 定义助手行为边界 训练有 system,推理没有 system
user 承载指令与上下文 把 user token 计入 loss
assistant 标记需要生成的回答 忘记 assistant 起始标记
special tokens 区分轮次和终止 EOS 不一致导致生成不停
tool markers 表达工具调用结构 把工具返回当成助手自然语言

模板不是格式问题,而是任务定义的一部分。 SFT、RM、DPO、PPO 和评测最好共享同一 tokenizer 与 chat template,否则后续阶段会优化另一个分布。

三、loss mask:只训练助手 token

note = "示意:构造 SFT loss mask,真实代码需按 tokenizer 和 chat template 调整"
tokens = tokenizer.apply_chat_template(messages, add_generation_prompt=False)
labels = tokens.input_ids.copy()
loss_mask = [0] * len(labels)

for span in assistant_response_spans(tokens):
    for i in range(span.start, span.end):
        loss_mask[i] = 1

for i, keep in enumerate(loss_mask):
    if not keep:
        labels[i] = -100      # PyTorch CrossEntropyLoss 忽略该位置

outputs = model(input_ids=tokens.input_ids, labels=labels)
loss = outputs.loss

这段代码只是示意。 真实实现要确保 span 边界来自模板解析,而不是用字符串搜索硬猜。 多轮对话、工具调用和截断都会改变助手 token 的位置。

四、packing 与截断

SFT 数据长度差异很大。 packing 会把多条短样本拼到同一个 sequence 里,提高 GPU 利用率。

packing 的前提是 attention mask 和 loss mask 正确隔离样本。 若两条样本之间没有边界,后一条样本会看见前一条样本的答案,训练目标被污染。

五、学习率、epoch 与过拟合

SFT 通常只跑少量 epoch,常见范围是 1 到 3 个 epoch,但这不是定律。 数据规模、模型大小、学习率、是否 LoRA、是否混入通用数据都会改变合适轮数。

过拟合不一定表现为 validation loss 立刻恶化。 更常见的信号是回答模板化、复读训练语料风格、拒答边界僵硬,或者后续 RL 的 KL 起点很差。

六、数据质量比数量更硬

LIMA 论文用“Less Is More for Alignment”强调少量高质量示范也能明显影响模型交互行为。 这个结论不应被误读成数据越少越好,而是说明 SFT 对示范质量、覆盖范围和风格一致性非常敏感。

Self-Instruct 和 Alpaca 展示了用模型生成指令数据、再清洗微调的路线。 它降低了构造指令数据的门槛,也带来蒸馏偏差和合成数据污染风险。

七、SFT 与后续 RL 的关系

在 RLHF 中,SFT 模型通常同时扮演两个角色:它是 PPO policy 的初始化,也是 KL reference model 的来源。 初始化太弱,RL 要花大量步数学习基本格式;初始化太窄,RL 探索空间不足。

DPO 也依赖 SFT 起点。 偏好损失会围绕 reference 分布移动策略,若 SFT 已经把某些正确行为排除在高概率区域外,离线偏好数据很难凭空恢复。

八、SFT 训练核对清单

1. 样本去重

2. 来源分层

3. 模板单测

4. prompt mask

5. assistant mask

6. EOS 处理

7. packing 隔离

8. 截断策略

9. 学习率

10. epoch 数

11. 数据混比

12. 蒸馏偏差

13. 安全样本

14. 代码数据

15. 评测集污染

九、常见误区

十、数据审计与调参清单

1. 角色边界

2. mask 单测

3. EOS 策略

4. 样本质量

5. 蒸馏来源

6. 自指令过滤

7. Alpaca 风格

8. LIMA 启示

9. 学习率搜索

10. epoch 选择

11. packing 边界

12. 截断审计

13. 领域混比

14. 安全拒答

15. 代码格式

16. 事实样本

17. 多轮对话

18. 工具样本

19. LoRA 配置

20. 评测污染

21. 验证样本

22. 回答风格

23. 拒答模板

24. 数学数据

25. 摘要数据

26. 写作数据

27. 工具调用

28. 多轮记忆

29. 负样本缺口

30. checkpoint 选择

31. 混合精度

32. 可复现性

十一、参考资料

← 上一篇:06|后训练全景 | 下一篇:08|奖励模型

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。


By .