Browse this library

Chinese source article

2.3.1 · 参数隔离与动态架构

参数隔离方法给不同任务分配不同参数, 让新任务更新避开旧任务依赖的权重. PackNet, HAT, CLNP, SupSup 使用固定容量, PNN, DEN, Expert Gate 扩展容量; 掩码与扩展规则同时带来任务标识、容量耗尽和参数增长等代价.

View original Markdown ↗

参数隔离方法给每个任务分配专属的参数, 旧任务的参数此后不再改变. 有的在固定容量内划分 (PackNet, HAT, CLNP, SupSup), 有的随任务增加容量 (PNN, DEN, Expert Gate). 第 2.1 篇式 (3b) 说明了正则化方法的极限: 某个参数对新旧任务都重要, 而两个任务对它的最优值不同时, 二次惩罚只能给出一个对两边都不好的折中. 参数隔离换一个做法: 让不同任务使用不同的参数, 冲突就不存在.

按网络容量是否变化, 方法分两类:

类别 方法 隔离单位 推理阶段如何选参数
固定容量 PackNet 单个权重 (剪枝掩码) 任务标识
固定容量 HAT 神经元 (门控向量) 任务标识
固定容量 CLNP 神经元和滤波器 (稀疏化) 任务标识
固定容量 SupSup 单个权重 (二值超掩码) 任务标识, 或用熵的梯度推断
容量增长 PNN 整列网络 任务标识
容量增长 DEN 神经元 (按需扩展, 拆分) 任务标识
容量增长 Expert Gate 整个专家网络 自编码器重建误差

固定容量方法的问题是容量会被用完; 容量增长方法的问题是参数越来越多. 两类方法都要回答推理阶段用哪组参数的问题. 如果答案是「任务标识」, 方法只适用于 Task-IL. De Lange et al. (2022) 的综述也指出, 这类方法通常需要一个任务 oracle 来激活对应的掩码或分支, 因而局限于多头设定.

1. 固定容量: 剪枝, 门控与超掩码

PackNet. 流程. Mallya & Lazebnik (2018) 的 PackNet 在一个固定大小的网络里依次放入多个任务. 处理第 tt 个任务的步骤:

  1. 在当前可用的权重 (之前任务剪掉的那部分) 上训练第 tt 个任务. 旧任务保留的权重固定, 但在前向传播里照常参与计算.
  2. 对当前任务可用的权重, 每层按幅值剪掉一定比例 (50% 或 75%), 一次性完成.
  3. 在剪枝后留下的权重上再训练约一半的 epoch, 恢复剪枝造成的精度损失.
  4. 留下的权重分配给任务 tt, 此后固定; 剪掉的权重置零, 交给后续任务.

推理阶段处理任务 tt 时, 只启用分配给任务 11 到 tt 的权重, 后分配的权重置零. 任务 tt 能用到之前全部任务的权重, 所以有前向迁移; 之前任务看不到后来分配的权重, 所以没有遗忘. 偏置和 BN 统计在第一轮之后固定. 这一条是零遗忘的必要条件: 偏置和 BN 的均值, 方差被所有任务共享, 没有逐任务的掩码, 只要后续任务更新它们, 旧任务的前向计算就会变. 任何参数隔离方法都要检查有没有这类被所有任务共享, 又没有被隔离的状态. 掩码的存储: 每个参数只需记录它被分配给了哪个任务, 有 NN 个任务时每个参数需要 log⁡2N\log_2 N 位. 论文报告 VGG-16 为 537 MB, 加一个任务的掩码约 17 MB, 加三个任务约 34 MB.

实验. 论文从 ImageNet 预训练的 VGG-16 出发, 依次加入 CUBS, Stanford Cars, Flowers. Table 2 的 top-1 错误率 (%):

数据集 只训练分类器 LwF 剪枝 (0.50, 0.75, 0.75) 剪枝 (0.75 ×3) 单独训练
ImageNet 28.42 39.23 29.33 30.87 28.42
CUBS 36.76 30.42 25.72 24.95 22.57
Stanford Cars 56.42 22.97 18.08 15.75 13.97
Flowers 20.50 15.21 10.09 9.75 8.65
总大小 (MB) 562 562 595 595 2173

剪枝列的结果是 6 种任务顺序, 共 18 次运行的平均. 括号里是各任务的剪枝比例: (0.50, 0.75, 0.75) 表示 ImageNet 之后剪掉 50%, 后两个任务各剪掉 75%. 几个读法:

  • LwF 的 ImageNet 错误率从 28.42% 升到 39.23%, PackNet 只升到 29.33% (剪掉 50% 的代价) 或 30.87% (剪掉 75%). 剪枝本身造成的损失远小于 LwF 的遗忘.
  • 新任务上 PackNet 比 LwF 低 4 到 7 个百分点的错误率, 与单独训练相差 1 到 4 个百分点.
  • PackNet 总大小 595 MB, 四个单独网络共 2173 MB.

另一个实验把 Places365 加在 ImageNet 之后. 剪枝 50% 时, ImageNet 错误率 29.33%, Places365 为 47.44%; 两个任务联合训练为 33.49% 和 45.98%; 各自单独训练为 28.42% 和 46.35%.

容量如何耗尽. PackNet 的容量可以直接算出来. 设每个任务剪掉可用权重的比例都是 pp. 第 1 个任务保留 1−p1-p, 释放 pp; 第 2 个任务在剩下的 pp 上训练, 保留 (1−p)p(1-p)p, 释放 p2p^2. 一般地, 第 jj 个任务分到的权重比例和学完 kk 个任务后剩余的空闲比例为

