单个方法全都失效,组合起来却提升 28 倍:JHU 拆解长程记忆的持续学习配方

上周刷到一篇论文,标题朴素得有点过分——《Continual Learning Mechanisms Compose for Long-Horizon Memorization》。但我看完摘要里那个数字之后坐直了:让模型连续学 100 个任务,naive 微调学完最后只剩 1.2% 的旧任务还记得,而他们试过的所有单一持续学习方法,没有一个能打。可一旦把几类机制按设计维度组合起来,最终保留率直接干到 34.9%,28 倍。

这个数字让我愣了一下。做持续学习的人都知道,replay、EWC、蒸馏这些方法单拎出来在 Split-MNIST 那种 5 任务、10 任务的小玩具上都能刷出漂亮数字。但 100 个任务、且学完后不给任务 ID、也不许翻旧数据——这是另一个量级的残酷。这篇论文(arXiv: 2609.06986)最打动我的地方,不是提出了什么新机制,而是把"组合"这件事本身当成研究对象,用一套相当扎实的实验设计告诉你:遗忘不是一种病,是好几种病,得吃好几种药,而且药之间有协同

核心摘要

  • 痛点:语言模型需要持续内化随时间到达的新信息,并在后续无数次更新后仍然记得。顺序微调会带来灾难性遗忘,而在 100 任务的长程设定下,作者评测的所有单一持续学习机制(EWC、SI、蒸馏、回放、LoRA 变体)全军覆没。
  • 方案:把持续学习机制沿两个设计维度组织起来——数据/函数/权重三类"锚点"决定每次更新要保住什么,低秩分配规则决定更新存在哪里;再用 task-level successive halving 在 90 种组合空间里搜索,配合 2⁴ 析因实验量化每个机制的主效应和交互效应。
  • 效果:最佳组合(数据锚点回放 + 函数锚点蒸馏 + 权重锚点 SI + merged LoRA)在三个数据集上全部排进 top 3,平均最终保留率从 1.2% 提到 34.9%;回放与 merged LoRA 在所有数据集上都呈现超加性交互
  • 我的判断:这是一篇"测量论文"而非"方法论文",机制全是现成的,值钱的是那套组合空间和析因分析的实验框架。它把持续学习从"调一个方法刷榜"推进到"理解机制间相互作用"的层面,值得做 agent 记忆、test-time training、模型编辑的人细读。

论文信息 - 标题:Continual Learning Mechanisms Compose for Long-Horizon Memorization - 作者:Zheyuan Zhang、Alvin Zhang(共同一作)、Daniel Khashabi、Tianmin Shu(共同指导) - 机构:Johns Hopkins University - 链接:https://arxiv.org/abs/2609.06986 | 项目页:compose-cl.github.io


🎯 问题设定:100 个任务的长程记忆,到底有多难

先把这个设定讲清楚,因为它的苛刻程度直接决定了后面所有结果的分量。

一个自回归语言模型,通过持续的监督微调依次学习 100 个 query-answer 任务。约束有三条,条条要命:

  1. 不许留旧数据。任务 \(t\) 到达时,模型只能看到当前任务的数据 \(\mathcal{D}_t\) 和从上一任务继承的状态 \(S_{t-1}\),之前任务的原始训练样本一个字都不能碰。
  2. 推理时不给任务 ID。这是 domain-incremental 设定,模型没法"切换模式",所有任务的知识必须共存于同一套参数里。
  3. 评估就用训练样本本身。注意,这里研究的是 memorization 而不是 generalization——模型学完任务 \(i\) 后,要回答所有 \(j \le i\) 任务的原始 query。学完第 100 个任务后,对全部 100 个任务算平均准确率,就是核心指标 Final(最终保留率)

你可能觉得:记忆而已嘛,背下来不就行了?但想想看,100 个任务 × 每任务 10 个 epoch 的更新,参数被反复覆写,最早学的任务相当于经历了 99 轮"冲刷"。naive 顺序微调学到最后,旧任务准确率只剩 1.2%——基本等于全忘了。每学一个新任务,就忘掉一批旧的,这就是灾难性遗忘在长程设定下的真实面目。

作者还定义了一个特别直观的指标:记忆半衰期。刚学完某任务时准确率接近满分,之后再学 \(a\) 个任务,准确率随记忆年龄 \(a\) 衰减;衰到一半时的 \(a\) 就是半衰期。naive 微调的半衰期是 1~2 个任务——学完一个,下一个就把你冲掉一半。

