资讯动态

灾难性遗忘与持续学习:为什么大模型上线后要冻结参数

发布时间:2026/10/15 5:38:33 来源:尧图企业网站定制
1. 一个让人睡不着觉的悖论你有没有想过一个挺拧巴的事儿我们花了这么大力气让机器能像人一样从数据里学东西可一旦它学成了我们做的第一件事往往是——把它冻起来不让它再学了。这不是段子。你去看任何一个真正落地的深度学习系统几乎都是这个套路训练阶段拼命喂数据、调参数等模型收敛到一个满意的指标立刻保存权重、锁死参数然后拿去推理。上线之后这个模型就进入了一种冻结人生——它再也不会因为遇到新数据而改变自己了。哪怕线上数据分布已经悄悄漂移哪怕用户行为早就变了样它还是那副老样子顶多靠人工定期重新训练一版替换掉。这事儿细想挺反直觉的。我们造机器的初衷不就是希望它能持续进化、越用越聪明吗为什么真到了这一步反而不敢让它一直学了答案藏在一个听起来有点吓人的词里灾难性遗忘Catastrophic Forgetting。这个词不是危言耸听它描述的是一个非常具体的现象——当一个神经网络在学习新任务时它会把之前学过的任务忘得一干二净而且忘得非常彻底几乎像是从来没学过一样。这篇文章我想把这条线索捋清楚从灾难性遗忘到底是怎么发生的到持续学习Continual Learning这个领域为了解决它想了哪些招再到大模型时代为什么冻结反而成了一种主流选择。中间会穿插一些我自己的理解、踩过的坑以及如果你要动手做相关实验具体该怎么设计、怎么避雷。适合对深度学习有一定基础、想搞清楚模型为什么不能一直学这个问题的朋友也适合正在做增量训练、模型迭代相关工作的同学参考。2. 灾难性遗忘到底是怎么发生的2.1 从一个最朴素的实验说起要理解灾难性遗忘最好的办法不是看定义而是自己动手跑一个最小实验。这个实验我在早期接触持续学习时反复做过每次都能直观感受到那种忘得干干净净的震撼。设想一个简单的全连接网络先让它学任务A识别手写数字0和1。数据很简单网络很快就能达到很高的准确率。这时候你把任务A的测试集拿出来测一遍准确率可能是99%以上。然后你不动网络结构直接拿任务B的数据继续训练——比如识别数字2和3。训练完之后你再回头测任务A会发生什么结果往往让人心里一凉任务A的准确率可能直接掉到接近随机猜测的水平比如50%左右二分类瞎猜的水平。网络并没有变笨它在任务B上表现很好但它把任务A的知识几乎完全覆盖掉了。这就是灾难性遗忘最赤裸裸的样子。我第一次看到这个结果的时候第一反应是是不是我代码写错了。反复检查数据加载、标签映射、损失函数都没问题。后来才明白这不是bug这是神经网络训练机制的内在天性。2.2 为什么梯度更新会覆盖旧知识要解释这个现象得回到神经网络训练的本质基于梯度的参数更新。神经网络的知识并不像数据库那样把每条信息存在一个独立的格子里。它是分布式地存储在成千上万个参数权重和偏置里的。一个参数往往同时参与多个任务、多个样本的预测。这种共享参数的设计是神经网络强大的原因也是它脆弱的根源。当你用任务B的数据做梯度下降时优化器只关心一件事怎么让当前这批数据上的损失更小。它根本不知道也不在乎这些参数之前承载了任务A的什么信息。于是为了拟合任务B参数会朝着对任务B有利的方向大幅移动。如果任务A和任务B需要的参数配置差异较大那么这次移动就会把原本编码任务A知识的参数配置破坏掉。打个比方。想象你有一块橡皮泥任务A要求你把它捏成一只鸭子你捏好了。现在任务B要求你把它捏成一辆汽车。你手上只有这一块泥为了捏出汽车你必须把鸭子拆了重捏。捏完汽车鸭子自然就没了。神经网络面对的就是这种只有一块泥的困境——参数容量是共享的新任务的重塑会摧毁旧任务的形状。这里有个关键点容易被忽略遗忘的严重程度和任务之间的相似性、参数更新的幅度都强相关。如果任务A和任务B非常相似比如都是识别手写数字只是类别不同遗忘会轻一些如果差异巨大比如一个做图像分类一个做文本情感分析遗忘几乎是毁灭性的。另外学习率越大、训练轮数越多参数移动越剧烈遗忘也越严重。2.3 它和过拟合欠拟合不是一回事很多人第一次听到灾难性遗忘会下意识把它和过拟合、欠拟合混在一起。这三者其实完全不同我专门用一张表来区分因为搞混了会导致你排查问题时方向跑偏。现象本质典型表现触发条件过拟合模型记住了训练集的噪声泛化差训练集准、测试集差数据少、模型复杂、训练久欠拟合模型容量不足或训练不充分训练集和测试集都差模型太简单、训练不足灾难性遗忘学新任务时破坏旧任务参数新任务好、旧任务崩顺序训练多任务、共享参数看出来了吧灾难性遗忘的独特之处在于它在当前任务上表现是好的坏的是过去学过的任务。这是一种时间维度上的退化而不是泛化维度上的问题。你如果只盯着当前任务的验证集根本发现不了它必须回头去测旧任务才能暴露。提示做增量训练时一定要保留一份旧任务的验证集并且每次训练后都跑一遍。我见过太多团队只监控新任务指标上线后才发现老功能悄悄退化了排查起来非常痛苦。3. 持续学习想让模型边学边记的几条路既然灾难性遗忘是共享参数导致的那持续学习Continual Learning也叫终身学习 Lifelong Learning这个领域要解决的核心问题就很明确了如何让模型在顺序学习多个任务时既学好新任务又不忘记旧任务。这个领域发展到现在大致形成了三条主要技术路线我一条条拆开讲顺便说说各自的坑。3.1 正则化路线给重要参数上锁这条思路的核心是不是所有参数对旧任务都同等重要。有些参数是关键先生动了它们旧任务就崩有些参数无关紧要随便改。那我们在学新任务时就给那些重要参数加一个惩罚项让它们尽量别动。最经典的方法是EWCElastic Weight Consolidation弹性权重巩固。它的做法是在学完任务A之后计算每个参数对任务A的重要性用Fisher信息矩阵来估计然后学任务B时在损失函数里加一项惩罚那些重要参数偏离原值的幅度。重要性越高的参数越不允许动就像给它们绑了根橡皮筋拉得越远阻力越大。这个方法的直觉很漂亮但实操中有几个坑Fisher信息矩阵的计算成本不低尤其是大模型参数量动辄上亿算一遍开销很大。重要性估计依赖旧任务数据如果旧数据因为隐私或存储原因拿不到这方法就受限。任务多了之后约束会互相打架。学第三个任务时既要尊重任务A的重要性又要尊重任务B的约束越叠越多模型最后可能哪个任务都学不好陷入动弹不得的僵局。我实测下来的感受是EWC在任务数量少2到3个、任务差异中等的情况下效果还行但任务一多就力不从心。它更像是一个温和的提醒而不是强力的保险。3.2 回放路线把旧数据掺进来一起学如果说正则化是别动旧参数那回放Replay路线就是另一个极端既然怕忘那就别让模型只学新的把旧数据也拿出来一起学。最直接的做法叫经验回放Experience Replay维护一个记忆缓冲区存一部分旧任务的样本。每次学新任务时从缓冲区采样一批旧样本和新样本混在一起训练。这样模型在每个批次里都能同时看到新旧数据参数更新就会兼顾两边遗忘自然大大减轻。这招效果通常是最好的但代价也很明显存储成本你得存旧数据。数据量大或者任务多的时候缓冲区怎么设计、存多少、存哪些都是学问。隐私和合规问题很多场景下旧数据不能长期保留或者不能跨任务共享这时候回放就用不了。数据不平衡如果新任务数据远多于回放的旧数据模型还是会被新任务带偏。需要仔细调回放比例。为了绕开必须存原始数据的限制后来出现了生成回放Generative Replay不存真实数据而是训练一个生成模型让它回忆出旧任务的样本。这个思路很优雅但引入了新问题——生成模型本身也可能遗忘而且生成质量不稳定训练复杂度高。我试过用生成回放做实验调参调到怀疑人生最后效果还不如老老实实存一批真实样本。3.3 架构路线给每个任务分房间前两条路线都是在共享参数这个前提下想办法架构路线则干脆换个思路既然共享参数会互相干扰那我给不同任务分配不同的参数子集各用各的不就不打架了吗具体做法有很多种。比如参数隔离学任务A时只用一部分网络分支学任务B时再长出新分支旧分支冻结不动。又比如动态扩展每来一个新任务就给网络增加一些容量专门服务新任务。这条路线理论上能彻底避免遗忘因为旧任务的参数根本没被碰过。但它的硬伤是容量会无限膨胀。任务一多网络越来越大参数量爆炸推理成本飙升最后根本没法部署。而且不同任务之间的知识无法迁移共享每个任务都从零学起效率很低。所以架构路线通常用在任务数量有限、且对遗忘零容忍的场景比如某些工业质检的多阶段模型。放到通用大模型上基本不现实。3.4 三条路线的横向对比把三条路线放一起对比能更清楚地看到各自的取舍。这张表是我自己整理的经验总结参数和结论基于常见实验设置具体数值会因任务和数据集而异但趋势是稳定的。路线代表方法抗遗忘效果存储开销计算开销适用场景正则化EWC、SI、MAS中等低中任务少、旧数据不可得回放经验回放、生成回放高高中高旧数据可存、效果优先架构参数隔离、动态扩展很高中高任务有限、零遗忘要求实际工程中很少纯用某一条路线更多是混合使用。比如回放 正则化既存一小批旧样本又对重要参数加约束双保险。这种组合往往比单一路线更稳也是我目前比较推荐的起步方案。4. 大模型的冻结人生为什么我们主动选择不学聊完持续学习的技术路线回到开头那个悖论既然有这么多方法对抗遗忘为什么大模型时代我们反而更倾向于把模型冻起来4.1 微调本身就是一次温和的灾难先澄清一个误区大模型并不是完全不学。我们常做的微调Fine-tuning本质上就是让预训练好的模型在新数据上继续学。但这里有个微妙的地方——微调往往只针对特定下游任务而且通常用很小的学习率、很少的轮数目的只是微调而不是重塑。即便如此微调也会带来遗忘。学术界有个现象叫灾难性遗忘在微调中的体现一个大模型在通用能力上很强但你拿某个垂直领域的数据猛训一通它在垂直领域变强了通用能力却可能下降。这就是为什么现在流行参数高效微调PEFT比如只训练一小部分额外参数LoRA之类的思路把主干网络冻住。冻结主干本质上就是在保护预训练阶段学到的通用知识不被破坏。所以你看冻结不是偷懒而是一种刻意的保护策略。预训练阶段花了海量算力和数据才得到的知识太珍贵了不敢让后续的微调随随便便把它覆盖掉。4.2 全量持续训练的成本与风险那为什么不干脆让大模型持续学习、天天更新呢原因很现实第一算力成本。大模型的全量训练动辄需要成千上万张加速卡跑很久。如果每次有新数据就全量重训成本高到无法承受。就算只做增量更新要保证不遗忘就得掺入大量旧数据做回放等于每次都在做接近全量的训练。第二稳定性风险。一个已经上线的模型行为是经过大量测试和验证的。如果它每天都在变今天和明天的输出可能不一样这对依赖它的下游系统是灾难。你没法对一个每天都在变的模型做可靠的回归测试。第三可控性。冻结的模型行为是可预测、可复现的。一旦允许它持续学习就可能学到我们不希望它学的东西——数据里的偏见、噪声、甚至恶意注入的内容。冻结是一种安全兜底。第四评估困难。持续学习的模型你怎么衡量它整体上变好了还是变坏了旧任务和新任务此消彼长没有一个简单的指标能说清楚。评估体系跟不上就不敢放开让它学。4.3 冻结其实是一种工程妥协我个人对这件事的看法是冻结不是技术上的最优解而是工程上的最稳解。持续学习在学术上很热闹但真正敢让线上模型边跑边学的生产系统少之又少。大多数团队选择的是一种折中方案——定期重训 灰度发布每隔一段时间用积累的新数据加上历史数据重新训练一版模型经过完整测试后替换线上版本。这种做法牺牲了实时进化的能力换来了可控、可测、可回滚。从工程角度这笔账是划算的。毕竟一个偶尔更新但稳定可靠的模型比一个天天进化但时不时抽风的模型对业务的价值大得多。注意如果你的业务确实需要模型快速适应新数据别一上来就搞全量持续学习。先从定期重训做起把数据管道、评估体系、回滚机制搭好再考虑更激进的方案。跳过基础设施直接上持续学习大概率会翻车。5. 如果要做持续学习实验具体怎么落地前面讲的偏原理和思路这一节给想动手的朋友一套可操作的方案。我按数据准备—基线搭建—方法对比—评估的顺序来讲每一步都附上我踩过的坑。5.1 数据集的切分方式决定了实验成败持续学习实验和普通实验最大的区别在于数据的组织方式。普通实验是把所有数据混在一起打乱训练持续学习则必须把数据切成有顺序的多个任务。常见的切分协议有三种任务增量Task-Incremental每个任务有明确的边界测试时知道样本属于哪个任务模型可以用任务ID辅助预测。这是最简单的设定。域增量Domain-Incremental任务之间输入分布不同但类别空间相同比如不同光照下的同一批物体分类。类增量Class-Incremental最难的设定每个任务引入新类别测试时不知道样本属于哪个任务模型必须自己区分所有见过的类别。我的建议是从任务增量开始逐步过渡到类增量。类增量最接近真实场景也最能暴露方法的缺陷。很多方法在任务增量下看着很美一到类增量就原形毕露。切分的时候有个细节要注意任务之间的顺序会影响结果。同一组任务换个学习顺序遗忘程度可能差很多。所以严谨的实验应该跑多个随机顺序取平均值而不是只跑一个顺序就下结论。我早期就吃过这个亏单次实验结论很漂亮换了个顺序直接崩盘。5.2 搭一个靠谱的基线动手之前先搭两个极端基线它们是你判断任何新方法好坏的标尺基线一朴素顺序训练Naive / Fine-tuning。就是不加任何抗遗忘手段直接顺序训练。这个基线代表最差情况任何方法如果连它都打不过就不用往下做了。基线二联合训练Joint Training。把所有任务的数据混在一起同时训练。这个基线代表上限因为它不存在遗忘问题所有数据都在。注意联合训练在很多场景下是不允许的旧数据不可得但它能告诉你如果不受限制最好能做到什么程度。有了这两个基线你的方法效果就有了参照系。一个方法如果接近联合训练说明抗遗忘做得好如果接近朴素顺序训练说明基本没用。5.3 关键参数与实操配置下面给一份我常用的实验配置模板基于图像分类任务你可以按需调整。这里用伪代码风格描述重点是参数选择的逻辑。# 持续学习实验核心配置示意 config { backbone: 小型卷积网络或预训练主干, # 小任务别用超大模型训练慢且难调 num_tasks: 5, # 任务数建议5-10个太少看不出趋势 epochs_per_task: 10, # 每个任务训练轮数太多会加剧遗忘 batch_size: 64, learning_rate: 0.01, # 持续学习里学习率要偏小减小参数移动幅度 optimizer: SGD with momentum, # 实测SGD比Adam遗忘更轻值得一试 replay_buffer_size: 200, # 回放缓冲区容量按任务数均分 replay_ratio: 0.5, # 新旧样本比例1:1起步 }几个参数背后的逻辑值得展开说学习率为什么要偏小因为参数移动幅度直接决定遗忘程度。学习率大参数一步跨得远旧知识被覆盖得就狠。把学习率调小虽然新任务学得慢一点但旧任务保得住。这是一个明确的权衡。为什么推荐SGD而不是Adam这是我实测的一个经验。Adam的自适应学习率会让某些参数更新得特别激进反而更容易破坏旧知识。SGD虽然收敛慢但更新更均匀、更温和遗忘往往更轻。当然这不是绝对的具体任务要试。回放比例怎么定如果新任务数据远多于回放数据模型会被新任务主导。一般从1:1开始调如果发现旧任务还是掉得厉害就提高回放样本的比例。但回放太多又会拖慢新任务的学习需要找平衡点。5.4 评估指标不能只看准确率持续学习的评估比普通任务复杂因为你要同时看新任务学得好不好和旧任务忘没忘。常用的指标有这么几个平均准确率Average Accuracy学完所有任务后在所有任务上的平均表现。这是最直观的指标。遗忘率Forgetting Measure每个任务刚学完时的准确率减去全部学完后的准确率再取平均。这个指标专门衡量遗忘程度非常关键。反向迁移Backward Transfer学新任务对旧任务的影响。正值表示新任务帮到了旧任务负值表示拖累了旧任务。我特别想强调遗忘率这个指标。很多人只看平均准确率但平均准确率会被新任务的强势表现掩盖问题。一个模型可能平均准确率不错但拆开看是新任务满分、旧任务全崩这种模型在实际场景里是没法用的。一定要把遗忘率单独拎出来看。6. 常见问题与排查技巧实录这一节整理我在做持续学习和增量训练时遇到的高频问题配上排查思路。这些问题在标准文档里很少写但实际动手时几乎都会碰到。6.1 问题速查表问题现象可能原因排查方向解决思路旧任务准确率断崖式下跌学习率过大、无抗遗忘手段检查学习率、确认是否用了回放/正则降学习率、加回放、加正则新任务怎么都学不好正则约束过强、回放比例过高检查正则权重、回放比例放松约束、降低回放比例任务越多效果越差容量不足、约束互相冲突看参数量、看各任务约束叠加增大容量、改用回放为主结果波动大、不可复现任务顺序敏感、随机种子未固定换顺序重跑、固定种子多顺序取平均、固定所有随机源回放后仍遗忘严重回放样本太少或代表性差检查缓冲区大小和采样策略增大缓冲、用分层采样6.2 几个容易忽视的坑坑一忘了固定随机种子。持续学习实验对随机性极其敏感数据顺序、参数初始化、dropout都会影响结果。我见过同一份代码跑两次遗忘率差了十几个百分点。做对比实验时务必固定所有随机源并且跑多次取平均。坑二用错了归一化统计量。如果用了批归一化BatchNorm不同任务的数据分布不同统计量会互相污染。学新任务时BatchNorm的均值和方差会被新数据带偏间接导致旧任务性能下降。解决办法是给每个任务独立的归一化统计量或者改用不受批次影响的归一化方式。这个坑很隐蔽因为表面上看是遗忘实际是归一化在捣乱。坑三评估时用了训练模式。测试的时候一定要把模型切到评估模式关掉dropout和BatchNorm的更新。这个听起来是常识但在持续学习的复杂流程里很容易在某个环节忘了切换导致评估结果失真。坑四缓冲区采样策略太随意。回放缓冲区如果只是随机存、随机取可能存了一堆相似样本代表性差。更好的做法是分层采样或者基于多样性采样保证缓冲区覆盖各个任务、各类别的典型样本。我试过用随机采样和分层采样对比后者在类增量场景下明显更稳。6.3 一个实用的调试顺序当你发现实验结果不对劲时别急着改方法按这个顺序排查先确认基线正常朴素顺序训练是不是真的遗忘了联合训练是不是真的不遗忘如果基线都不对后面全白搭。再确认数据切分正确每个任务的类别、样本数、顺序是否符合预期打印出来核对。然后看单任务表现模型在每个任务刚学完时的准确率是否正常如果单任务都学不好问题在训练本身不在遗忘。最后看遗忘曲线把每个任务在后续所有阶段的准确率画成曲线遗忘发生在哪一步、有多严重一目了然。这个顺序能帮你快速定位问题出在训练还是遗忘避免在错误的方向上瞎调参。7. 我对这件事的一点个人看法聊了这么多技术细节最后说点偏感受的东西。灾难性遗忘这个问题本质上暴露的是当前神经网络学习范式的一个根本局限它把知识压缩在共享参数里却没有机制去保护旧知识。人类大脑不是这样工作的。我们学新东西时大脑会通过复杂的机制巩固旧记忆睡眠、记忆重放都参与其中。神经网络目前还没有这么精妙的机制。持续学习这个领域研究了这么多年方法出了一堆但至今没有一个能像联合训练那样彻底解决问题。这让我觉得可能真正的突破不在于打补丁式的正则或回放而在于学习范式本身的改变。也许未来的模型会有更结构化的知识存储方式也许会有类似大脑记忆巩固的机制让新旧知识真正和谐共存。至于大模型的冻结人生我现在的态度是理解并接受。在更好的方案成熟之前冻结是一种负责任的工程选择。它不完美但它稳定、可控、可回滚。与其追求一个天天进化但随时可能崩的模型不如先把一个稳定的模型用扎实。如果你正在做相关的工作我的建议是别被持续学习这个词的热度带偏先想清楚你的业务到底需不需要模型实时进化。很多场景下定期重训就够了硬上持续学习反而增加了一堆复杂度和风险。技术选型永远要服务于实际需求而不是追新逐热。这个方向后续还有很多可以挖的比如持续学习和参数高效微调的交叉、大模型时代如何做低成本的增量更新、评估体系怎么跟上。等我把手头的实验跑完再来分享新的踩坑记录。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