城南有家三十年的老面馆,老板艾师傅的红烧牛肉面是整条街的招牌。最近他时髦了一把,去学日式拉面。学成归来,徒弟一尝牛肉面差点哭出来——汤头咸了、面身软了、连那勺独家辣油都变了味。艾师傅挠头:我明明只是去学新菜,怎么连做了三十年的老味道都丢了?这件事,在 AI 圈有个响当当的名字——灾难性遗忘。大模型就像这位学新菜的老厨师:让它学会一个新任务,它往往顾此失彼,把之前辛苦训练的能力忘得一干二净。好在工程师们琢磨出了三套“护味心法”:给重要配方贴上“不许动”标签(EWC 弹性权重整合)、时不时回锅老菜(经验回放)、给调料变动设上限(正则化约束)。这套心法,就是今天要讲的持续学习。

岗位关联

对 AI 工程团队来说,掌握持续学习意味着模型上线后能边用边学、越用越准,而不是每学一个新技能就推倒重来——这是大模型从“会训练”走向“会成长”的必修课。

目录
  1. 可视化演示
  2. 1. 遗忘原理剖析
  3. 2. 弹性权重整合
  4. 3. 回放重演策略
  5. 4. 正则化约束
  6. 5. 工程落地要点
  7. 6. 前沿演进方向
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示持续学习的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

持续学习:持续学习 持续学习概念与核心挑战 灾难性遗忘的成因与影响 核心机制可视化 持续学习整体架构与关键组件

1. 遗忘原理剖析

艾师傅学日式拉面为什么会把老配方冲掉?本质在于,他只有一块黑板记配方——所有菜品的盐、糖、火候都写在同一块黑板上。学新菜必须改黑板,一改就把老菜的数字覆盖了。神经网络也是同一块黑板:模型的所有知识都藏在同一组权重里,没有“分抽屉”的自觉。当它学新任务时,新知识硬生生写进旧权重,旧知识自然被冲得七零八落。

深度学习更新参数靠的是梯度下降。训练任务 B 时,梯度会顺着让 B 正确率升高的方向推权重。可这个方向往往和任务 A 需要保持的方向不一致:改动一批对 A 至关重要的参数,A 的损失就会嗖嗖往上涨。这就是灾难性遗忘的直接成因——不是模型“不想记”,而是新旧任务在参数空间里的“势力范围”发生了正面冲突。

数学上可以这样刻画:用 \\(\mathcal{L}_A\\) 表示旧任务 A 的损失。训练 B 之前,模型在旧参数下损失很低;训练 B 之后参数变了,如果旧任务的损失暴涨,就说明旧知识正在瓦解:

艾师傅的问题不是“不能学新菜”,而是“改配方时不知道哪些数字不能动”。要解决它,得先学会分辨参数的重要性——这正好引出我们的第一味解药:EWC 弹性权重整合。

LA(θnew)≫LA(θold)\mathcal{L}_A(\theta_{\text{new}}) \gg \mathcal{L}_A(\theta_{\text{old}})
这个不等式用一句话说:同样的老题目,换了新参数后突然做不对了,这就是灾难性遗忘。
  1. 旧任务损失函数 \\(\mathcal{L}_A\\)衡量模型在任务 A 上的表现,数值越小说明记得越牢,相当于老菜谱的“味道评分表”。
    LA\mathcal{L}_A
  2. 旧参数 \\(\theta_{\text{old}}\\)模型刚学完任务 A 时的那组权重,是“老菜谱”的完整记录。
    θold\theta_{\text{old}}
  3. 新参数 \\(\theta_{\text{new}}\\)继续训练任务 B 之后被梯度更新得到的权重,相当于改写过的新配方。
    θnew\theta_{\text{new}}
  4. 远大于符号 \\(\gg\\)表示旧任务损失暴增,说明旧知识严重退化,是灾难性遗忘的数学信号。
    ≫\gg

2. 弹性权重整合

