一、问题本质
灾难性遗忘(Catastrophic Forgetting)是神经网络微调中最常见的问题之一。
它的核心定义是:模型在学习新任务时,大幅丢失了原来在预训练或旧任务上学到的能力。
在大模型微调中表现为:
- 微调后模型在垂直领域表现变好;
- 但通用能力,比如常识、推理、指令跟随、多语言,明显下降;
- 严重时模型会变得“偏科”,甚至只会说微调数据的格式。
一句话总结:灾难性遗忘就是模型“学了新的,忘了旧的”,本质是参数更新破坏了原有知识表示。
二、灾难性遗忘的成因
1、参数共享
神经网络的所有任务共享同一套参数。
- 预训练知识分布在参数中;
- 微调时参数被更新;
- 新任务梯度可能覆盖旧任务需要的参数方向。
2、数据分布偏移
微调数据分布和预训练分布不同:
- 微调数据集中在某个领域;
- 模型参数向该领域偏移;
- 通用能力对应的参数被弱化。
3、梯度干扰
不同任务的梯度方向可能冲突:
- 新任务梯度更新参数;
- 可能破坏旧任务的最优解;
- 没有机制保护旧知识。
4、微调数据量小
指令微调数据通常只有几万条:
- 相比预训练万亿 token;
- 数据量小,模型容易过拟合;
- 过拟合后泛化能力下降。
5、学习率过大
- 学习率大,参数更新幅度大;
- 更容易破坏预训练知识;
- 需要较小学习率和 warmup。
三、全量微调怎么缓解灾难性遗忘
1、混合通用数据
在微调数据中混入通用数据:
- 通用指令数据;
- 预训练数据的一小部分;
- 多任务数据。
配比通常:
- 领域数据:70%–90%;
- 通用数据:10%–30%。
作用:
- 保持通用能力;
- 防止参数过度偏移;
- 类似“复习”。
2、降低学习率
- 用比预训练更小的学习率;
- 常见 $1 \times 10^{-5}$ 到 $5 \times 10^{-5}$;
- 配合 warmup 和 cosine decay。
3、早停
4、正则化
5、参数高效微调
- 用 LoRA 代替全量微调;
- 只更新少量参数;
- 冻结基座,保护预训练知识。
6、多阶段微调
- 先通用指令微调;
- 再领域微调;
- 逐步过渡,减少冲击。
7、经验回放
- 保留部分旧数据;
- 训练时混合新旧数据;
- 缓解遗忘。
四、LoRA 怎么缓解灾难性遗忘
1、冻结基座
LoRA 的核心:
- 基座参数 $W_0$ 冻结;
- 只训练低秩增量 $BA$;
- 原始知识保存在 $W_0$ 中。
$$
W = W_0 + BA
$$
因为 $W_0$ 不变,预训练知识不会被直接破坏。
2、低秩约束
- $BA$ 是低秩的;
- 表达能力有限;
- 不会大幅改变模型行为;
- 减少对通用能力的冲击。
3、初始化策略
- $A$ 高斯初始化;
- $B$ 零初始化;
- 初始 $\Delta W = 0$;
- 从预训练模型出发,平滑过渡。
4、缩放系数
- $\alpha / r$ 控制增量影响;
- 较小的缩放,减少对基座的扰动。
5、但 LoRA 也可能遗忘
如果:
- $r$ 太大;
- 训练数据太单一;
- 训练太久;
- 学习率太大;
LoRA 也可能导致通用能力下降。
所以 LoRA 只是缓解,不是完全避免。
五、微调后通用能力下降的排查方向
1、先确认下降程度
- 用什么评估?
- 通用 benchmark:MMLU、C-Eval、GSM8K、HellaSwag;
- 指令跟随:MT-Bench、AlpacaEval;
- 多语言:MGSM、XLSum;
- 和基座对比,量化下降幅度。
2、排查数据
(1)数据配比
- 领域数据占比是否过高?
- 是否完全没有通用数据?
- 是否单一任务主导?
(2)数据质量
(3)数据分布
- 是否和预训练差异太大?
- 是否覆盖太窄?
- 是否缺少多样性?
(4)数据量
- 是否过拟合?
- 是否 epoch 太多?
- 是否数据太少?
3、排查训练
(1)学习率
- 是否太大?
- 是否有 warmup?
- 是否有 decay?
(2)训练轮数
(3)batch size
(4)损失曲线
- 训练 loss 是否过低?
- 验证 loss 是否上升?
4、排查方法
(1)是否用全量微调
(2)LoRA 配置
- $r$ 是否太大?
- target_modules 是否太多?
- $\alpha$ 是否太大?
(3)是否合并了 LoRA
5、排查模型
- 基座模型是否本身就有问题?
- 是否选错了基座?
- 是否模型太小?
六、解决通用能力下降的方法
1、数据层面
- 混入通用数据,10%–30%;
- 提高数据质量;
- 增加多样性;
- 去重、去噪;
- 平衡任务配比。
2、训练层面
- 降低学习率;
- 减少 epoch;
- 加 warmup;
- 早停;
- 用 LoRA 代替全量。
3、方法层面
- 用 LoRA,冻结基座;
- 减小 $r$;
- 减少 target_modules;
- 用 DoRA、LoRA+ 等改进;
- 用多阶段微调。
4、正则层面
5、评估层面
- 建立通用能力评估集;
- 训练中定期评估;
- 发现下降及时调整。
6、模型合并
- 把微调模型和基座模型做权重插值;
- 比如 Task Arithmetic、TIES、DARE;
- 平衡领域能力和通用能力。
7、多 LoRA 方案
- 基座保持通用;
- 领域能力用 LoRA 加载;
- 推理时按需切换;
- 避免永久性遗忘。
七、一个实际排查流程
第一步,确认下降:
- 跑通用 benchmark;
- 和基座对比;
- 量化下降幅度。
第二步,看数据:
- 配比是否失衡;
- 质量是否有问题;
- 是否缺少通用数据。
第三步,看训练:
第四步,看方法:
第五步,对症下药:
- 混通用数据;
- 降学习率;
- 减 epoch;
- 换 LoRA;
- 减 $r$;
- 模型合并。
第六步,重新评估,迭代。
八、简单评价这道面试题
1、这道题的价值
- 这是大模型微调中非常实战的一道题;
- 一道题能考察灾难性遗忘的成因、全量和 LoRA 的缓解机制、排查和解决思路;
- 区分度好,初级可能只知道“会忘”,中级能说清原因,高级能系统排查并给出解决方案;
- 贴近实战,微调后通用能力下降非常常见。
2、这道题的不足
- 题目偏综合,如果没有实际微调经验,容易答得空泛;
- 没有涉及具体 benchmark 和评估方法;
- 对模型合并等高级方法考察不够;
- 没有涉及多任务学习和持续学习。
3、建议的追问方向
- 怎么量化通用能力下降?
- 混通用数据的比例怎么定?
- LoRA 为什么也会遗忘?
- 模型合并有哪些方法?
- 持续学习中怎么避免遗忘?
- 多 LoRA 方案怎么设计?
4、总体评价
这是一道很好的大模型微调实战面试题,适合考察候选人对灾难性遗忘和微调权衡的理解。它既能考察遗忘的成因,也能延伸到数据、训练、方法和评估多个层面。如果候选人能把灾难性遗忘的原因、全量和 LoRA 的缓解机制以及系统的排查和解决流程都讲清楚,基本可以判断其具备大模型微调的实战经验。
评论专区
评论加载中...登录后即可发表评论