主题
持续学习与自我迭代:模型怎么把“经验”留下来
一句话:持续学习不是把上下文开大,也不是再微调一次;它要在不遗忘旧能力的前提下,把新任务、新环境、新反馈写进参数或可复用的外部结构。自我迭代是它之后的下一级台阶:模型不仅能学,还能用学到的能力改进下一代模型。
为什么需要
预训练是一次性的:训练结束后,权重冻结,模型不会因为上线后遇到的新问题自动变好。RAG 和记忆能补上下文,但它们是推理时的外部结构,不改变模型的能力边界;微调能改权重,但只训新任务会把旧能力冲掉。
这就是持续学习要解决的三件事:学新的、不忘旧的、可验证地变好。它和“上下文工程”“记忆系统”不是同一层:前两者决定模型此刻看到什么,持续学习决定模型以后成为什么。
核心机制
一、四种“记住”的方式
| 方式 | 存在哪 | 改不改权重 | 主要问题 |
|---|---|---|---|
| 上下文 | 当前窗口 | 不改 | 会话结束就没了,长度有限 |
| RAG / 外部记忆 | 向量库、文件、数据库 | 不改 | 检索不到就不会用;不形成能力 |
| 微调 / LoRA | 参数或适配器 | 改 | 会遗忘;数据和评测成本高 |
| 持续学习 | 参数 + 可复用结构 | 改,且按序列管理 | 稳定性与可塑性难平衡 |
“记住”不等于“学会”。把一条事实放进 RAG,模型能在下一次检索时用上;但它没有把“如何处理这类问题”内化。持续学习关心的是后者:新任务学完后,旧任务还在,而且能迁移到没见过的任务。
二、三个难点
- 灾难性遗忘:在新任务上做梯度下降,会改动对旧任务重要的权重;旧任务准确率可能断崖式下降。
- 稳定性与可塑性:太稳定就学不会新东西,太可塑就忘掉旧东西;这是持续学习的核心取舍。
- 评测困难:不是看最后一个任务,而是看整条任务序列上的遗忘率、前向迁移和反向迁移。
这条闭环的关键是“旧任务回归”和“回滚”必须和更新在同一个发布单元里。只评估新任务,等于用灾难性遗忘换分数;没有回滚,一次坏更新会把线上能力永久改坏。
三、三类方法
重放(rehearsal):把旧数据或旧数据的代表样本和新数据混在一起训练。它最稳,但要解决存储、隐私、采样和配比;对 LLM 来说,全量重放很贵,通常用数据选择或生成式重放。
正则(regularization):惩罚对旧任务重要的参数改动,典型是 EWC:用 Fisher 信息估计每个参数的重要性,重要参数少动。它不需要存旧数据,但在大模型上计算和近似都有代价,效果不如重放稳定。
结构(architecture):给新任务加适配器、专家或模块,按路由调用。LoRA、MoE、模型扩展都属于这一类;它减少了参数冲突,但会带来路由、合并和容量管理问题。
LLM 的持续学习通常分三段:持续预训练(新领域/新语言)、持续指令微调(新任务格式)、持续对齐(偏好/安全)。三段的数据和评测不能混在一起;领域知识、指令遵循和安全边界是三种不同的能力。
四、从持续学习到自我迭代
自我迭代可以理解为一个循环:模型生成候选(解法、代码、数据)→ 验证器筛选 → 用筛出的结果训练下一版 → 在留出集上评测。它比持续学习多了一步“自己产生学习材料”,但也更依赖验证器:没有可靠验证,模型会把错误放大。
这和蒸馏不同:蒸馏是把教师已有的行为迁移给学生;自我迭代是让模型产生新行为、再用验证筛选。前者压缩能力,后者探索能力。两者可以叠加,但不能互相替代。
最小上手
用两个任务做一个线性回归,观察“先学 A 再学 B”如何把 A 忘掉;再把 A 的一部分和新任务混在一起训练,看取舍。
python
import numpy as np
rng = np.random.default_rng(0)
def data(n, slope, intercept):
x = rng.uniform(-1, 1, n)
return x, slope * x + intercept
def train(w, b, x, y, lr=0.1, steps=200):
for _ in range(steps):
pred = w * x + b
w -= lr * np.mean((pred - y) * x)
b -= lr * np.mean(pred - y)
return w, b
def mse(w, b, x, y):
return np.mean((w * x + b - y) ** 2)
xa, ya = data(200, 2.0, 1.0)
xb, yb = data(200, -1.0, -1.0)
w, b = train(0.0, 0.0, xa, ya)
print("after A", round(w, 2), round(b, 2), "A_mse", round(mse(w, b, xa, ya), 3))
w, b = train(w, b, xb, yb)
print("after B", round(w, 2), round(b, 2), "A_mse", round(mse(w, b, xa, ya), 3), "B_mse", round(mse(w, b, xb, yb), 3))
xr = np.concatenate([xa[:100], xb])
yr = np.concatenate([ya[:100], yb])
w, b = train(0.0, 0.0, xr, yr)
print("replay", round(w, 2), round(b, 2), "A_mse", round(mse(w, b, xa, ya), 3), "B_mse", round(mse(w, b, xb, yb), 3))输出:
text
after A 2.0 1.0 A_mse 0.0
after B -1.0 -1.0 A_mse 8.269 B_mse 0.0
replay 0.15 -0.31 A_mse 3.362 B_mse 0.988先学 A 再学 B,B 的误差是 0,但 A 的误差从 0 涨到 8.269,这就是灾难性遗忘。把 A 的一半样本和新任务混在一起,A 的误差降到 3.362,B 的误差升到 0.988;重放不是让两个任务都完美,而是用一点新任务性能换旧任务不崩。真实系统里,这个配比就是稳定性与可塑性的旋钮。
生产动作
- 先定义任务序列:新知识、新格式、新工具、新安全边界是不同任务;不要把“更新事实”和“改变行为”混成一次训练。
- 保留重放集:按任务、领域、难度分层采样,控制旧数据比例;重放集要版本化,不能每次从线上随机抓。
- 优先低成本适配:能靠 RAG、记忆、Prompt 解决的,不要动权重;必须动权重时,先 LoRA/适配器,再考虑全参。
- 评测三件事:新任务提升、旧任务遗忘、跨任务迁移;再加安全回归和校准回归。
- 灰度与回滚:模型、适配器、数据快照、评测集一起版本化;出现遗忘或安全漂移,整单元回滚。
- 监控数据漂移:输入分布、工具调用成功率、用户纠正率、拒答率都要看;只监控 loss 不够。
- 隐私与授权:重放集可能含用户数据;训练前做脱敏、去重和授权检查,避免把隐私写进权重。
边界
- 持续学习不是免费的。它要额外训练、存储、评测和回滚成本;任务序列越复杂,工程成本越高。
- 重放不是万能。旧数据太多会压制新任务,太少会遗忘;配比要用评测找,不能拍脑袋。
- 记忆不等于学习。RAG 和上下文能解决“这次不知道”,解决不了“下次还不会”。
- 自我迭代依赖验证器。没有可靠验证,模型会奖励自己的错误;有验证器,也可能被 reward hacking。
- 递归自我训练会退化。只用模型自己生成的数据训练,分布会变窄,错误会放大;真实数据和人类反馈要留在闭环里。
- “学习去学习”还没有解决。持续学习是“在任务序列上学习”,元学习是“学会学习的方法”,自我迭代是“用能力改进能力”;三者相关,但不是同一个东西。
- 安全边界会漂移。持续更新可能改变拒答、工具权限和价值判断;每次更新都要跑安全回归,不能只看能力分数。
讲清楚
持续学习是在不遗忘旧能力的前提下,把新任务、新环境、新反馈写进参数或可复用结构。它和上下文、RAG、记忆不是一层:前两者决定模型现在看到什么,持续学习决定模型以后成为什么。
三类方法是重放、正则和结构:重放最稳但贵,正则省数据但难扩展,结构灵活但要做路由和合并。真实系统通常组合使用,并且把旧任务回归、灰度、回滚和隐私检查放进同一个发布单元。
自我迭代是持续学习的下一级台阶:模型自己产生候选,验证器筛选,再训练下一版。它能加速研究,但依赖验证器、会被 reward hacking、会导致分布退化;没有“自动变强”的魔法,只有“产生—验证—筛选—回归”的工程闭环。
参考:Towards Lifelong Learning of Large Language Models: A Survey(ACM CSUR 2025);Continual Learning in Large Language Models;Lifelong Learning of LLM Agents(IEEE TPAMI 2026);EWC(PNAS 2017)
适用:需要让模型从线上反馈持续变好的系统;更新频率、数据授权与回滚能力决定方案 | 初稿 2026-10