面馆老板请来一位调味顾问。她的方案又简单又聪明:给每味调料贴一张“秘方标签”,写清楚这味料对每道招牌菜有多关键。学新菜时,标签上“关键度”高的调料(比如牛肉面的盐)不许大动;无关紧要的(比如摆盘的葱花)随意调整。这就是 EWC(Elastic Weight Consolidation,弹性权重整合)的直觉——给每个参数打一个“重要度分”,学新任务时,重要参数动得越多,惩罚越重。

重要度分从哪来?答案藏在任务 A 的输出对参数的敏感度里:把一个参数轻轻拨动一点,任务 A 的损失变化越大,说明这个参数对 A 越关键。这个敏感度信息在数学上就是 Fisher 信息矩阵,它的每个对角线元素 \\(F_i\\) 就是第 \\(i\\) 个参数的重要度估计。Fisher 信息大的参数,相当于咸味在牛肉面里的地位——动一克都惊天动地。

EWC 把训练目标改写成“新任务损失 + 防遗忘惩罚”两项:

艾师傅的“秘方标签”贴到位后,盐和糖被稳稳锁住,汤头不跑味,日式拉面也学得成。这就是“弹性”二字的精髓:不是锁死,而是重要参数弹性受限、次要参数自由发挥。

L(θ)=LB(θ)+λ2∑iFi(θi−θA,i∗)2\mathcal{L}(\theta) = \mathcal{L}_B(\theta) + \frac{\lambda}{2}\sum_{i} F_i\left(\theta_i - \theta^*_{A,i}\right)^2
直观理解:模型学任务 B 时,老菜谱里那些“关键调料”(Fisher 信息大的参数)被一根看不见的弹簧拴住,拉得越远,回弹的惩罚越重。
  1. 新任务损失 \\(\mathcal{L}_B(\theta)\\)保证模型能学好新任务 B,相当于“学新菜的考核分数”。
    LB(θ)\mathcal{L}_B(\theta)
  2. 平衡系数 \\(\lambda\\)控制保护强度,\\(\lambda\\) 越大,参数越不敢离开旧位置,新任务越难学。
    λ\lambda
  3. Fisher 信息 \\(F_i\\)第 \\(i\\) 个参数对旧任务 A 的重要度估计,相当于“秘方标签”上的关键度数字。
    FiF_i
  4. 参数偏离量 \\(\theta_i - \theta^*_{A,i}\\)当前参数与任务 A 学完时参数之差,差值越大,说明旧知识被改得越厉害。
    θi−θA,i∗\theta_i - \theta^*_{A,i}
  5. 二次惩罚项 \\(\frac{1}{2}(\cdot)^2\\)偏离越远罚得越狠,让参数只能在旧值附近小范围移动,而不是被凭空限制在某个区间。
    12(θi−θA,i∗)2\frac{1}{2}(\theta_i - \theta^*_{A,i})^2

3. 回放重演策略

艾师傅学了日式拉面后,给自己定了个规矩:每周固定三天做老招牌牛肉面。这叫“回锅老菜”——哪怕没人教,亲手做一遍就是最好的巩固。机器学习把这招叫经验回放(Experience Replay):训练新任务时,把旧任务的样本混进训练数据,让模型“温故而知新”。

回放怎么落地?最朴素的是样本缓冲存储:划一块固定大小的缓冲区(比如几千条旧样本),训练任务 B 时,每次迭代从缓冲区和 B 的数据里各抽一批混合训练。代价是需要额外存储,而且旧样本往往涉及用户隐私,不能随便存。于是有了更高级的生成式回放——训练一个生成模型(如 VAE、扩散模型)来“凭记忆重塑”旧样本的分布,需要时现场生成,避免直接存原始数据。

无论哪种回放,训练时新旧数据混合,损失都由两项加权组成:

面馆的“回锅日”看着笨,却是最稳的保味手段。回放也一样:不依赖花哨数学,只要旧样本以合适比例反复出现,模型就不容易把它清空。它和 EWC 是黄金搭档——一边用弹簧锁住重要参数,一边用老题复习保持手感。

