微调完就把老本行忘光?聊聊灾难性遗忘

灾难性遗忘核心数据与三大解法

你拿一个开源大模型,用自己业务的数据做了一轮监督微调。目标任务上的表现肉眼可见地变好了:回答风格更贴合业务、输出格式更规范、专业术语也不再乱用。可你再拿它去做点别的事,问题就来了——原本能算对的数学题开始出错,写代码的风格变得奇怪,多轮对话甚至接不上茬。你明明只是”教了它一点新东西”,为什么感觉像把它”洗了脑”?

微调完就把老本行忘光?聊聊灾难性遗忘

这不是你的错觉,也不是训练脚本写错了。这是深度学习里一个从 1980 年代就被记录下来、至今仍然没有彻底解决的老问题——灾难性遗忘(Catastrophic Forgetting)。它既是”为什么大模型不能像人一样持续学习”的答案,也是每一个做微调的工程师迟早会撞上的墙。

关键事实速览

维度要点
现象顺序学习多个任务时,学习新任务会导致旧任务性能骤降
首次记录McCloskey & Cohen,1989 年(称 catastrophic interference)
本质原因神经网络参数共享:为新任务更新的权重,恰好承载着旧任务的知识
核心矛盾稳定性 vs 可塑性的两难(stability-plasticity dilemma)
三大解法正则化(EWC / LwF)、回放(GEM / 生成式回放)、参数隔离(Adapter / LoRA)
大模型特征参数量越大,在某些实验中遗忘反而越严重;参数高效微调天然更抗遗忘

先看一个具体的例子

假设你手上有一个 70 亿参数的开源对话模型,通用能力不错。现在你要让它学会用你公司的口吻写周报,于是准备了 5000 条”周报指令 → 周报内容”的样本,做了一轮全参数微调。

训练日志很好看:训练损失从 1.8 一路降到 0.4,验证集上的格式准确率从 30% 涨到 92%。你美滋滋地把模型部署上去,结果测试的时候发现:

  • 让它做一道简单的两位数乘法,它开始胡言乱语,而微调之前它是算得对的;
  • 让它写一段 Python,代码能跑但风格明显变了,变量命名开始带周报腔;
  • 多轮对话里,它更容易”忘记”上文,回答变得又短又急。

你会本能地怀疑:是不是学习率太高了?是不是数据质量有问题?是不是过拟合了?

这些怀疑都有道理,但都不是根本原因。真正发生的事情是:为了防止在 5000 条周报样本上出错,梯度下降毫不犹豫地修改了一大批”对周报任务不重要、但对数学和代码至关重要”的权重。模型没有”变笨”,它只是把能力重新分配给了新任务。

灾难性遗忘到底是什么

用一句话概括:灾难性遗忘是指神经网络在学习新信息时,突然且严重地丢失先前已学知识的现象。“灾难性”(catastrophic)这个词不是修辞夸张,而是描述其破坏程度——不是慢慢退化,而是在训练新任务的早期阶段就断崖式下跌。

这个概念最早可以追溯到 1989 年,McCloskey 和 Cohen 在一项关于联结主义模型(connectionist models)的研究中发现:当网络被要求顺序学习多组模式时,学习新的一组模式会让它对旧模式的记忆几乎完全崩溃。他们把这个现象称为”灾难性干扰“(catastrophic interference)。后来 French 在 1999 年的综述里,将这类现象统一梳理并推广为”灾难性遗忘”这一更广为人知的说法。

这里有一个容易被忽略的关键限定词:顺序。如果所有任务的数据同时摆在面前一起训练(也就是多任务学习),遗忘根本不会发生——网络会在所有任务的约束下找一个共同的解。问题恰恰出在”任务一个接一个到来、旧数据又拿不到”这个现实约束上。

而现实世界里,绝大多数场景都是顺序的:模型上线后要不断吸收新知识、新产品、新话术,你不可能每次都把历史上所有数据重新翻出来联合训练一遍。这也是为什么灾难性遗忘至今仍是 AI 走向”持续学习”(continual learning)的核心障碍。

为什么会发生:三个层次的原因

要真正理解这件事,得从神经网络”知识存在哪”说起。