📊 三个数据集:从随机符号到真实问答

光有一个设定不够,作者造了三个语义真实性递增的 100 任务数据集,这个梯度设计挺讲究:

数据集 规模 构造方式 记忆难度来源
Symbol-QA 100 任务 × 100 例 随机键值关联(任意符号映射) 完全无语义结构,纯死记硬背
LLM-QA 100 任务 × 100 例 围绕 100 个虚构主题,由 LLM 生成 QA 对,保证每个 query 全局唯一映射 有语言形式但无先验知识可借力
Real-QA 100 任务 × 50 例 来自十个公开 QA 数据集的自然问题,且做了逐模型污染过滤——剔除模型 5 次采样中任意一次答对的样本 最接近真实场景

Real-QA 的污染过滤值得单独说一句。很多记忆类研究的坑在于:模型本来就"知道"答案,测出来的保留率掺了水分。把模型已经能答对的样本剔掉,测到的才是"新学进去又没忘掉"的部分。这个细节让我觉得作者是认真在测记忆,不是在刷数字。

🏗️ 方法框架:两个设计维度,一个组合空间

这篇论文没有发明新机制。它做的事是:把持续学习文献里的经典机制重新组织进一个二维设计空间,然后系统地问——组合会不会比单用好?哪些组合有协同?

维度一:三个锚点——每次更新该保住什么

锚点 代表机制 一句话解释
数据锚点 生成式回放(generative replay) 冻结上一版模型,用一个任务无关的 replay token 让它自由生成 300 条伪序列,当前任务每训一个 batch 就搭配一个 replay batch,还用冻结模型给 replay 序列提供软标签
函数锚点 先前状态自蒸馏(self-distillation,LwF 那一脉) 在当前任务的数据上,让新模型的输出分布去对齐旧模型的输出分布,保住"输入到输出的映射"
权重锚点 Online EWC / SI(突触智能) 给重要参数加二次惩罚,EWC 用对角 Fisher 估重要性,SI 沿优化路径累积参数贡献

这三个锚点对应三种不同的"遗忘来源":忘了旧数据长什么样、忘了旧函数怎么映射、忘了哪些权重不能随便动。这是组合假设的直觉基础——如果不同机制补的是不同的洞,那组合起来应该比单个强

整体目标函数就是当前任务 SFT 损失加上三类保留项:

\[\Theta_t=\operatorname*{arg\,min}_{\Theta}\ \mathcal{L}_{\mathrm{SFT}}^{t}(\Theta)+\mathcal{R}_{D}^{t}(\Theta)+\mathcal{R}_{F}^{t}(\Theta)+\mathcal{R}_{W}^{t}(\Theta)\]

有个实现细节容易被忽略但很实在:SFT 时 query token 不做 mask。理由是 test-time training 这类应用里你很难把 query 和 answer 干净地拆开。这种为真实应用让路的设计选择,我给好评。

维度二:低秩分配规则——更新存在哪里

锚点回答"保住什么",分配规则回答"新东西存哪"。主实验比较两条:

  • Shared LoRA:所有任务持续优化同一对 LoRA 矩阵 \(A\)\(B\)\(W_t = W_0 + \rho B_t A_t\)
  • Merged LoRA:每个任务分配一对新 LoRA,学完后把 \(\rho B_t^\star A_t^\star\) 折叠进稠密权重,再重新初始化新矩阵和新优化器(借鉴 ReLoRA 的 merge-and-reinitialize 套路)。

两条规则的存储状态都是"一个稠密模型 + 每权重矩阵一对 LoRA",大小随任务数恒定——这点在工程上很重要,100 个任务不会撑爆显存。附录里还测了状态随任务数增长的 O-LoRA 和 sequential OSRM,后面会看到,它们并没有带来一致收益。

搜索:把 successive halving 搬到任务维度

90 种配置(3 种权重锚点 × 3 种函数锚点 × 5 种回放超参 × 2 种 LoRA 规则)全跑 100 任务太贵,作者把经典的 successive halving 改造了一下:不是逐步增加训练迭代数,而是逐步增加任务数。10 任务后留 top 45 → 20 任务后留 top 23 → 50 任务后留 top 10 → 这 10 个跑完 100 任务。

这个 task-level successive halving 本身是个小亮点。持续学习的搜索成本和任务数成正比,用短 horizon 做早停筛选,前提是"早期排名能预测长期排名"——他们验证了这一点:10 任务排名和 100 任务最终排名高度一致。但作者也诚实地承认,这不保证保留最优配置,只是够好用。

