大模型在旧数据上练出的能力,微调之后突然不好使了——问它原本会答的常识,开始胡说;让它写原本擅长的格式,写得不伦不类。这叫灾难性遗忘,根子是参数更新只优化了新任务的 loss,旧能力赖以生存的那些参数连接被悄悄改掉了。本文按机制层思路,讲两条主流应对路线。
遗忘是怎么发生的
先看遗忘的来路。模型的各项能力并不住在各自的「抽屉」里,而是共用同一套参数:语言流畅度、知识记忆、格式遵循,全搅在同一张网络里。微调的梯度只朝着新任务的方向推,旧能力依赖的连接被顺手改写,表现出来就是新能力涨一分、旧能力掉三分。任务跨度越大、学习率越高,这种改写越狠。
回放:把旧数据掺回来
第一条路是回放,也叫混合重放。思路很直白:微调时别只喂新数据,把一部分旧数据掺进来一起训。进来的是新旧混合的 batch,新样本教新任务,旧样本把模型往原来的行为上拉,出去的模型两边都不至于太差。掺多少旧数据是关键,掺多了新任务学不动,掺少了旧能力照样掉,实践中常用反复试验的方式定比例,思路和语料配比是怎么调出来的一致。好比复习不能只刷新题,也得回顾旧题;我们平时用 DeepSeek 和 Kimi 问同类问题时,也会刻意换着问法,防止自己只会一种问法。
生成式回放:拿不到旧料时
回放有个更讲究的版本叫生成式回放:旧原始数据拿不到或不便保存时,让基座模型生成一批「旧风格」的样本掺进去。进来的是一个提示模板和基座模型,出去的是一批近似旧分布的合成样本。这条路的好处是不依赖原始语料,坏处是生成样本本身带基座的分布,防遗忘的精度打折,筛选标准可以参考合成数据是怎么筛的里的循环设计。
正则化:拉住参数别乱动
第二条路是正则化。既然遗忘来自参数被改得太多,就在 loss 里加一项惩罚,拉住参数别偏离原位。进来的是新任务梯度和一个「距离基准」的度量,惩罚项按参数与微调前的差异计分,出去的更新量在「学新」和「别乱动」之间折中。常见做法是按参数重要性加权,重要连接动得少、次要连接动得多。好处是不用存旧数据,坏处是基准定得死,任务差异大时会被旧参数拖住,新能力上限受限。
三条路的取舍集中在旧数据、效果和代价上:
| 做法 | 要不要旧数据 | 效果 | 代价与边界 |
|---|---|---|---|
| 回放 | 要,旧样本得能保存 | 新旧混训,两边都不至于太差,效果最稳 | 掺多了新任务学不动,掺少了旧能力照样掉 |
| 生成式回放 | 不用原始语料,要有基座和提示模板 | 不依赖旧料,但防遗忘精度打折 | 合成样本自带基座分布,只是近似旧分布 |
| 正则化 | 不用 | 改动小、无额外数据成本 | 基准定得死,任务差异大时拖住新能力 |
两条路不是二选一。轻量微调用正则化就够,改动小、无额外数据成本;能力跨度大的微调靠回放打底,正则做辅助。参数高效微调方法本身也是防遗忘的一类间接手段——只训一小部分参数,天然破坏面小,这在微调的显存是怎么省的里也有提及。
还有一个常被忽视的因素:学习率。力度过大本身就是遗忘的加速器,预训练级的学习率跑微调,几百步就能把旧能力冲掉一大块。微调时学习率为什么比预训练小讲的就是这个力度账。要验证遗忘有没有发生,得靠覆盖新旧任务的评估集,看两头的成绩单;数据喂入顺序对收敛稳定性的影响,则可以看训练数据的顺序有影响吗。
- 回放:新旧数据混训,掺多少靠反复试验,效果最稳
- 生成式回放:拿不到旧语料时让基座造,精度打折
- 正则化:loss 加惩罚拉住参数,不用存旧数据
- 折中:回放打底、正则辅助,参数高效微调天然减损
- 前提:学习率别超档,评估集要覆盖新旧任务
灾难性遗忘快问快答三则
- 掺多少旧数据算合适?:没有通用比例,从一比一起步按评估集反馈调,新任务掉就减旧、旧能力掉就加。
- 冻结大部分参数能防遗忘吗?:能减轻,冻得越多旧能力越稳,但可学的新东西也越少,是同一个天平的两头。
- 正则化为什么有时不灵?:任务跨度大时,旧参数的基准会拖住新能力,这时候还得靠回放补真实旧分布。


