前段时间忙着本科毕业工作还有投稿的工作耽搁了,现在开始恢复更新啦~
今天看的一篇是基于动态架构的持续学习论文,论文地址点这里。
持续学习致力于以增量方式学习新的数据或任务,并且不会出现灾难性遗忘。最早的方法考虑了机遇正则化的策略(如EWC),其通过考虑网络中的重要权重来保存旧知识,但这种方法会使得这些权重无法处理好新的任务。第二种方法是基于记忆重放(GEM),通过保存一部分旧的样再之后配合新样本一起训练,然而如果后续任务的不相关,则模型会陷入stability-plasticity(稳定性-可塑性)问题。最近,参数隔离(如FedWEIT使用了掩码来隔离参数)成为增量学习的新趋势,因为不同的任务可能需要不同的参数或网络结构,从而避免任务之间的干扰。然而,如果要处理大量任务,主干模型的容量往往会饱和,从而限制了增量框架的丰富组合性。
还有一种持续学习的方法称为动态的模型架构,其通过为新任务增加新的分支来进行扩展。早期的动态架构采取固定(线性)增加方式,但这样会增加内存和计算的压力,如下图的(a)。为了改善这样的情况,会对动态的模型进行修剪,如图(b)所示,但这也就导致了其他的问题,例如为了寻找到更好的结构却增大了搜索空间。此外,它们都将学习过程分为多个阶段:首先定义每一个任务的网络进行训练。然后,重新训练策略严重依赖于额外的超参数,导致过多的计算成本。这些方法很难应用于资源受限的场景,如移动设备或视频监控摄像机。
因此一个好的动态架构满足三点:(1) stability-plasticity(稳定性-可塑性)(2) 轻量级的参数规模 (3)较少的额外成本。针对于此本文提出了一种端到端可训练的自适应可扩展网络(E2-AEN),以实现全局优化,如图©。该方法由一系列AES(自适应扩展架构)组成,简单来说就是每个AES能够跟新任务生成新的架构去应对,并且采用高效的方式去实现这个架构。
在持续学习中,一系列任务
{
t
a
s
k
1
,
.
.
.
,
t
a
s
k
N
}
\{task_1,...,task_N\}
{task1,...,taskN}逐渐到来。对于每一个任务,数据集可以表示为
D
i
=
{
x
j
,
y
j
}
j
=
1
N
i
D_i=\{x_j,y_j\}^{N_i}_{j=1}
Di={xj,yj}j=1Ni,
x
j
x_j
xj表示为原始的数据特征,
y
j
y_j
yj表示每一个数据特征对应的标签,
N
i
N_i
Ni表示在第
i
i
i个任务上的数据规模。为了能够不断地学习这些任务,我们的目标可以定义为:
y
i
=
Φ
(
x
i
;
Θ
s
,
Θ
i
t
)
y_i=\Phi(x_i;\Theta^s,\Theta^t_i)
yi=Φ(xi;Θs,Θit),其中
Θ
s
\Theta^s
Θs表示为任务共享参数,
Θ
i
t
\Theta^t_i
Θit表示为特定任务参数。因此目标函数可以表示为:
L
=
∑
i
=
1
N
L
i
(
Θ
i
t
;
Θ
s
,
D
i
)
(1)
\mathcal{L}=\sum^N_{i=1}\mathcal{L}_i(\Theta^t_i;\Theta^s,D_i) \tag{1}
L=i=1∑NLi(Θit;Θs,Di)(1)
其中
L
i
\mathcal{L}_i
Li表示为第
i
i
i个任务的损失函数。
本文提出的端到端可训练自适应扩展网络(E2-AEN)可以取代基于基本自适应扩展机制的阶段式优化。它是通过一系列称为自适应可扩展结构(AES)的轻量级模块与基础网络一起实现的,对应于下图所示的每个特定任务。AES有两种可能的状态,活动和非活动。当状态处于活动状态时,功能适配器将冻结主干,以适应新任务,否则将跳过特征适配器,从而节省一些不必要的计算和参数,这是自适应和高效的。
因此给定第
j
j
j个卷积模块
H
j
H_j
Hj,那么在第
i
i
i个任务上的第
j
j
j个使用AES的卷积模块的前向传播可以表示为:
F
i
,
j
=
H
j
+
A
i
,
j
(
H
j
)
(2)
F_{i,j}=H_j+\mathcal{A}_{i,j}(H_j) \tag{2}
Fi,j=Hj+Ai,j(Hj)(2)
其中
A
i
,
j
\mathcal{A}_{i,j}
Ai,j是一个可微分的AES模块。
提出的AES有两个关键组件:设计的特征适配器和基于自适应的剪枝策略,如下图所示。功能强大的特征适配器,其操作表示为
D
(
⋅
)
\mathcal{D}(·)
D(⋅),负责将先前学习的表示扩展到新概念空间,并有效避免任务干扰。它使得主干参数被冻结,因此在之前的任务中不会出现遗忘现象。基于自适应门的修剪策略(gate-based)致力于减少特征适配器带来的冗余参数,使框架更高效,其操作表示为
G
(
⋅
)
\mathcal{G}(·)
G(⋅)。得益于基于门的修剪策略(gate-based),AES能够确定是否需要在某个卷积层中执行功能适配器,还是可以跳过它,因此(2)可以变为:
F
i
,
j
=
H
j
+
G
i
,
j
(
D
i
,
j
(
H
j
)
)
⋅
D
i
,
j
(
H
j
)
(2)
F_{i,j}=H_j+\mathcal{G}_{i,j}(\mathcal{D}_{i,j}(H_j))\cdot\mathcal{D}_{i,j}(H_j) \tag{2}
Fi,j=Hj+Gi,j(Di,j(Hj))⋅Di,j(Hj)(2)
其中
G
(
⋅
)
∈
{
0
,
1
}
\mathcal{G}(·) \in\{0,1\}
G(⋅)∈{0,1}。
在看论文中发现作者对很多地方都添加了东西,为了方便理解我这里简单的说明一下。首先本文是基于动态架构的持续学习,因此每一个任务到来时都会有生成新的空间给他训练,在训练过程中作者设计了一个门的结构,也就是不是每次都添加所有的层(这里所有的层指的是所有的CNN)。因此现在就有两个问题:一是如何添加层,二是如何控制每个任务选择不同的层。首先第一个问题,作者在每一个CNN上连接了一个特殊的卷积块,基本的卷积块加上这一部分形成了新的空间——该任务的特征空间;第二问题则是会对添加的这一部分转换成一个0或1的值,经过转换后来确定是否进行激活。上述两个问题分别对应于特质适配器和自适应门修剪。为了进一步缩小使用量,作者在损失函数上添加了其余的东西。首先作者说明可以对特征适配器上的参数进行修剪,这里就是尽量使得整个参数稀疏,因此损失定义如(5)所示。紧接着,既然每一个任务适配器的参数稀疏度都不一样,那么就可以根据稀疏度来决定是否激活(也就是越稀疏越不希望被激活),因此设定了第二个损失函数,可以发现它包括两部分:一个是判断这个参数的稀疏度,另一个是在使用自适应门修剪时具体数据的激活情况,尽量让其相等。举个例子:总共5张图片,假如在某一个块中我们的稀疏度为0.4的话,而在这个快却有4张照片被激活,激活概率为4/5=0.8,表明此时我们的稀疏度特别高,不应该能激活那么多,所以尽量使其两个值相等。作者最后还说了一些具体训练推理的东西,由于没有找到源码就不进行说明了,等我找到了我就配合源代码进行解析。