L(θ)=LB(θ)+β E(x,y)∼Dreplay[LCE(fθ(x), y)]\mathcal{L}(\theta) = \mathcal{L}_B(\theta) + \beta\,\mathbb{E}_{(x,y)\sim\mathcal{D}_{\text{replay}}}\big[\mathcal{L}_{\text{CE}}\left(f_\theta(x),\,y\right)\big]
翻译成人话:每次学习新任务时,都从“旧记忆库”里抽一批老题让模型再做一遍,做错的照样罚,这样老知识就不会被新知识冲掉。
  1. 新任务损失 \\(\mathcal{L}_B(\theta)\\)学新任务 B 的主目标,保证新知识学得进。
    LB(θ)\mathcal{L}_B(\theta)
  2. 回放样本分布 \\(\mathbb{E}_{(x,y)\sim\mathcal{D}_{\text{replay}}}\\)从回放缓冲(旧样本池)中抽样取的“老题”,代表旧任务的知识分布。
    E(x,y)∼Dreplay\mathbb{E}_{(x,y)\sim\mathcal{D}_{\text{replay}}}
  3. 回放强度 \\(\beta\\)控制老题在训练中的占比,\\(\beta\\) 越大越重视旧知识,但太大也会拖慢新任务学习。
    β\beta
  4. 交叉熵损失 \\(\mathcal{L}_{\text{CE}}\\)衡量模型在老题上的预测与真实答案的差距,回放老题就是要让这个差距不增大。
    LCE(fθ(x), y)\mathcal{L}_{\text{CE}}\left(f_\theta(x),\,y\right)

4. 正则化约束

艾师傅的调味顾问又给了一条更简单的规矩:每次学新菜,任何调料的用量变化幅度不能超过 2 克。这比 EWC 的“分级锁”更省事——不管哪个调料、重不重要,整体变动都设个上限。对应到模型训练,就是正则化约束方法。

正则化方法的思路是:不单独判断哪个参数重要,而是从整体上约束参数别跑太远。最朴素的形式是 L2 参数范数约束:训练新任务时,把“参数相对旧位置的漂移量”作为惩罚项加进损失。进阶玩法是知识蒸馏:让新模型在旧任务上的输出尽量模仿旧模型(教师模型)的输出,用“软化的概率分布”把旧知识温柔地传递下来——就像老厨师手把手教徒弟“盐要分三次放”,而不是只丢一句“放 3 克”。

L2 参数约束的损失形式如下:

规矩虽粗,胜在省事。如果不知道每道菜的“秘方标签”(没算 Fisher 信息),那就先定个总则:调料变化别超过 2 克。老味道至少不会崩太多——工程上这叫“快速止血方案”,比什么都不做强得多。

L(θ)=LB(θ)+λ∥θ−θA∗∥22\mathcal{L}(\theta) = \mathcal{L}_B(\theta) + \lambda\left\lVert \theta - \theta_A^* \right\rVert_2^2
一句话:学新任务可以,但整体参数不许偏离旧位置太远,超出的距离按平方计费。
  1. 新任务损失 \\(\mathcal{L}_B(\theta)\\)保证新任务能学会,是所有持续学习目标的共同地基。
    LB(θ)\mathcal{L}_B(\theta)
  2. 参数漂移向量 \\(\theta - \theta_A^*\\)当前权重与任务 A 权重快照的差,反映“配方被改了多少”。
    θ−θA∗\theta - \theta_A^*
  3. L2 范数的平方 \\(\lVert \cdot \rVert_2^2\\)把漂移量平方求和,让大幅漂移付出远超小幅漂移的代价。
    ∥θ−θA∗∥22\left\lVert \theta - \theta_A^* \right\rVert_2^2
  4. 正则化强度 \\(\lambda\\)控制“限量”的松紧,\\(\lambda\\) 越大,参数越被钉在旧位置附近。
    λ\lambda

