ComposeCL:连学 100 个任务只记得 1.2%,四类机制组合到 35%

连学 100 个问答任务,模型为什么把前面的全忘了?

设想你每天往一个 AI 助手嘴里喂一点新知识,喂满 100 天。第 100 天,它对新知识对答如流,你随口问一句第一周学过的内容,它几乎一句都答不上来。这不是夸张的假设,而是这篇论文里的实测结果:语言模型顺序学完 100 个问答任务之后,旧任务平均只记得 1.2%。人不会这样。学过 2+1=3 的人再去学 2+2=4,不会把前者忘光,但分布式表示的网络会。对网络来说,泛化能力和这个健忘症来自同一个根源:同一批参数要同时服务所有记忆,改一处就牵动全局。这个悖论从 1989 年一直跟到今天。

这个现象叫灾难性遗忘(catastrophic forgetting)。它的根源早在 1989 年就被 McCloskey 和 Cohen 说透了:网络用同一批权重响应所有输入,调整权重去适配新输入时,必然会改写它对旧输入的响应,而且这种破坏剧烈得不像普通干扰,更像逆行性失忆。McCloskey & Cohen 他们的实验很朴素:先让网络学 1 的加法事实,再学 2 的加法事实,前一组事实的准确率瞬间崩盘。到 1999 年,French 的综述把惨烈程度定格成一条经典曲线:一个算术网络在 15 次训练内,旧任务正确率从 100% 跌到 20%、再到 1%、最后归零,而人类学习者的干扰曲线是平缓的。French 1999

正是这种"人不会这样"的反差,让研究者把问题提炼成一个著名的两难:stability–plasticity 权衡。一个系统既要对新输入敏感,也就是可塑性,又不能在吸收新输入时被彻底击垮,也就是稳定性。可塑性过头,旧知识被覆盖,这就是灾难性遗忘;稳定性过头,新任务学不进去,一样是失败。关键词是"同时":两者天然互相拉扯,所有防遗忘方法本质上都是在找这个拉锯的平衡点。

这个 1989 年的老问题,在语言模型时代换了一个更尖锐的形态。大模型会被持续微调、持续投喂新知识,遗忘不再只是认知科学里的好奇。今天的产品模型按周发布新版本,私人助手要持续记住用户的偏好,垂直领域要不断注入新语料。如果每加一点新知识就得把旧知识整体重训一遍,成本与风险都不可接受。Johns Hopkins 团队的这篇论文把问题做成一个可评测的设定,叫 long-horizon memorization(长程记忆):模型顺序接收 100 个问答任务,每个任务只给当前数据,不保留任何旧训练样本,推理时也没有任务标识。没有任务标识意味着模型不能靠"现在答的是第几个任务"这样的提示来分开处理,必须用同一个模型同时服务 100 个任务的查询。评测在训练时见过的样本上做,所以考的是"记住多少",不是"会不会泛化"。这是持续学习评测里相当严苛的一种设定:没有任务标识、不保留旧样本、只考记忆,相当于连续 100 次微调、中间一次都不回头。ComposeCL

在这个设定下,把"学新忘旧"推向极致的做法,就是最朴素的顺序微调(naive fine-tuning):每来一个任务就继续训练。结果,三个数据集上旧任务的平均最终保留率只剩 1.2%,三个数据集各自的数字是 1.0%、1.4%、1.3%,在难度差异很大的三种任务上惊人地一致,说明灾难性遗忘几乎不挑任务形态。注意 1.2% 不是"什么都不记得",而是学完 100 个任务后,在 100 个旧任务上的平均准确率只剩这个数,模型还是能答对零星几个。换句话说,在这个设定下,朴素微调不是"效果打折",而是机制性地失效:100 个任务学完,旧知识几乎全部蒸发。真正的问题是:既然每次更新都必然破坏旧知识,能不能在更新的时候,给旧知识上几道保险?

方法平均最终保留率
naive 顺序微调1.2%
最强单机制8.1%
最强组合(三锚 + merged LoRA)34.9%,约 28 倍

