Synaptic Intelligence:沿训练轨迹衡量参数重要性,让神经网络少忘旧任务
一个网络学会区分数字 0 和 1,接着学习 2 和 3,为什么可能连先前的二分类都不会了?旧数据不能重新拿出来训练时,能否只保存少量参数级信息,就减轻这种遗忘?
Synaptic Intelligence(SI,突触智能)的思路是:记录每个参数沿训练轨迹为降低损失做了多少贡献,之后对重要参数的改变施加更强约束。 网络不是全部冻结,而是尽量利用对旧任务不重要的参数学习新任务。
本文精读 Continual Learning Through Synaptic Intelligence,作者为 Friedemann Zenke、Ben Poole、Surya Ganguli,发表于 ICML 2017。以 arXiv v3(2017-06-12)的正文、附录和原始图表为依据,并核对作者代码。数值例子为教学构造;图上读数与论文明确报告的数值分别标注。
1. 一句话结论与论文全景
SI 用训练过程中“梯度 × 实际参数更新”的累积量估计参数重要性,再构造逐参数加权的二次惩罚;它不需要重放旧训练样本,就能在论文的顺序分类实验中明显减轻遗忘。
这里的“突触”是权重和偏置等参数的统称,不是额外引入脉冲神经元,也不是关于大脑记忆机制的实验验证。
| 问题 | SI 的处理 |
|---|---|
| 如何知道哪个参数重要? | 沿整个训练路径累计其对损失下降的局部贡献 |
| 如何比较移动幅度不同的参数? | 用任务内净位移的平方加阻尼项做归一化 |
| 学新任务时如何保留旧知识? | 对偏离上一任务结束参数的变化施加加权二次惩罚 |
| 是否需要旧数据? | 该正则项不需要访问旧任务样本 |
| 是否需要任务边界? | 原始算法在任务结束时更新重要性和参考权重 |
论文最直观的实验是 Split MNIST:顺序学习五个二分类任务后,不加约束的网络在最早两个任务上退化到接近随机水平,而 SI 保持较高准确率。Permuted MNIST 的十任务平均准确率约为 97%,与论文引用的 EWC 曲线相近。(图 3、图 4;后者为近似读图)
这支持的是指定任务协议下的抗遗忘能力,不是“所有任务永远不会忘”,也不是已经解决了无任务标识的开放世界持续学习。
2. Motivation:稳定与可塑性为什么冲突?
2.1 新任务的下降方向,可能是旧任务的上升方向
设先学习任务 A,再学习任务 B。普通微调只优化当前损失 \(L_B\),并不关心参数移动后 \(L_A\) 会发生什么。由于两个任务共享参数,对 B 有利的更新可能破坏 A 所依赖的表示,造成 catastrophic forgetting,即灾难性遗忘。
如果允许保存全部旧数据并联合训练,问题可以缓解;但论文研究的是不能持续访问旧任务损失的场景。另一方面,把所有旧参数冻结虽然稳定,却会限制新任务学习,或者迫使网络不断扩张。
真正需要的不是“所有参数尽量不动”,而是:保留旧任务真正依赖的部分,让其他部分保持可塑性。(§1–§3)
2.2 为什么只看参数大小不够?
权重大不代表它对降低损失贡献大;权重变化大也可能只是沿着平坦方向移动。作者因此选择同时观察两个量:这个参数改变了多少,以及当时损失对这个参数有多敏感。
生物学启发来自突触不只是一个静态标量,还可能具有与历史有关的内部状态。SI 将这一启发转成可计算的参数级记忆,但作者明确说明:不主张真实生物突触一定按 SI 的公式工作。(§6)
3. Method:从路径贡献到保护强度
3.1 第一步:为每个参数累计损失下降贡献
令 \(\theta\in\mathbb R^P\) 为模型参数,\(g_k=\partial L_\mu/\partial\theta_k\) 为当前任务 \(\mu\) 的梯度。一次小更新 \(\delta\) 引起的损失变化满足:
\[ L_\mu(\theta+\delta)-L_\mu(\theta) \approx\sum_{k=1}^{P}g_k\delta_k. \]
如果梯度为负、参数向正方向移动,则 \(g_k\delta_k<0\),这一项有助于降低损失。为让“有贡献”对应正数,SI 定义:(式 1–3)
\[ \omega_k^\mu =-\int_{t_{\mu-1}}^{t_\mu} g_k(\theta(t))\,\dot\theta_k(t)\,dt. \]
在固定任务损失和精确连续积分下:
\[ \sum_k\omega_k^\mu =L_\mu(\theta_{\mathrm{start}}) -L_\mu(\theta_{\mathrm{end}}). \]
总和是起点到终点的损失下降;但各参数分到多少贡献取决于实际路径。这不是独立干预每个参数后得到的因果重要性。
实际训练使用离散累计:
\[ \omega_k\leftarrow\omega_k -g_{k,t}\bigl(\theta_{k,t+1}-\theta_{k,t}\bigr). \]
因此应记录优化器执行后的实际位移,而不是默认所有更新都等于 \(-\eta g\)。只有在不含动量、预条件和其他正则项的普通梯度下降中,单步贡献才简化为 \(\eta g_{k,t}^2\)。
作者代码使用当前任务的 unregularized gradient
累计贡献,而参数更新来自加入保护项后的优化目标。这避免把“抵抗旧任务正则项”本身误记为当前任务学习贡献。(作者仓库
protocols.py、optimizers.py)
3.2 第二步:除以净位移平方,累计跨任务重要性
任务 \(\nu\) 内参数的净位移为:
\[ \Delta_k^\nu =\theta_k(t_\nu)-\theta_k(t_{\nu-1}). \]
学习新任务 \(\mu\) 时,论文使用的累计保护系数为:
\[ \Omega_k^\mu =\sum_{\nu<\mu} \frac{\omega_k^\nu}{(\Delta_k^\nu)^2+\xi}. \]
\(\xi>0\) 是阻尼项,用于避免净位移接近零时分母过小。\(\omega\) 与损失同量纲,\(\Omega\) 与“损失除以参数平方”同量纲,因此乘回参数偏移平方后仍是损失。(式 5)
直觉是:如果很小的参数移动曾带来较大的损失下降,就应赋予较强保护。这里除的是起终点的净位移平方,不是所有逐步位移平方的和,也不是梯度平方的累加。
离散更新、噪声和其他优化力可能产生负贡献。论文式 (5) 展示直接求和,作者实现则对累计重要性使用非负截断,并提供历史累积控制;两者应区分。下面的示例所有贡献为正,因此不涉及截断。
3.3 第三步:对重要参数施加“软弹簧”
令 \(\widetilde\theta_k\) 为上一任务结束时的参数,新任务优化:
\[ \widetilde L_\mu(\theta) =L_\mu(\theta) +c\sum_k\Omega_k^\mu (\theta_k-\widetilde\theta_k)^2. \]
这里 \(c\) 控制稳定与可塑性的权衡。因为式中没有 \(1/2\),正则项梯度为:
\[ \frac{\partial\widetilde L_\mu}{\partial\theta_k} =g_k+2c\Omega_k^\mu(\theta_k-\widetilde\theta_k). \]
重要参数相当于连接一根更硬的弹簧,但仍然可以移动。新任务开始时参数恰好等于参考值,弹簧力为零;发生偏移后,保护作用才显现。
任务结束时,算法更新 \(\Omega\),将参考值移到新的终点,并清零本任务的 \(\omega\)。它不是为每个旧任务永远保留一个单独模型;不过将历史汇总到最新参考点,也是一种近似,不等于精确保留所有旧损失。(§3)
3.4 与 EWC 的区别:沿途统计还是终点统计?
| 维度 | SI | 论文讨论的 EWC |
|---|---|---|
| 保护形式 | 逐参数加权二次惩罚 | 同样是加权二次惩罚 |
| 重要性来源 | 整段训练路径的梯度与更新 | 任务结束参数处的 Fisher 对角估计 |
| 收集时机 | 在当前任务训练过程中累计 | 通常在任务结束后估计 |
| 主要近似 | 离散路径积分、对角化、跨任务汇总 | Fisher 估计及对角化 |
区别不是“SI 有正则化而 EWC 没有”,而是怎样估计正则化的权重。也不能把 Fisher、经验 Fisher 和 Hessian 混称为同一矩阵;论文附录 C 专门讨论了它们的差别。
对理想二次损失,作者证明路径统计与曲率存在联系;一般非线性损失的曲率沿路径变化,不能声称 SI 总能精确恢复终点 Hessian。逐参数统计还忽略了参数之间的协同关系。(§4)
4. 数值例子:学习、记账、巩固,再学新任务
以下是两个标量参数的教学示例,用可手算的二次损失替代真实网络与交叉熵。步长、阻尼和任务函数都是构造值,不是论文 MNIST 配置。
4.1 任务 A:参数 1 更敏感
设初始参数为 \((0,0)\),旧任务损失为:
\[ L_A(\theta)=2(\theta_1-1)^2 +\frac12(\theta_2-1)^2. \]
梯度为 \((4(\theta_1-1),\theta_2-1)\)。使用普通梯度下降,学习率 \(\eta=0.25\),训练两步后结束该任务:
| 步骤 | 更新前参数 | 梯度 \(g\) | 实际更新 \(\delta=-0.25g\) | 更新后参数 | 单步贡献 \(-g\odot\delta\) |
|---|---|---|---|---|---|
| 1 | \((0,0)\) | \((-4,-1)\) | \((1,0.25)\) | \((1,0.25)\) | \((4,0.25)\) |
| 2 | \((1,0.25)\) | \((0,-0.75)\) | \((0,0.1875)\) | \((1,0.4375)\) | \((0,0.140625)\) |
\(\odot\) 表示逐元素相乘。累积得到:
\[ \omega=(4,0.390625),\qquad \Delta=(1,0.4375). \]
这里任务结束不代表每个参数都已收敛;SI 可以在规定训练预算结束时进行巩固。
还有一个重要检查:真实损失从 \(2.5\) 降到 \(0.158203125\),下降 \(2.341796875\);而离散累计贡献总和是 \(4.390625\),两者不相等。这是因为本例步长不小,一阶离散近似会有误差。连续精确积分的恒等式不能无条件套到有限步训练上。
4.2 把贡献转为保护强度
取阻尼 \(\xi=0.1\),此前没有其他任务:
\[ \begin{aligned} \Omega_1&=\frac{4}{1^2+0.1}=3.636364,\\ \Omega_2&=\frac{0.390625}{0.4375^2+0.1} =1.340483. \end{aligned} \]
保存参考参数 \(\widetilde\theta=(1,0.4375)\),清零本任务的路径累计器。参数 1 的保护更强,但参数 2 也不是完全无约束。
4.3 学任务 B:新目标与旧目标冲突
设新任务希望输出参数位置 \((0,1)\):
\[ L_B(\theta)=\frac12\theta_1^2 +\frac12(\theta_2-1)^2. \]
不用 SI,完全优化 B 后得到 \((0,1)\),此时 \(L_B=0\),但 \(L_A=2\),旧任务明显退化。
取 \(c=1\),SI 的新目标为:
\[ \begin{aligned} \widetilde L_B ={}&\frac12\theta_1^2+\frac12(\theta_2-1)^2\\ &+3.636364(\theta_1-1)^2\\ &+1.340483(\theta_2-0.4375)^2. \end{aligned} \]
刚开始时正则梯度为零,新任务梯度为 \((1,-0.5625)\)。若以步长 \(0.1\) 更新一次,会到达 \((0.9,0.49375)\)。此时正则梯度变为:
\[ \begin{aligned} r_1&=2\times3.636364\times(-0.1)=-0.727273,\\ r_2&=2\times1.340483\times0.05625=0.150804. \end{aligned} \]
任务梯度是 \((0.9,-0.50625)\),合成后约为 \((0.172727,-0.355446)\)。因此参数 1 继续离开旧值的速度被明显压低;参数 2 则仍能朝新目标移动。
4.4 解出最终折中点
这个二维问题没有耦合,可以直接令梯度为零。若新任务目标为 \(b=(0,1)\),每个坐标的最优值为:
\[ \theta_k^*=\frac{b_k+2c\Omega_k\widetilde\theta_k} {1+2c\Omega_k}. \]
代入得到:
\[ \theta_1^*\approx0.879121,\qquad \theta_2^*\approx0.590313. \]
| 训练结果 | 旧任务 \(L_A\) | 新任务 \(L_B\) |
|---|---|---|
| A 结束时 \((1,0.4375)\) | 0.1582 | 0.6582 |
| 无约束学完 B:\((0,1)\) | 2.0000 | 0 |
| SI 折中点 | 0.1131 | 0.4703 |
SI 牺牲了 B 的最优损失,换来对 A 的保护。本例中 A 甚至比原终点略好,因为参数 2 朝两个任务共享的目标 1 移动;这是构造任务的特点,不是 SI 必然带来正向迁移的保证。
到这里已经跑通:当前任务梯度 → 实际更新 → 路径贡献 → 净位移归一化 → 保存参考值 → 新任务正则化 → 最终折中。
5. Results:抗遗忘效果与评测边界
原文主要用图而不是精确数值表报告表现。下列带“约”的百分比为原图近似读数,不是复现实验结果;不为曲线补造小数点后的精度。
5.1 Split MNIST:先前任务不再迅速退回随机水平
五个任务依次为 0/1、2/3、4/5、6/7、8/9。模型是两层、每层 256 个 ReLU 单元的 MLP,使用多头输出,只在当前任务的两个数字间计算分类损失。设置包括 Adam、batch size 64、每任务 10 epochs、\(\xi=10^{-3}\),比较 \(c=0\) 与 \(c=1\);任务间重置优化器状态。(§5.1)
图 3 显示:学完全部任务后,无巩固网络在最早两个任务上接近 50% 随机水平,SI 对这些任务仍保持接近 100% 的表现。实验重复 10 次,误差条为 SEM,即均值标准误。
这是已知任务、二分类读出头的设置,不能解读为模型在不知道任务身份时,对十个数字进行统一分类的准确率。
5.2 Permuted MNIST:与 EWC 相近,远好于普通顺序训练
每个任务对 MNIST 像素采用不同的固定随机置换,仍预测十个数字。模型为两层、每层 2,000 个 ReLU 单元的 MLP,batch size 256、每任务 20 epochs;\(c=0.1\)、\(\xi=0.1\),这里保留任务间 Adam 状态。(§5.2)
图 4 的十任务平均准确率近似为:
| 图中方法 | 十任务结束时的平均准确率,约 |
|---|---|
| SI | 97% |
| EWC | 97% 附近 |
| SGD w/ dropout | 82% |
| SGD | 56% |
按图上近似值,SI 相对最弱的无巩固曲线高约 41 个百分点,但不能据此宣称显著优于 EWC。EWC 曲线是从 Kirkpatrick 等人的论文提取并重绘的,不是这里重新运行的严格同栈对照。
另外,图例使用 SGD 名称,而本节方法描述的优化器为 Adam;这里保留图例称谓,不将它改写成一套已经完全澄清的优化器消融。
图 5 显示,启用 SI 后不同任务第二层重要性向量的相关性更低,与减少参数干扰的解释一致。但这只是辅助观察,不是已经证明网络形成了完全独立的任务模块。
5.3 CIFAR:保住旧任务,但最后一个任务可能付出代价
实验先学完整 CIFAR-10,再顺序学习五个来自 CIFAR-100 的十类任务;不是把全部 CIFAR-100 类别都顺序学完。使用四个卷积层加全连接层及 dropout 的 CNN,采用多头设置,重复 5 次,误差条为标准差。(§5.3、附录 A)
图 6 中最早的 CIFAR-10 任务,普通微调验证准确率约 43%,SI 约 74%,差约 31 个百分点。SI 在前面任务上普遍优于无巩固,但最后一个任务没有占优:这是保留旧知识与适应新任务的真实权衡。
相对“每个任务从头训练”的模型,SI 在多个后续小数据任务上也有优势,不过最初 CIFAR-10 并不符合这个趋势。作者将其与每类样本更多等因素联系起来,不应把正向迁移写成普遍规律。
附录 B 另有一个不同实验:CIFAR-10 分为前五类和后五类,两个任务各训练 60 epochs,重复 10 次。作者明确报告第二个任务的验证准确率约提升 4.5 个百分点。它提供了迁移收益的证据,但不能与图 6 的六任务设置混在一起。
5.4 “计算高效”具体指什么?
SI 的核心新增状态是若干与参数同形状的数组,保存参考值、历史重要性和当前路径贡献,不需要保存完整训练轨迹或不断复制旧模型。状态开销为 \(O(P)\),不会因为任务数增加而线性保存整套旧模型。
它可以利用训练梯度,不需要任务结束后专门扫描旧数据计算重要性。但“局部计算”不代表没有反向传播,也不等于零额外内存;底层框架如何分别处理任务梯度与总梯度,会影响实际开销。多头实验中的任务输出头也与共享参数统计的开销是两回事。
6. 最具创新性的点:重要性来自“如何学会”,而不只来自“学完之后”
SI 最有辨识度的创新,是把每个参数沿优化轨迹对损失下降的贡献,转化为下一阶段学习时的保护强度。
二次正则化本身不是主要新意。关键在于,训练过程已经产生梯度和位移,SI 将这些通常会被丢弃的历史量累积起来,再用参数净位移归一化,形成紧凑的经验摘要。
这回应了动机中的两难:既不需要重放全部旧数据,也不必一刀切地冻结所有参数。理论部分解释了它在特殊二次问题中与曲率的联系;实验中 \(c=0\) 与 \(c>0\) 的对照支持巩固机制确实减轻遗忘。
证据边界同样重要:这些实验没有完整分离“路径统计”“归一化”“任意其他重要性估计”的全部贡献;与 EWC 接近说明它是一条有效且高效的替代路线,而不是证明路径信息在所有情况下都优于终点信息。
7. 不足与可能的改进
7.1 作者明确讨论的边界
- SGD 噪声会使路径贡献估计偏大,所以保护强度 \(c\) 需要调节,而不是永远设为 1。(§3)
- 二次代理损失的直接推导针对两个任务;扩展到更多任务主要由实验支持。(§3)
- 对一般非线性损失,重要性与终点 Hessian 不存在简单的普遍对应。(§4)
- 原始算法在任务结束时更新参考值和累计重要性;生物学动机也不构成对真实突触机制的证明。(§3、§6)
7.2 我的分析:任务边界和任务身份降低了难度
Split MNIST 与 CIFAR 的多头协议避免了跨任务类别竞争。真实数据流未必给出任务边界,测试时也未必知道应该用哪个头。
改进可以比较单头 class-incremental、无明确边界的数据流,并尝试周期性或变化检测驱动的巩固。代价是引入边界检测误差和窗口超参数;需要同时测平均准确率、遗忘量、任务身份未知时的表现,而不只重复多头结果。
7.3 我的分析:对角保护忽略参数协同
一个函数可能依赖 \(\theta_1+\theta_2\),沿 \((+a,-a)\) 移动并不改变输出,但对角二次惩罚仍可能把两者的移动都判为危险。网络重参数化还会改变逐参数尺度,进一步影响重要性。
改进方向是分块或低秩重要性近似,保留部分协同方向。代价是更多存储和计算;应比较相同内存预算下的旧任务保持、新任务可塑性,以及等价重参数化前后的稳定性。
7.4 我的分析:累积保护可能逐渐压低可塑性
重要性随历史积累会使越来越多参数不容易改变。如果新旧任务确实冲突,不存在同时最优的共同参数,正则项只能选折中点,不能创造不存在的容量。
可尝试历史衰减、重要性上限或少量参数扩展。它们的风险是重新引入旧任务遗忘或增加模型大小;应在更长任务序列上画出旧任务保持与新任务学习速度的权衡曲线。作者代码已有历史累积控制接口,但具体衰减方案的效果仍需独立验证。
7.5 我的分析:贡献估计依赖优化器和离散步长
数值例子已经说明有限步路径累计可能不等于真实损失下降。Adam、动量、梯度裁剪与参数正则项会进一步改变位移,错误地用 \(\eta g^2\) 替代实际更新可能改变算法含义。
改进应先保证“当前任务梯度 × 实际位移”的正确记账,再研究独立小批次梯度估计或平滑统计是否降低偏差。代价是额外计算或滞后;需要比较不同学习率、batch size 和优化器下的重要性分布及抗遗忘效果,而不仅是当前任务训练 loss。
7.6 复现与迁移到现代模型
作者代码仓库提供原始实验实现,但其环境是旧版 TensorFlow/Keras。复现时尤其要核对任务结束更新顺序、非负截断、阻尼、损失归一化,以及任务间是否重置 Adam 状态。
将 SI 应用于大模型继续训练是合理的研究方向,却不是这篇 2017 年分类论文已经验证的结论。若只在 adapter 等部分参数上使用,也会改变保护范围;应独立评估通用能力保留、领域学习效果和显存成本。
8. 读者应记住的要点
- SI 记录的是沿训练路径发生的损失下降贡献,不是权重大小,也不是简单的终点梯度。
- \(\omega\) 是本任务的路径累计,\(\Omega\) 是归一化后的跨任务保护强度;两者不要混淆。
- 保护是围绕旧参数的软约束,不是永久冻结;稳定性收益通常伴随可塑性代价。
- 论文证明了特定顺序分类设置下的有效性,没有消除任务边界、参数协同、有限容量和统计偏差问题。
原始资料与延伸阅读
- arXiv 论文与版本记录。
- arXiv v3 PDF,含附录:核心方法式 1–5,理论 §4,实验图 3–7。
- ICML 2017 正式出版页。
- 作者代码,尤其是 protocols.py 与 optimizers.py。
与站内 AgentFounder:用继续预训练扩展 Agent 能力,FAS 与 HAS 如何把经验变成训练数据 对照阅读,可以区分“增加继续预训练阶段以获得新能力”与“约束参数更新以保留旧能力”;PlanPhys:长程规划从哪里来?预训练、OPD 与多教师蒸馏的能力边界 则从另一套受控实验展示了不同领域知识与模式冲突时,后训练可能产生的覆盖与遗忘。
点赞与评论
喜欢这篇文章?点个赞,或留下你的想法。登录 GitHub 后即可参与。
如果评论无法加载,请检查网络连接后刷新页面。