第一层:知识是分布式的,没有专属抽屉。在传统软件里,功能是隔离的——你改一个函数,不会影响另一个函数。但神经网络不是这样。一个模型的所有知识,都被分布式地编码在同一套权重矩阵里。”会算加法”和”会写周报”这两件事,在参数空间里高度重叠,共享着大量底层神经元。你动了其中一部分,另一部分就会跟着变。这是灾难性遗忘最根本的结构性原因。

第二层:学习就是在损失地形上找低点。训练神经网络,可以想象成在一片多维的”损失地形”上寻找最低的山谷。每个任务都有自己的一片”好区域”。当模型学完任务 A,它停在 A 的谷底;接着开始学任务 B,梯度下降只看 B 的损失,于是它从 A 的谷底出发,一路朝着 B 的谷底走。走到 B 的谷底时,脚下这个位置对 A 来说可能已经是高高的山坡了——旧任务的性能自然就崩了。

这里还有一个反直觉的细节:因为神经网络是极度过参数化的,同一个任务通常存在大量性能相同的解。这意味着理论上”对 A 好的区域”和”对 B 好的区域”很可能是相交的,存在一个能同时满足两者的解。真正的问题在于,标准梯度下降根本没有动机去找那个相交区域——它只关心眼前的 B,走直线最近的谷底就够了。这正是很多缓解方法的立足点:把”去找相交区域”这件事,变成一个显式的优化目标。

第三层:新任务的梯度是”覆盖式”的。实际训练时,为了让新任务快速收敛,学习率往往设得不低,梯度更新的幅度也大。一批数据的梯度反向传播下去,会在成千上万个参数上同时施加改动。对模型来说,它并不区分”这个参数对旧任务有多重要”,所有参数一视同仁地被推着走。于是承载旧知识的关键权重,就这样被顺手改掉了。

稳定性与可塑性:一对天生的矛盾

理解了上述原因,你会发现灾难性遗忘其实是一枚硬币的一面。另一面,是它在认知科学里的经典表述——稳定性与可塑性的两难(stability-plasticity dilemma)。

一个学习系统必须同时具备两种能力:

  • 可塑性(plasticity):能够吸收新信息、适应新任务;
  • 稳定性(stability):能够保住已经学会的旧知识不被冲掉。

麻烦在于这两者天然对立。把权重锁得越死(稳定性强),模型就越难学新东西(可塑性差);把权重放得越开(可塑性强),旧知识就越容易被覆盖(稳定性差)。这不是调参能绕过去的工程问题,而是任何学习系统都要面对的根本取舍。

生物大脑被认为通过”突触巩固”(synaptic consolidation)来缓解这个矛盾——重要突触会被加固、变得不易改变,从而在保持整体可塑性的同时保住关键记忆。EWC 这篇论文的灵感正来源于此。而人工神经网络的困难在于,它没有这种”哪些连接重要”的天然机制,必须人为地把它算出来。

它和过拟合、和”模型变笨”不是一回事

做微调时,有三个容易混淆的概念,先厘清:

概念表现根因怎么判断
灾难性遗忘旧任务能力断崖式下降,新任务表现良好参数被新任务改写,覆盖旧知识在旧任务评测集上测,分数骤降
过拟合训练集表现好,验证集表现差模型记住了训练样本的噪声训练/验证损失曲线分离
能力退化所有任务上表现都下降训练不稳定、精度损失、数据有毒性新任务本身也没学好

关键区别在于:灾难性遗忘是”此消彼长”——新任务涨、旧任务跌;而过拟合是”新任务自己没学好”。如果你发现微调后模型在目标任务上确实变强了,但在通用基准上明显变差,那基本就是灾难性遗忘,而不是过拟合。

解法路线一:正则化,给重要权重加”弹簧”

最直观的思路是:既然问题是”重要权重被改坏”,那就识别出重要权重,给它们加一道约束,让它们别跑太远。这类方法统称正则化方法

EWC(Elastic Weight Consolidation,弹性权重巩固)是这条路线上的奠基之作,由 DeepMind 团队发表于 2017 年的 PNAS(卷 114、第 13 期、3521–3526 页,DOI 10.1073/pnas.1611835114)。它的核心做法分两步:

  1. 算重要性:在每个任务训练完成后,用费舍尔信息矩阵(Fisher Information Matrix)估计每个参数对该任务的重要程度——可以粗略理解为”这个参数动一点点,任务损失会涨多少”。
  2. 加惩罚:学新任务时,在损失函数里加一个二次惩罚项,把重要参数往旧值上拉。重要性越高,拉得越紧。