上面这张答案的轮廓,就是这篇论文的全部故事:单机制全都不够,但把机制正确地组合起来,事情开始起变化。注意这张表的对比对象:8.1% 是单机制里最好的,34.9% 是组合里最好的,二者之间近 27 个百分点的差距,就是"组合"这两个字的分量。论文的路线分成两步:先想清楚每次更新该保住什么,再想清楚新知识该写进哪里。

三种锚:靠数据、靠行为、靠权重,各守一路遗忘

论文的第一个设计维度回答"每次更新要保留什么"。经典持续学习综述把解法分为正则化、重放、优化、表示、架构五大类,CL Survey 而这篇论文把防遗忘机制重新归拢成三类 anchor(锚)。名字很形象:每次更新像船抛锚,锚住的是旧知识。这三类锚在经典分类里都有老祖宗,重放一类对应 data anchor,函数正则一类对应 function anchor,权重正则一类对应 weight anchor;数据、行为、权重,恰好是人类能想到的"旧知识以什么形式存在"的三种答案:以样本存在、以行为存在、以参数存在。论文做的是把它们装进同一个坐标系里显式比较,而优化、表示那几类没有直接进坐标系,架构一类则对应后文要讲到的隔离路线。

data anchor(数据锚)靠数据。既然旧样本不能留,就让一个冻结的旧模型副本自己生成伪序列当作回放集,每个任务生成 300 条,比单个任务本身的样本量还大,混进当前任务的训练批次,每个当前任务的 minibatch 配对一个回放 minibatch。伪序列从一个不带任务标识的通用 token 开始生成,这样回放内容不会偏向任何单一旧任务;旧模型还同时给出软标签,让新模型不只模仿字面答案,还能模仿答案的概率分布。回放 loss 的权重和生成温度是两个可调超参。这一招在文献里的学名叫 Generative Replay(生成式回放),成本结构也和其他两类不一样:每轮都要先跑一遍旧模型生成数据。

function anchor(行为锚)靠行为。它不生成任何回放序列,只在新任务的输入上做自蒸馏:让新模型下一个 token 的输出概率分布向旧模型的输出看齐,包括那些只会在旧任务里出现的 token。用旧行为绑住新模型,这正是 2016 年 Learning without Forgetting(LwF)开创的思路,LwF 在这篇论文里以自蒸馏(self-distillation)的形式出现,而且不依赖任务标识,比当年更省事。代价是它只能约束到新任务输入碰得到的那些输入,旧输入空间里与新任务不相交的部分,它管不到。

weight anchor(权重锚)靠权重。它直接在损失里加一个二次惩罚项:旧参数 θ* 是锚点,新参数离锚点越远罚得越狠,惩罚强度由每个参数的重要性决定:对旧任务越重要的参数,越不许动。论文的实现是 Synaptic Intelligence(SI),online EWC 只在搜索阶段作为候选。三种锚守着三个不同来源的遗忘,打成一张对照表最清楚。

锚手段守住什么
data anchor冻结旧模型生成伪序列回放旧知识重新进入训练
function anchor在新任务输入上蒸馏旧输出旧决策边界与行为
weight anchor围绕旧参数加重要性加权的二次惩罚最重要的旧权重

三种锚并不互斥,它们分别盯着不同的遗忘通路,这正是论文后来做组合的伏笔。ComposeCL

想看懂权重锚为什么比一刀切的 L2 正则更聪明,一幅 2017 年 EWC 论文里的示意图比任何公式都省事。

EWC 参数空间示意图

图注:EWC 论文的参数空间示意。灰色椭圆是任务 A 的优良区,奶白椭圆是任务 B 的优良区,从旧参数锚点出发的三条箭头分别对应只按任务 B 梯度走(蓝)、对所有权重统一强度约束(绿)、按重要性加权的 EWC(红),红色路线能落在两区交界。EWC

每个权重像一根弹簧,重要性越高弹簧越硬,越不许被拉动。统一 L2 相当于所有弹簧同样硬,新任务学不动;完全不约束只追新任务,旧任务被毁;EWC 用 Fisher 信息估计每根弹簧的刚度,SI 走的是同一条路。EWC 这正是 EWC 方法名里 "elastic"(有弹性)一词的来历:约束的松紧按重要性逐参数调节,而不是一刀切。