wj=(1−p) p j−1,rk=p k(1)w_j = (1-p)\,p^{\,j-1}, \qquad r_k = p^{\,k} \tag{1}

p=0.75p = 0.75 时, 学完 3 个任务剩 42% 空闲权重, 学完 10 个任务只剩约 5.6%; 第 10 个任务自己只分到约 1.9%. p=0.5p = 0.5 时, 学完 3 个任务只剩 12.5%. 论文的 (0.50, 0.75, 0.75) 方案下, ImageNet 分到 50%, CUBS 分到 0.5×0.25=12.5%0.5\times0.25 = 12.5%, Stanford Cars 分到 0.375×0.25≈9.4%0.375\times0.25 \approx 9.4%, Flowers 约 7.0%, 剩余约 21%. 后面的任务分到的权重按几何级数减少, 但它们可以读取前面所有任务的权重. Table 2 里 Flowers 只用到约 7% 的新权重, 错误率仍与单独训练相差约 1.4 个百分点, 说明后续任务主要依靠前面任务学到的特征. 如果后续任务与前面差别很大, 这些特征帮不上忙, 几何级数减少的新容量就会成为瓶颈. 所以任务数量要事先大致估计, 剪枝比例按它来设.

论文图 3 直接测了任务顺序的影响. VGG-16 的 conv1_1 到 fc7 约有 1.34 亿参数, 第一次 50% 剪枝后约 6700 万空闲; 第二个任务用掉约 1675 万, 剩约 5025 万; 第三个任务用掉约 1300 万, 给第四个任务留约 3700 万. 同一个数据集加入得越晚, 能用的参数越少: Stanford Cars 作为第一, 第二, 第三个新任务加入时, top-1 错误率依次为 16.00%, 18.34%, 19.91%; 对论文的几个数据集, 从第一个加入改为第三个加入, 错误率平均上升 3%. 作者据此建议: 如果能事先决定顺序, 应先加入最难或与其他任务最不相关的任务.

论文还在参数更少的 ResNet-50 (2700 万参数) 和 DenseNet-121 (860 万参数) 上验证了 PackNet (VGG-16 为 1.4 亿). 这些网络含残差连接和 BN, BN 的参数在 ImageNet 剪枝重训后冻结, 错误率仍远低于只训练分类头的基线, 多数情况下与每个任务单独一个网络相差 1 到 2 个百分点. 作者试过为每个任务单独学一套 BN 参数, 效果还会更好, 但为了简单, 也为了省去每个 BN 层额外 4 个向量的存储, 最终选择冻结.

HAT. ### 1.1. 门控与退火

Serra et al. (2018) 的 Hard Attention to the Task 为每个任务 tt, 每一层 ll 学一个任务嵌入 elte_l^t, 门控向量为

alt=σ(s elt)(2)a_l^t = \sigma\big(s\, e_l^t\big) \tag{2}

σ\sigma 是 sigmoid, ss 是正的缩放系数. 层输出按元素乘以门控: hl′=alt⊙hlh_l' = a_l^t \odot h_l. ss 越大, alta_l^t 越接近 0/1 的硬掩码. 训练中 ss 在每个 epoch 内按 batch 线性退火:

s=1smax⁡+(smax⁡−1smax⁡)b−1B−1(3)s = \frac{1}{s_{\max}} + \Big(s_{\max} - \frac{1}{s_{\max}}\Big)\frac{b-1}{B-1} \tag{3}

bb 是 batch 序号, BB 是一个 epoch 的 batch 数. 开始时 ss 很小, 门控接近 0.5, 梯度能顺畅地流向嵌入; 结束时 s=smax⁡s = s_{\max}, 门控接近二值. 推理阶段直接用 smax⁡s_{\max}. HAT 用的是这种退火的 sigmoid 加梯度补偿, 不是 straight-through 估计.

屏蔽旧任务的梯度. 学完任务 tt 后, 把门控按元素取最大值累积:

al≤t=max⁡(alt, al≤t−1)(4)a_l^{\le t} = \max\big(a_l^t,\ a_l^{\le t-1}\big) \tag{4}

训练任务 t+1t+1 时, 连接第 l−1l-1 层单元 jj 和第 ll 层单元 ii 的权重, 梯度按两端单元的累积门控缩小:

gl,ij′=[1−min⁡(al,i≤t, al−1,j≤t)] gl,ij(5)g_{l,ij}' = \Big[1 - \min\big(a_{l,i}^{\le t},\ a_{l-1,j}^{\le t}\big)\Big]\, g_{l,ij} \tag{5}

两端单元都被旧任务用过 (累积门控接近 1) 时, 这条权重的梯度被屏蔽; 只要有一端没被用过, 权重仍可更新. 用 min⁡\min 的理由是: 一条权重只有在输入单元和输出单元都对某个旧任务打开时, 才会影响该旧任务的计算. 若输出单元 ii 对旧任务关闭 (al,i≤t≈0a_{l,i}^{\le t}\approx 0), 旧任务前向时这条权重的结果被门控乘以零; 若输入单元 jj 关闭, 这条权重的输入为零. 两种情况下改动这条权重都不影响旧任务. 屏蔽只作用于反向, 前向时新任务照常读取旧任务的单元, 所以有前向迁移.

