BlackCat

持续学习 39 min read

持续学习(Continual Learning):截至 2026 年的技术总体认知

持续学习(Continual Learning)截至 2026 年的技术总体认知:为什么零遗忘不等于好的持续学习系统,评估需同时考虑新知识吸收、旧能力保持、前后向迁移与训练存储成本。

版本日期:2026-08-21


持续学习不是单纯“防止遗忘”,而是在受限资源下进行顺序优化。

顺序指的是数据/任务经验按照时间顺序到来,模型随着时间不端更新,优化梯度的问题。

受限资源意味着不能每次都从来开始训练,这样虽然最不容易遗忘,但是资源利用效率太低。

一个完全冻结、什么都学不到的模型可以做到零遗忘,但它显然不是好的持续学习系统。评价必须同时考虑新知识吸收、旧能力保持、前后向迁移、训练与存储成本。

不先声明场景,讨论某个 CL 方法“更好”几乎没有意义。 Task-IL、Domain-IL、Class-IL、Online CL、Task-free CL 的困难来源不同;是否提供 task ID、是否允许保存旧样本、缓冲区按样本数还是字节数计算,也都会彻底改变结论。

  1. 在允许保存少量历史数据时,回放仍然是最可靠、最难击败的通用机制之一。 但这里应说“强默认基线”,而不是“任何场景下的唯一最优解”。隐私、数据治理、存储和额外训练计算会限制它。

  2. 强预训练模型改变了问题的主导变量。 过去研究的核心是“怎样保护从零学到的表征”;今天很多视觉 CIL 问题的核心变成“怎样正确利用已经很强的冻结表征,并避免分类器偏置、路由错误和下游分布差异”。因此任何新方法都应与“冻结 backbone + prototype / linear head”比较。

  3. LLM 的遗忘不是一个单一现象。 性能下降可能来自参数知识被覆盖、表征改变、读取头或路由失配、指令格式偏移、生成策略改变、安全/对齐目标改变。2025 年关于 spurious forgetting 的工作进一步表明,一部分表面遗忘是“知识仍在,但访问方式失配”。

  4. 实际可部署的 CL 系统通常是混合系统。 常见组合不是“只用 EWC”或“只用 Prompt”,而是:冻结主干、PEFT 模块、受限回放、蒸馏、外部检索记忆、周期性巩固、回归测试、版本化与回滚。

  5. 真正开放式、长期、有界资源的终身学习仍未解决。 目前方法在短任务序列、预先切分的数据集或有限域更新上已经很有用;但在未知任务边界、长时间尺度、知识会过期、需要安全更新且资源不能持续增长的真实环境中,还没有统一解法。


第一部分:问题到底是什么

1. 持续学习的技术定义

设数据按顺序到达:

[
D_1, D_2, \ldots, D_T, \qquad D_t \sim P_t(X,Y)
]

其中分布 (P_t) 可以发生变化。变化可能表现为:

  • 新类别出现;
  • 输入风格或传感器变化;
  • 新领域语料到达;
  • 标签含义、奖励函数或用户偏好变化;
  • 任务边界明确、模糊,甚至根本不存在。

模型在第 (t) 个阶段不只有参数 (\theta_t),更完整的状态应该写成:

[
S_t = \big(\theta_t,; o_t,; M_t,; A_t,; E_t\big)
]

其中:

  • (\theta_t):主模型参数;
  • (o_t):优化器状态,例如 Adam 的一阶、二阶动量;
  • (M_t):回放缓冲或样本统计;
  • (A_t):Prompt、Adapter、LoRA、mask、专家模块等可插拔参数;
  • (E_t):RAG 数据库、Agent episodic memory 等外部记忆。

持续学习算法执行更新:

[
S_t = \mathcal{A}(S_{t-1},D_t;B)
]

这里的 (B) 是资源约束,例如:

[
B=(\text{memory bytes},\text{train FLOPs},\text{latency},\text{privacy},\text{model growth})
]

因此,一个更完整的定义是:

持续学习是模型在非平稳、按序到达的数据或经验上持续更新,在无法反复依赖全部历史数据与无限计算的条件下,兼顾新知识吸收、旧能力保持、知识迁移和资源有界增长。

这个定义比“不断学习新知识而不忘旧知识”更精确,因为它明确了:

  1. 数据分布不一定按清晰任务切分;
  2. 旧数据不是绝对不可访问,而通常是访问受限;
  3. 资源约束属于问题本身;
  4. 旧知识不一定都应永久保存;过期、错误或不安全的知识有时应被主动修改或遗忘。

1.1 一个多目标优化视角

可以把 CL 写成多目标问题:

[
\min_{S_t};
\underbrace{R_t(S_t)}{\text{当前适应}}
+\lambda
{\text{old}}\underbrace{R_{1:t-1}(S_t)}{\text{历史保持}}
-\lambda
{\text{transfer}}\underbrace{T(S_t)}{\text{迁移收益}}
+\lambda
{\text{resource}}\underbrace{C(S_t)}_{\text{资源代价}}
]

这不是某一篇论文的统一训练式,而是理解领域的工程抽象:

  • 只压低当前风险,得到 naïve sequential fine-tuning,容易遗忘;
  • 只保护旧任务,模型会僵化,无法学习新任务;
  • 不惩罚资源,最简单的办法是每个任务复制一整套模型;
  • 不考虑迁移,系统只是保存一堆孤立任务,并没有形成可复用知识。

2. CL 与相邻概念的边界

概念 主要目标 是否通常更新参数 是否强调保留旧能力 与 CL 的关系
Joint / offline training 在全部数据上统一训练 隐式保留 常作为近似上界,但违反“历史数据受限”条件
Online learning 数据流上逐步优化 不一定 CL 是更强调长期保持与迁移的一类在线学习问题
Transfer learning 从源任务迁移到目标任务 通常不要求 多为单向适应,不一定有长序列
Domain adaptation 适应目标域 是或否 不一定 Domain-IL 可视为其顺序、多阶段版本
Test-time adaptation 部署时适应当前测试分布 通常是 常被忽略 若要求长期稳定,就与 Online CL 汇合
Model editing 局部修改事实或行为 是或外挂参数 强调局部性 连续多次编辑会演化成 lifelong editing 问题
RAG 更新外部知识库并检索 通常不改主参数 主参数天然不忘 是实用“外部记忆更新”,但不等于参数持续学习
Model merging 合并多个任务模型或任务向量 合并参数 取决于冲突 是知识累积的互补路线,不自动解决顺序更新
Agent memory 保存对话、轨迹、反思或工具结果 通常外部存储 依赖检索 可成为 CL 系统的 episodic memory,但“记住”不等于“学会”

2.1 为什么“零遗忘”不是充分条件

