持续学习(Continual Learning,也叫 Life-long Learning)听起来挺学术,但真把模型放到业务里跑过一两年的人,几乎都撞见过它的反面——灾难性遗忘。我最早被这个问题“挑衅”是在一个智能相册分类项目里:模型第一版识别五类常见内容,上线后挺稳,后来产品经理要求新增三个人像分组,我把新数据混进老数据里做微调,结果旧类别的整体准确率掉了两成多,有几个类别的召回率几乎归零。
这不是简单的“数据不够”或“模型烂”,而是新任务在学习过程中把旧知识从共享参数里“冲”走了。持续学习想解决的就是这件事:让模型能够不断吸收新任务、新分布、新类别,同时尽量保持对旧任务的性能,并且尽可能少依赖“存好所有历史数据、重新全量训练”这种笨办法。这篇文章写给正在做模型迭代、或者准备入门持续学习方向的读者,我会从问题定义讲起,把常见任务设定、主流方法、评估指标、落地场景和踩坑记录一次说透,最后给出一套可以直接照着抄的最小实验方案。
1. 持续学习到底在解决什么问题
1.1 灾难性遗忘:一切模型迭代难题的源头
先花点时间把灾难性遗忘的原理说清楚。神经网络里的参数共享是深度学习的优势,也是灾难性遗忘的根源。你用任务 A 的数据训练出一组参数 θA,再拿任务 B 的数据继续做梯度下降,得到 θB。梯度更新只保证在任务 B 的损失函数上下降,并不会保证 θB 这个点在任务 A 的损失曲面上仍然处于低误差区域。一旦任务 B 的数据量足够大、学习率设置得又比较激进,旧任务对应的最优区域就会被远远抛在身后,模型在旧数据上的表现自然就崩了。
这个现象给人的感觉很像考试周临时抱佛脚:掌握了新考点的解法,却把前面的公式忘得一干二净。稍微反常识一点的是,就算任务 B 和任务 A 高度相关,遗忘也可能发生。因为共享的底层特征虽然在两个任务上看起来“差不多”,但高层的决策边界会受到新数据的强烈扰动。后面讲方法的时候你会看到,几乎所有持续学习算法都在做一件事:在新任务更新和旧知识保护之间找一个工程上可接受的平衡点。
1.2 模型需要的不是“重启”,而是“续学”
传统机器学习流程追求“一个批次训练完成,之后只做推理”。但绝大多数真实业务不允许这样。推荐系统里用户偏好每周都在变,电商后台每天要上新商品;手机端图像分类里用户不断产生新类型的照片;OCR识别引擎需要不断适配新的版面样式。如果每次变化都把所有历史数据备份下来全量重训,到了数据规模大到一定程度、或者涉及隐私数据无法留存的时候,成本会高到无法承受。
持续学习的定义,学术上并没有一个唯一版本。大家反复引用的描述是:模型在一系列任务样本依次到达的情况下,通过不断学习来积累知识,并利用之前学到的经验帮助新任务做出更好预测,而不是重新从零开始训练。这个描述的要点有三个:任务流式到达、知识不断积累、新任务从旧知识中获益。后向迁移和前向迁移这两个概念也由此而来——前者指新任务对旧任务表现的影响,后者指旧任务对新任务学习的帮助。好的持续学习系统应该让后向迁移不小于零(也就是不遗忘),前向迁移尽量为正。
1.3 稳定性与可塑性的矛盾
持续学习领域喜欢引用一个双目标框架:模型既要有“稳定性”,保证旧知识不丢;又要有“可塑性”,保证新知识学得动。这两个目标在数学上天然冲突。你把旧参数钉死,稳定性有了,新任务却只能在一个很小的参数子空间里打转,表现受限;你把所有参数放开,可塑性很强,旧知识却容易被冲掉。
理解了这个矛盾,再看后面所有方法就不会发晕。正则化方法是在损失函数里加约束,逼迫新任务的解落在旧任务可行区域附近;记忆回放是在训练新任务时反复灌输旧样本,让旧损失重新出现在优化目标里;架构扩展是给新任务分配专属参数区域,把参数共享冲突直接避开。它们的区别只是“处理稳定与可塑矛盾”的姿势不同。
2. 先分清场景:Task-IL、Domain-IL 和 Class-IL
同一种方法,在有些设定下效果很好,换个设定就翻车。要读懂持续学习论文,先得建立“学习场景”的概念。目前最通行的是 van de Ven 等人提出的三分类法,把持续学习问题划分成任务增量、领域增量和类增量三类。先搞清楚自己在哪个场景,否则后续的方法选型和评估都会跑偏。
2.1 Task-IL:任务有标签的“温室”
Task Incremental Learning 是最温和的设定。训练时每个样本都带有任务编号,推理时模型也能拿到“当前要判断的是哪个任务”。因为知道 task id 在做判别,模型可以给不同任务设计独立的输出头、或者在网络里附加任务专属的归一化层,旧任务参数可以完全不被动,遗忘问题很容易被压制到很低。
但这种温室条件在真实业务里很少出现。你很难在线上推理时提前告诉模型“现在进来的这批图只包含猫狗两类,来自旧任务”。所以我个人觉得 Task-IL 更适合做学术研究的参照系,或者用于任务边界非常清晰、可以在系统中显式控制的特殊场景。比如工厂质检中每个批次只测固定几种缺陷,批次号就是天然的 task id,那用 Task-IL 思路套一套完全可行。可一旦任务边界模糊,它就会塌。
2.2 Domain-IL:分布变了,标签没变
Domain Incremental Learning 的设定更贴近分布漂移问题:任务依次到达,但所有任务共享同一套类别标签,测试时没有任务编号。一个典型例子是商品识别模型,先在实验室白底图上训练,随后又用货架拍摄的真实场景图继续训练,类别始终是“可乐、薯片、洗衣液”这些固定品类,但图像的光照、背景、相机角度都变了。
Domain-IL 下模型没有“任务编号”这根拐杖可依赖,所有任务共享同一个输出层,算法必须学会在多个数据分布之间维持一个统一决策面。它的难度明显高于 Task-IL。好在评估相对简单,因为测试集和训练集的类别对齐,不需要为动态扩展的输出头做过多处理。
2.3 Class-IL:不断出现的全新类别
Class Incremental Learning 是三个设定里最难,也是我认为最贴近真实增量业务的。任务依次到达,每个新任务带来一批全新类别,训练和推理时都不提供 task id,而最终模型需要在包含历史所有类别的完整类别空间上做预测。比如一个人脸识别系统,第一批只注册了员工 A、B、C,第二批新增员工 D、E,系统最终要在五个人的集合中一次给出分类结果。
这个设定的难点不仅在“遗忘”,还在于“类别不均衡”。旧任务类别没有样本可用,新任务类别样本充足,模型很容易把新类别分错的概率倾向旧类别,产生严重的分类偏置。很多论文会用“偏置校正”或“蒸馏”专门去压这个问题。如果你在业务里看到的报错是“新增类别之后,旧类别全被吸入新类别”,那多半就是 Class-IL 场景下的典型症状。
2.4 一张表看懂三种设定
| 设定 | 训练时是否给 task id | 测试时是否给 task id | 标签空间 | 主要难点 | 代表场景 |
|---|---|---|---|---|---|
| Task-IL | 是 | 是 | 每个任务独立输出头 | 任务间特征迁移小 | 批次边界明确的工业质检 |
| Domain-IL | 是(有时给) | 否 | 全部任务共享 | 跨分布决策面稳定 | 光照/背景变化的商品识别 |
| Class-IL | 是 | 否 | 动态扩展 | 遗忘+分类偏置 | 不断新增类别的相册分类 |
经常看到有同学拿 Task-IL 方法硬套 Class-IL 场景,指标很难看,最后得出结论“持续学习没用”。其实不是方法没用,是问题定义没有对应上。选方法前先问清楚自己产品形态里的推理条件:测试时知不知道当前输入属于哪一批?类别空间是否固定?这个前置问题想清楚了,后面选型才有的放矢。
3. 主流方法流派与代表性工作的拆解
持续学习方法大体可以分成四个流派:参数正则化、记忆回放、架构扩展、知识蒸馏。四个流派都有代表性方法,也各有各的适用边界。我把它们放在一起拆解,方便你做选型时对照。
3.1 正则化方法:EWC 和它的“参数锁”
正则化流派是理解持续学习的敲门砖。最具代表性的就是 EWC(Elastic Weight Consolidation,弹性权重固化)。它的思路是在新任务的损失函数上叠加一个二次惩罚项,结构上有点像 L2 正则,但关键是它根据参数的重要性做加权,不是每个参数同样对待。
EWC 的惩罚项写法是:
L = L_new + (λ / 2) * Σ_i F_i * (θ_i - θ*_i)²
其中 θ* 是在旧任务上学到的参数,F 是 Fisher 信息矩阵的对角线近似,表示每个参数对旧任务的重要程度。重要参数在 Loss 里对应的权重 F_i 大,训练新任务时不敢动;不重要的参数可以随意移动。你可以把 F 想象成参数空间里的“土地价格图”——在旧任务的损失地形上是陡坡的参数,地价高,不能随便拆迁。
实际用 EWC 有几个细节容易踩坑。第一,F 的估计需要旧任务数据。训练完任务 1 后,保留一批旧样本在模型上前向一次,计算梯度的平方平均值作为 Fisher 对角近似;如果旧样本拿不到,退而求其次可以用旧任务的合成样本,或者干脆只用普通 L2 约束。第二,λ 需要单独调,它不是越大越好。λ 很大会让新任务几乎学不动,λ 太小则遗忘控制不住。我在一个 6 任务的序列分类实验里对比过,λ 从 1 调到 10000,平均准确率的跨度能超过 15 个点。第三,随着任务数量增加,惩罚项会越叠越多,最好是每个旧任务的惩罚项都独立维护并一起加起来,而不是只对最近一个任务做约束。
EWC 的优点很突出:无需额外的样本存储,实现简单,几乎能嵌进任何网络。缺点是当任务数多、类别相关性复杂时,共享参数被多重惩罚“锁死”,新任务能用的自由度越来越少,性能会逐渐下滑。所以它非常适合做基线,或者作为其他方法的辅助约束。
3.2 记忆回放方法:经验复读是简单有效的基线
如果预算允许存储一部分旧数据,那记忆回放(Experience Replay)是性价比最高的选择。核心思想非常朴素:训练新任务时,从缓冲区中取出少量旧任务样本,和新任务样本混合在一起做梯度更新,这样旧任务的关键损失会重新回到优化目标里,参数的更新方向会被“拉”向两边都能兼顾的位置。
回放有两个关键设计点:缓冲区怎么存,采样怎么采。常用策略包括随机采样、蓄水池采样(reservoir sampling)、以及先聚类再选代表样本的 herding 策略。蓄水池采样非常适合任务边界不清晰、样本流无限漫长的场景,它能在不知道数据总量上限的情况下,保证每个样本被保留进缓冲区的概率一致。herding 则更智能,它是按类别特征空间的均值中心,选择最靠近中心的若干样本,这些样本的“代表性”更好,但计算成本也更高。
基于回放发展出来的代表性方法有 GEM(Gradient Episodic Memory)和 iCaRL 等。GEM 在梯度层面做文章:计算新任务梯度后,把它投影到所有旧任务样本梯度方向的半空间内,保证投影后的梯度不会增加旧任务的损失。iCaRL 则在类增量场景下把回放、特征均值原型和知识蒸馏三者结合起来,先用特征均值给每个类生成原型表征,再靠蒸馏损失让旧类别输出不被新类别吞噬,最后用最近邻或原型距离完成分类。
个人建议:如果不限制存储,先用最简单的 Experience Replay 跑一版基线。我的经验是,在 CIFAR-100 拆成 10 个任务的设置下,每个类保留 50 张图,回放方法就能轻松超越单独使用 EWC 十几个点的平均准确率,而且训练稳定性明显更好。回放方法的核心难点在于你的应用是否允许保存用户数据——如果涉隐私,就要考虑生成回放或用原型类方法替代。
3.3 架构扩展方法:给模型“扩容”
架构扩展流派处理稳定与可塑性矛盾的方式最直接:不给共享参数制造冲突,干脆把不同任务的专用参数区域分开。Progressive Neural Networks(PNN)的做法是每来一个新任务,就新建一条独立的网络列,并通过横向连接把旧列的特征接入新列,新列可以借用旧知识,但旧列参数保持冻结,从结构上杜绝遗忘。
PNN 很优雅,但参数随任务数线性增长,推理成本也越来越大。紧随其后的 PackNet 走的是另一条路:在单个网络内部做稀疏化。先用一个任务训练网络,然后按参数绝对值剪掉一部分不重要的连接,把这些连接固定为“不可用”,剩下的参数重新训练下一个任务。这样就得到一个固定大小的网络,但每个任务都拥有一部分专属连接,不需要的时候可以把不活跃的部分裁剪掉。
架构方法在任务数量有限、任务边界清晰、推理端能接受模型体积增长的场景下相当好用。比如嵌入式设备上持续加入新的手势识别,每次新增手势时把旧参数冻结,只训练新增连接,显存和算力开销可控。它们最大的瓶颈就是扩展性:任务几十上百个之后,模型的稀疏结构管理和部署调度都变成麻烦事。另外,剪掉旧连接可能带来少量信息损失,剪枝比例需要针对旧任务验证集微调。
3.4 蒸馏方法:用旧模型的“软知识”稳住输出
知识蒸馏本来是多模型压缩的技术,后来被引入持续学习,形成 LwF(Learning without Forgetting)这一类方法。思路是在学习新任务时,把旧任务数据过一遍旧模型得到软标签(类别的概率分布),训练时让新模型对这些软标签的预测尽量靠近。这样做的好处是无需保存旧样本,只需要存一个旧模型,对隐私场景友好。
LwF 有个常见陷阱:软标签里的暗知识(比如旧模型对某个旧类别的中等置信度)能被蒸馏传下去,但如果新旧类别空间的交集增长特别大,蒸馏信号的强度会被稀释,旧类别输出照样会被新类别压下去。所以在 Class-IL 里,很多方法会把蒸馏和回放/原型结合使用。iCaRL 就是典型组合拳:回放保证旧类别有代表性样本,蒸馏保证旧类别的输出概率不被新类别淹没,原型分类再进一步消除偏向。
在我的实验里,蒸馏损失对最终结果的影响非常大。把蒸馏温度从 2 调到 8,或者把蒸馏损失的权重从 1.0 调到 0.1,都能明显改变最后几个任务的性能。实操上,蒸馏损失的权重一定要放在验证集上调,而且在任务数量多的时候,最好每个旧任务单独记录一份旧模型的蒸馏预测,避免多任务蒸馏时互相打架。
3.5 选型判断:没有银弹,只有约束条件
做选型时我会先列四个约束:能否存旧数据?推理时知不知道任务边界?网络容量是否允许按任务扩展?上线节奏多快?如果旧数据完全不能留,那就只能正则化或蒸馏;如果可以存少量旧样本,回放优先;如果任务数量少且边界清晰,架构扩展也不错。大多数实际系统最后是组合方案,回放加蒸馏是最常见的搭配,回放保证短期稳定,蒸馏负责处理类别不均衡和长尾遗忘。
4. 实验设计与评估指标:怎么验证方法真的有效
持续学习方向“水论文”容易,做扎实评估难。我自己看论文时,第一眼不是看方法多 fancy,而是看评估矩阵和基线设置。如果指标只给一个平均准确率,连遗忘量都没有,那这个结果基本不具备参考价值。下面讲一下我平时做对比实验的固定流程。
4.1 评估矩阵和四个常用指标
持续学习论文里最常见的评估方式,是维护一个 T×T 的矩阵 R,R[i][j] 表示模型在学完第 j 个任务之后,在任务 i 上的准确率。只取 i≤j 看到的就是已经学过的任务表现,i>j 的位置可以理解为对未来任务的预测能力测试,但通常不会作为核心衡量。基于这个矩阵,最常用的四个指标如下:
- 平均准确率 ACC:学完全部 T 个任务后,所有已学任务准确率的平均。ACC = (1/T) * Σ_{j=1}^{T} R[T][j]。它直观反映最终学习效果。
- 遗忘量 Forgetting:每个任务在学完后续全部任务后,相比它刚刚学完时的准确率下降了多少,然后取平均。遗忘量越低越好。
- 后向迁移 BWT:BWT = (1/(T-1)) * Σ_{i=1}^{T-1} (R[T][i] - R[i][i]),用来衡量新任务对旧任务表现的综合影响。BWT 越接近 0,遗忘抑制越好,正的 BWT 说明出现了正向迁移,负的 BWT 就说明有遗忘。
- 前向迁移 FWT:衡量旧知识对学新任务的帮助,需要和“只学当前任务”的独立模型对比。FWT = (1/(T-1)) * Σ_{i=2}^{T} (R[i-1][i] - R_i*) / 某个参考差值,具体归一化方式在不同论文里略有差异,但思想都是“迁移了多少”。
只看 ACC 很容易被迷惑。因为如果每个任务都很难且模型一件都学不好,ACC 可能很低,而如果任务量少、每个任务简单,ACC 虚高。所以完整的实验报告应当同时展示 ACC、Forgetting/BWT 和 FWT,最好再把“从头联合训练所有任务”的上界和“每个任务单独训练”的下界一起列出来,读者才可能判断你的算法是真的能平衡稳定与可塑性,还是单纯调参调出来的表象。
4.2 一个最小可复现的实验方案
我给准备跑持续学习基线的新手提供一个可以直接照抄的最小方案。数据集上用 Split CIFAR-100,把 100 个类别随机分成 10 个任务,每个任务 10 类,按顺序喂给模型。骨干网络用 ResNet18,输入 32×32 的图像,最后一个全连接层按照 Class-IL 的设置动态扩展。
训练细节方面:每个任务训练 30 个 epoch,batch size 128,优化器用 SGD,momentum 0.9,weight decay 5e-4。初始学习率 0.1,在任务内用余弦退火降到底。注意这里的关键是每个任务内部都可以从头跑 30 个 epoch,而不是在整个持续学习流程里只跑一遍。评估记录上,每学完一个任务,就在所有已学任务的测试集上做一次评测,把结果填进 R 矩阵。
回放缓冲区的配置建议:每个类别固定保留 50 张图,总共 500 张。采样用 herding 策略,如果没时间实现,随机采样也能跑,但结果会差一点。对比实验至少要有三组:无任何持续学习策略的朴素微调、带 EWC、带经验回放。最终汇报 ACC、Forgetting 和 BWT,跑 5 个不同随机种子,汇报均值和标准差。
这套方案我调试过多轮,跑一次完整实验在单张消费级 GPU 上大约需要两到四个小时。如果时间紧,可以把每个任务的 epoch 降到 15,或者把 ResNet18 换成更小的自定义 CNN,指标依然有区分度。
4.3 评估中容易犯的三个错误
第一个错误是任务顺序固定且不随机化。任务顺序会显著影响持续学习结果,如果顺序恰好对新任务友好,实验得到了很好看但“脆”的数字;多测几种任务排列,比只跑一种更有说服力。
第二个错误是让回放缓冲区“泄漏”。有的实现把缓冲区里的旧样本又并入了训练集,相当于旧样本被重复采样,指标虚高且不符合真实场景。旧样本应该只从缓冲区以一定比例混合到当前 batch,不能直接参与任务的新样本统计。
第三个错误是只在最后一个任务跑一次测试,用最终模型代表全部表现。这样做会把早期间任务的信息丢弃掉,无法观测遗忘曲线。正确做法是每次任务学完后都完整评估,画出逐任务准确率的曲线,遗忘过程必须能从头看到尾。
5. 落地场景:持续学习在真实业务里怎么用
持续学习不是象牙塔里的话题。下面几个场景我都实际接触过或调研过,能比较直观地说明它在业务里到底是什么位置。
5.1 边缘端设备上的增量分类
边缘端的典型痛点是模型不能频繁走“上传到云端全量重训再下发”的链路,网络带宽和数据隐私都不允许。最现实的路径是在设备端做轻量持续更新。我做过一个拍照识别场景的原型:设备上跑一个轻量 CNN,每当用户手动纠正识别结果时,把纠正样本存进本地缓冲区,夜间低功耗时段做一轮增量训练。
在实现上,我踩过一个很重要的坑:设备端显存极小,把回放缓冲区设置得过大可能导致 OOM。后来改成每类只保留 20 张图像,并且使用 PackNet 的思路冻结旧连接,只训练新增系数,才把单次训练的内存控制住。效果上,更新后旧类别准确率保持了 95% 以上,新识别准确率提升也很明显。这个场景说明,持续学习不是必须用复杂的算法,只要想清楚“旧知识如何保留、新知识如何接入”,简单组合也能落地。
5.2 推荐与广告场景的动态纠偏
推荐系统天然是流式数据,用户行为偏好随着节假日、热点事件剧烈漂移。全量重训在数据量大时成本极高,而纯在线学习又容易被短期噪声带偏。持续学习的思路是把一批新行为数据当作一个“新任务”,在原有模型参数上继续训练,并用一小部分历史行为样本作为回放缓冲,这样既能抓住近期偏好,又不忘掉用户长期兴趣。
实操里的一个问题是,推荐模型的特征空间往往很大,embedding 层更新会导致整个下层特征表征漂移,表现为旧兴趣召回率骤降。针对这个问题,我在训练时会把最重要的 embedding 参数用 EWC 惩罚约束住,同时从长期行为池中随机抽回一部分样本做经验回放,双管齐下,效果比单独用哪一类都稳。度量方式上,项目组关心的不只是准确率,还有新老 item 曝光的稳定比例,这也是持续学习效果评估里容易被忽略却非常实际的一环。
5.3 大模型时代的持续学习方向
大模型时代,持续学习非但没有过时,反而被推到了更显眼的位置。微调一个预训练大模型时,如果只在下游任务上继续训练,很容易覆盖掉通用的语言/视觉表征,导致在原有任务或通用能力上大幅退化。训练多轮指令微调和 RLHF 时,新的偏好信号也可能会覆盖之前学过的能力,这在业内已经有大量案例。
目前比较常用的做法包括参数高效微调加数据回放,以及基于提示池(prompt pool)的方法。提示池的思路是把一组可学习的 prompt 当作任务专属参数,新任务到来时选择并更新一部分 prompt,而不是更新全部模型参数,这本质上是架构扩展思路在大模型上的变体。L2P、DualPrompt 等研究工作陆续证明了这类方法在图像分类任务上不仅抗遗忘,而且能实现从新任务到旧任务的正向迁移。如果你在做大模型的持续微调,我建议先在推理时加入一个小型评估集跟踪旧能力衰减,而不是只看新任务的准确率上涨,这往往是决定方案是否可行的第一步。
6. 实践中的常见问题与排查技巧
持续学习的坑大多不在论文公式里,而在工程实现细节中。我把这几年积累的典型问题整理成了一张速查表,遇到现象可以直接对照排查。
6.1 典型问题与解决对照表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 新任务学完,旧任务准确率暴跌 | 缺少旧数据回放或蒸馏约束 | 检查训练 loss 是否包含旧任务惩罚项;增加回放比例 |
| BWT 负向且很大 | 新任务学习率过高,参数漂移严重 | 降低新任务学习率、增加 EWC λ,或增加蒸馏权重 |
| 新任务一直学不进去 | 惩罚项过重,模型自由度被锁死 | 降低 λ 或回放频率,让新任务有足够更新空间 |
| Class-IL 下旧类别被全部吸入新类别 | 类别不均衡、分类偏向严重 | 用原型分类代替全连接分类头,加偏置校正 |
| 回放后测试集指标异常偏高 | 缓冲区数据泄漏进训练集 | 检查样本划分,旧样本只能从缓冲区分发 |
| 不同随机种子结果波动大 | 任务顺序或初始化过于敏感 | 多测种子,固定骨干初始化,汇报方差 |
| 存储缓慢增长无法接受 | 回放缓冲区或架构扩张过大 | 改用蒸馏/EWC,或对缓冲区做上限控制 |
| 评估曲线看不出遗忘过程 | 只在最后一个任务测了一次 | 每学完一个任务就全量评估并记录矩阵 |
6.2 我的三条排错主线
排查持续学习问题,比起问题现象,我建议大家先抓住三条主线:数据流向、优化设置、指标口径。
数据流向指的是旧样本、新样本和验证集之间的边界是否清晰。很多看上去异常的结果,追下去都是数据泄漏或缓冲区管理出错。优化设置包含学习率、batch size、λ 和回放比例,持续学习对学习率尤其敏感,新任务的学习率如果沿用单任务的预设值,几乎都会大幅遗忘;经验上把学习率调低到单任务的 1/2 到 1/5,遗忘会有肉眼可见的下降。指标口径则是指你用的矩阵、平均方式和参考基线是否一致,如果不统一,两个项目之间很难对比。
6.3 一个实战排错案例
有一次我在做类增量实验,发现第五个任务学完后,旧任务准确率断崖式下跌。开始怀疑是回放缓冲区太小,但从 50 张加到 500 张,问题依旧。后来仔细检查,发现是输出头扩展时,新类别的权重初始化成了随机值,而旧类别的权重保持了之前训练好的数值,新类别在训练初期输出幅度远高于旧类别,导致模型直接偏向把一切样本都判给新类别。我把新权重初始化方式改成“用旧类权重均值初始化”后,旧任务准确率回升了十多个点。这个案例提醒我,Class-IL 的坑往往不在方法本身,而在工程实现的初始化、标签映射和输出扩展这些细节上。
如果只让我给你一条建议,我会说:先别急着复现最新论文,把你业务的三种设定、四类约束、评估指标这四件事钉死在纸面上,然后从一个朴素的“经验回放+蒸馏”基线打起。持续学习这摊水很深,但它的核心永远是对遗忘的度量和管理,什么时候你能画出一条不崩的遗忘曲线,什么时候才算真正入门了。我在这条路上踩过的坑远不止这篇文章写的这些,但只要评估体系搭得扎实,后面的每一次实验都不会白费。