梯度补偿与容量正则. ss 很大时, sigmoid 在大部分区间饱和, 嵌入的梯度很小; ss 在一个 epoch 内变化, 梯度的尺度也跟着变. HAT 对嵌入的梯度 qq 做补偿:

ql,i′=smax⁡[cosh⁡(s el,it)+1]s[cosh⁡(el,it)+1] ql,i(6)q_{l,i}' = \frac{s_{\max}\big[\cosh(s\, e_{l,i}^t) + 1\big]}{s\big[\cosh(e_{l,i}^t) + 1\big]}\, q_{l,i} \tag{6}

为了给后续任务留容量, 损失里加一项正则, 惩罚新任务占用旧任务没用过的单元:

R(At,A<t)=∑l∑ial,it(1−al,i<t)∑l∑i(1−al,i<t)(7)R\big(\mathsf{A}^t, \mathsf{A}^{<t}\big) = \frac{\sum_{l}\sum_{i} a_{l,i}^t\big(1 - a_{l,i}^{<t}\big)}{\sum_{l}\sum_{i}\big(1 - a_{l,i}^{<t}\big)} \tag{7}

系数记作 cc. 新任务复用旧任务已经打开的单元不受惩罚, 打开新单元才受罚. 论文取 smax⁡=400s_{\max} = 400, c=0.75c = 0.75, 并报告 smax⁡∈[25,800]s_{\max}\in[25, 800], c∈[0.1,2.5]c\in[0.1, 2.5] 范围内结果都较好.

实验结果. 论文用 8 个图像数据集组成的任务序列, 随机顺序跑 10 次, 用遗忘比 ρ\rho 衡量 (ρ=0\rho = 0 表示没有遗忘, 越负遗忘越多). 学完 2 个任务时 HAT 的 ρ≤2=−0.02\rho^{\le 2} = -0.02, 基线中最好的 EWC 为 −0.08-0.08; 学完 8 个任务时 HAT 的 ρ≤8=−0.06\rho^{\le 8} = -0.06, 最好的基线 PNN 为 −0.11-0.11. 论文据此称遗忘分别减少 75% 和 45%. Permuted MNIST 上 HAT 为 98.6%, SI 为 97.1%; Split MNIST 上 HAT 为 99.0%.

HAT 的掩码单位是神经元, 比 PackNet 的单个权重粗, 存储只需每层每个任务一个嵌入向量. 以一个 4096×40964096\times4096 的全连接层, 10 个任务为例: PackNet 的掩码每个权重需 ⌈log⁡210⌉=4\lceil\log_2 10\rceil = 4 位, 共约 1.68×107×41.68\times10^7\times4 位, 即约 8.4 MB; HAT 每个任务存 4096 个 FP32 嵌入, 10 个任务共约 164 KB. 粒度粗换来的是存储小, 但一个神经元一旦被旧任务打开, 它的全部输入权重 (若上一层对应单元也打开) 都被屏蔽, 新任务能改动的自由度也随之减少. 它同样需要任务标识来选嵌入. De Lange et al. (2022) 的综述只在 Tiny ImageNet 上报告了 HAT, 理由是在更难的设定里, 容量分配不对称和超参数敏感让 HAT 难以使用.

CLNP. Golkar et al. (2019) 的 Continual Learning via Neural Pruning 在固定容量的网络上做神经元级的稀疏化. 训练一个任务时加激活稀疏的正则, 让一部分神经元和滤波器变得不活跃; 后续任务只用这些不活跃的单元训练, 同时读取旧任务的特征, 对旧任务的表现没有任何影响. 论文引入「优雅遗忘」(graceful forgetting) 的概念: 稀疏程度和当前任务性能之间有取舍, 允许在受控范围内损失一点旧任务性能, 换取更多空闲容量. CLNP 还给出一个诊断量: 每个任务剩余和复用的神经元, 滤波器数量. 论文观察到这些数字自动反映了靠前的层的特征更容易迁移. CLNP 与 PackNet 都是剪枝路线, 区别在单位: PackNet 剪单个权重, 掩码要逐权重存储; CLNP 剪神经元和滤波器, 掩码按单元存储, 也更容易转化为实际的计算节省.

SupSup. Wortsman et al. (2020) 的 Supermasks in Superposition 不训练权重. 网络权重 WW 用带符号的 Kaiming 常数初始化后固定, 第 ii 个任务只学一个二值掩码 MiM^i (超掩码), 用 Edge-Popup 算法训练. 推理为

p=f(x, W⊙Mi)(8)p = f\big(x,\ W \odot M^i\big) \tag{8}

每个任务只需存一个与权重同形的二值掩码, 每参数 1 位. SupSup 的特点是可以推断任务标识. 把所有已学掩码按系数 αi\alpha_i 叠加, p(α)=f(x,W⊙∑iαiMi)p(\alpha) = f\big(x, W\odot\sum_i \alpha_i M^i\big), 初始时 αi\alpha_i 相等. 正确任务的掩码通常给出低熵 (高置信度) 的输出, 于是沿熵 H\mathcal{H} 的负梯度更新 α\alpha:

α←α−η ∇α H(p(α))(9)\alpha \leftarrow \alpha - \eta\, \nabla_\alpha\, \mathcal{H}\big(p(\alpha)\big) \tag{9}

