Catastrophic Forgetting

模型在新数据或新目标上继续训练时,可能损害原有任务和通用能力,这称为灾难性遗忘。

常见原因

  • 新数据分布过窄或与原能力冲突。
  • 学习率过大、训练时间过长。
  • 缺少旧任务 replay 或通用能力约束。
  • 评测只看新任务,未建立回归集。

缓解方向

  • 混合 replay 数据与代表性旧任务。
  • 更小学习率、合理 warmup/re-warming 和早停。
  • PEFT 或参数隔离降低全局权重扰动。
  • 正则、蒸馏、模型合并与阶段性 checkpoint 对比。
  • 建立通用、领域、格式和安全回归评测。

固定“至少混合 10%–30% 旧数据”不是通用规则,应通过回归曲线确定。

机制与定位

新阶段的梯度会把参数推向新数据的低损失区域;当该方向与旧任务所需表示冲突、且没有 replay 或正则约束时,旧能力的 margin 下降,最终表现为回归。这个链条可通过 checkpoint 曲线拆开:

1
2
3
4
新数据 loss ↓
→ 旧回归集是否同步下降?
→ 若是,检查分布冲突/学习率/容量
→ 调整 replay、正则或参数隔离

不要把“新任务变好、旧任务变差”归因给模型规模;先按数据配比、层/模块、tokenizer/template 和推理温度分层对照。PEFT 只是降低扰动概率,不能替代旧能力回归评测。

遗忘通常不是一个单一数字

新领域训练可能保留通用问答,却损伤代码、少数语言、长上下文或拒答边界;平均分不变也可能掩盖某个关键子群体的崩溃。把回归集按语言、任务、长度、知识时效和安全场景分桶,记录每个 checkpoint 的曲线,才能知道是全局漂移还是局部冲突。还要固定推理 tokenizer、chat template 和采样参数,否则包装变化会伪装成遗忘。

用梯度和表示找到冲突位置

如果新旧数据对同一层的梯度方向经常相反,说明该层承担了冲突任务;可以比较旧任务梯度投影、新任务梯度范数和各层激活的 cosine 相似度。浅层更可能承载词法/通用表示,深层更可能承载任务行为,但不要把这个经验当成硬规则;真正的层定位需要 checkpoint 或模块冻结实验验证。只调低全局学习率会让新任务也学不动,参数隔离、replay 或蒸馏更能针对冲突来源。

缓解方案各自牺牲什么

Replay 保留旧分布,却占用数据与训练预算;正则/蒸馏约束旧输出,却可能限制新能力;PEFT 减少全局权重扰动,却受 adapter 容量和 target modules 约束;模型合并便于多版本管理,却可能产生任务间干扰。选择前先明确要保留的是事实、格式、推理还是安全行为,并用同一回归矩阵衡量代价。遗忘报告应同时包括新任务收益、旧任务跌幅、训练 token、参数改变范围和恢复成本。