EWC:用参数重要性抵抗灾难性遗忘
从贝叶斯后验与 Fisher,到可检验的参数锚点约束
一句话总结
保存旧参数与 Fisher 对角,对重要方向的移动施加惩罚;局部近似和新旧任务权衡决定其能力边界。
EWC:哪些参数应该更难改变
Overcoming catastrophic forgetting in neural networks 由 Kirkpatrick 等人发表于 PNAS 2017,本页依据 arXiv:1612.00796 的完整稿。它研究顺序学习:模型先完成任务 A,再学习任务 B,而学习 B 的梯度可能覆盖对 A 有用的参数。EWC 的关键不是把所有参数冻结,而是估计每个参数对旧任务有多重要,再对重要参数的移动施加更大代价。
可以把参数想成弹簧连接的点,旧任务最优参数是弹簧的锚点。对旧任务敏感的方向弹簧更硬,不重要的方向比较自由。这个比喻对应原文 Figure 1,但必须补上限制:论文主要使用逐参数的对角近似,不能完整表示参数之间共同变化时的补偿关系,真实损失地形远比独立弹簧复杂。
与你的研究相关的问题是:一个场景学到的表情编码器,面对新场景时哪些权重应保留?EWC 提供一种参数空间的基线;它不要求像 LwF 那样在新输入上复制旧输出,而是保存旧参数与重要性。两者保留知识的位置不同,所以也会以不同方式失败。
从贝叶斯更新理解正则项
把旧任务学完后的参数看成一个后验分布,而不仅是一个点。这个分布表示哪些参数值与旧数据相容。学习新任务时,旧后验可以作为新任务的先验:新数据推动参数适应,旧分布要求变化不要太离谱。实际神经网络的完整后验难以保存,于是论文用局部高斯近似压缩它。
高斯的中心是旧任务训练得到的参数,精度表示局部曲率或约束强度。论文用 Fisher 信息的对角元素近似每个参数的重要性。Fisher 并不是参数绝对值大小,也不是所有梯度简单平均后的绝对值;它关注对数概率关于参数的敏感程度平方的期望。
如果某个权重稍微变化就使旧模型对旧数据的概率判断改变很多,它的 Fisher 可能较大。若模型在某个参数方向较不敏感,这个方向可以容许更多新任务更新。由于这只是旧解附近的局部信息,当新任务要求移动很远时,二次近似可能无法正确描述旧损失。
原文贝叶斯推导的核心关系。D_A、D_B 表示两个任务数据,theta 表示网络参数;学习 B 时不必重新访问全部 A 数据,前提是已经对旧后验做了可用近似。
原文局部高斯近似的教学展开。C 与当前参数优化无关,旧解 theta 星号是锚点;仅保留对角项意味着忽略不同参数之间的相关性。
Fisher 对角的概念写法。实践中输入来自数据,标签可由模型分布采样,或用经验标签进行近似;这些估计并非严格相同,报告必须说明具体采用哪种。
对应原文式(3)。第一项学新任务,第二项保护旧任务。lambda 越大并不意味着总性能越好:过强约束可能让新任务几乎学不动。
教学求导。正则梯度指向旧锚点;如果参数正好在锚点,正则梯度为零,即使 Fisher 很大也不会凭空产生更新。
教学二维例子,尚未乘 lambda。两个参数移动相同距离,但第一个受到一百倍的重要性权重。若把 Fisher 全部设为一,就退化为围绕旧权重的普通二次约束。
为什么 Fisher 估计最容易写错
逐样本梯度平方的平均,与先求批量平均梯度再平方不是同一件事。后者会让方向相反的样本梯度相互抵消,低估重要性。最初练习可以一次处理一个样本,清零梯度、反向传播、累加平方,最后除以样本数;理解无误后再考虑向量化加速。
还要分清模型 Fisher、真实标签下的经验 Fisher,以及取最大预测类别的近似。它们可能对错误预测和不确定样本给出不同重要性。一个第三方实现采用预测最大类,并不意味着这是原论文完整贝叶斯推导的严格等价实现;你应在配置中记录 fisher_label_mode 一类明确字段。
旧权重与 Fisher 都必须脱离当前计算图,并作为阶段固定状态保存。若保存的是仍与参数共享存储的引用,训练 B 时锚点也跟着移动,惩罚项可能始终很小,程序却不会报错。验收时应检查旧快照在若干更新后保持不变,而不只是观察损失能够打印。
多阶段时还存在合并方式选择:逐任务保留多个锚点和 Fisher,或维护一个在线近似。二者的内存与目标函数不同;将多个任务权重简单相加后仍围绕最新锚点约束,是一个具体算法选择,不能不加说明地称为与原始多任务形式完全一致。
flowchart TD A[Old task training] --> S[Parameter snapshot] A --> F[Diagonal Fisher] S --> P[Weighted penalty] F --> P B[New task data] --> L[Task loss] P --> U[Update current parameters] L --> U
实验表该如何诚实阅读
原文的主要效果通过曲线展示,而不是提供每条曲线每个时刻的精确数字。本页不从曲线外观猜测准确率,下面两张数值表摘录补充材料的实验配置,明确它们是设置表,不是性能表。想写正式复现比较,应下载作者可用数据或独立实现并实际测量,不能把目测曲线写成两位小数。
原文 Figure 2 研究置换 MNIST 的顺序学习。每个任务对像素位置施加不同固定置换,标签仍然是数字,但输入表示发生变化。它能检验遗忘,不能直接代表影视与访谈的自然场景偏移。置换本身应在任务内固定,训练与测试采用同一置换,否则你测到的是另一种随机扰动任务。
| 配置项 | 报告的取值 |
|---|---|
| 隐层宽度 | 400;调参范围含 400–2000 |
| 隐层数量 | 2;深层实验 6 |
| 训练轮数 | 20 或 100,依对应实验 |
| 学习率搜索 | 10^-5 至 10^-3 |
| 随机超参数组合 | 50 |
| dropout(采用时) | 输入 0.2,隐藏层 0.5 |
| 配置项 | 报告取值 |
|---|---|
| 输入图像 | 84×84 |
| 历史帧数 | 4 |
| 批量 | 32 |
| 学习率 | 0.00025 |
| Fisher 估计 | 100 个 minibatch |
| EWC 系数 | 400 |
| 任务抽样 | 19 个游戏中选 10 个;10 组序列、各 4 次运行 |
Atari 证据与作者限制
原文 Figure 3 展示多种 Atari 游戏的顺序学习。强化学习还涉及奖励、经验采样和任务识别,不是把分类损失替换一个名字就完成迁移。论文使用任务相关的短期经验缓冲及额外的任务相关参数,因此不能把整个 Atari 系统描述成绝对不存任何经验、只加一个二次项的纯粹分类算法。
作者还分析了沿重要与不重要方向扰动网络的敏感性,发现对角 Fisher 的近似并非完整描述真实参数不确定性。参数之间可以互相抵消或协同变化,而独立惩罚看不到这种相关结构。原文讨论更丰富的后验近似作为可能方向,没有声称现有 EWC 能无限保存任意数量任务。
对你的模型,额外状态至少包含一份参数锚点和一份同形状 Fisher。若基础网络很大,这一存储开销不可忽略;只训练 LoRA 参数时可以探索只对适配参数估计重要性,但那是一个新的受限版本,需要说明被保护的参数集合,不能直接套用全网络的文献结果。
第三方源码检查与实现边界
本次克隆并读取 moskomule/ewc.pytorch 的 README、utils.py 与演示入口。它是第三方教学实现,不是 DeepMind 官方论文代码。仓库在当前快照未提供明确许可证文件,因此这里只引用极短的关键表达式用于说明,并给出固定提交定位,不转载完整函数。实际训练尚未执行。
utils.py 中先对每个输入前向,用最大预测类别构造损失,再累计梯度平方。下面第一处是这种标签近似,第二处是重要性加权的参数位移。这个实现返回的惩罚没有显式二分之一,外部 importance 系数吸收尺度;比较 lambda 时要先对齐定义,不能只比较两个配置文件里的数字大小。
该代码使用旧版 Variable 和 loss.data 索引等接口,迁移到现代 PyTorch 时需要改写;兼容性修改也应保持逐样本估计、固定快照和损失缩放。不要为了程序能运行就改成批平均梯度平方,却仍把算法语义当作未变。
第三方教学实现:标签近似:utils.py:40–40;固定提交 c846fc6c7929。
label = output.max(1)[1].view(-1)第三方教学实现:惩罚核心:utils.py:53–53;固定提交 c846fc6c7929。
_loss = self._precision_matrices[n] * (p - self._means[n]) ** 2从二维例子到两个场景的验收
第一步用两个可训练标量构造新任务二次损失,旧锚点设为零,Fisher 分别设为一百和一。打印无 EWC 与有 EWC 的最优移动量,验收高重要性参数更接近旧值。这个例子不需要深度网络,能够让你直接看到惩罚强度如何改变解。
第二步在小分类器上估计 Fisher。检查每个元素非负、没有 NaN,并用十个样本逐个累加与手写循环结果比较。把 Fisher 全置零时,训练应与普通微调一致;把全部参数初始化为旧快照时,惩罚值应为零。这两项是最基本的正确性证据。
第三步完成两场景顺序学习,分别保存第一阶段检查点、Fisher 文件和第二阶段配置。新阶段只使用当前场景训练样本,先比较无保护、统一权重保护和 Fisher 加权保护。如果三者结果完全相同,应检查梯度、lambda 尺度及锚点是否错误共享内存。
第四步在相同训练预算下比较若干 lambda,输出每个场景的结果与新任务学习曲线。过强保护的典型表现是旧任务稳定但新任务训练损失降不下去;过弱保护则接近普通微调。你的结论应讨论这个权衡,而不是只把旧任务下降较小当成胜利。
最后给出额外状态大小、Fisher 估计耗时和每类遗忘情况。EWC 让你学会把“重要知识”变成可计算的局部参数约束;它没有直接识别哪些面部动作与情绪有关,也没有保证跨场景语义对齐。后续可以与 LwF 的输出约束、GPM 的方向约束并列比较,而不是假定三者只是不同名字的同一方法。
进一步诊断:重要性估计与保护对象
Fisher 的数值尺度会随损失求和或求平均、使用样本数以及模型概率校准变化。两个实现若都写 lambda 等于一千,却分别使用总和与均值,其实际惩罚强度可能差很多。先在固定小批样本上记录任务损失、惩罚值及各自梯度范数,再解释权重选择,比盲目抄文献的超参数更可靠。
重要性还依赖估计样本覆盖。如果只采到高兴和中性,稀有恐惧相关参数可能被认为不重要;之后学习新场景时这些方向被覆盖,平均准确率下降却不明显。你可以在相同估计样本预算下比较随机采样与类别分层采样,记录逐类遗忘差异;这是一项明确的小实验,而不是泛泛的“改进 Fisher”。
作者承认对角高斯近似忽略相关性,且局部估计可能低估不确定性。独立判断是,模型有可替代的参数组合时,逐坐标约束可能过度限制本来无害的协同移动。一个二维算例中,如果旧任务只依赖两个参数的和,那么二者一增一减可以不改变旧输出;独立平方惩罚却仍会处罚它们。这正是后续子空间方法值得阅读的原因。
实践还需注意批归一化运行均值等缓冲状态不一定属于可训练参数。即使被保护的权重几乎没动,统计量漂移仍可能让旧域预测改变。因此保存和比较 state_dict,而不仅是参数列表;报告明确哪些状态冻结、哪些更新,才能让“参数保护有效”的结论具有可复核含义。
还可设计一个不依赖最终准确率的检查:人为只移动一个已知 Fisher 较大的参数,再移动同样距离的低 Fisher 参数,分别计算惩罚增量。二者比例应与对应重要性比例一致。若不一致,先检查参数名匹配、广播和缩放,而不是归因于数据集太难。
可执行研究记录与评价纪律
把阅读成果变成可检查的实验记录。先建立一张样本清单,每行至少包括样本标识、原始视频或说话人标识、类别、场景、训练验证测试角色。先检查这些标识的交集,再开始训练。视频切成不同短片,并不意味着它们在语义、人物或拍摄来源上相互独立;随机划分得到的高分也不能自动证明跨场景泛化。
所有比较都应固定输入帧数、预训练权重、数据增强、优化步数和评价脚本。先用一个种子验证数据流、梯度和保存恢复,再用预先约定的多个种子做正式比较。记录每个种子的结果,报告均值和波动,而不是只保留最高一次。若为了显存缩小模型或批量,把它写入兼容性实验说明,不把改动后的结果称为原论文的严格复现。
检查分类效果时,同时保存逐样本预测和混淆矩阵。总体准确率上升可能只是多数类别变好;逐类召回率能揭示少数表情被牺牲的问题。跨场景实验还要报告每个场景的指标,防止样本量大的场景掩盖小场景退化。一个漂亮的特征可视化只能辅助观察,不能替代独立测试集、明确指标和误差分析。
模型选择必须与最终测试分开。用验证集选择学习率、训练轮数和新增模块的强度,先写清选择规则,再运行最终测试;不要根据测试集反复挑选超参数。若研究设定禁止访问旧数据,就不能为了选择防遗忘系数反复查看旧任务测试结果。可以预先固定系数,或另行声明验证数据的可访问范围,让比较遵循同一规则。
每次改动只回答一个问题,保存配置文件、代码提交、随机种子、数据清单哈希和检查点路径。最后交付一页实验说明,按“问题、对照、改动、结果、解释、失败案例”组织。若结果没有提高,先确认机制是否确实生效,再判断假设是否错误;未运行的实验只能写成计划,不能填上看似合理的数字。本文表格均为原文报告或明确注明的教学计算,并非本机复现实测。
原文短引与证据入口
原论文与完整上下文。以下三个短引仅定位作者用语,解释与判断见上文:“elastic weight consolidation”;“catastrophic forgetting”;“Fisher information matrix”。
自己的解释与验收记录
写出一条输入到输出的链路、一个关键公式的含义,以及你完成的最小检查。笔记仅保存在当前浏览器,可从主站「我的学习笔记」导出。