论文报告往往一步梯度就能选中正确的掩码, 即使在 2500 个任务 (2500 种 MNIST 置换) 中也是如此. 推断只需对叠加后的网络做一次前向和一次反向, 不用逐个尝试掩码. 一步就能选中的原因可以这样理解: 在所有 αi\alpha_i 相等的点上, 偏导数 ∂H/∂αi\partial\mathcal{H}/\partial\alpha_i 衡量的是「把叠加稍微偏向第 ii 个掩码, 输出熵下降多少」. 取偏导数最负的那个 ii 作为任务标识, 相当于一次比较了全部掩码各自的局部效果. 逐个尝试 TT 个掩码需要 TT 次前向, 梯度方法只需要一次前向和一次反向, 代价与任务数基本无关. 存储方面, 每个任务的掩码每参数 1 位, 2500 个任务就是每参数 2500 位, 约为 FP32 权重本身的 78 倍. 下文提到的 Hopfield 网络存储用于把这部分压到固定大小.

论文定义了三种设定: GG (训练和推理阶段都给任务标识), GN (训练时给, 推理时不给), NNs (训练和推理都不给, 模型需要自己判断何时出现新任务并分配新掩码). 掩码还可以存进一个 Hopfield 网络的吸引子里, 把记忆压缩到固定大小. SupSup 依赖网络足够大, 使得随机权重里存在适合每个任务的子网络. L2P 论文 Table 2 在 Split CIFAR-100 的 Class-IL 上以 ResNet18 运行 SupSup, 平均准确率 28.34%, 同骨干的联合训练上界为 80.41%. 在类别多, 单任务难度高的设定下, 只靠掩码选子网络, 能力有限.

1.2. 容量增长

Progressive Neural Networks. Rusu et al. (2016) 的 PNN 为第 kk 个任务新建一列网络, 之前各列的参数全部冻结. 第 kk 列第 ii 层的输出同时接收本列上一层和之前各列上一层的特征:

hi(k)=f(Wi(k)hi−1(k)+∑j<kUi(k:j)hi−1(j))(9a)h_i^{(k)} = f\Big(W_i^{(k)} h_{i-1}^{(k)} + \sum_{j<k} U_i^{(k:j)} h_{i-1}^{(j)}\Big) \tag{9a}

Wi(k)W_i^{(k)} 是第 kk 列自己的权重, Ui(k:j)U_i^{(k:j)} 是从第 jj 列到第 kk 列的横向连接. 只有 W(k)W^{(k)} 和 U(k:⋅)U^{(k:\cdot)} 参与训练. 论文把线性的横向连接换成非线性的 adapter: 先乘一个可学习的标量 (调整不同列特征的尺度), 再经过一个单隐层 MLP 做降维投影, 以控制横向连接的参数量. 由于旧列不更新, PNN 不会遗忘. 新列可以通过 UU 读取旧列的特征, 所以有前向迁移. 论文的实验在强化学习上进行, 包括 Pong 的变体, 多个 Atari 游戏和 3D 迷宫 Labyrinth, 用迁移分数 (相对单列基线的学习效率) 衡量迁移. PNN 的代价也很直接:

  • 参数增长. 设每列 LL 层, 每层宽 nn, 横向连接取线性形式. 第 kk 列自身约有 Ln2Ln^2 个参数, 横向连接约有 (k−1)(L−1)n2(k-1)(L-1)n^2 个. KK 列合计约为
KLn2+K(K−1)2(L−1) n2(9b)K L n^2 + \frac{K(K-1)}{2}(L-1)\,n^2 \tag{9b}

第二项随任务数二次增长. 10 个任务时横向连接的参数约为各列自身参数的 4.5 倍 (LL 较大时). 论文用降维的 adapter 压缩横向连接, 正是为了控制这一项.

  • 任务标识. 推理阶段要知道用哪一列的输出.
  • 容量利用. 论文附录分析了各列的使用情况, 越往后的列, 新增容量被实际使用的比例越小. 后续任务越来越依赖旧列的特征, 新列的大部分参数是冗余的.

A-GEM 论文 (Chaudhry et al., 2019) 在单遍设定下把 PNN 作为基线. Permuted MNIST 上 PNN 的平均准确率为 93.5%, 遗忘为 0; Split CIFAR 上为 59.2%, 遗忘为 0. 同一张表里 GEM 分别为 89.5% 和 61.2%, 多任务联合训练为 95.3% 和 68.3%. 零遗忘不等于高准确率: Split CIFAR 上 PNN 低于 GEM 和 A-GEM, 每列只用一个任务的数据训练, 单列的表达能力受限.

DEN. Yoon et al. (2018) 的 Dynamically Expandable Networks 在需要时才增加容量. 新任务到来时分三步:

  1. 选择性重训: 用稀疏正则找出与新任务相关的那部分旧神经元和连接, 只重训这一子网络.
  2. 动态扩展: 如果重训后损失仍高于阈值, 给每层增加若干神经元, 再用稀疏正则剪掉用不上的部分.
  3. 拆分与复制: 检查每个神经元在重训前后的变化, 变化过大说明它的语义漂移了, 就把它复制一份: 旧副本留给旧任务, 新副本给新任务. 每个神经元记录加入时的时间戳, 推理阶段任务 tt 只使用时间戳不晚于 tt 的神经元.

论文报告 DEN 的参数量为单独训练各任务网络的 11.9% 到 60.3%. 它比 PNN 省参数, 因为只有新任务真正需要时才扩展, 而且扩展后会剪枝. 代价是三个步骤各有阈值和正则系数, 调参复杂.