5. 工程落地要点

艾师傅的后厨管理升级了:每个菜系分灶台——川菜灶台专门做川菜,粤菜灶台专门做粤菜,学新菜时先看清楚这道菜归哪个灶台。模型领域这叫任务边界识别:训练和推理时都要知道“当前是哪一个任务”,才能选择对应的保护策略或输出头。没有任务 ID 的持续学习,就像不看菜就乱开火,新旧知识在同一个灶台里打架。

工程上持续学习要迈过三道坎。第一,任务边界怎么确定:数据是自然分批次到达的(在线学习)还是明确划分的(任务增量学习),决定了用 EWC 还是回放。第二,框架和超参怎么选:EWC 的 \\(\lambda\\)、回放的缓冲大小、正则化强度,都要在验证集上调,不能拍脑袋。第三,怎么量化“有没有遗忘”:常用的评估指标叫 BWT(Backward Transfer,后向迁移),它专门衡量学完新任务后,旧任务的表现相比它刚学完时掉了多少。

BWT 的计算公式如下:

灶台分清楚、火候有监控,艾师傅的后厨才敢同时经营川粤日三种口味。工程落地也一样:任务边界、超参调优、BWT 监控三件套齐了,持续学习才有资格从论文走进生产线。

BWT=1T−1∑i=1T−1(RT,i−Ri,i)\text{BWT} = \frac{1}{T-1}\sum_{i=1}^{T-1}\left(R_{T,i} - R_{i,i}\right)
把每个旧任务“最终准确率”减去它“刚学完时的准确率”,再取平均。负数越明显,遗忘越严重;接近 0 说明知识保持得漂亮。
  1. 任务总数 \\(T\\)模型依次学习的全部任务个数,比如先学 A 再学 B 再学 C,\\(T=3\\)。
    TT
  2. 最终准确率 \\(R_{T,i}\\)学完全部任务后,第 \\(i\\) 个旧任务重新测试的准确率,代表“老菜现在的味道”。
    RT,iR_{T,i}
  3. 初始准确率 \\(R_{i,i}\\)第 \\(i\\) 个任务刚学完立刻测试的准确率,代表“老菜刚出锅的味道”。
    Ri,iR_{i,i}
  4. 对所有旧任务取平均 \\(\frac{1}{T-1}\sum\\)综合衡量所有旧任务的平均遗忘程度,避免只盯一个任务。
    1T−1∑i=1T−1\frac{1}{T-1}\sum_{i=1}^{T-1}

6. 前沿演进方向

后来艾师傅的店开进了米其林大饭店,后厨更气派了,可困扰没消失——大模型学新东西照样会忘。好消息是,大模型时代有了更省力的“加菜”方式:不动整本菜谱,只在关键工序上贴一张小纸条。这就是参数高效微调,LoRA(Low-Rank Adaptation,低秩适配)是其中的代表——把原本巨大的权重矩阵 \\(W\\) 冻住,只训练一个低秩增量 \\(\Delta W = BA\\),每个新任务只是多了一张小小的“味型卡”。

LoRA 与持续学习天然契合:每个任务训练一份轻量增量,老任务的增量不删,新任务的增量互不干扰;配合回放或蒸馏,还可以进一步防止增量之间的相互污染。大模型的持续学习正在从“改全部参数”走向“只改一小撮参数 + 记忆库管理”。

LoRA 的前向计算表达式如下:

米其林后厨的“纸条哲学”是:老菜谱不动,新菜法以小博大。持续学习的终极愿景,是让大模型像艾师傅一样——开三十年馆子,学一百道新菜,招牌味道一滴都不丢。这正是终身学习(Lifelong Learning)的方向:模型不是学一次就毕业,而是用一辈子、长一辈子。

