微调数据混合与课程学习

单一任务 SFT 容易导致灾难性遗忘(catastrophic forgetting)——通用对话能力下降。通过数据混合课程学习(curriculum learning),在拉高目标任务的同时保留基座能力。

系列索引:微调技术路线导读


一、何时需要混合

场景 做法
窄分类 + 怕格式退化 掺 5–20% 通用指令数据
多业务线共用一个模型 按流量或优先级设比例
CPT + SFT 同一阶段 按 token 比例混 text 与对话
对齐后能力掉 SFT 通用集 + DPO 时控 β

二、多任务比例

策略 说明
均匀 每任务等量 sample(小任务过采样)
按重要性 主任务 70%,辅助 30%
按 token 长文档任务按 token 加权,防短样本刷屏
动态 前期主任务高,后期加通用(课程)
1
2
3
4
5
6
7
8
9
10
11
from datasets import concatenate_datasets, interleave_datasets

# 方式 A:拼接后 shuffle
mixed = concatenate_datasets([task_a, task_b, general]).shuffle(seed=42)

# 方式 B:按概率交错
mixed = interleave_datasets(
[task_a, task_b, general],
probabilities=[0.5, 0.3, 0.2],
seed=42,
)

三、通用能力保留

从基座 instruct 模型的公开指令集(如 Alpaca、ShareGPT 子集)抽取 5–20% 与领域数据混合:

  • 监控通用抽检集(人工或 EM)。
  • lr 不宜过高;LoRA 通常足够。

05-04 全参 vs PEFT | Math-04/20 遗忘对策


四、CPT 与 SFT 混合

模式 说明
串行(推荐) 05-02 CPT 后再 SFT
并行混训 需自定义 dataloader;同一 step 不同 loss 掩码

混训时 CPT 样本用全序列 loss,SFT 用 completion_only——实现复杂度高于串行。


五、简单课程学习

  1. 阶段 1:短样本、简单标签、高 lr(或标准 lr)。
  2. 阶段 2:加长上下文、难样本、降 lr 或续训。
  3. 阶段 3(可选):加入开放生成或多轮。

实现:train_dataset 按难度排序后分阶段 trainer.train(resume_from_checkpoint=...)


六、评估

混合后必须分任务报告指标,勿只看总 loss:

集合 指标
主任务 test F1 / EM
通用抽检 人工 / 小 benchmark
invalid 率 格式是否退化

七、小结

混合 = 比例可控 + shuffle 可复现 + 分任务验收。默认窄任务可不必混合;开放 instruct 模型做深领域 SFT 时建议掺通用集。

下一步:08-01 基线评估

-------------本文结束感谢您的阅读-------------