Expert Gate. Aljundi et al. (2017) 的 Expert Gate 为每个任务训练一个专家网络, 再配一个单层的欠完备自编码器作为门控. 自编码器只用该任务的训练数据训练, 把输入映射到一个低维子空间. 推理阶段, 每个自编码器重建输入, 重建误差最小的那个任务的专家负责预测. 任务标识由门控推断, 不需要外部提供; 而且同一时刻只需把一个专家载入显存. 推断的计算量随任务数线性增长, 每来一个输入都要过一遍全部自编码器; 自编码器只有一层, 比专家网络小得多, 这部分开销在任务数不多时可以接受. 门控选错时, 输入被交给一个从未见过这类数据的专家, 结果通常接近随机, 所以门控的准确率是整个系统准确率的上限.

自编码器还用来估计任务相关性. 新任务到来时, 用各旧任务的自编码器在新数据上的重建误差衡量相关程度, 选最相关的旧专家作为新专家的初始化, 并据此决定用微调还是 LwF 训练新专家. Expert Gate 的参数量随任务数线性增长, 每个任务一个完整专家. 它也不是一个共享模型: 专家之间没有参数共享, 迁移只发生在新专家初始化时.

统一机制: 从任务掩码到可达参数子空间. 硬参数隔离的数学形式. 把一个有 LL 层的网络参数记为 θ={Wl}l=1L\theta={W_l}{l=1}^{L},其中全连接层 Wl∈Rdl×dl−1W_l\in\mathbb R^{d_l\times d{l-1}}.任务 tt 的二值权重掩码为 Ml(t)∈{0,1}dl×dl−1M_l^{(t)}\in{0,1}^{d_l\times d_{l-1}},前向使用

hl(t)=ϕl ⁣((Wl⊙Ml(t))hl−1(t)+bl(t)).(10)h_l^{(t)}=\phi_l\!\left((W_l\odot M_l^{(t)})h_{l-1}^{(t)}+b_l^{(t)}\right). \tag{10}

hl−1(t)∈Rdl−1h_{l-1}^{(t)}\in\mathbb R^{d_{l-1}} 是该层输入,ϕl\phi_l 是激活函数.硬隔离要求后续训练不能改变旧任务前向所依赖的任何状态.若 Fl(<t)F_l^{(<t)} 表示此前任务已经占用的权重,训练任务 tt 时梯度应满足

∇WlLt←(1−Fl(<t))⊙∇WlLt.(11)\nabla_{W_l}\mathcal L_t \leftarrow (1-F_l^{(<t)})\odot\nabla_{W_l}\mathcal L_t. \tag{11}

式 (11) 只保护矩阵权重还不够.偏置 blb_l,LayerNorm/RMSNorm 的缩放参数,BN 的运行均值与方差,分类头以及 optimizer state 都可能改变旧任务输出.严格的零遗忘判断是:对任意旧任务输入 xx,学习新任务前后的函数 ft(x)f_t(x) 完全相同.只要共享状态仍会更…9435 tokens truncated…阻止合理专长集中.

模块选择器自身可采用原型、判别网络或生成似然. 原型距离简单, 高维空间的尺度与表示…368 tokens truncated…新增占用产生大惩罚. 这会使后期任务偏向复用旧单元, 即使复用产生冲突. 报告每层剩余容量与正则梯度, 可以观察瓶颈是否集中在某层. 门控温度退火还与训练长度耦合. batch 数少时 ss 尚未升到硬门控, 推理离散化误差大; batch 数多时门控早早饱和, 后续难以调整. 以训练进度比例退火在不同数据量任务上保持形状, 绝对更新次数仍影响优化. SupSup 的随机底座需要多个初始化重复. 某次随机网络恰好包含好子网, mask 方法表现高; 另一次可能没有足够特征. 只重复 mask 初始化、固定底座, 会低估主要方差. 底座种子应作为最高层随机变量之一.

子网络数量增长时, mask score 存储与搜索时间增加. 若无任务 ID, 每次输入对所有 mask 计算熵, 推理成本随任务数线性增长. 近似检索候选 mask 可降低成本, 候选召回成为新瓶颈. 报告 oracle 候选上限与真实检索差距. PNN 的横向连接允许新列读取全部旧列, 旧列冻结保证其原任务函数不变. 新列数量增长后, 输入维度与横向参数近似二次增长. 即使参数存得下, 每次训练新任务要运行所有旧列, 计算也随任务数增长. 稀疏选择旧列能缓解, 又引入路由. 旧列输出是否仍有用取决于接口. 各列独立归一化和激活尺度变化, 新列学习横向权重可以适配; 底层环境或预处理更新后, 冻结列可能整体失配. 零遗忘只相对原输入分布成立, 域变化仍会降低旧列性能.

DEN 的扩展、复制和选择性重训练试图在增长与共享之间折中. 触发扩展的损失阈值若用当前训练损失, 数据噪声会制造新神经元; 若用验证损失, 需要独立数据. 新增单元后再做稀疏化, 结构会受超参数顺序影响. 大模型 adapter 的路由有时由自然语言任务描述完成. 描述本身是额外任务标识, 与仅给输入的 Class-IL 不同. 报告 prompt 是否含任务名、示例或工具说明, 否则“无需任务 ID”可能只是把 ID 换成文字. adapter fusion 在冻结多个 adapter 后学习注意力组合. 融合层用哪些任务数据训练, 决定能否泛化到未见组合. 若使用所有目标任务验证集, 它属于联合后处理; 在线持续场景只能用已见数据更新, 还要保护旧融合权重.