论文把这个机制比作一根弹簧:每个参数都被一根弹簧拴在它原来的位置上,弹簧的”硬度”正比于该参数的重要性。这就是”弹性权重巩固”这个名字的由来(elastic 一词正是取自弹簧)。换句话说,学习新任务时,不重要的参数可以自由调整,重要的参数则被牢牢拽住。

论文用两组实验验证了有效性:一组是手写数字(MNIST)上的分类任务序列,另一组是让同一个智能体依次学习多个 Atari 2600 游戏。在 Atari 实验里,不加约束的智能体在停止玩某个游戏后很快就把它忘光了,平均下来几乎学不会任何一个;而加入 EWC 后,它能在依次学习多个游戏的同时保住前面的成绩。

LwF(Learning without Forgetting,无遗忘学习)是另一条同属正则化、但机制完全不同的路线,由伊利诺伊大学香槟分校的 Li 与 Hoiem 在 2016 年提出(arXiv:1606.09282)。它的巧妙之处在于:不需要旧任务的数据,也能保住旧任务的能力。

做法是”让模型自己教自己”:

  • 把新任务的图片先喂给原始模型,记录它对旧任务的输出概率分布,作为”软标签”;
  • 训练时同时优化两个目标——新任务的分类损失,加上一个知识蒸馏损失,逼着新模型的输出尽量贴近刚才记录的软标签;
  • 先”热身”训练新加的任务层,再对全部参数做联合优化。

论文在 AlexNet 上的实验中,用 ImageNet 和 Places365 作为旧任务、PASCAL VOC 和 CUB-200-2011 等作为新任务。一个典型结果很能说明问题:在 ImageNet→VOC 的场景里,普通微调把旧任务准确率拉到了 55.3%,而 LwF 保住了 56.2%,已经非常接近需要旧数据的联合训练上界 56.9%。更有意思的是,在 CUB 鸟类识别这个新任务上,LwF 拿到了 57.7%,反而超过了普通微调的 57.0% 和特征提取的 52.5%——作者认为,保住旧知识本身起到了一种正则化作用,抑制了对新(通常更小)数据集的过拟合。

此外还有 SI(Synaptic Intelligence)、MAS(Memory Aware Synapses)等方法,思路与 EWC 类似,都是用不同方式估计参数重要性并施加约束,区别主要在”重要性怎么算”上。

解法路线二:回放,用旧数据的”影子”提醒模型

如果说正则化是”给参数上锁”,回放(rehearsal / replay)就是”给模型复习”。既然旧数据拿不到,那就想办法造出它的替身。

最朴素的版本是经验回放:训练新任务时,从旧任务里抽一小部分真实样本混进每个批次一起训。这个方法简单有效,但前提是你还留着旧数据——而在隐私敏感、数据量巨大的真实场景里,这个前提经常不成立。

GEM(Gradient Episodic Memory,梯度情景记忆)由 Lopez-Paz 与 Ranzato 在 2017 年提出,用一个”情景记忆库”存下少量旧任务样本。每步更新时,它不只算新任务的梯度,还会检查这个梯度会不会推高旧任务的损失;如果会,就把梯度投影到一个不伤害旧任务的方向上去。它的改进版 A-GEM(Chaudhry 等,2019)大幅简化了计算,让方法更实用。这两项工作还贡献了持续学习领域常用的三个评价指标:准确率后向迁移(学新任务对旧任务的影响)和前向迁移(学新任务对未来任务的帮助)。

生成式回放(Generative Replay,Shin 等,2017)更进一步:不存真实样本,而是训练一个生成模型,让它”回忆”出旧任务的伪样本,用这些伪样本参与训练。这样一来,旧数据完全不落地,隐私和存储问题都缓解了。

自合成回放(Self-Synthesized Rehearsal,SSR)是把这套思路搬到 LLM 上的一个新版本(arXiv:2403.01244)。它用模型自己在旧任务上学到的能力,生成一批合成样本作为”复习材料”,再拿这些材料和新任务数据一起训练。论文在 SuperNI 任务序列上做了对比,用后向迁移(BWT,衡量学新任务后旧任务掉了多少,越接近 0 越好)来看效果:

模型方法平均准确率 AR后向迁移 BWT
Llama-2-7b-chat多任务学习(上界)62.68
不回放(基线)47.05−20.73
自合成回放 SSR63.34−1.27
Alpaca-7b多任务学习(上界)63.60
不回放(基线)36.37−31.50
自合成回放 SSR60.24−2.35

这组数字非常直观:Alpaca-7b 在完全不回放时,学完新任务后旧任务平均掉了 31.5 个百分点(BWT −31.50);引入自合成回放后,这个损失被压到 2.35 个百分点(BWT −2.35),同时平均准确率从 36.37 提升到 60.24,已经逼近需要全部数据同时训练的多任务学习上界 63.60。

解法路线三:参数隔离,让不同任务用不同的”抽屉”

第三条路线的思路最干脆:既然共享参数会导致互相干扰,那干脆不让它们共享

硬隔离的早期代表是 PackNet、Progressive Networks 这类方法:每学一个新任务,就冻结一部分已经用过的参数,只训练剩余参数。旧任务的权重被彻底锁死,当然不会被覆盖。代价是模型的参数容量会被逐个任务消耗掉,任务一多就无参数可用,而且任务之间完全没有知识迁移。

软隔离则是今天更主流的做法,代表就是 Adapter 与 LoRA。这类方法统称参数高效微调(PEFT):冻结住整个预训练模型不动,只在旁边插入少量可训练的新参数(Adapter 加的是小模块,LoRA 加的是低秩分解矩阵),训练时只更新这部分。

这带来一个非常重要的”副作用”——它天然就是抗遗忘的。因为原始权重根本没被改动,模型的基础能力完整保留在原处;新学到的知识被写进了新增的那一小块参数里。如果你要为第二个任务再训一个 LoRA,只要和第一个 LoRA 分开存放,两者可以互不干扰地共存。这正是 LoRA 在工程实践中如此受欢迎的原因之一:它不只是”省显存”,还顺手缓解了灾难性遗忘。

研究者在这条路上还在继续推进。正交子空间方法(如 O-LoRA)要求新任务的更新方向与旧任务正交,从几何上避免干扰。LB-CL(Qiao 与 Mahdavi,NeurIPS 2024,宾夕法尼亚州立大学)则把两种目标结合起来:一方面通过基于敏感度的 SVD 三元组选择,把旧任务的参数化知识注入新任务的初始化(促进知识迁移);另一方面用梯度投影保持正交,避免遗忘。在 Amazon Reviews 与 Yahoo Answers 两个基准上,它用 T5-large 取得了 52.9 和 46.8 的准确率,超过了此前的 SOTA 方法 O-LoRA。

大模型时代:问题变简单了,还是更难了

一个自然的期待是:模型这么大,是不是就不容易忘了?答案是两面都有,而且比想象中微妙。

令人担心的一面:Huang 等人在 2024 年做了一项针对大模型的实证研究,发现在跨领域的持续指令微调中(涵盖推理、阅读理解等任务),遗忘会随着模型规模增大而变得更严重,尤其是在 10 亿到 70 亿参数这个区间。也就是说,”模型更大就更抗遗忘”这个直觉,在指令微调场景下并不成立。

令人安心的一面:另一项关于持续预训练的研究(Ibrahim 等,2024)给出了相反的观察——更大的模型比小模型更能抵抗遗忘。他们用 The Pile 作为初始训练数据,用 SlimPajama(英语到英语,弱分布偏移)和德语 Common Crawl(英语到德语,强分布偏移)模拟持续预训练,并提出了一套三步配方:学习率重新升温再衰减(恢复可塑性)、按计算量等价地混入旧数据回放(对抗遗忘)、采用”无限”学习率调度(适配不限次数的更新)。结果很漂亮:一个 100 亿参数模型在弱偏移下,只回放 5% 的原始数据,平均基准分就达到 47.68,而”从头重训”这个昂贵基线的分数是 48.00——几乎无法区分。

两份研究看似矛盾,其实说的是两件事:持续预训练(在原始分布上继续训练)和指令微调(在下游任务上做定向调整)对模型的影响机制不同,前者更多是补充知识,后者更容易改写行为模式。这也提醒我们:讨论”大模型会不会遗忘”,必须先说清是在哪种训练范式下。