搜索的第一个结论就很扎心:没有任何单一机制活到 50 任务阶段。能跑到 100 任务的,全部同时带了数据锚点和 merged LoRA。

📈 主实验:组合的力量,以及它从哪里来

图1:2⁴ 析因实验全矩阵——SI、SD(自蒸馏)、Replay、Merge(merged LoRA)四个机制的 16 种组合在三个数据集上的最终保留率。彩色圆点表示该组合包含哪些机制,每列按包含的机制数分组

图1:四个机制的 16 种组合的析因矩阵。从左到右按包含机制数分组,单机制列(左起第二组)最高也只有 12.5%(Real-QA 上的 replay),而含三个以上机制的组合普遍冲上 20%~55%。

看这张图,模式非常清楚:保留率几乎随机制数量单调攀升,但不是所有机制贡献相同,也不是简单相加

关键数字

方法 Symbol-QA LLM-QA Real-QA
Naive 顺序微调 1.0 1.4 1.3
最强单一机制 4.2 7.5 12.5
最强组合 23.2 41.8 54.8
本文最佳方法(三锚点 + merged LoRA) 18.5 41.8 44.3

几个值得咂摸的点。最强单一机制居然全是 replay——数据锚点单兵作战最强,这个直觉上和"记忆任务最直接缺的是旧数据"吻合。但即便是它,在 Symbol-QA 上也只有 4.2%。而组合之后,Real-QA 上最强冲到 54.8%(SI + replay + merged LoRA)。注意各数据集的最强组合并不一样:Symbol-QA 偏好 SD + replay + merge,LLM-QA 偏好全栈四件套。只有"三锚点 + merged LoRA"这一组在三个数据集上全部排进 top 3,这也是作者把它推为最佳方法的原因——稳健,而非单项冠军。

记忆矩阵:看得见的遗忘

图2:三个数据集上的时序准确率矩阵——横轴是任务 j,纵轴是学完任务 i 后的 checkpoint,下三角的 (i, j) 格表示学完任务 i 后对任务 j 的准确率。颜色越亮(黄)准确率越高,越暗(紫)越低。每行一个数据集,每列一种方法配置

图2:时序准确率矩阵。naive 微调(最左列)只有对角线一条亮带——学完即忘;加了 replay 后亮带变宽;叠加 merge 后整个下三角大面积转绿转黄。红框标出的是各数据集的最强组合。

这张矩阵图是全文最有说服力的一张。naive 微调的下三角几乎是全黑的,只剩对角线一条细亮的缝——学完任务 j 的那一刻会,下一个任务就冲掉。而随着机制叠加,亮区从对角线向整个下三角扩散。但你仔细看最强组合的图,左上角(最早学的任务)仍然明显偏暗。

组合延缓了遗忘的时间尺度,但没有阻止遗忘本身。这句话作者自己说了,我也很认这个诚实的结论。记忆半衰期的数字同样说明问题:

方法 Symbol-QA LLM-QA Real-QA
Naive 微调 1 1 2
最强单一机制 4 6 11
最强组合 19 32 44

半衰期从 1~2 个任务拉长到 19~44 个,确实是一个数量级的改善。但 100 任务的 horizon 下,最早的任务还是会死掉。

🔬 析因分析:协同是真的,还能解释为什么

这部分是我觉得全文最值钱的地方。主效应表(单位:百分点,粗体为统计显著):

数据集 SI SD Replay Merge
Symbol-QA +0.3 +5.7 +9.5 +5.9
LLM-QA +5.8 +5.0 +18.5 +14.9
Real-QA +6.3 +3.7 +19.3 +20.5

Replay 和 merged LoRA 是无可争议的两大主力,在所有数据集上主效应最大。SI 和 SD 则看数据集下菜——SI 在 Symbol-QA 上几乎没用(+0.3),这很合理:随机符号映射没有可复用的参数结构,"保护重要权重"无从下手。

再看交互项,R×M(回放 × merged LoRA)在三个数据集上全部显著为正:+3.6、+9.4、+11.7。更硬核的超加性证据是:在没有 SI/SD 的配置里,replay 和 merge 单独增益之和只有 3.9 / 7.7 / 13.9 个百分点,而两者组合的实际增益高达 15.6 / 31.0 / 46.9——远超加性和。

