Catastrophic Forgetting
Catastrophic Forgetting
模型在新数据或新目标上继续训练时,可能损害原有任务和通用能力,这称为灾难性遗忘。
常见原因
- 新数据分布过窄或与原能力冲突。
- 学习率过大、训练时间过长。
- 缺少旧任务 replay 或通用能力约束。
- 评测只看新任务,未建立回归集。
缓解方向
- 混合 replay 数据与代表性旧任务。
- 更小学习率、合理 warmup/re-warming 和早停。
- PEFT 或参数隔离降低全局权重扰动。
- 正则、蒸馏、模型合并与阶段性 checkpoint 对比。
- 建立通用、领域、格式和安全回归评测。
固定“至少混合 10%–30% 旧数据”不是通用规则,应通过回归曲线确定。
机制与定位
新阶段的梯度会把参数推向新数据的低损失区域;当该方向与旧任务所需表示冲突、且没有 replay 或正则约束时,旧能力的 margin 下降,最终表现为回归。这个链条可通过 checkpoint 曲线拆开:
1 | 新数据 loss ↓ |
不要把“新任务变好、旧任务变差”归因给模型规模;先按数据配比、层/模块、tokenizer/template 和推理温度分层对照。PEFT 只是降低扰动概率,不能替代旧能力回归评测。
遗忘通常不是一个单一数字
新领域训练可能保留通用问答,却损伤代码、少数语言、长上下文或拒答边界;平均分不变也可能掩盖某个关键子群体的崩溃。把回归集按语言、任务、长度、知识时效和安全场景分桶,记录每个 checkpoint 的曲线,才能知道是全局漂移还是局部冲突。还要固定推理 tokenizer、chat template 和采样参数,否则包装变化会伪装成遗忘。
用梯度和表示找到冲突位置
如果新旧数据对同一层的梯度方向经常相反,说明该层承担了冲突任务;可以比较旧任务梯度投影、新任务梯度范数和各层激活的 cosine 相似度。浅层更可能承载词法/通用表示,深层更可能承载任务行为,但不要把这个经验当成硬规则;真正的层定位需要 checkpoint 或模块冻结实验验证。只调低全局学习率会让新任务也学不动,参数隔离、replay 或蒸馏更能针对冲突来源。
缓解方案各自牺牲什么
Replay 保留旧分布,却占用数据与训练预算;正则/蒸馏约束旧输出,却可能限制新能力;PEFT 减少全局权重扰动,却受 adapter 容量和 target modules 约束;模型合并便于多版本管理,却可能产生任务间干扰。选择前先明确要保留的是事实、格式、推理还是安全行为,并用同一回归矩阵衡量代价。遗忘报告应同时包括新任务收益、旧任务跌幅、训练 token、参数改变范围和恢复成本。