LoRA 的 rank 不等于实际功能维数. BB 或 AA 可能秩亏, 不同列高度相关. 报告奇异值谱和有效秩, 能判断增加 rank 是否增加可用容量. rank 很高但谱集中时, 存储增加没有带来新方向. 两个 LoRA 参数矩阵的 Frobenius 正交也受缩放不唯一性影响: BA=(cB)(A/c)BA=(cB)(A/c). 只约束 BB 可通过缩放改变惩罚而不改函数. 对完整更新 ΔW\Delta W 约束, 或固定因子范数, 才能减少这种自由度. 任务向量合并时, 符号冲突表示同一坐标增量方向相反, TIES 等方法会裁剪和选符号. 坐标冲突不一定等于功能冲突, 参数对称性仍在. 合并后必须在各任务和通用保持集上验证, 不能由向量几何直接推出无遗忘.

MoE 专家参数可能保持不变, 共享注意力、嵌入和路由器仍更新. 旧任务退化可以来自共享层漂移, 专家冻结只隔离部分参数. 对共享层冻结/更新做四格消融, 再用旧路由回放, 能定位遗忘来源. MoE 增加专家后, 总参数增长但每 token 激活参数近似固定. 这是容量增长与计算增长解耦的优势. 路由、通信和负载均衡仍增加系统成本, 专家分布跨设备时网络通信会成为瓶颈. 只报告激活 FLOPs 会漏掉这些开销. 统计分析应以任务顺序、结构初始化和路由初始化分层. 动态架构的随机性不只来自 SGD. 多个 seed 若共享同一增长决策, 无法估计结构搜索方差. 保存每次运行的模块谱系, 比较相同分数是否来自相同结构.

模块数量是随时间变化的中介变量. 方法后期准确率高, 可能因为增长更多, 也可能因为分配更好. 在相同模块数下比较, 或将参数量作为协变量画前沿. 事后把最优增长运行与固定小模型比较会夸大算法收益. 可证伪的容量主张应预测干预结果. 若声称任务共享某模块, 删除模块应同时伤害这些任务; 若声称新模块解决冲突, 禁止增长时新任务下降且旧任务保持; 若声称路由学习了任务身份, 表面风格变化后仍应选择相同模块. 预测不兑现时, 需要降低机制结论.

最终验收可以用一张矩阵完成. 行是任务和分布变体, 列是 oracle 路由、真实路由、随机路由、单模块删除、共享层冻结和容量匹配基线. 每个格子同时记录准确率、参数、激活计算和延迟. 这张矩阵把模块能力、路由、共享干扰和资源增益拆开. 长期模块系统还需要版本语义. 模块声明依赖的底座版本、输入表示、输出接口和其他模块. 升级底座或删除依赖时, 先运行兼容测试. 将模块看成可组合软件组件, 参数隔离才真正带来可维护性; 只保存一堆权重文件会把问题推迟到部署阶段.

容量增长的上限最终来自可管理性. 理论上每个任务一套网络能消除参数遗忘, 实际上存储、加载、路由、验证和删除成本随任务增加. 动态架构的目标应是用最少新容量获得无法由共享参数实现的增量, 同时保持模块边界可验证. 当任务高度相关、底座强且更新小, 共享参数或单个 adapter 往往更高效; 当任务冲突明确、任务身份可靠, 硬隔离最清楚; 当身份未知且技能可组合, 稀疏专家和软路由更灵活, 也最依赖路由证据. 方法选择由任务结构决定, 不能由“零遗忘”一个指标决定.

“零遗忘”还要注明测量范围. 冻结旧模块确保参数位不变, 旧任务端到端表现仍可能因预处理、tokenizer、共享嵌入、归一化统计和路由变化而下降. 只有将完整旧路径冻结, 才能给出结构性不变保证; 完整冻结又阻断所有共享迁移. 输入接口的微小变化也会破坏隔离. tokenizer 新增 token 改变嵌入表, 图像分辨率变化改变位置编码, 工具 schema 更新改变提示格式. 任务模块依赖旧接口时, 它的参数没有遗忘, 功能仍失效. 回归测试应覆盖接口版本, 不能只比较模块文件哈希.

输出空间扩展同样存在共同分母问题. 每任务独立头在 Task-IL 下互不干扰; Class-IL 把头拼接后, 新头 logits 尺度可能更大, 旧样本被判成新类. 冻结旧头无法校准新旧头. 需要联合样本、偏置校正或共享能量标尺, 这会重新引入跨任务数据. 多头系统还可能重复语义类别. 两个任务分别包含“汽车”, 独立头产生两个标签, 合并时要决定它们相同、层级相关还是上下文不同. 这个 ontology 对齐问题无法由掩码解决. 模块边界若与语义边界不一致, 路由和输出合并都会产生歧义.

共享表示冻结得太早会产生表示债务. 早期任务只需简单特征, 后续任务需要更丰富底层表示, 私有高层模块无法补偿缺失信息. 允许底座小幅更新并对旧模块做适配, 或周期性重训共享层, 能偿还债务, 同时放弃严格参数隔离. 可用线性探针判断债务. 在冻结底座上训练充分容量的新头仍表现差, 说明必要信息未进入表示; 增加更多任务 adapter 收益有限. 解冻底座后新任务提高、旧任务下降, 则共享表示成为真正冲突点. 这比盲目扩大 adapter rank更有诊断性.