h=Wx+ΔWx=Wx+BAxh = Wx + \Delta W x = Wx + BAx
意思是:原始输出 \\(Wx\\) 完全不动,新增一个低秩增量 \\(BAx\\) 来适配新任务。增量很小,但对新任务很关键——就像往老汤里滴两滴新味型的精华。
  1. 原始输出 \\(Wx\\)冻结的大模型权重 \\(W\\) 对输入 \\(x\\) 的映射,承载着海量通用知识,训练中一动不动。
    WxWx
  2. 低秩增量 \\(\Delta W x = BAx\\)新任务专属的小增量,其中 \\(B\\in\\mathbb{R}^{d\\times r}\\)、\\(A\\in\\mathbb{R}^{r\\times d}\\),秩 \\(r\\) 远小于维度 \\(d\\)。
    ΔWx=BAx\Delta W x = BAx
  3. 秩 \\(r\\)控制增量参数的规模,\\(r\\) 越小参数越省,但表达新任务的能力也越受限。
    r≪dr \ll d

AI 应用场景

推荐系统持续更新

阶段:在线学习 / 增量部署

解决的问题:传统推荐模型每周全量重训一次,耗时耗钱;只拿新数据增量训练,大促期间的强信号又会覆盖用户平日的品类偏好,导致“学了双十一,忘了日常”。

具体案例:某电商平台在大促结束后,日常场景推荐点击率下降 18%。引入 EWC 锁定用户长期兴趣参数,同时用回放缓冲保留最近 30 天的历史交互样本,新行为数据实时更新后,日常推荐指标回升了 12%,大促知识也没有丢失。

智能客服知识迭代

阶段:模型知识更新(大模型微调阶段)

解决的问题:客服大模型升级时,新旧知识在参数空间打架——学了新产品 FAQ,老产品话术被新参数覆盖,用户问老问题就开始“胡说八道”。

具体案例:某银行客服模型引入新理财产品知识时,采用“回放旧对话语料 + 知识蒸馏”组合策略:旧语料以 3:7 比例混入新数据,同时让新模型在旧问题上的输出逼近旧模型。上线后新产品问答准确率达 90%,旧产品问答准确率从 74% 提升到 91%。

自动驾驶终身学习

阶段:持续数据流训练

解决的问题:自动驾驶车队跨城市部署,新城市的路况数据持续涌入。模型学会新城市的交通标志后,容易忘掉老城市的特殊规则(如潮汐车道、特定路口禁行)。

具体案例:某自动驾驶团队在增量训练中引入分任务 EWC + 生成式回放:旧城市数据不直接存储(保护隐私),而是用生成模型重建关键场景样本参与训练。验证结果显示,新城市驾驶性能提升的同时,老城市交通标志识别准确率保持在 98% 以上。

Python 演示