假设模型参数完全冻结:

[
\theta_t=\theta_0,\quad \forall t
]

它不会因为新训练而忘记旧任务,但也无法吸收参数知识。于是:

[
\text{Forgetting}=0 \not\Rightarrow \text{Continual Learning is good}
]

同样,如果允许每个任务复制一个无限大的模型,并在测试时提供完美 task ID,也可以接近零遗忘;但其参数量随任务线性增长:

[
|\theta_{1:T}|=O(TP)
]

这说明 CL 的真正难点来自共同参数、未知路由和有界资源同时存在


第二部分:为什么神经网络会忘

3. 最小解释:共享参数上的梯度干扰

模型学完旧任务后位于 (\theta)。新任务的一步更新为:

[
\theta' = \theta - \eta g_{\text{new}}
]

对旧任务损失做一阶展开:

[
L_{\text{old}}(\theta')
\approx
L_{\text{old}}(\theta)
-\eta g_{\text{old}}^\top g_{\text{new}}
]

若:

[
g_{\text{old}}^\top g_{\text{new}}<0
]

那么沿新任务梯度更新会使旧任务损失上升。这就是 GEM/A-GEM 等梯度约束方法的直接出发点。

但不能把灾难性遗忘简单等同于“梯度点积为负”。一阶局部近似没有覆盖:

  • 非线性网络经过多步更新后的路径效应;
  • 表征层改变导致分类头失效;
  • BatchNorm 统计或优化器动量改变;
  • 类别先验和 logit 尺度漂移;
  • Prompt/专家路由选错;
  • LLM 的答案格式、指令遵循或安全策略改变。

4. 遗忘至少有六个技术层次

flowchart TD
    A[新数据或新任务到达] --> B[参数更新]
    B --> C1[参数干扰]
    B --> C2[表征漂移]
    B --> C3[分类器/校准偏置]
    B --> C4[优化器与统计状态漂移]
    B --> C5[路由或任务识别错误]
    B --> C6[LLM 输出策略/对齐改变]
    C1 --> D[旧任务指标下降]
    C2 --> D
    C3 --> D
    C4 --> D
    C5 --> D
    C6 --> D

4.1 参数干扰

同一组权重同时承担多个任务。新任务优化修改了旧任务依赖的方向。

4.2 表征漂移(representation drift)

旧样本的特征由:

[
z_{\text{old}}=\phi_{\theta_{t-1}}(x)
]

变成:

[
z_{\text{new}}=\phi_{\theta_t}(x)
]

即使分类器没有变,旧类别在特征空间的位置也可能移动。反过来,即便 backbone 基本保留,分类头偏置也可能造成性能下降。

4.3 类别不平衡与 logit 偏置

Class-IL 中,当前阶段包含大量新类样本,却只有少量甚至没有旧类样本。交叉熵会把决策边界推向旧类,产生“新类偏置”。因此很多 CIL 方法中的 classifier alignment、balanced fine-tuning、prototype classifier,并不是直接保护参数,而是在修正输出空间。

4.4 优化器与归一化统计漂移

Adam 的动量、学习率调度、BatchNorm running mean/variance 都是模型状态。只保存权重、不保存这些状态,或者在新域上重新估计统计量,都可能改变旧任务表现。

4.5 路由失败

参数隔离、Prompt Pool、MoE 或 Adapter Pool 依赖“给当前输入选择正确模块”。此时旧知识可能完整保存在某个模块里,但输入被路由到了错误模块。表面指标仍会下降,但问题不是参数被擦除,而是知识不可达

4.6 LLM 的访问与对齐失败

LLM 可能仍然能在线性 probe、特定 prompt 或少量校准后输出旧知识,但在原任务格式下失败。ICLR 2025 的 Spurious Forgetting in Continual Learning of Language Models 将一类现象解释为 task alignment 下降,而非知识本体完全消失。因此 LLM-CL 评测必须区分:

[
\text{knowledge storage}
\neq
\text{knowledge accessibility}
\neq
\text{generation policy}
]


第三部分:先把实验场景说清楚

5. 三种经典增量场景

van de Ven 等人的标准化工作把经典监督 CL 分为三类。

场景 测试时 task ID 输出空间 核心难点 常见误区
Task-Incremental Learning 给定 通常每任务独立 head 或 mask 保护旧任务参数 task ID 是强 oracle,掩盖了任务识别问题
Domain-Incremental Learning 不给定 标签语义保持不变,共享 head 同一任务在不同上下文/域中稳定 “无需推断 task ID”不是说域变化不存在,而是无需选择任务专属输出头
Class-Incremental Learning 不给定 类别集合持续扩大,共享 head 同时识别所有已见类;新类偏置 最终精度混合了表征、分类器和平衡问题

形式化地:

Task-IL

[
f(x,t)\rightarrow y
]

测试时提供任务上下文 (t)。

Domain-IL

[
f(x)\rightarrow y, \qquad \mathcal{Y}_t=\mathcal{Y}
]

标签空间保持一致,但 (P_t(X)) 或 (P_t(X,Y)) 变化。

Class-IL

[
\mathcal{Y}1\subset \mathcal{Y}{1:2}\subset\cdots\subset\mathcal{Y}_{1:T}
]

模型必须在所有已见类别上做一次统一预测。

6. 现实设定还需要另外四个轴

只写“Class-IL”仍然不够。实验至少还要声明:

6.1 数据访问

  • Full replay:可访问全部历史数据,接近 joint retraining;
  • Bounded raw replay:保存固定数量或固定字节的原始样本;
  • Feature replay:保存中间特征;
  • Logit replay:保存旧模型输出;
  • Generative replay:保存生成器并合成旧样本;
  • Replay-free / exemplar-free:不保留历史样本。

6.2 数据遍历次数

  • 多 epoch task-wise CL;
  • 单遍 online CL;
  • 小批次流式更新;
  • 完全 one-example-at-a-time。

6.3 任务边界

  • 已知清晰边界;
  • 训练时已知、测试时未知;
  • 模糊边界;
  • 无边界 task-free / general CL。

6.4 资源增长

必须分别报告:

[
\text{raw memory},\quad
\text{feature/logit memory},\quad
\text{trainable params},\quad
\text{total params},\quad
\text{FLOPs},\quad
\text{latency}
]

“每类保存 20 个样本”与“总共保存 2,000 个样本”不是同一个约束;“每任务增加一个 LoRA”也不能称为严格常数内存。


第四部分:怎样正确评测 CL

7. 性能矩阵

设 (R_{i,j}) 表示模型学完第 (i) 个任务后,在第 (j) 个任务测试集上的性能。

[
R=
\begin{bmatrix}
R_{1,1} & R_{1,2} & \cdots & R_{1,T}\
R_{2,1} & R_{2,2} & \cdots & R_{2,T}\
\vdots & \vdots & \ddots & \vdots\
R_{T,1} & R_{T,2} & \cdots & R_{T,T}
\end{bmatrix}
]

矩阵的对角线衡量每个任务刚学完时的能力;最后一行衡量整个序列结束后的保留情况;下三角反映学习后续任务对前面任务的影响。

8. 核心指标

8.1 最终平均精度(ACC)

[
\mathrm{ACC}=\frac{1}{T}\sum_{j=1}^{T}R_{T,j}
]

它是最直观的最终综合表现,但不能告诉你模型是“学不会新任务”还是“学会后又忘了”。

8.2 反向迁移(BWT)

常用定义为:

[
\mathrm{BWT}=\frac{1}{T-1}\sum_{j=1}^{T-1}\left(R_{T,j}-R_{j,j}\right)
]

  • BWT < 0:后续学习伤害旧任务;
  • BWT = 0:旧任务最终表现与刚学完时相同;
  • BWT > 0:后续学习反而提升旧任务。

8.3 正向迁移(FWT)

一种常见定义是:

[
\mathrm{FWT}=\frac{1}{T-1}\sum_{j=2}^{T}\left(R_{j-1,j}-b_j\right)
]

其中 (b_j) 是未学习该任务时的基线。FWT 高意味着过去经验让模型在正式训练新任务前已经更有准备。

注意:不同论文对 BWT/FWT 的下标和基线约定可能不同,比较数字前必须核对公式。

8.4 平均遗忘(Average Forgetting)

任务 (j) 的遗忘可写为:

[
F_j=\max_{l\in{j,\ldots,T-1}}R_{l,j}-R_{T,j}
]

然后:

[
\overline F=\frac{1}{T-1}\sum_{j=1}^{T-1}F_j
]

它比较旧任务历史最佳值与最终值。若模型后续获得正向修正,(F_j) 也可能为负或接近零。

9. 只报告 ACC/Forgetting 仍然不够

现实系统还应报告:

  • Anytime performance:训练过程中任意时间点的平均能力,而不仅是最终一步;
  • Adaptation speed:新任务达到某阈值需要多少样本或更新步;
  • Calibration:置信度、ECE、旧类/新类 logit 偏置;
  • Memory in bytes:不要只报“样本数”;图像、token、feature、logit 的体积不同;
  • 训练 FLOPs 和 wall-clock:回放会让每步训练量上升;
  • 推理延迟与路由代价:模块池、ensemble、KNN、RAG 都可能增加推理成本;
  • 参数增长率:每任务新增参数是否是 (O(1))、(O(T)) 或更高;
  • 隐私风险:原始样本回放可能记住个人数据;生成式回放也不天然隐私安全;
  • 安全与通用能力回归:对 LLM 尤其重要。

10. 一个可信 CL 实验必须包含的基线

至少应有:

  1. Naïve sequential fine-tuning:遗忘下界/基本对照;
  2. Joint training:在全部数据可用时的近似上界,而不是同等约束下的竞争者;
  3. ER + reservoir sampling:允许回放时的强简单基线;
  4. DER++:回放 + 历史 logit 的强基线;
  5. EWC 或 LwF:无原始回放的经典基线;
  6. Frozen pretrained backbone + prototype/linear head:Foundation Model 时代不可缺少;
  7. 一个 PEFT 基线:例如 Prompt、Adapter 或 LoRA。

还应控制:

  • 相同 backbone 和预训练权重;
  • 相同旧数据字节预算;
  • 相同超参数搜索预算;
  • 多个任务顺序与随机种子;
  • 不使用测试 task ID 泄漏;
  • 明确预训练集与评测集是否重叠;
  • 不在最终测试序列上选择超参数。

第五部分:经典技术路线

11. 正则化:限制哪些参数或函数可以改变

正则化方法的统一思想是:

[
L_t(\theta)=L_{\text{new}}(\theta)+\lambda,\Omega(\theta,\theta^*_{\text{old}})
]

根据保护对象,可分为:

  • 参数正则化:EWC、SI、MAS 等,保护“重要参数”;
  • 函数正则化:LwF、logit distillation 等,保护旧模型的输入—输出行为。

11.1 EWC:用局部后验曲率保护重要参数

EWC 的经典目标为:

[
L(\theta)=L_{\text{new}}(\theta)
+\frac{\lambda}{2}\sum_i F_i(\theta_i-\theta_i^*)^2
]

其中:

  • (\theta_i^*):旧任务训练结束时的参数;
  • (F_i):Fisher 信息矩阵的对角近似,作为参数重要性;
  • (\lambda):稳定性与可塑性的权衡。

直观解释:

  • 若 (F_i) 大,移动参数 (\theta_i) 的代价高;
  • 若 (F_i) 小,该参数可更多用于新任务;
  • 这不是把重要参数绝对冻结,而是施加“弹性锚定”。

开源代码摘录:Online EWC 的惩罚项

出处:Mammoth,models/ewc_on.py,MIT License。
实现身份:权威 CL 框架复现;不是 EWC 原作者仓库。
原始行源码 L30–L35

penalty = self.args.e_lambda * (self.fish * ((self.net.get_params() - self.checkpoint) ** 2)).sum()

逐项对应:

  • self.net.get_params() - self.checkpoint 对应 (\theta-\theta^*);
  • ** 2 是二次距离;
  • self.fish * ... 让 Fisher 大的参数受到更强约束;
  • .sum() 对全部参数累加;
  • e_lambda 控制保护强度。

Online EWC 还会递归衰减和累积 Fisher:

[
F_t \leftarrow \gamma F_{t-1}+\widehat F_t
]

这样不必为每个历史任务保存一整套 Fisher 和锚点,但压缩历史曲率也会丢失任务细节。

EWC 的假设与局限

  1. 使用对角 Fisher,忽略参数间相关性;
  2. 在旧最优点附近做局部二次近似,长距离更新时近似会变差;
  3. 长任务序列中越来越多参数被判定为重要,模型可能逐渐失去可塑性;
  4. 它保护参数位置,不保证旧函数在所有输入区域都保持;
  5. Class-IL 中的分类器偏置并不会因为 Fisher 惩罚自动解决。

11.2 LwF:保护函数输出,而不是参数位置

LwF 保存旧模型 (f_{\theta^-}),在新数据 (x\sim D_t) 上要求新模型输出接近旧模型:

[
L=L_{\text{new-label}}
+\lambda T^2,
\mathrm{KL}\left(
\sigma(z^- /T);|;\sigma(z/T)
\right)
]

优点是无需原始旧数据;局限是蒸馏只发生在新数据覆盖的输入区域。若新旧任务输入支持集几乎不重叠,旧模型在新数据上的输出不足以约束旧域函数。

11.3 SI 与 MAS 的位置

  • SI 沿优化轨迹累计每个参数对损失下降的贡献;
  • MAS 用模型输出对参数扰动的敏感度衡量重要性,可在无标签数据上估计;
  • 二者与 EWC 的区别主要是“如何估计重要性”,而不是保护目标的根本改变。

11.4 什么时候正则化值得优先考虑

适合:

  • 不能保存原始数据;
  • 任务序列不太长;
  • 参数和计算预算严格;
  • 新旧任务有较强共享结构;
  • 作为 replay/PEFT 系统中的辅助项。

不适合单独承担:

  • 很长、差异很大的任务序列;
  • 强 Class-IL 新类偏置;
  • 需要精确保留大量细粒度旧样本;
  • 旧数据分布与新数据几乎不重叠。

12. 回放:把旧训练信号重新放回优化过程

经验回放的基本目标是:

[
L =
\mathbb E_{(x,y)\sim D_t}\ell(f_\theta(x),y)
+\lambda
\mathbb E_{(x,y)\sim M_t}\ell(f_\theta(x),y)
]

它直接修复顺序训练的核心缺陷:优化器不再只看到最新分布。

12.1 Reservoir Sampling:固定缓冲如何代表整个历史流

当已见样本数为 (n),缓冲容量为 (m) 时,reservoir sampling 使每个历史样本最终进入缓冲的概率为:

[
P(x_i\in M_n)=\frac{m}{n}
]

它不需要预先知道数据流总长度。

开源代码摘录:Mammoth Buffer

出处:Mammoth,utils/buffer.py,MIT License。
实现身份:框架公共 Buffer 实现。
原始行源码 L104–L122

if num_seen_examples < self.buffer_size:
return num_seen_examples

rand = np.random.randint(0, num_seen_examples + 1)
if rand < self.buffer_size:
return rand
else:
return -1

逐步解释:

  1. 缓冲未满时,当前样本直接进入下一个空位;
  2. 缓冲满后,在 ([0,n]) 中均匀抽一个整数;
  3. 只有抽到前 (m) 个位置时才替换缓冲中的某项;
  4. 否则返回 -1,丢弃当前样本。

Reservoir 的优势是简单、无偏和 task-free;不足是它不关心类别平衡、困难度、梯度多样性或隐私价值。数据流严重不平衡时,“全历史均匀”不一定等于“对最终任务最有用”。

12.2 缓冲里究竟存什么

存储对象 优点 风险/代价
原始样本 + 标签 训练信号最完整 隐私、版权、存储大
压缩样本 减少空间 压缩伪影、实现复杂
中间特征 更小、可能更隐私 backbone 漂移后旧特征失配
历史 logits 保存“暗知识”与类关系 依赖旧输出维度和校准
梯度/低秩子空间 直接约束更新方向 计算和存储可能随模型规模上升
生成器 不直接存真实数据 生成器也会遗忘;合成分布可能偏移

12.3 DER++:样本标签与历史 logit 同时回放

DER++ 的典型目标可写成:

[
L_{ ext{DER++}}
=L_{\text{CE,new}}
+\alpha|f_\theta(x_m)-z_m|2^2
+\beta,L
{\text{CE}}(f_\theta(x_m),y_m)
]

其中缓冲保存 ((x_m,y_m,z_m)),(z_m) 是样本进入缓冲时的历史 logits。

开源代码摘录:DER++

出处:Mammoth,models/derpp.py,MIT License。
实现身份:Mammoth 是 DER/DER++ 论文团队的官方代码库。
原始行源码 L36–L52

loss_mse = self.args.alpha * F.mse_loss(buf_outputs, buf_logits)
loss += loss_mse
loss_ce = self.args.beta * self.loss(buf_outputs, buf_labels)
loss += loss_ce

第一项让当前模型复现历史函数输出;第二项用真实标签防止旧 logits 中的错误永久固化。

为什么 logits 有用?硬标签只告诉模型正确类,而历史 logits 还保留:

  • 类别间相似性;
  • 决策边界附近的相对置信度;
  • 当时模型的函数状态。

但 DER++ 仍受缓冲代表性、logit 校准漂移和输出空间扩展影响。

12.4 GEM / A-GEM:不是直接混合损失,而是约束梯度

GEM 希望新任务更新不能增加每个旧任务记忆集的损失:

[
\langle g,g_k\rangle \ge 0,\qquad \forall k<t
]

若违反约束,就把新梯度投影到可行区域。A-GEM 用一个参考记忆梯度 (g_{\text{ref}}) 代替多个旧任务约束:

[
\tilde g=
\begin{cases}
g,&g^\top g_{\text{ref}}\ge 0\
g-\frac{g^\top g_{\text{ref}}}{g_{\text{ref}}^\top g_{\text{ref}}}g_{\text{ref}},&g^\top g_{\text{ref}}<0
\end{cases}
]

开源代码摘录:A-GEM 投影

出处:Mammoth,models/agem.py,MIT License。
实现身份:框架复现。
原始行源码 L13–L15

corr = torch.dot(gxy, ger) / torch.dot(ger, ger)
return gxy - corr * ger
  • gxy:当前批次梯度;
  • ger:回放参考梯度;
  • corr * ger:当前梯度在冲突参考方向上的分量;
  • 相减后得到位于边界上的投影梯度。

限制包括:

  • 大模型上提取、拼接并投影全参数梯度很昂贵;
  • 一个随机参考批次未必代表全部旧知识;
  • “不提高当前记忆批次损失”不等于不伤害整个旧分布;
  • 强约束会抑制有必要的表示重构。

12.5 回放研究真正的三个子问题

  1. 存什么:reservoir、类别平衡、coreset、梯度多样性;
  2. 取什么:随机检索、MIR 的最大干扰样本、难例优先;
  3. 怎样训练:标签 CE、logit 蒸馏、对比学习、梯度约束、校准。

这比“回放 = 把几张旧图混进来”更完整。


13. 参数隔离与架构扩展:让任务少共享或不共享参数

核心形式可以抽象为:

[
f(x)=f_{\theta_{\text{shared}},A_{r(x)}}(x)
]

其中 (A_k) 是任务模块、mask、Prompt、Adapter、LoRA 或专家,(r(x)) 是路由器。

13.1 主要形态

形态 代表思路 如何防遗忘 主要代价
整列扩展 Progressive Networks 旧列冻结,新任务加新列 参数近线性增长
动态神经元/层 DEN、Block Expansion 新知识进入新容量 模型和推理成本增长
剪枝后占位 PackNet 旧任务权重冻结,新任务使用剩余权重 容量逐渐耗尽;需 task ID
二值 mask Piggyback、HAT、SupSup 每任务使用不同子网络 mask/路由管理;共享容量冲突
Prompt/Adapter/LoRA 池 L2P、EASE、O-LoRA 等 冻结 backbone,隔离增量参数 模块增长、检索错误

13.2 参数隔离并没有消除所有问题

它把问题从“参数是否被覆盖”转移为:

  • 如何发现新任务;
  • 如何选择正确模块;
  • 模块是否可复用;
  • 总容量怎样保持有界;
  • 多模块输出如何校准;
  • 跨任务共享是否被过度削弱。

若测试时直接提供 task ID,许多参数隔离方法的难度会显著下降。因此 Task-IL 的高分不能自动推导出真实 task-agnostic 场景的可靠性。


14. 三大方法家族不是互斥的

现代方法往往同时使用:

[
\boxed{\text{frozen backbone}}
+\boxed{\text{PEFT module}}
+\boxed{\text{small replay}}
+\boxed{\text{distillation}}
+\boxed{\text{classifier calibration}}
]

例如:

  • replay 提供旧输入覆盖;
  • distillation 保持历史函数;
  • LoRA/Adapter 减少主干改动;
  • 正交约束减少模块间干扰;
  • prototype 或 balanced head 修复新类偏置。

所以把一个方法只归为“正则化”或“架构法”,更多是历史上的主机制分类,而不是当代系统的完整描述。


第六部分:预训练模型如何重构 CL

15. 从“保护表征”转向“利用表征”

传统 CL 默认从随机初始化开始:

[
\phi_{\theta_0}\text{ 很弱}
]

因此每个任务都必须修改 backbone,而遗忘主要发生在表征层。

Foundation Model 时代,预训练表示可能已经具有很强的可迁移性:

[
\phi_{\text{PTM}}(x)\text{ 已经线性可分或近似可分}
]

如果冻结 (\phi),只更新类别统计或轻量分类器,就不存在 backbone 参数遗忘。此时问题转化为:

  • 预训练表征是否覆盖下游分布;
  • 类原型是否稳定;
  • 新旧类别的统计是否可比;
  • 分类器如何处理类数量扩张;
  • 需不需要轻量适配来缩小分布差距。

16. Prototype / NCM:为什么简单方法会很强

对类别 (c),累积归一化特征均值:

[
\mu_c= rac{1}{N_c}\sum_{i:y_i=c}
\frac{\phi(x_i)}{|\phi(x_i)|_2}
]

预测:

[
\hat y=\arg\max_c
\frac{\phi(x)^\top\mu_c}
{|\phi(x)|_2|\mu_c|_2}
]

如果 backbone 冻结,旧样本的特征坐标系不会漂移,类原型可在线累计。因此 SimpleCIL 一类方法可以在不训练下游 backbone 的条件下形成很强的 CIL 基线。RanPAC 进一步加入固定随机投影和非线性扩维,以提高线性可分性,再累计原型/统计。

16.1 这不等于 CL 已经解决

冻结表征绕开了参数干扰,却仍可能失败于:

  • 新领域超出预训练分布;
  • 细粒度类别需要专门特征;
  • 类内分布随时间漂移,单均值原型不足;
  • 预训练数据与 benchmark 重叠,结果被高估;
  • 新任务需要的是生成、推理或控制技能,而不是静态分类。

因此 Foundation Model 时代的新方法必须回答:

相对“冻结 PTM + 极简统计分类器”,你的复杂模块究竟增加了什么?增加的精度是否值得训练、存储、路由与调参成本?


17. L2P:把持续学习状态放进可检索 Prompt Pool

L2P 官方架构图

图片出处:Google Research google-research/l2p 官方仓库,Apache-2.0 License。

17.1 按图逐步解读

  1. 输入先经过预训练 embedding / query function,得到查询向量;
  2. Prompt Pool 中每个 Prompt 与一个 key 关联;
  3. 查询向量和 key 做相似度匹配;
  4. 选出的 top-k Prompt 被前置到输入 token embedding;
  5. 预训练 Transformer 主干保持冻结或基本冻结;
  6. Prompt 和分类器承担下游顺序学习。

这相当于把“长期可学习状态”从巨大的 backbone 转移到一个小型、可检索的键值模块中。

17.2 开源代码摘录:top-k Prompt 检索

出处:Google Research L2P,models/prompt.py,Apache-2.0 License。
实现身份:论文作者官方 JAX 实现。
原始行源码 L191–L225

(sim_top_k, idx) = jax.lax.top_k(sim, self.top_k)

选定索引后,从 Prompt Pool 取出对应参数:

batched_prompt_raw = jnp.take(
prompt, idx,
axis=1)

将 Prompt 加到输入序列前方的官方实现为:

原始行源码 L35–L45

return jnp.concatenate([prompt, x_embed], axis=1)

17.3 关键技术含义

  • top_k 不是 task ID;它是由输入特征动态决定的路由;
  • Prompt Pool 是参数记忆,不是原始样本回放;
  • backbone 冻结降低了表征遗忘,但 Prompt 之间仍会竞争;
  • 如果 query 与 key 匹配错误,知识虽然存在,也会不可达;
  • 固定 pool 会容量不足,动态扩展又会造成长期内存增长。

18. DualPrompt:共享知识与任务特异知识分开

DualPrompt 官方架构图

图片出处:Google Research google-research/l2p 官方仓库,Apache-2.0 License。

18.1 图中的两类 Prompt

  • G-Prompt(General Prompt):跨任务共享,学习通用知识;
  • E-Prompt(Expert Prompt):与特定任务/输入簇相关,通过 key 匹配选择。

图右侧展示 Prompt 如何注入多头自注意力(MSA):Prompt 可以被拆分并附着到 key/value 路径,而不是只在最外层拼接 token。

18.2 它在解决什么

L2P 把所有知识放进一个池,容易出现共享不足或 prompt collision。DualPrompt 显式分解:

[
P(x)=P_G+P_{E,r(x)}
]

  • (P_G) 负责跨任务共享;
  • (P_E) 负责隔离任务特异变化;
  • 路由器 (r(x)) 负责选择专家 Prompt。

这是一种参数级的“稳定—可塑”分工,但它仍依赖路由可靠性、Prompt 容量和预训练 backbone 的可迁移性。


19. Adapter / LoRA / 子空间隔离

LoRA 将权重更新写为低秩增量:

[
W'=W+\Delta W,\qquad \Delta W=BA,
]

其中秩 (r\ll d)。冻结 (W) 后,只训练 (A,B),可以显著减少可训练参数。

持续学习中的关键不是“用了 LoRA 就不会忘”,而是:

  • 多任务是否共用同一 LoRA;
  • 每任务是否新建 LoRA;
  • 如何路由和合并;
  • 不同 LoRA 子空间是否干扰;
  • 模块数量是否有界。

InfLoRA、O-LoRA 等方法试图让新任务增量位于与旧任务重要梯度/子空间正交的方向:

[
\Delta W_t\perp \mathcal{G}_{1:t-1}
]

但严格正交会随任务增多消耗可用子空间;近似梯度空间的质量也决定了真实保护程度。


第七部分:LLM 的持续学习

20. 为什么 LLM-CL 不能直接照搬 Split CIFAR

LLM 的“任务”通常不是清晰的十分类:

  • 领域语料持续到达;
  • 新事实与旧事实发生时间冲突;
  • 新工具、新语言、新格式和新技能加入;
  • SFT、偏好优化和安全对齐目标反复改变;
  • 同一个 prompt 同时依赖知识、推理、指令遵循与输出策略。

因此当前 LLM-CL 通常按模型生命周期分成三个阶段:

阶段 主要数据 典型损失 主要遗忘对象 常见机制
Continual Pre-Training(CPT) 新领域/新时间段无标注 token next-token loss 通用语言能力、旧领域知识 旧数据混合、学习率重预热、扩层、正则化
Continual Fine/Instruction Tuning(CFT/CIT) 指令—回答、任务数据 SFT CE 旧技能、格式、通用能力 replay、distillation、LoRA/Adapter Pool、正交子空间
Continual Alignment 偏好、安全、奖励数据 DPO/RLHF/策略目标 helpfulness、安全边界、知识可达性 数据混合、参考模型约束、在线合并、回归测试

2026 年的 LLM-CL 综述也普遍采用“持续预训练—持续微调—持续对齐”的阶段化结构。

21. 持续预训练:真正的变量不只有数据

CPT 的更新可写为:

[
L_{\text{CPT}}=
\mathbb E_{x\sim \alpha P_{\text{new}}+(1-\alpha)P_{\text{replay}}}
[-\log p_\theta(x)]
]

其中 (\alpha) 是新旧数据混合比例。工程上至少要同时设计:

  1. 数据混合比例:新领域太高会覆盖旧能力,太低则适应慢;
  2. 学习率重预热:旧模型已经处于衰减学习率末端,直接继续训练可能缺乏可塑性;
  3. 优化器状态:保留还是重置 Adam moments 会改变更新轨迹;
  4. token 顺序与去重:持续语料可能与旧数据重复或时间冲突;
  5. tokenizer/embedding 扩展:新语言、新符号可能需要新 token;
  6. 评测矩阵:不能只看新领域 perplexity,还要看通用、推理、安全和旧域。

实践中,“重预热 + 少量旧数据混合”是必须认真比较的简单基线。复杂 CL 方法若没有超过这一基线,往往没有足够工程价值。

22. 持续指令微调:技能与任务对齐同时变化

CIT 训练的是:

[
p_\theta(y\mid x,\text{instruction})
]

性能下降可能来自:

  • 旧技能参数被覆盖;
  • 指令模板变化;
  • 当前数据过度强化某一种回答风格;
  • 旧任务输出标签/格式不再被生成策略优先选择;
  • LoRA 合并或路由错误。

因此只测一个 exact-match 分数,很难判断“知识没了”还是“输出方式变了”。

23. Spurious Forgetting:先判断知识是否真的消失

一个更可靠的诊断流程是:

  1. 原始任务评测:旧任务指标是否下降;
  2. 固定表征 probe:旧知识是否还能被线性读取;
  3. head/calibration reset:重新校准小型输出层后能否恢复;
  4. prompt rescue:更明确的任务描述或 few-shot 示例能否恢复;
  5. logit/representation analysis:旧答案是否仍有较高但未胜出的概率;
  6. 再训练成本:只用极少旧样本是否快速恢复。

若知识很容易被重新读取,问题更接近访问或对齐;若连内部 probe 都显著失效,才更像参数知识被覆盖。

这一区分会改变治疗方式:

  • 真正参数遗忘 → replay、正则、隔离、扩容;
  • 读取/校准失败 → head alignment、routing、prompt、decoding 修正;
  • 安全/策略漂移 → alignment 数据与目标重新平衡。

24. LLaMA Pro:用 Block Expansion 增加新容量

LLaMA Pro 的思路是把原 Transformer 层保留并冻结,在层间插入新块。残差块可写为:

[
h_{l+1}=h_l+F_l(h_l)
]

如果新增块初始化为:

[
F_{\text{new}}(h)\approx 0,
]

那么插入时近似恒等映射:

[
h_{l+1}\approx h_l
]

之后只训练新增块,使新领域知识主要进入新容量,继承参数尽量不动。

flowchart LR
    I[输入] --> O1[冻结旧 Block 1]
    O1 --> N1[新增可训练 Block A<br/>初始近似恒等]
    N1 --> O2[冻结旧 Block 2]
    O2 --> N2[新增可训练 Block B<br/>初始近似恒等]
    N2 --> O3[冻结旧 Block 3]
    O3 --> Y[输出]

官方开源实现:TencentARC LLaMA-Proscripts/block_expansion.py,Apache-2.0 License。

这种方法的优势是结构性保护继承参数;代价是:

  • 参数和推理 FLOPs 增长;
  • 新旧知识仍要经过整个网络共同组合;
  • 连续多轮扩展是否保持有界尚未解决;
  • “旧参数不动”不等于输出行为绝对不变,因为新增块会改变后续激活。

25. RAG、模型编辑、模型融合与 LLM-CL 的关系

25.1 RAG

RAG 更新:

[
E_t \leftarrow E_{t-1}\cup \Delta E_t
]

而主参数 (\theta) 可以不变。它特别适合:

  • 频繁变化的事实;
  • 需要来源和可删除性的知识;
  • 用户或组织私有数据;
  • 低延迟更新。

但它不会自动让模型学会新的推理程序、语言模式或工具策略。检索失败、索引过期和上下文容量仍是瓶颈。

25.2 模型编辑

编辑适合局部事实或行为修正,但大量顺序编辑可能产生:

  • 局部性下降;
  • 编辑间干扰;
  • 目标事实与关联事实不一致;
  • 参数补丁持续增长。

因此 lifelong model editing 是 CL 的邻近子问题,而不是已经替代 CL 的万能方案。

25.3 模型融合

任务向量可写为:

[
\tau_t=\theta_t-\theta_0
]

融合尝试:

[
\theta_{\text{merge}}=\theta_0+\sum_t\alpha_t\tau_t
]

它可以免原始数据合并多个专长模型,但参数方向冲突、尺度差异和路由问题仍然存在。它更像离线知识整合,与在线顺序学习互补。


第八部分:Agent 与实际系统中的记忆层级

26. “保存经历”与“改变能力”必须分开

一个 Agent 可以把每次轨迹存进数据库,但这只说明它有外部记忆:

[
\text{remembered episode}\not\Rightarrow\text{internalized skill}
]

更完整的记忆层级是:

层级 载体 时间尺度 优势 局限
Working memory 当前 context 秒—分钟 即时、无需训练 上下文有限,结束即消失
Episodic memory 对话/轨迹/样本 Buffer 天—长期 可追溯、可回放 检索成本和隐私风险
Semantic external memory RAG/知识图谱 长期 易更新、可删除、可引用 不改变参数能力
Procedural/module memory Prompt/LoRA/Adapter/技能模块 中长期 轻量适配、可路由 模块增长与冲突
Parametric memory 主模型权重 长期 低延迟泛化、隐式整合 更新昂贵、难删除、会干扰

27. 一个较现实的持续学习系统架构

flowchart TD
    A[持续到达的数据/轨迹] --> B[质量、隐私与安全过滤]
    B --> C[短期 episodic buffer]
    B --> D[可检索语义记忆 RAG]
    C --> E[样本选择与回放调度]
    D --> F[训练数据构造/自蒸馏]
    E --> G[冻结主干 + PEFT/可扩展模块]
    F --> G
    G --> H[旧能力/新能力/安全回归测试]
    H -->|通过| I[版本化部署]
    H -->|失败| J[回滚、调混合比、扩大回放]
    I --> K[线上反馈与漂移监测]
    K --> A
    C --> L[周期性 consolidation]
    D --> L
    L --> G

关键工程原则:

  1. 即时事实优先进入外部记忆,不必每次改参数;
  2. 重复、高价值、可泛化的经验才进入参数巩固
  3. 训练前做数据治理和去重
  4. 更新后必须通过旧能力、新能力、安全和延迟门控
  5. 每次更新都可回滚
  6. 模块、Buffer 和索引都有淘汰/压缩策略
  7. 长期资源必须可计量,而不是隐式无限增长

28. CL 对 AGI / RSI 的真实意义

持续学习是长期自主智能的必要组成,但不是充分条件。RSI 或开放式 Agent 还需要:

  • 自动发现能力缺口;
  • 选择有信息价值的经验;
  • 构造课程与实验;
  • 判断新更新是否真的改善;
  • 识别奖励欺骗、数据污染和安全回归;
  • 把具体经历抽象为可迁移技能;
  • 决定何时外部记忆、何时参数巩固、何时删除。

因此更完整的闭环是:

[
\text{experience}
\rightarrow\text{evaluation}
\rightarrow\text{selection}
\rightarrow\text{update}
\rightarrow\text{regression testing}
\rightarrow\text{deployment}
]

而不仅是“继续梯度下降”。


第九部分:开源代码与复现实验

29. 本文代码来源清单

机制 仓库 文件 实现身份 许可证 本文用途
Online EWC aimagelab/mammoth models/ewc_on.py CL 框架复现 MIT 解释 Fisher 加权二次惩罚
Reservoir Sampling aimagelab/mammoth utils/buffer.py 框架公共实现 MIT 解释固定容量流式采样
DER++ aimagelab/mammoth models/derpp.py 论文团队官方代码库 MIT 解释 logit + label 双回放
A-GEM aimagelab/mammoth models/agem.py CL 框架复现 MIT 解释冲突梯度投影
L2P / DualPrompt google-research/l2p models/prompt.py 论文作者官方 JAX 实现 Apache-2.0 解释 Prompt 检索和前置
LLaMA Pro TencentARC/LLaMA-Pro scripts/block_expansion.py 论文作者官方实现 Apache-2.0 说明 Transformer Block Expansion

重要区分

  • “开源”只表示代码公开并有相应许可证;
  • “论文作者官方实现”与“权威框架复现”不是同一概念;
  • EWC 和 A-GEM 在本文使用的是 Mammoth 复现,不冒充原作者源码;
  • 本文没有为“无官方代码”的方法自行补写实现。

30. 用 Mammoth 跑一个 DER++ 基线

下面命令逐字来自 Mammoth 官方 README:

python main.py --model derpp --dataset seq-cifar100 --alpha 0.5 --beta 0.5 --lr 0.001 --buffer_size 500

官方 README 同时提醒,这组超参数只是运行示例;更规范的比较应使用仓库提供的配置和复现记录:

python main.py --model derpp --dataset seq-cifar100 --model_config best

30.1 不要只“跑通”,要记录完整实验契约

建议每个实验保存:

  • git commit;
  • 数据集版本与切分;
  • 任务顺序;
  • 预训练 checkpoint;
  • Buffer 的样本数与实际字节;
  • 所有超参数;
  • 随机种子;
  • 每阶段性能矩阵 (R);
  • FLOPs、显存、训练时间;
  • 最终模型与优化器状态;
  • 是否使用 task ID;
  • 是否在测试集上选择超参数。

31. 工具选择

Mammoth

适合:快速比较大量经典和现代方法。其官方 README 在 2026 年列出 70+ 方法和 20 个数据集,并提供模型配置与复现记录。

Avalanche

适合:从 benchmark stream、训练策略、评测指标到日志的端到端实验;其模块化 API 很适合学习 CL 协议或构造自定义数据流。

PyCIL

适合:以 Class-Incremental Learning 为主的复现,尤其是传统 CIL 与预训练模型 CIL。仓库在 2026 年仍有新工具和方法更新记录。

PILOT

适合:预训练模型驱动的 CIL 方法,便于比较 Prompt、Adapter、prototype 等路线。

Google Research L2P

适合:理解 L2P/DualPrompt 的原始 JAX 设计。它是方法官方实现,不应把其中 TPU/JAX 环境假设直接等同于通用 PyTorch 工程模板。


第十部分:怎样设计一项可信研究

32. 第一步:写清“问题合同”

在写模型前先回答:

  1. 数据是 task-wise 还是无边界流?
  2. 测试时是否提供 task ID?
  3. 允许重访多少旧数据,按样本还是字节?
  4. 是否允许存特征、logit、生成器?
  5. 模型参数能否随任务增长?
  6. 新旧知识冲突时,哪个版本应被视为正确?
  7. 需要保留哪些通用能力和安全属性?
  8. 训练与推理预算是多少?

没有这些条件,“解决 catastrophic forgetting”是不可证伪的宽泛表述。

33. 第二步:建立最小但强的基线矩阵

类别 最小基线 要回答的问题
无保护 Naïve FT 原始遗忘有多严重?
上界 Joint 如果历史数据完全可用,最高能到哪里?
回放 ER-reservoir 复杂方法能否超过最简单回放?
回放+蒸馏 DER++ 历史函数信息是否有额外价值?
正则 EWC/LwF 不存旧样本时能保留多少?
Foundation baseline Frozen PTM + prototype 提升是否主要来自预训练?
PEFT Prompt/LoRA/Adapter 轻量参数是否足以适应?

34. 第三步:做能解释机制的消融

至少应测试:

  • 去掉 replay;
  • 去掉 distillation;
  • 固定与更新 backbone;
  • 不同 Buffer 字节预算;
  • 随机采样 vs 类别平衡/困难样本;
  • task ID 有/无;
  • 正常路由 vs oracle 路由;
  • 只评 classifier vs 重训练一个 probe;
  • 不同任务顺序;
  • 预训练数据重叠排查。

一个方法若只在单一顺序、单一 seed、单一 buffer size 上胜出,不能说明其总体机制可靠。

35. 第四步:把结果分解为四种失败

当旧任务分数下降时,依次问:

  1. 没学会新任务? 看当前任务学习曲线;
  2. 学会后参数遗忘? 看旧表征 probe 和旧样本损失;
  3. 分类器/校准偏置? 看 feature separability、balanced head、NCM;
  4. 路由/对齐失败? 用 oracle module、prompt rescue、head reset 测试。

这比只报告“遗忘率下降 2%”更能产生可迁移知识。


第十一部分:目前哪些问题已经较成熟,哪些仍未解决

36. 相对成熟的部分

在以下条件下,CL 已经有可用的工程解:

  • 任务序列较短;
  • 任务边界或类别增量协议明确;
  • 允许固定小 Buffer;
  • 评测是监督分类;
  • backbone 和数据规模适中;
  • 可以接受少量模块增长。

此时 ER、DER++、prototype、PEFT 和简单校准往往能构成强系统。

37. 仍然开放的核心问题

37.1 长时间尺度与有界资源

很多方法的隐藏状态随任务增长:

[
|M_T|,|A_T|,|\text{statistics}_T|=O(T)
]

真正终身学习需要长期压缩、合并、淘汰和重构,而不是无限增加 Prompt、LoRA 或样本。

37.2 未知任务边界

现实分布可能缓慢漂移,也可能突然改变。系统必须决定:

  • 何时创建新模块;
  • 何时复用旧模块;
  • 何时只是噪声;
  • 何时旧概念已失效。

37.3 知识冲突与有益遗忘

“旧知识”不总是正确:法律、价格、医学指南、用户偏好和安全政策会更新。系统需要时间和来源建模,而不是无条件把新旧信息平均。

37.4 知识存储与访问的可诊断性

需要更好地区分:

  • 参数中是否还存在知识;
  • 哪个层级保存了知识;
  • 路由能否访问;
  • 生成策略为何不输出;
  • 恢复需要多少数据和计算。

37.5 Foundation Model 基准污染

预训练模型可能见过 ImageNet 派生数据、任务文本或公开评测。复杂 CL 方法的提升必须与数据重叠和 backbone 能力解耦。

37.6 LLM/Agent 的安全持续学习

在线吸收经验会扩大:

  • 数据投毒;
  • prompt injection 被巩固;
  • 隐私记忆;
  • reward hacking;
  • 安全边界回退;
  • 用户个性化与全局模型污染。

因此实际系统不能让线上反馈直接无门控地更新主模型。


第十二部分:方法选择的工程决策表

现实需求 优先路线 原因 需要警惕
只需更新频繁变化事实 RAG / 外部知识库 快、可引用、可删除 检索失败,不会自动内化技能
允许保存少量旧样本 ER / DER++ 强、简单、通用 隐私与额外训练成本
禁止保存原始数据 蒸馏、EWC/SI/MAS、feature/logit replay 不依赖原始旧样本 新数据支持集不足、近似误差
强预训练视觉分类 Frozen PTM + prototype,之后再考虑 PEFT 简单基线可能已很强 分布外细粒度任务
多个可识别任务 Adapter/LoRA/Prompt Pool 模块化隔离 task 路由、参数增长
新领域 LLM 语料 CPT + 数据混合 + LR 重预热 + 回归评测 直接更新语言模型分布 通用能力与对齐回退
新指令/技能 CIT + PEFT + 少量 replay/distill 成本较低、便于版本化 格式偏移、LoRA 冲突
长期 Agent 外部 episodic/semantic memory + 周期巩固 兼顾快速记忆和慢速内化 检索污染、无界增长、安全

结论:当前 CL 的最准确技术图景

持续学习的核心不应被概括为一句“让模型不断学习且不遗忘”。更准确的图景是:

[
\boxed{
\text{在非平稳数据流上,管理参数、模块、样本与外部记忆的长期状态更新}
}
]

经典正则化、回放和参数隔离分别回答:

  • 哪些方向不能随便改;
  • 哪些旧训练信号必须重现;
  • 哪些知识应放入独立容量。

预训练模型时代又增加了两个问题:

  • 何时根本不应修改强 backbone;
  • 如何在 Prompt/LoRA/Adapter/原型之间组织和路由知识。

LLM 与 Agent 时代进一步要求系统区分:

[
\text{参数知识}
+\text{外部语义记忆}
+\text{情景经历}
+\text{程序性技能}
+\text{生成与安全策略}
]

因此,目前最有前景的方向不是寻找一个单一“永不遗忘损失函数”,而是设计一个有界、可诊断、可回滚、分层记忆、能够周期巩固的学习系统

真正的终身学习是否实现,应由以下问题决定:

  1. 它能否持续学到新能力,而不只是存储新文本?
  2. 它能否知道哪些旧知识应保留、修改或删除?
  3. 它能否在没有 task ID 的情况下访问正确知识?
  4. 它的内存、参数和计算是否长期有界?
  5. 它能否证明更新没有破坏通用能力和安全性?
  6. 它能否从具体经历形成可迁移的抽象,而不是无限堆积样本?

在这些问题被同时解决之前,CL 仍然是从静态模型走向真正长期智能的核心开放领域。


主要参考资料与开源资源

总体与评测

经典方法

预训练模型

LLM 持续学习

开源仓库


图片与代码归属说明

  • assets/l2p_illustration.pngassets/dualprompt_illustration.png 来自 Google Research L2P 官方开源仓库,随仓库 Apache-2.0 License 发布。
  • 代码摘录版权归相应仓库贡献者所有;本文仅摘录理解算法所需的最短连续源码,并保留来源与许可证信息。
  • Mermaid 流程图为本文用于解释的原创结构图,不是任何论文原图。

Keep reading

View all