灾难性遗忘 Catastrophic Forgetting

Catastrophic Forgetting

迁移学习/持续学习中,模型在学习新任务新知识后,几乎完全丧失先前习得任务能力的经典现象,是大模型微调、多任务学习、终身学习领域最核心的挑战之一。

详细解释

Catastrophic Forgetting(灾难性遗忘 / 灾难性失忆) 一句话定义:你本来有一个「啥都会一点」的通用底座模型(会写代码、会做数学、会聊天),然后你用 10 万条客服对话数据对它做了全量 SFT,训完之后发现它客服确实回答得很好,但让它写代码时写出来的全是客服语气的废话,写 Python 函数能力从 80 分掉到 20 分——旧能力被新任务「覆盖掉」了,而且不是慢慢忘,是断崖式下跌,所以叫「灾难性」。它是神经网络的本质属性(因为参数共享,新任务的梯度更新会覆盖旧任务在同一组参数上编码的知识),不是 bug 是 feature。

灾难性遗忘在 LLM 时代有了两个新名字但本质一样:(1) Alignment Tax(对齐税)——做 RLHF/DPO 对齐之后,模型的无害性、有用性上去了,但 coding/math/reasoning 等通用能力的 Benchmark 分数掉了 2-5%,这 2-5% 就是你为了对齐交的「税」,本质就是对齐数据把代码/数学知识覆盖了一部分;(2) Speculative Decay(推理衰减)——SFT 之后模型生成的回答越来越长、越来越像客服,但 CoT 推理的正确率反而比底座低几个百分点。

唯元智创 的迁移学习平台默认开启了「防遗忘保险」:自动把你的微调数据和 10% 的 ShareGPT/Alpaca 通用数据做智能混合,自动监控训练中通用 Benchmark(MMLU/GSM8K/HumanEval)的分数曲线,一旦掉速超过阈值就自动触发 EWC 正则或停止训练,避免你训完才发现模型废了。

灾难性遗忘严重程度的四个影响因素(为什么你 SFT 忘得快、别人忘得慢)

影响因素忘得慢(好)忘得快(坏)工程建议
① 微调方式LoRA / Adapter(只改 0.1-1% 参数)全量微调(改 100% 参数)99% 场景优先 LoRA,忘性是全量的 1/3 到 1/5
② 新任务数据量占比新任务数据 30%,通用数据 70% 混合100% 全是新任务数据任何微调至少混入 5-15% 通用数据,成本几乎为零
③ 学习率 LR 大小LoRA 学习率 1e-5 到 5e-5,epoch ≤ 3LR 1e-4 以上,epoch ≥ 10宁可用小 LR 多训 1 个 epoch,也不要大 LR 爆训
④ 新旧任务相似度新任务和旧底座预训练分布接近(如通用新闻 → 金融新闻)分布差极远(通用百科 → 生物基因序列)分布差距越大,通用数据混入比例要越高(最高加到 30%)

当代防止灾难性遗忘的六大工程化方案(按性价比排序)

方案实现原理实现难度防遗忘效果准确率损失(新任务)综合推荐
① 数据混合 rehearsal(排练法)新任务数据里混 5-20% 通用数据 / 旧任务数据一起训极低0-2%(轻微)⭐⭐⭐⭐⭐ 第一首选,零成本
② LoRA / Adapter 参数隔离新任务只训独立 Adapter / LoRA 权重,底座原权重冻住不动很好0-5%(LoRA 容量有限)⭐⭐⭐⭐⭐ 必选组合
③ 正则约束(EWC / MAS / L2-SP)Loss 加惩罚项:旧任务重要参数改动越大,惩罚越大1-3%⭐⭐⭐⭐ 前两个不够时加
④ 多 Adapter 动态切换每个任务一个独立 LoRA,推理时按任务 ID 切中高极好(完全不遗忘)0%(容量独立)⭐⭐⭐⭐ 多任务场景必须
⑤ 知识蒸馏回放(KD + Replay)训新任务时,让旧模型「老师」监督新模型输出分布保持一致很好1-2%⭐⭐⭐ 资源充足才上
⑥ 动态网络扩展(Progressive / PNN)新任务新增一整层或一整组参数,旧参数完全不动极高完美0%⭐⭐ 只用于超大模型

灾难性遗忘的量化检测方法(怎么判断你真的遗忘了)

不要靠主观感觉「好像写代码不行了」,必须在微调前后固定跑下面三个 Benchmark 组合,量化打分对比,才能客观判断遗忘程度:

基础三件套必跑(每 500 training steps 记录一次曲线)

  1. 通用能力基准:MMLU 5-shot(通用知识)、GSM8K 8-shot(数学推理)、HumanEval Pass@1(代码)
  2. 新任务目标基准:你的业务 held-out 测试集(比如客服 1000 条人工标注)
  3. 灾难性遗忘指数 CF1 = 平均(MMLU/GSM8K/HumanEval 训前分数 - 训后分数)/ 训前分数 × 100%