python78 行
import torchimport torch.nn as nnimport torch.nn.functional as F  class SimpleNet(nn.Module):    def __init__(self, in_dim=64, hid_dim=32, out_dim=4):        super().__init__()        self.fc1 = nn.Linear(in_dim, hid_dim)        self.fc2 = nn.Linear(hid_dim, out_dim)     def forward(self, x):        return self.fc2(F.relu(self.fc1(x)))  def make_task(seed, shift):    torch.manual_seed(seed)    x = torch.randn(200, 64)    w = torch.randn(64, 4)    y = (x @ w + shift).argmax(dim=1)    return x, y  def train_model(model, x, y, saved=None, fisher=None, lam=0.0, steps=150):    opt = torch.optim.SGD(model.parameters(), lr=0.05)    for _ in range(steps):        opt.zero_grad()        loss = F.cross_entropy(model(x), y)        if saved is not None and fisher is not None:            reg = 0.0            for name, p in model.named_parameters():                if name in fisher:                    reg = reg + (fisher[name] * (p - saved[name]) ** 2).sum()            loss = loss + lam / 2 * reg        loss.backward()        opt.step()  def compute_fisher(model, x, y, iters=20):    fisher = {}    opt = torch.optim.SGD(model.parameters(), lr=0.01)    for _ in range(iters):        opt.zero_grad()        loss = F.cross_entropy(model(x), y)        loss.backward()        for name, p in model.named_parameters():            if p.grad is not None:                fisher[name] = fisher.get(name, 0.0) + p.grad.detach() ** 2    for name in fisher:        fisher[name] = fisher[name] / iters    return fisher  def evaluate(model, x, y):    pred = model(x).argmax(dim=1)    return (pred == y).float().mean().item()  if __name__ == "__main__":    x_a, y_a = make_task(0, 0.0)    x_b, y_b = make_task(1, 3.0)     model_naive = SimpleNet()    train_model(model_naive, x_a, y_a)    acc_before = evaluate(model_naive, x_a, y_a)    train_model(model_naive, x_b, y_b)    acc_naive = evaluate(model_naive, x_a, y_a)     model_ewc = SimpleNet()    train_model(model_ewc, x_a, y_a)    fisher = compute_fisher(model_ewc, x_a, y_a)    saved = {n: p.detach().clone() for n, p in model_ewc.named_parameters()}    train_model(model_ewc, x_b, y_b, saved=saved, fisher=fisher, lam=200.0)    acc_ewc = evaluate(model_ewc, x_a, y_a)     print("=========== 持续学习: 任务A遗忘对比 ===========")    print("朴素微调后 任务A准确率: {:.2%} -> {:.2%}".format(acc_before, acc_naive))    print("EWC训练后 任务A准确率: {:.2%} -> {:.2%}".format(acc_before, acc_ewc))
目的:用合成数据构建两个关联任务,先让模型学会任务 A,再学任务 B;通过对比朴素微调与 EWC 训练后的任务 A 准确率,直观看到“灾难性遗忘”和“持续学习保护”的差距。
  1. loss = F.cross_entropy(model(x), y)标准分类损失,驱动模型学新任务
  2. reg = reg + (fisher[name] * (p - saved[name]) ** 2).sum()EWC 惩罚项:重要参数偏离旧值越大,罚得越狠
  3. fisher[name] = fisher.get(name, 0.0) + p.grad.detach() ** 2用梯度平方估计 Fisher 信息,衡量参数对旧任务的重要度
  4. saved = {n: p.detach().clone() for n, p in model_ewc.named_parameters()}保存任务 A 学习完毕的权重快照,作为旧知识基准
  5. train_model(model_ewc, x_b, y_b, saved=saved, fisher=fisher, lam=200.0)用 EWC 训练任务 B,λ 控制保护强度
  6. acc_naive = evaluate(model_naive, x_a, y_a)评估朴素微调后的旧任务准确率,直接看到遗忘的代价

常见误区

误区EWC 里的 λ 是保护强度的意思,那当然设得越大越好,反正旧知识重要,保护越强越不会忘。我直接把 λ 调到 10000 试试。

正解λ 越大,参数被锁得越死,新任务 B 就越学不进去。持续学习的本质是“新老兼顾”,不是“保老弃新”。λ=0 等于纯微调,疯狂遗忘;λ=∞ 等于只做旧任务,新任务白学。合适的 λ 应该让“新任务能学会”且“旧任务掉得少”达到平衡,要在验证集上朝 BWT 最接近 0 的方向调。就像艾师傅学新菜:盐罐子焊死确实不会跑味,但日式拉面也彻底学不成了。

为何常见:新手看到 EWC 惩罚项,本能觉得“保护=越大越好”,忽略了总损失里还有新任务损失这一半;而且 λ 的量级依赖损失尺度,直觉上很难判断。

误区回放策略不就是把旧数据全存下来,训练时混进去吗?那我硬盘大,全存不就行了?反正数据越多效果越好。真实业务里旧数据是海量的,全存既不现实,也有隐私合规风险(比如用户对话记录、医疗影像)。

正解工程上通常限制缓冲大小(几千到几万条),并用随机抽样或“最优化采样”——专门挑那些对防止遗忘最有价值的样本(比如模型最容易忘的困难样本)。更前沿的方案是生成式回放,用生成模型重塑旧样本分布,压根不存原始数据。回放的效果取决于“存哪批、每批多少、怎么混合”,不是多多益善。