但锚只规定"尽量不动什么"。新知识总得有个落脚点,如果直接写进全量权重,锚也只能延缓叠加伤害,100 个任务的累积更新迟早把旧知识冲垮。新知识存在哪里,是论文的第二个设计维度,也是下一章的主题。

新知识存在哪:低秩分配与 merged LoRA

第二个设计维度叫 low-rank allocation(低秩分配),回答"新知识存在哪里、以什么形式累积"。

先讲低秩是什么。全量微调是直接更新整个权重矩阵 W。LoRA 的想法是:不碰 W,把更新写进一对小矩阵 B 和 A 的乘积,最终权重变成 W′ = W + BA,其中 B、A 的尺寸都远小于原矩阵。训练时 W 冻结,只训这两个小矩阵。

LoRA 重参数化

图注:LoRA 重参数化示意。左侧预训练权重 W0 冻结;输入同时经过 W0 与两个低秩矩阵 B、A 的乘积两条路径,输出相加;训练只更新 A、B 两个小矩阵,A 以随机高斯初始化。LoRA

为什么可以这样?LoRA 论文的观察是:适配一个下游任务所需的权重改动,通常落在极低的"内在秩"上,两个窄矩阵的乘积就足够表达,不需要动整个矩阵。在 GPT-3 175B 上,论文认为 r=1 或 r=2 的低秩就已足够,可训练参数降到万分之一量级。原因可以这样想:适配任务时真正变化的是一条低维的方向,两个窄矩阵的乘积恰好表达这条方向,方法本身不关心除此之外的细节。低秩的好处是省参数省显存,推理时还能把 BA 合并回 W0,合回去之后模型的推理路径和普通模型一模一样,只是里面的数值换了,不引入额外延迟。LoRA

接下来是这道题的分岔:学 100 个任务,每一对的 BA 如何处理?论文在两条主线之间选择。merged LoRA(合并式)每来一个任务就新学一对 (A_t, B_t),学完把这个增量折进稠密权重 W,再开一对全新的适配器和全新的优化器给下一个任务,沿用 ReLoRA 的 merge-and-reinitialize 模式。所有任务的知识最终累积在同一组权重里,参数规模不随任务数增长。shared LoRA(共享式)则让所有任务共用同一个适配器,继续在旧增量上优化。shared 的麻烦在于,从第二个任务开始,它就在一个已经被改过的底子上继续改,旧增量会被后续任务一拖再拖,越滚越偏离最初的样子。ComposeCL

论文把另外两条"任务越多参数越多"的路子放进附录做对照:O-LoRA 给每个任务一个与过去正交的独立适配器,让新任务的低秩子空间与之前所有任务的尽量垂直,从几何上把任务间干扰压到最低;这条隔离路线在经典的五任务持续学习基准上是强基线,O-LoRA 自己在 T5-large 上平均拿到 75.8 分。O-LoRA Sequential OSRM 则是任务级 LoRA 顺序堆叠,隔离但不去正交。为什么做成这个取舍?因为 100 个任务的视界下,每任务一个适配器意味着状态随任务数线性增长、存储不可持续;知识应该"合并"而非"隔离"。合并视角在模型合并领域有成熟对应物,TIES-Merging 把每个任务的微调看成 task vector,并且指出粗暴相加会因参数冗余和符号冲突互相抵消,需要用修剪、选符号、合并三步来修正。TIES

到这里,二维坐标就齐了:锚决定"更新时保留什么",分配规则决定"新知识存在哪里"。一句话回顾这个维度:分配规则选的是新知识的"仓库",merged 选的是最朴素也最可持续的仓库,也就是同一组权重本身。两个维度各有变体,乘起来有 90 个候选配置。一个配置要跑满 100 个任务,逐个试完不现实。下一章讲论文怎么用最少的训练找到最优组合。

90 个组合怎么搜:逐轮淘汰加析因实验