还有一项对比研究值得一提(arXiv:2504.01241):它在 GLUE 基准的 SST-2、MRPC、CoLA、MNLI 四个任务上对多个 100 亿参数以下的开源模型做顺序微调。结果显示,不同模型抗遗忘的能力差异相当大——Phi-3.5-mini 表现出最小的遗忘,同时保持了很强的学习能力,被认为适合持续学习场景;而 Orca-2-7b、Qwen2.5-7B 在微调后也展现出不错的学习能力和综合表现。对工程师的实际启示是:选基座模型时,抗遗忘能力本身就应该是一个考量项。

三条路线横向对比

路线代表方法核心机制是否需要旧数据主要代价
正则化EWC按参数重要性加二次惩罚(弹簧)不需要需算费舍尔矩阵,任务多时约束过强
正则化LwF用旧模型软标签做知识蒸馏不需要新旧任务差异大时效果下降
回放经验回放 / GEM混入旧任务样本或约束梯度方向需要(少量)存储与隐私成本
回放生成式回放 / SSR用生成或自合成样本当复习材料不需要真实旧数据合成样本质量影响上限
参数隔离PackNet冻结旧参数,只训剩余部分不需要参数容量被逐任务消耗
参数隔离Adapter / LoRA冻结主干,只训新增小参数不需要多任务适配器需要额外管理

需要说明的是,这三条路线并非互斥。工程实践中常见的组合是:用 LoRA 做参数隔离打底,再在训练数据里混入少量通用指令数据做回放——一个管”别改坏主干”,一个管”别忘了旧本事”,两者叠加往往比单用一种更稳。

工程上怎么判断和缓解

如果你正在做微调,下面几条是可以直接落地的做法。

第一,建立一套”防遗忘评测集”。这是最基本也最容易被忽略的一步。除了目标任务自己的验证集,还要固定一组通用能力测试——数学、代码、常识、多轮对话各留几道题,微调前后各跑一次。只有测了,你才知道到底掉了多少。千万不要只看目标任务的指标就上线。

第二,优先考虑参数高效微调。如果 LoRA 或 QLoRA 能满足目标任务的精度要求(多数场景下可以),优先用它代替全参数微调。冻结主干这个动作本身,就消除了一大部分遗忘风险。

第三,在训练数据里混入通用数据。即使做全参数微调,也可以在业务样本里掺入一定比例的通用指令数据(业界常见的做法是从百分之几到百分之几十不等,具体比例需要在目标任务效果和通用能力之间做消融实验)。这就是回放思想最朴素的落地形式。

第四,控制学习率和训练轮数。灾难性遗忘在训练早期最猛。较低的学习率、较少的轮数、以及合适的早停策略,都能显著减轻对旧知识的破坏。如果必须做多轮,考虑隔一段时间就评估一次通用能力,一旦发现明显下滑就停下来调整。

第五,多任务场景显式设计隔离。如果你需要让模型同时服务多个业务方向,别把它们混在一个 LoRA 里训。为每个方向训练独立的适配器,运行时按需加载或切换,比”训一个大杂烩”要可控得多。

第六,接受”没有免费午餐”。上述所有方法都是在稳定性与可塑性之间做权衡,没有哪一种能让你既能无限吸收新知识、又永远不忘旧本事。真正务实的做法,是先明确你的业务更怕哪一种损失,再据此选择偏向稳定还是偏向可塑的方案。

小结

灾难性遗忘不是 bug,而是当前神经网络架构与训练范式的一种固有属性。它的根源在于参数共享——旧知识和新技能挤在同一套权重里,而梯度下降在学新任务时并不会主动照顾旧任务。

从 1989 年被记录到今天,研究者已经拿出了三大类应对手段:正则化(EWC 的弹簧、LwF 的蒸馏)通过约束重要参数来保住旧知识;回放(GEM、生成式回放、自合成回放)通过复习旧数据的替身来提醒模型;参数隔离(Adapter、LoRA)则从结构上让不同任务各用各的参数,从根子上避免干扰。而 LoRA 这类参数高效微调方法之所以在工程上大受欢迎,正是因为它们在省显存的同时,顺手把抗遗忘这件事也解决了一大半。

回到文章开头那个例子:微调完模型”变了个人”,其实是在提醒我们——每一次微调,都是一次对模型能力的重新分配。想清楚哪些能力必须保住、哪些可以牺牲,并为此配上合适的评测和方法,远比调参本身更重要。

主要菜单