反过来, 底座已经包含能力时, 动态扩展可能只是记住任务格式. 将提示、标签名称和输出格式统一后再测, 若新模块优势消失, 它没有学到新的语义能力. 模块参数量应与它承担的新增信息相匹配. 模块复用常用相似任务搜索. 用最终表示计算相似度会使用新任务训练后的信息, 在线选择时不可得. 应在扩展决策时记录当时可见特征, 区分在线决策与事后 oracle. oracle 复用上限高、在线策略低, 瓶颈在任务相似度估计. 相似度也可能非对称. 任务 A 学到的通用特征帮助 B, B 的窄特征未必帮助 A. 对称余弦无法表达这种方向性. 用“从 A 初始化 B 节省多少样本”定义迁移价值更直接, 成本是需要试训. 小规模探针训练可近似, 也要计入结构搜索预算.

专家选择还可以采用后验模型平均. 与其固定一个路由, 保留多个模块假设并随证据更新. 这能表达不确定性, 计算随候选数增加. 当后验长期多峰, 强制选择单任务身份会损失真实歧义. 软组合应在校准指标上评价, 不只看 top-1. 开放流中任务边界可能根本不存在, 分布连续变化. 为每个微小变化新建模块会无限增长. 更合适的是让模块参数随上下文连续插值, 或用少数基模块组合. 此时“任务数”不再是容量单位, 需要按分布覆盖和函数复杂度计量.

连续插值也有外推风险. 两个已知域之间的门控插值可能有效, 域外输入的权重组合没有训练依据. 在插值区间与外推区域分别评测, 路由置信度需要随距离下降. 高置信外推是软路由常见失败. 动态网络的训练稳定性应包含结构事件. 新建、合并、剪枝或路由切换发生时, 损失可能瞬间变化. 保存事件前后 checkpoint, 测即时冲击和恢复时间. 只看阶段末结果会漏掉部署期间的短暂严重退化. 结构事件也会改变优化器状态. 新参数没有动量, 旧参数带有历史矩; 合并参数后原优化器矩如何组合没有唯一答案. 清空全部状态影响旧模块, 只初始化新参数造成学习速率不一致. 报告状态处理规则并做消融.

混合精度与量化增加另一层隔离误差. 冻结量化底座、训练高精度 LoRA, 合并到量化权重时会发生舍入; 不合并则推理保留额外矩阵. 多 adapter连续合并的量化误差会累积. 在合并前后分别评测, 区分算法干扰与数值误差. 模块库的检索元数据也会遗忘. 任务描述、原型和路由 key 由旧模型编码, 底座升级后新查询嵌入空间变化, 最近邻失效. 保留旧编码器用于路由增加成本, 重编码所有 key 需要原始任务数据. 版本化嵌入空间是外部记忆与模块系统的共同问题.

对用户个性化 adapter, 数据极少、任务数极多. 每用户独立模块稳定但难以训练, 全局共享高效却可能泄漏用户信息. 分层模型用群体 adapter、用户低秩残差与权限隔离折中. 评测要同时看个性化增益、跨用户泄漏和冷启动. 模型遗忘之外还有模块发现遗忘. 旧模块仍完好, 路由 key 被新任务覆盖, 系统再也选不到它. 将 oracle 路由与真实路由长期差距画出来, 能识别这种“记得但找不到”. 外部索引回放与路由器持续训练可修复, 需要保存旧查询分布. 容量淘汰也要考虑组合中心性. 一个模块自身任务频率低, 却被许多后续组合依赖, 删除影响很大. 仅按直接调用频率淘汰会破坏模块图. 可用依赖入度、反事实删除损失和恢复成本共同估值.

冷存储恢复时间属于性能. 很少使用的模块移到磁盘节省显存, 突然请求时需要加载; 实时系统可能超时. 报告热缓存命中、P50/P99 延迟与恢复正确率, 参数容量前沿才完整. 模块可靠性还取决于训练数据的归属. 同一条样本可能同时训练共享骨干、路由器和任务 adapter, 删除请求要追踪三个位置. 只删除 adapter 无法撤回共享更新, 只重训骨干又会改变所有模块接口. 将数据—参数依赖写入谱系, 才能估计删除范围. 当多个模块由不同团队或时间开发, 接口契约必须包含输入规范化、隐藏维度、输出语义和校准范围. 参数 shape 相同不代表能够组合. 在接入库前运行契约测试, 用固定探针检查尺度、缺失值和分布外行为, 能减少隐形耦合.

知识产权和授权也会限制模块组合. 某个 adapter 可在特定底座上运行, 未必允许与另一个模块合并或再分发. 技术评测中的“可合并”只描述函数与参数, 部署还需满足数据和许可边界. 模块元数据应把这些约束与性能一起保存. 对抗环境下, 恶意模块可以操纵共享激活或路由, 影响没有直接选择它的请求. 冻结参数不能阻止前向时产生极端值. 在组合层做幅度限制、异常检测和模块沙箱, 再用恶意 adapter 压力测试跨模块隔离. 安全隔离比梯度隔离要求更强.