先看测试场。论文造了三个 100 任务的问答数据集,难度依次递进。Symbol-QA 是 10,000 条随机 key-value 关联,每任务 100 例,考的是纯记忆,答案和问题没有任何语义关联。LLM-QA 是 10,000 条由语言模型生成的虚构问答,也是每任务 100 例,内容像真的但世界上查无实据。Real-QA 是从 10 个公开问答数据集过滤出的 5,000 条真实自然问答,每任务只有 50 例,且过滤掉了模型已经能答对的项。三个数据集都保证每个 query 在所有任务里只有唯一正确答案。为什么要三种?因为"记忆"在不同形态下可能遵循不同规律:随机配对考纯关联记忆,虚构问答考语义记忆,自然问答考真实世界的记忆,后两者才是模型日常要面对的形态。结论只对某一种成立就不可信。ComposeCL

候选空间是 90 个配置:三个锚各有开与不开以及强度变体,乘上分配规则的二选一,一共 3×3×5×2 种。逐个跑满 100 个任务不现实,论文用了一个叫 task-level successive halving(任务级逐级淘汰)的策略:在学到 10、20、50、100 个任务时各做一轮评估,按三个随机种子的平均保留率排名,每轮保留约一半,90 进 45、45 进 23、23 进 10,最后 10 个配置跑完 100 个任务。逐级淘汰的合理性在成本:早就被淘汰的配置只花了 10 到 50 个任务的训练预算,昂贵的全程训练只留给少数活得下来的配置,中途被淘汰的配置也不需要重新训练已完成的任务。

task-level successive halving 流程

图注:task-level successive halving 流程。四个水平分面依次对应 10/20/50/100 个任务时的评估轮次,副标题标出每数据集评估的配置数 90/45/23/10;灰色行表示该配置在所有数据集都已被淘汰。候选池随视界变化,条形高度不代表保留率的绝对变化。ComposeCL

这一轮淘汰的"死亡名单"很有信息量:没有任何一个单机制候选活过 50 任务阶段,进入 100 任务阶段的配置全部同时带着 data anchor 和 merged LoRA,一个都不缺,三个数据集的最终赢家还都带着 weight anchor。组合强于单体,在这里露出第一个证据。

但"谁赢了"不是论文唯一关心的问题。它还想知道每个机制单独贡献多少、合起来是互补还是互挤,这需要用析因实验(factorial experiment)回答。把三个锚和合并式分配各当成一个开关,2 的 4 次方共 16 个组合,每组合每数据集跑 3 个种子,得到 144 次观测,分数是三个种子的平均,避免单次训练的好运气冒充结论。再做方差分析,把总收益拆成主效应和交互效应。主效应是只拨动一个开关、其他都不动时保留率的平均变化;交互效应是两个开关同时拨动时,实际收益减去各自主效应之和的差额。差额为正说明两个机制互相成全,所谓 1+1>2;为负说明它们互相挤占。16 个开关组合两两不同,才能把每个机制的效果干净地分离出来。这是从"工程上凑出最好配置"升级到"科学上理解机制如何协作"。

指标上,论文先记录一张时间记忆矩阵,第 i 行第 j 列是学完第 i 个任务后在任务 j 上的准确率。由它导出最终保留率,也就是学完整条序列后所有任务的平均准确率,这是主指标。另有两个辅助指标:即时习得率统计每个任务刚学完时答得怎么样,遗忘度统计每个任务从自己的最佳成绩跌到最终成绩跌了多少。主线之外还配一个记忆半衰期,指保留率跌到刚学完时一半所需的任务数,用来衡量记忆能撑多久。ComposeCL

16 个组合最终各得多少分、超加性落在哪一对机制上,就是下一章的内容。

1.2% 到 34.9%:为什么互补机制能 1+1>2

16 个组合的结果,论文用一幅热力图并排放了出来。

16 组合最终保留率热力图

图注:16 个组合学完 100 个任务后的最终保留率热力图(上半,右侧色条范围 0-60),下半部的点阵标出每一列组合启用了哪些机制(SI、SD、Replay、Merge 四种,实心为启用)。从左到右机制渐全,色块整体变深。ComposeCL