为何常见:把回放的直觉理解成“背课文”,觉得背得越多越牢,忽略了存储成本和采样策略才是工程核心。

误区模型上线后,来一批新数据我就用这批数据继续训练,这不就是持续学习吗?我每天都在“持续”更新模型啊。

正解普通微调几乎没有防遗忘机制。新任务训练会把旧任务权重覆盖,典型表现是“学会新知识、忘光旧知识”,甚至出现准确率雪崩。持续学习的定义性特征,是有意识地在训练目标中加入防遗忘约束(EWC 的惩罚项、回放的旧样本、正则化的漂移上限)。微调是持续学习的“裸奔版”,不是持续学习本身。

为何常见:微调和持续学习表面上都是“接着训练”,很多人只看操作不看机制,于是把两个层次的概念混为一谈。

误区任务 A 学完之后,我把 Fisher 信息算出来存好,以后学所有新任务都用这一份,反正标着“重要度”嘛。

正解Fisher 信息刻画的是“某个参数对当前旧知识版图的重要度”。当任务序列不断变长(A→B→C),旧知识的版图在变,重要度分布也在变。一直沿用最早的 Fisher,后续任务的保护方向会失准。实践中常用 EWC 的在线版本:每学完一个任务,把新旧 Fisher 按衰减因子融合(例如 \\(F \\leftarrow \\gamma F_{\\text{old}} + F_{\\text{new}}\\)),让重要度估计始终跟得上知识版图的变化。

为何常见:EWC 的论文推导里 Fisher 是“学完任务 A 的静态量”,初学者被这个局部形式迷惑,忽略了它在一个长任务序列里需要滚动更新。

误区EWC 要逐参数算惩罚项,大模型动辄几百亿参数,这得算到猴年马月?所以持续学习对大模型根本没用。

正解大模型时代持续学习非但有意义,反而更刚需——微调一个 70B 模型学新知识,很容易把通用能力冲掉。逐参数的 EWC 在高维空间确实开销大,但工程上已有多种适配方案:参数高效的 LoRA 持续学习(只约束低秩增量)、冻结主干只训旁路、任务向量叠加存储、以及“书签式”管理多个增量矩阵。核心思路依然是“保护重点 + 温故知新”,只是换了个轻量载体。

为何常见:看到 EWC 公式里对每个参数求和,就下意识觉得大模型算不动,误以为整套技术在大模型时代失效。

面试题

Q1. “灾难性遗忘”最准确的含义是:

单选题 · easy

  • A.训练数据被意外删除
  • B.旧知识被新任务冲掉← 正确答案
  • C.模型参数量超出显存
  • D.新任务数据严重偏差

答案:B。灾难性遗忘指模型在学习新任务后,旧任务性能显著下降。它不是因为数据丢了或显存不够,而是新旧知识在参数空间冲突,新梯度覆盖了旧权重。就像艾师傅学完日式拉面,把牛肉面的盐量配方冲掉了一样。

Q2. EWC 中 Fisher 信息的主要作用:

单选题 · easy

  • A.估计参数对旧任务的重要程度← 正确答案
  • B.计算新任务的梯度大小
  • C.决定学习率大小的分布
  • D.压缩模型参数的存储量

答案:A。Fisher 信息衡量每个参数对旧任务输出的敏感度——参数拨动一点,旧任务损失变化越大,说明越重要,相当于“秘方标签”上的关键度。它不参与梯度计算,也不决定学习率或存储。

Q3. EWC 损失函数中 λ 设置过大的后果:

单选题 · mid

  • A.旧任务遗忘速度加快
  • B.新任务学习效果变差← 正确答案
  • C.模型推理速度变慢
  • D.Fisher 信息自动失效

答案:B。λ 控制防遗忘惩罚的权重。λ 太大,参数被牢牢锁在旧位置,新任务 B 的损失难以下降,表现为“学不进去”。它不会加快遗忘(只会防过头),也不影响推理速度和 Fisher 信息的计算。