经验阈值判断(7B 模型为例)

  • CF1 ≤ 3%:几乎没忘,完美,可以上线
  • CF1 3% 到 7%:轻微遗忘,正常,大多数 SFT 都在这个区间,不影响业务
  • CF1 7% 到 15%:中度遗忘,回去加通用数据比例(从 10% 加到 20%),降学习率,重来
  • CF1 ≥ 15%:严重灾难,停止训练!要么改 LoRA(你可能用了全量),要么加 EWC 正则,要么把 LR 砍半再训

常见问题

我用 LoRA 微调后还是忘代码了,是不是哪里做错了?
LoRA 不是万能的,它只是把忘的程度减轻了而不是完全消除;如果你忘得很明显(比如 HumanEval 掉了 10% 以上),通常是以下四个具体参数没调对,改完基本就好:(1)LoRA rank r 太大了——r=64 甚至 128 时,可训练参数量已经接近全量的 5% 以上,遗忘程度也会变大;一般任务 r=8 或 16 就够了,r 越小忘得越慢;(2)target modules 设得太多——很多人把 q_proj/k_proj/v_proj/o_proj/gate/up/down 全部 7 个模块都挂了 LoRA,全部都改的话遗忘当然严重;一般只挂 q_proj 和 v_proj(原论文推荐)或者再加个 o_proj 就够了,别全挂;(3)数据里完全没混通用数据——哪怕是 LoRA,100% 全是客服对话数据也会忘,至少混 5% 的 ShareGPT/CodeAlpaca 通用数据;(4)学习率太大、epoch 太多——LoRA 一般 LR 用 2e-5 或 1e-5,epoch 2-3 足够,很多人用 1e-4 跑 10 个 epoch,LoRA 权重学得太饱和把底座信号盖过去了,相当于伪全量微调。把这四条改完,CF1 通常能从 12% 降到 3% 以内。
DPO/RLHF 对齐之后 Math/Coding 分数掉了(Alignment Tax),怎么补回来?
Alignment Tax 是 2024 年 LLM 对齐研究的热门方向,已经有三个工业界验证有效的补救方案,组合使用基本能把 Tax 降 80%:(1)DPO 偏好对里混入「推理/代码能力样本」——不要让 DPO 的数据集 100% 都是「无害性/有用性」的人类偏好对,至少加 20% 的「推理正确 vs 推理错误」「代码正确 vs 代码错误」的偏好对进去,让 DPO 对齐阶段同时复习 coding/math 能力;(2)SFT 阶段后 + DPO 阶段中间加一道「能力复习 SFT」——做完第一次 SFT(对话对齐)之后,再用 5% 至 10% 的高质量代码/数学数据跑 1 个 epoch 的「复习 SFT」,之后再上 DPO,相当于给 DPO 打底子;(3)用「混合 DPO」而不是纯 DPO——DPO 损失函数是「胜者比败者概率高」,改成加权 DPO:对代码/数学样本的对比对给 2-3 倍的损失权重,无害性样本给 1 倍权重,模型会优先保住推理能力;(4)2024 年底新出的「Kahneman-Tversky Optimization (KTO)」对齐算法从原理上比 DPO 交的税低很多(因为它不需要成对的偏好,而是「喜欢/不喜欢」二分类,没有把模型能力分布拉到「中间态」的副作用),有预算可以直接换 KTO 代替 DPO。
终身学习(Continual Learning)场景,10 个任务一个接一个训,有没有办法不累积遗忘?
单模型共享参数的终身学习,10 个任务累积后一定会有一定程度的遗忘,这是神经网络参数共享的宿命;但工程上可以用「MoE 式 LoRA 路由器 + 经验回放」组合把累积遗忘压到 5% 以内,已经达到了生产可用水平。具体工业界最佳实践(2025 年):(1)参数层:每个新任务到来就挂一个新的独立 LoRA Adapter,Adapter 之间参数完全独立,不共享;(2)路由层:训一个极小的路由器分类器(1 层 MLP,输入用户请求 embedding,输出「这个请求该激活哪些 LoRA」的权重),支持多 LoRA 同时激活加权求和——本质是轻量级 MoE;(3)回放层:每个任务训练当下的同时,从之前所有任务的训练数据中各采样一个小 buffer(每个任务最多 1000 条)一起参与当前任务的 LoRA 更新,保证路由器见过旧数据;(4)固化层:前 3 个任务训完就冻住底座不再改,之后的新任务只新增 LoRA 和更新路由器。这套方案 Meta 在 Llama 3 多任务、OpenAI 在 GPT-4o 多模态对齐中都用了变体,实测 10 个任务的累积 CF1 能控制在 4% 左右,单个 LoRA 的容量又足够专精,是目前性价比最高的终身学习范式;别去碰 2010 年代那堆纯正则(EWC/SI)的学术方法,它们在 7B+ 大模型上根本不 work,遗忘曲线还是爆炸。