读图顺序是这样的:横轴的 16 列只是开关组合,不表示任务顺序或时间;最左列是什么机制都没开的 shared LoRA,三行都只有 1% 出头,这就是 naive 的水平;往右每多开一个开关,色块深一格。三个数据集各自的最优组合分别拿到 23.2%、41.8%、54.8%,且偏好各不相同:Symbol-QA 的赢家带自蒸馏,Real-QA 的赢家带 SI 却不带自蒸馏。把链条数字摆齐:naive 微调平均 1.2%,最强单机制平均只有 8.1%,三个锚全部启用加 merged LoRA 的组合平均 34.9%,约 28 倍;这份最佳配置在三个数据集上的具体分数是 18.5%、41.8%、44.3%。这里有个容易被忽视的反常点:最强单机制离 34.9% 还差得远,即使在最顺的 Real-QA 上,单开 merged LoRA 也只有 12.5%。中间靠的不是某个"魔法机制",而是组合的结构本身。

超加性从哪来?看数据。以 LLM-QA 为例:单开数据重放(Replay)带来 +18.5 个百分点的主效应,单开 merged LoRA 带来 +14.9,两个都开时,除了这两者之和,还额外多出 +9.4 个百分点的交互项,而且这个 Replay × Merge 交互在三个数据集上全部显著为正(p<0.05)。注意交互项的规模随数据集难度递增:Symbol-QA 上是 +3.6,LLM-QA 上是 +9.4,Real-QA 上高达 +11.7,任务越接近真实语言,两个机制合起来的额外收益越大。换句话说,在这里 1+1 不等于 2,而是等于 2.4。机制层面的解释其实很直接:单开重放,旧知识天天被复习,但新任务更新照样大幅落在全量权重上,覆盖式磨损还在;单开 merged,新知识被收进窄通道、不再大面积覆盖旧参数,但旧任务没有机会重新巩固,遗忘只是变慢。两个一起开,回放负责把旧知识一遍遍捞回来,merged 保证捞回来的知识不会被下一次更新再次覆盖。它们堵的是两个不同的漏洞,所以合起来超出各自之和。ComposeCL

还有一个隐藏对照,更能说明增益来自"组合的结构"而不是"换了更强的单体":把 merged 替换成 O-LoRA,保留率变化只有 -3.3 / +1.0 / +1.6 的种子波动级;替换成 Sequential OSRM 则变成 -0.8 / -11.5 / -11.6,在自然语言数据集上大跌 10 分以上。同样是"任务越多参数越多"的隔离路线,一个几乎不亏、一个明显倒退,差异就出在隔离的方式上。这印证了论文的取向:在 100 任务的视界里,问题不是哪种隔离技术更高级,而是"合并加回放"这个组合本身。

不过 34.9% 也暴露了另一面:每个数据集的最强组合并不相同,没有放之四海皆准的赢家,三个锚加 merged LoRA 是唯一在所有数据集都进入前三的配置,论文这才敢把它称为最佳方法。记忆半衰期也从 naive 的 1/1/2 个任务、最佳单机制的 4/6/11 个任务,被拉到 19/32/32 个任务。19 个任务的意思是:一个知识学到手之后,还能再撑过 19 轮新任务才掉一半,比 naive 的 1 到 2 个任务是数量级的差别。但拿到这个成绩的代价是通用能力。下一章把这两个词拆开看。

记忆保住了,推理却在崩:边界与意义

34.9% 到底意味着什么?把端点数字翻译成"记忆能持续多久",看半衰期曲线。

记忆寿命曲线

图注:记忆寿命曲线。三个并排子图对应三个数据集,Y 轴是对数刻度的保留率,X 轴是记忆年龄(任务数),各四条曲线分别对应 naive 微调、最佳单机制、全部机制组合与数据集专属最优组合,子图下方标注各自的半衰期任务数(如 LLM-QA 为 1/6/32/32)。ComposeCL