Q4. 经验回放策略的核心做法:

单选题 · mid

  • A.训练时混入旧任务样本← 正确答案
  • B.测试时反复运行旧任务
  • C.增加模型的隐藏层数
  • D.把旧任务数据全部删掉

答案:A。经验回放的核心是“温故而知新”——训练新任务时,从旧样本缓冲区(或生成模型的伪样本)中抽样,与新任务数据混合训练,让旧知识不断被复习。它发生在训练阶段,与测试、网络结构、删数据无关。

Q5. BWT(后向迁移)衡量的是:

单选题 · mid

  • A.新任务对旧任务的平均影响← 正确答案
  • B.旧任务对新任务的平均影响
  • C.模型参数量整体变化幅度
  • D.每一次训练消耗的总时长

答案:A。BWT 把所有旧任务的“最终准确率 − 刚学完时准确率”取平均,专门回答“学完所有新任务后,旧知识被冲掉了多少”。负值越大遗忘越严重,这不是参数量或耗时问题。

Q6. 生成式回放相比真实样本回放的突出优势:

单选题 · hard

  • A.不需要存储原始私有数据← 正确答案
  • B.能够完全消除灾难性遗忘
  • C.训练速度一定快十倍以上
  • D.生成样本质量必然更高

答案:A。生成式回放训练一个生成模型(如 VAE、扩散模型)来重塑旧样本分布,训练时“现场生成”旧数据,因此不必保存原始样本,规避隐私和存储风险。它不能完全消除遗忘,速度和质量也不会凭空提升。

Q7. 大模型中 LoRA 持续学习的主要思路:

单选题 · extreme

  • A.冻结原权重只训练低秩增量← 正确答案
  • B.每次训练都重新随机初始化
  • C.仅用生成式回放解决遗忘
  • D.把所有参数全量重新训练

答案:A。LoRA 把原始权重矩阵 W 冻结,只训练低秩分解增量 ΔW=BA,每个任务保存一份轻量“味型卡”增量。推理时叠加即可,老任务增量不删、新任务互不干扰,是参数高效持续学习的代表方案。

Q8. 以下哪些属于持续学习的常用防遗忘方法:

多选题 · easy

  • A.EWC 弹性权重整合← 正确答案
  • B.经验回放与生成回放← 正确答案
  • C.正则化参数漂移约束← 正确答案
  • D.梯度裁剪防止梯度爆炸

答案:ABC。EWC(参数重要度惩罚)、经验回放(混旧样本)、正则化(限制参数漂移)是持续学习的三大类主流方法。梯度裁剪只是防止梯度爆炸的训练技巧,与防遗忘无关——它解决的是训练稳定性,不是知识保持问题。

Q9. 关于 EWC 机制的正确描述:

多选题 · mid

  • A.用 Fisher 信息估计参数重要度← 正确答案
  • B.在损失中加入二次惩罚项← 正确答案
  • C.需要保存旧任务完整数据集
  • D.惩罚项限制参数大幅漂移← 正确答案

答案:ABD。EWC 用 Fisher 信息给参数标重要度,在损失中加入二次惩罚项限制参数漂移,因此不需要保存旧任务数据——这是它相比回放的一大优势。C 描述的是回放策略的特征,不是 EWC 的。

Q10. 衡量持续学习模型性能时常用的指标维度:

多选题 · hard

  • A.新任务学习后的准确率← 正确答案
  • B.旧任务知识保持程度← 正确答案
  • C.前后任务正向迁移幅度← 正确答案
  • D.每个任务推理时的鲁棒性

答案:ABC。持续学习的评估要同时看三个维度:新任务能不能学好(准确率)、旧知识有没有被冲掉(BWT)、以及任务间是否有正向迁移(FWT,前向迁移)。推理鲁棒性属于模型稳定性范畴,不是持续学习特有的评估维度。