为什么会超加性?我的理解是:merged LoRA 把每个任务的更新折叠进稠密权重后重置,新任务始终从一个"干净"的低秩空间出发,减少了更新之间的互相覆写;而回放保证了这个折叠过程不会把旧关联冲散。一个管"空间不打架",一个管"内容不丢失",缺一个都瘸。

反面的交互同样有信息量。SD×Replay 在 Real-QA 上是 −10.3——已经有回放提供软标签了,再叠蒸馏是重复的函数约束,边际收益为负。SI×Merge 在 Symbol-QA 上是 −3.0,作者给的机制性解释很漂亮:merged LoRA 每个任务换一对新 LoRA 因子,而 SI 攒下的重要性分数绑定的是旧因子的坐标——坐标系换了,约束施加在了功能角色已经改变的参数上,错位惩罚反而有害。Symbol-QA 的任意映射没有可复用结构,这种错位代价最高。说实话,这种"负交互也能给出机制解释"的分析,比单纯的正结果更能让我信服这套框架不是玄学。

⚠️ 泼几盆冷水:通用能力、状态增长与评估边界

记住了新知识,通用能力照样崩

图3:通用能力评估——在 GSM8K、MATH、MGSM、MMLU-Redux 四个基准上,基座模型(最上行)与三种 LoRA 分配规则学完 100 个任务后的准确率对比

图3:基座模型在 GSM8K 上有 83.6% 的准确率,但 100 个任务的持续学习后,所有方法都出现断崖式下跌——merged LoRA 在 Symbol-QA 训练后 GSM8K 只剩 0.8%。

这张图看得我有点皱眉。基座(Qwen3-4B-Base)在 GSM8K 上 83.6%,持续学习 100 个任务后,merged LoRA 只剩 0.8%。任务内记忆保住了 35%,通用数学能力几乎清零。O-LoRA 相对好一些(Real-QA 训练后 MMLU-R 还能保住 52.0%),但也是矮子里拔将军。

这暴露了一个比"记住 QA 对"更本质的问题:选择性记忆。人脑学新东西不会把乘法表忘了,但目前的持续学习机制做不到这种区分。作者也坦承"在学习新关联的同时保持通用能力仍是开放挑战"。如果你做 agent 长期记忆,这是必须正视的墙。

状态随任务增长的分配规则没有一致收益

把 merged LoRA 换成状态随任务数线性增长的 O-LoRA,保留率几乎没变(两个数据集略升、Symbol-QA 下降);sequential OSRM 更是在三个数据集上全部降低保留率。花更多状态并没有买来更多记忆——这对工程落地反而是个好消息:恒定状态的 merged LoRA 就够了。

评估边界的自我声明

作者的局限性声明写得很到位,我原样转述并加点评:其一,测的是 memorization,模型可能记住了关联但答不出改写的 query——真实应用里用户很少原样提问,这个 gap 不小;其二,各种子共享同一任务顺序,任务顺序敏感性没测,而做持续学习的都知道顺序可以影响很大;其三,TSH 搜索不保证全局最优。肯把这些写出来,比藏着掖着强。

💡 我的判断

这篇论文的机制没有一个是新的——replay 是 2017 年 Deep Generative Replay 那一路,EWC 和 SI 是 2017 年的经典,LwF 蒸馏是 2016 年的,merged LoRA 借 ReLoRA 的套路。从这个角度说,它是工程整合加测量科学,不是方法突破。

但它的价值恰恰在这里。持续学习这个领域积了太多"在小 benchmark 上单方法有效"的论文,而这篇直接把 horizon 拉到 100 任务,用析因实验把机制间的主效应和交互效应一个个拆出来测,还给了负交互的机制解释。这种工作给领域留下的不是又一个 trick,而是一张机制互相作用的地图——以后谁要在长程设定下设计新方法,可以直接查这张地图,知道哪两个机制有协同、哪两个会打架。

对工程的启发也很直接:如果你在做需要持续更新的模型(agent 记忆、个性化模型、test-time training),第一优先级是数据侧回放加 merge-and-reinitialize 的低秩更新,这对组合便宜、状态恒定、协同最强;蒸馏和 SI 视任务性质再加,别默认全堆上——堆错了不但没用,还有负交互。另外,通用能力崩塌的问题目前没有答案,上线前务必单独评测。

还有一个更本质的问题没被解决:半衰期再长也是半衰期,所有保留曲线都在衰减。真正的长期记忆可能需要架构层面的改变(比如显式的记忆槽位、检索增强),而不是在更新动力学上做文章。这篇论文划出了"参数化记忆组合优化"这条路的边界,这个边界本身就是贡献。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我