灾难性遗忘的统计也要改写为模块级事件. 旧任务下降时, 记录专家函数变化、路由变化、共享底座变化和输出校准变化. 四者可通过冻结/交换实验拆开. 只看旧模块参数是否变化会把三种系统级遗忘漏掉. 样本级转移矩阵提供更细证据. 对每个旧样本记录更新前后是否正确、oracle 与真实路由、所选模块和置信度. 若 oracle 始终正确、真实路由从正确变错误, 遗忘集中在路由; oracle 也错, 专家或共享表示已经退化. 汇总到任务均值会丢掉这种因果分层.

参数增长方法的置信区间应以完整训练运行为单位. 模块数是数据依赖随机变量, 不能把同一运行中的模块当独立样本. 多个任务顺序可能得到不同结构与参数量, 同时报告性能和规模分布. 只挑一个结构最小且分数最高的运行属于双重选择. 结构搜索会多次查看验证集, 产生选择偏差. 尝试越多扩展、合并和路由配置, 观测最好分数越乐观. 记录候选数, 用独立密封集评估最终结构. 将人手调的架构与自动增长比较时, 两边应获得相近搜索预算.

参数效率常用“每任务新增百分比”报告, 分母若是巨大的冻结底座, 数字会显得很小. 绝对字节、任务数增长曲线和激活计算更直观. 一个 0.1% 的百亿参数模型 adapter 仍有千万参数, 一万个任务无法忽略. 功能容量也不能由参数数目直接推断. 共享底座提供大量固定特征, 小 adapter 能组合出复杂函数; 从头训练同参数量模块可能完全不够. 比较 adapter 方法时应固定底座, 比较整体系统时再把底座存储与预训练成本列出. 动态架构可能把训练成本推迟到评测. oracle 任务 ID 让每次只运行一个模块, 未知任务需要遍历多个专家或计算所有原型. 任务数增长后评测成本上升, 即使训练稳定. 延迟随任务数的曲线是扩展性指标.

近似最近邻、层级路由或两阶段筛选可把检索从线性降到次线性. 近似索引会漏掉正确模块, 层级上层错误会阻断下层. 报告候选召回和最终准确率, 不把索引误差归到专家能力. 模块合并后的可逆性也要保留. 若只保存合并结果、删除源模块, 发现负迁移后无法恢复. 保留源增量和合并配方占更多存储, 却支持回滚与重新加权. 长期系统应把合并视为可版本化变换, 不把它当不可逆压缩. 定期蒸馏模块库到新底座可以控制增长. 蒸馏数据决定哪些模块行为被保留, 长尾模块最容易消失. 蒸馏前后逐模块 oracle 测试、组合测试和路由测试, 能区分知识压缩与路由重建的损失. 若保留全部蒸馏数据, 存储问题又转移到数据层.

参数隔离最强的保证是局部的: 某组冻结坐标不会因梯度改变. 从这个保证到“任务能力永久保持”, 中间还隔着输入接口、共享参数、路由、校准和外部环境. 将保证写到准确层级, 才能知道还需要哪些回归测试. 最终选择可由三条曲线决定. 第一条是性能随任务数, 看能力是否持续; 第二条是参数与延迟随任务数, 看系统是否可扩展; 第三条是 oracle—真实路由差距, 看模块发现是否跟得上容量增长. 三条同时稳定, 动态架构才真正解决了长期学习问题, 否则只是把遗忘移动到容量或路由层.

这三条曲线还要与固定大模型、回放和正则化基线并列. 固定大模型说明额外容量本身的收益, 回放说明旧数据能否修复共享干扰, 正则化说明限制更新能否达到相同保持. 动态架构只有在相近资源下越过这些参照, 并且模块干预符合预期, 才支持“结构分配优于单纯扩大或冻结”的结论.

面对新数据流时, 任务身份是否可得、冲突能否由共享表示吸收, 共同决定是否增长. 身份可靠且冲突强, 隔离有清晰收益; 身份模糊时先解决路由证据; 冲突弱时优先共享, 避免为每次轻微分布变化永久增加模块. 这样可以减少容量被早期错误判断耗尽.

2. 参考文献

  1. Rusu, A. A., et al. (2016). Progressive Neural Networks. arXiv:1606.04671.
  2. Mallya, A., & Lazebnik, S. (2018). PackNet: Adding Multiple Tasks to a Single Network by Iterative Pruning. CVPR 2018.
  3. Serra, J., Suris, D., Miron, M., & Karatzoglou, A. (2018). Overcoming Catastrophic Forgetting with Hard Attention to the Task. ICML 2018.
  4. Golkar, S., Kagan, M., & Cho, K. (2019). Continual Learning via Neural Pruning. arXiv:1903.04476.
  5. Wortsman, M., et al. (2020). Supermasks in Superposition. NeurIPS 2020.
  6. Yoon, J., Yang, E., Lee, J., & Hwang, S. J. (2018). Lifelong Learning with Dynamically Expandable Networks. ICLR 2018.
  7. Aljundi, R., Chakravarty, P., & Tuytelaars, T. (2017). Expert Gate: Lifelong Learning with a Network of Experts. CVPR 2017.
  8. Chaudhry, A., Ranzato, M., Rohrbach, M., & Elhoseiny, M. (2019). Efficient Lifelong Learning with A-GEM. ICLR 2019.
  9. De Lange, M., et al. (2022). A continual learning survey: Defying forgetting in classification tasks. IEEE TPAMI.
  10. Wang, Z., et al. (2022). Learning to Prompt for Continual Learning. CVPR 2022.