跳到正文

持续学习与自我迭代:模型怎么把“经验”留下来 ​

一句话:持续学习不是把上下文开大,也不是再微调一次;它要在不遗忘旧能力的前提下,把新任务、新环境、新反馈写进参数或可复用的外部结构。自我迭代是它之后的下一级台阶:模型不仅能学,还能用学到的能力改进下一代模型。

为什么需要 ​

预训练是一次性的:训练结束后,权重冻结,模型不会因为上线后遇到的新问题自动变好。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

把 AI 工程讲到既懂也会用