持续学习的概念
“持续学习”的概念其实非常好理解,正如我们先后学习高数和线代,我们希望在学习线代的时候仍能够记住之前学的高数内容,同时用高数的思想来帮助理解和学习线代,这就是一种持续学习的能力。那我们也希望神经网络可以跟人一样具备这种能力,对多个任务不断学习,而不是再为每个任务训练一个网络。这种能力概括起来就是以下两点:
- 可塑性(学习新知识的能力):应用从之前任务学习到的经验,以更快更好地学习当前任务;
- 稳定性(旧知识的记忆能力):学习当前任务时,不会忘记之前已经学会的任务。
持续学习面对的挑战
然鹅,传统的神经网络要实现这一目标并不容易。试想一下,我们针对某一任务训练神经网络,其实就是把从这个任务提取出来的知识以参数的形式记录在每个神经元上,而如果把这个训练好的网络拿去学习另一个任务,那所有的参数都会被覆盖,也就是说我们辛辛苦苦训练好的模型最后只变成了一套初始化参数。这就是“持续学习”中的一大难题:灾难性遗忘 除此之外,要将持续学习部署到现实世界中,还有许多问题需要解决。首先,在实际场景中,模型需要学习的任务可能很多。在“终身学习”的环境中,模型甚至需要在无限的任务上不断地训练。然而,由于“灾难性遗忘”和“关于内存的使用和计算的效率”,传统的持续学习方法对大量任务的“可扩展性”尚未得到验证。 另一个重要但相对较少研究的问题是“任务顺序敏感性”问题。由于①“灾难性遗忘”导致模型偏移以及②知识只能从前一个任务向后一任务单向转移(不能用后一任务的知识辅助训练前一任务),模型在多个任务上的训练顺序对其在每个任务上的性能存在巨大影响。如果任务之间的公平性很重要(例如疾病诊断),这种顺序敏感性问题就不容被忽视。 综上,持续学习面对的主要挑战有三个,分别是灾难性遗忘,关于内存的使用和计算的效率,任务顺序敏感性。
Continual Learning With Additive Parameter Decomposition
针对上述问题,ICLR 2020的一篇文章《SCALABLE AND ORDER-ROBUST CONTINUAL LEARNING WITH ADDITIVE PARAMETER DECOMPOSITION》提出了一种新的持续学习方法,名为 Additive Parameter Decomposition(APD)。 APD将目标网络各层的网络参数分解为 task-shared and sparse task-specific parameters with small mask vectors。当任务每次到达带有 APD 的网络(APD - net)时,网络可以利用 task-shared parameters 进行学习,并使用 sparse task-adaptive parameters 学习 task-shared parameters 无法解释的增量差异。这里相当于把每一层模型的参数分解为 “所有任务共享的参数集” 以及“ 某一任务独有的参数集(该参数集具有稀疏性)”。 而由所有任务共享的 task-shared parameters 可能无法考虑到某几个任务间具有的一些共识知识,这将导致 sparse task-specific parameters 中存在冗余信息。文章进一步对 sparse task-adaptive parameters 进行聚类,获得 hierarchical shared parameters。 这段话举个例子就很好理解了,比如现在有三个任务 A(x, y, z)、B(x, y)、C(x, u),括号内分别为三个任务所带有的知识,现在根据 APD,task-shared parameters 就应为 x(理想情况下为 x,实际上还可能会有 y、z、u 的一项或多项),任务 A、B、C 的 sparse task-adaptive parameters 分别为 A: (y, z), B: (y), C: (u),可以看到,任务 A 和 B 的 sparse task-adaptive parameters 具有冗余项 y(共识知识),为了进一步减少内存占用,文章对 sparse task-adaptive parameters 进行了层次聚类。
公式化理解
带着上面的概念,我们进一步由浅入深地用公式理解 ADP。
ADP
将模型参数 θ 分解为 task-shared parameter matrix: σ 和 task-adaptive parameter matrix: τ,对于任务 t ,其模型参数
θ
t
=
σ
?
M
t
+
τ
t
θ_t = σ ? M_t + τ_t
θt?=σ?Mt?+τt?,其中其中 mask vectors
M
t
M_t
Mt?作为 task-shared parameter 的 attention,引导学习者只关注与每个任务相关的部分。 当一个新任务到来时,可以适当地更新共享参数 σ,但不要偏离之前的共享参数
σ
(
t
?
1
)
σ^{(t-1)}
σ(t?1)。令
τ
t
τ_t
τt? 尽可能稀疏,以减少内存占用并提高计算效率。分解后的参数模型的目标函数如下: 其中,L 为损失函数,
∣
∣
?
∣
∣
1
|| · ||_1
∣∣?∣∣1? 为
l
1
l_1
l1? 范数。mask vectors
M
t
M_t
Mt? 是一个具有可学习参数
v
t
v_t
vt? 的 sigmoid 函数,该函数应用于每一层的输出通道或 σ 的神经元。 ADP 还要一个好处是,通过 task-adaptive parameter matrix 这一参数,每个任务可以有它的专属参数,模型在训练其他任务时不会改变其他任务的专属参数,这一在一定程度上缓解了“灾难性遗忘”这一问题。
Order Robust Continual Learning with Retroactive Parameter Updates
看到这里,或许有人发现虽然 task-adaptive parameter matrix 这一参数可以保持不变,但是 task-shared parameter 是随着新的任务一直在更新的呀,这不就进一步加剧了“灾难性遗忘”吗?而且还加剧了模型的“任务顺序敏感性”?是的没错,确实存在这两个问题。因此文章提出选择 “追溯更新过去任务的 task-adaptive parameter,以反映每个训练步骤的 shared parameter 的更新,使所有以前的任务都能保持原来的解。”(其实就是通过更新 task-adaptive parameter 来限制 task-shared parameter 的偏移,这不仅可以缓解“灾难性遗忘”,还可以降低模型的“任务顺序敏感性”) 公式化来讲就是,当一个新任务 t 到来时,我们先恢复所有之前的参数(
θ
i
θ_i
θi? for task i < t):
θ
i
?
=
σ
(
t
?
1
)
?
M
i
(
t
?
1
)
+
τ
i
(
t
?
1
)
θ_i^* = σ^{(t-1)} ? M_i^{(t-1)} + τ_i^{(t-1)}
θi??=σ(t?1)?Mi(t?1)?+τi(t?1)?,然后在限制
σ
?
M
i
+
τ
i
σ ? M_i + τ_i
σ?Mi?+τi? to be close to
θ
i
?
θ_i^*
θi?? 的条件下更新
τ
1
:
(
t
?
1
)
τ_{1:(t-1)}
τ1:(t?1)?。所以对于这个新来的任务 t ,它的目标函数为:
Hierarchical Knowledge Consolidation
最后一个问题就是前面提到的, task-shared parameters 可能无法考虑到某几个任务间之间的一些共识知识,进而加剧了内存占用。因此文章提出以聚类的方式来聚合这些共识知识。 如上图所示,首先将所有任务通过 K-means 对
{
τ
i
}
i
=
1
t
\{τ_i\}_{i=1}^t
{τi?}i=1t? 进行聚类,将所有任务聚成 K 个集合
{
G
g
}
g
=
1
K
\{G_g\}_{g=1}^K
{Gg?}g=1K?,然后通过计算每个参数的 value discrepancy,将属于同一集合的任务的 task-adaptive parameters 分解成 locally-shared parameters:
σ
g
σ_g
σg?-hat 和 task-adaptive parameters:
{
τ
i
}
i
∈
G
g
\{τ_i\}_{i∈G_g}
{τi?}i∈Gg?? (这里的
τ
i
τ_i
τi? 变得更加稀疏)。计算公式如下,其中
τ
i
,
j
τ_{i,j}
τi,j? 代表第 i 个 task-adaptive parameter matrix 的第 j 个元素,
μ
g
μ_g
μg? 是
G
g
G_g
Gg? 的聚类中心。 为了提高效率,每训练 s 个任务后再更新 locally-shared parameters:
σ
g
σ_g
σg?-hat,更新的方式是通过执行 K-means,以之前的 locally-shared parameters:
σ
g
σ_g
σg?-hat 为每个集合初始化聚类中心。同时需要将质心的数量增加到 K + k,以解释任务间方差的增加(随着任务数量的增多,方差必然增大,那么聚类中心肯定也得随之增加)。
final objective function and Algorithm
综上我们可以得到最终的目标函数如下: 以式 (3) 作为目标函数的 ADP 持续学习伪代码如下 :
确实🐂🍺:ADP的附加优势:Selective task forgetting
在实际场景中,随着我们不断训练模型,一些早期学习的任务可能变得无关紧要。例如,当我们在训练 “产品识别模型” 时,不再需要识别已停产的产品。在这种情况下,我们可能想要忘记之前的任务,以保证网络能够继续学习后续的任务。然而,现有的持续学习方法并不能有效地处理这个问题,因为一些特征或参数的去除也会对后面的任务产生负面影响,因为它们的参数是相互纠缠的。而在 APD 中,可以通过删除 task-adaptive parameters:
τ
t
τ_t
τt?来实现任务 t 的遗忘,并且,这对其余任务的 task-adaptive parameters 绝对没有影响。
|