四条曲线开头都接近 100%,新学的任务当时都会答,之后以不同速度下滑。naive 是近乎直线的坠落,一个任务之后保留率就跌掉一半;组合曲线则缓得多,要到 19 或 32 个任务之后才腰斩。画成一句话就是:naive 是悬崖,组合是缓坡,缓坡仍然通向遗忘,只是通往遗忘的路变长了。图里只画到记忆年龄 80,论文并不对更远的衰减做外推,但可见的趋势仍是向下。组合改变的是遗忘的时间尺度,并没有终止遗忘。34.9% 是在 100 任务终点处截出来的一个读数,遗忘本身还活着。论文对此交代得很清楚,局限有三条。

第一,记忆不等于推理。所有方法在 GSM8K、MATH、MGSM、MMLU-Redux 这四个通用推理基准上,学完 100 个任务后仍然大幅退化。保住通用能力最好的反而是 O-LoRA,因为它不动 base 参数,但四个基准平均也只有 26.8% 和 28.8%,比 base 模型的 69.4% 低了 40 多分;merged LoRA 更只有 13.0% 和 13.4%,学完符号任务之后所有分配规则的通用能力都跌破 8%,有的 GSM8K 输出干脆退化成复读训练数据里的格式。第二,每个任务刚学完时准确率都接近 100%,说明差异全部来自遗忘,而不是学不会:模型每个任务都当场学会,只是学会的东西在一个个任务之后不断流失。第三,100 个同构问答任务,离真实世界那种分布漂移、任务交织的更新场景还很远。ComposeCL

这里其实还藏着一层更深的观察:论文的评测是在训练时见过的样本上做的,所以 34.9% 说明的是"记住了见过的关联",而 GSM8K 这类基准考的是没见过的题,两套分数本来就测两件事。组合能把第一套做漂亮,恰恰说明第二套需要别的手段;记忆与推理在现有方案里是互相拉扯的,O-LoRA 记忆分没输、通用分却保留得最好,就是因为它从不改动 base 参数。

把这篇论文放回 2026 年的版图,坐标很清楚。2026 年的 LLM 持续学习综述把问题按训练阶段切成持续预训练、持续微调、持续对齐三块,ComposeCL 落在持续微调这一极。BeyondStaticModels 主张"参数内 memory consolidation"的记忆综述则提醒一个概念边界:它并不把静态预训练权重算作 memory,而 ComposeCL 恰恰是在预训练权重方向上做 consolidation,两者视角不同,正好互为补充。Memory-LLM 另一篇综述用 When/Where/How 三轴重构持续学习,ComposeCL 是典型的 where=parameters、post-training 一极,它证明了在最经典的这一格上,"怎么拼机制"仍然是非平凡的设计空间,不需要外推到外部系统就能拿到结构性收益。CLinTransition 还有一个值得对照的实证:2026 年初对 20 个真实 SOTA 大模型的机制诊断发现,顺序微调造成的遗忘不是均匀分布的,集中在模型的 mid-layer MLP 与 MoE routing 上。这项诊断用三类指标定位损伤:激活表征的相似度、路由门控的漂移、以及权重矩阵的 Frobenius 漂移,中间层 MLP 的漂移量级远超浅层。MechanisticForgetting ComposeCL 与该诊断同属参数层面的相关方向,只是它并未按 mid-layer MLP 或 MoE routing 做定位式干预:weight anchor 的重要性加权约束施加在全部旧参数上,是整体性的参数内手段。

所以这篇论文的价值不在 34.9% 这个数本身,在于两件事。它证明了防遗忘机制的组合能带来结构性的超线性收益,把"怎么拼机制"变成一张有坐标、可搜索、可析因的地图,这套"二维坐标加逐级淘汰加析因归因"的方法论本身就可以移植到别的机制组合上;它也诚实圈出了边界:记忆与推理是两回事,参数内的组合救得了前者,救不了后者。真实世界的模型持续更新,大概还需要外部记忆、分层存储这类参数之外的系统级方案。用一句话记住这篇论文:组合让遗忘变慢 28 倍,但记忆不是推理,参数内的保险救不了通用能力。

想深入读原文:Continual Learning Mechanisms Compose for Long-Horizon Memorization(arXiv:2609.06986)

参考文献

ComposeCL:连学 100 个任务只记得 1.2%,四类机制组合到 35%