本篇论文来自2020年PAMI,具体地址点这里
一. 介绍
但通常情况下,仍然需要为每个新任务训练一个单独的模型。考虑到两个形式或性质完全不同的任务,例如预测一系列单词中的下一个单词和预测图像中对象的类别,很显然,每个任务都需要不同的架构或计算。一个更受限制的场景,学习一种在几个相关领域都能很好工作的表示,这种情况称为多域学习(MDL),以将其与多任务学习(在同一域上执行不同的任务)区别开来。一个标准的MDL需要满足以下几点:
- 使用相同的计算通道
- 需要为不同的域增加参数
- 避免灾难性遗忘
- 逐步学习
本文为每个任务增加了新的模型参数,并且每个任务的都具有自己独特的任务参数。
二. 方法
我们让 T T T表示为需要学习的一些任务。具体来说,一个深度的卷积神经网络(DCNN)的目的是学习并且解决 T T T。大部分的DCNN都遵循着下面的结构:对于每一个输入 x x x,DCNN将会通过 l l l层 ϕ i , i ∈ 1 ⋯ l \phi_i, i\in1 \cdots l ϕi,i∈1⋯l。较低的层为计算层(例如resnet中的resblock)。使用 Φ F N = σ ( ϕ l ) ∘ … σ ( ϕ 2 ) ∘ σ ( ϕ 1 ) \Phi_{F_N}=\sigma\left(\phi_l\right) \circ \ldots \sigma\left(\phi_2\right) \circ \sigma\left(\phi_1\right) ΦFN=σ(ϕl)∘…σ(ϕ2)∘σ(ϕ1)表示整个网络 N N N中的卷积层,同样,定义 Φ C N = f c ∘ … σ ( f 2 ) ∘ σ ( f 1 ) \Phi_{C_N}=f_c \circ \ldots \sigma\left(f_2\right) \circ \sigma\left(f_1\right) ΦCN=fc∘…σ(f2)∘σ(f1)表示网络中分类部分,由一系列的全连接构成。
2.1 Adapting Representations
假设我们有两个任务
T
1
T_1
T1和
T
2
T_2
T2,我们需要学习一个基网络
N
N
N去解决任务
T
1
T_1
T1。假设在第二个任务上也依旧保持着和原网络一样的架构,只是参数不同。我们只需要增加一个控制模块来选择每个任务的网络。其中,每个控制模块使用现存的参数创建出一个新的卷积filters去处理新的任务:对于每一个卷积层
ϕ
l
\phi_l
ϕl,我们使用
F
l
∈
R
C
o
×
C
i
×
k
×
k
F_l \in \mathcal{R}^{C_o \times C_i \times k \times k}
Fl∈RCo×Ci×k×k表示为当前层的filters,其中
C
o
C_o
Co表示为输出的特征大小,
C
i
C_i
Ci表示为输入的特征大小,
k
×
k
k\times k
k×k表示为卷积核的大小,我们使用
b
l
∈
R
C
b_l\in\mathcal{R}^C
bl∈RC表示为bias。定义
F
l
∈
R
C
o
×
D
F_l\in\mathcal{R}^{C_o \times D}
Fl∈RCo×D为filters的扁平版本(flatten),其中
D
=
C
i
⋅
k
⋅
k
D=C_i \cdot k \cdot k
D=Ci⋅k⋅k,我们使用
F
l
∈
R
C
o
×
C
i
×
k
×
k
F_l \in \mathcal{R}^{C_o \times C_i \times k \times k}
Fl∈RCo×Ci×k×k表示
F
i
F_i
Fi中的一个filter,如下:
f
1
=
(
f
11
1
⋯
f
1
k
1
⋱
f
k
k
1
)
,
⋯
,
f
i
=
(
f
11
i
⋯
f
1
k
i
⋱
f
k
k
i
)
f^1=\left(\begin{array}{ccc}f_{11}^1 & \cdots & f_{1 k}^1 \\ & \ddots & \\ & & f_{k k}^1\end{array}\right), \cdots, f^i=\left(\begin{array}{ccc}f_{11}^i & \cdots & f_{1 k}^i \\ & \ddots & \\ & & f_{k k}^i\end{array}\right)
f1=⎝
⎛f111⋯⋱f1k1fkk1⎠
⎞,⋯,fi=⎝
⎛f11i⋯⋱f1kifkki⎠
⎞
那么flattened的版本则是:
f
~
=
(
f
11
1
,
⋯
,
f
k
k
1
,
⋯
,
⋯
f
11
i
,
⋯
,
f
k
k
i
)
∈
R
D
\tilde{f}=\left(f_{11}^1, \cdots, f_{k k}^1, \cdots, \cdots f_{11}^i, \cdots, f_{k k}^i\right) \in \mathcal{R}^{\mathcal{D}}
f~=(f111,⋯,fkk1,⋯,⋯f11i,⋯,fkki)∈RD
那么对于一个filters,其生成由下面构成:
F
~
l
a
=
W
l
⋅
F
~
l
\tilde{F}_l^a=W_l \cdot \tilde{F}_l
F~la=Wl⋅F~l
其中
W
l
∈
R
C
o
×
C
o
W_l \in \mathcal{R}^{C_o \times C_o}
Wl∈RCo×Co表示一个权重矩阵,根据这个就可以把flattened的filters投放到另一个空间。"Unflattening"将一个向量
f
~
\tilde{f}
f~转换为其对应的tensor
f
l
∈
R
C
i
×
k
×
k
f_l \in \mathcal{R}^{C_i \times k \times k}
fl∈RCi×k×k,那么同样可以把
F
~
l
a
\tilde{F}_l^a
F~la转为对应的tensor。使用
X
⊗
Y
X \otimes Y
X⊗Y表示下面过程:flatten
Y
Y
Y,使用矩阵乘
X
X
X,再unflatten,可以写为:
F
l
a
=
W
l
⊗
F
l
F_l^a=W_l \otimes F_l
Fla=Wl⊗Fl
如果卷积层中包括bias,那么我们需要重新创建一个新的向量
b
l
a
b^a_l
bla。对于第
l
l
l层
ϕ
l
\phi_l
ϕl来说是按照下面的方法进行计算:给定一个可选择参数
α
∈
{
0
,
1
}
\alpha \in \{0,1\}
α∈{0,1},我们按照如下方式进行计算:
x
l
+
1
=
[
α
(
W
l
⊗
F
l
)
+
(
1
−
α
)
F
l
]
∗
x
l
+
α
b
l
a
+
(
1
−
α
)
b
l
x_{l+1}=\left[\alpha\left(W_l \otimes F_l\right)+(1-\alpha) F_l\right] * x_l+\alpha b_l^a+(1-\alpha) b_l
xl+1=[α(Wl⊗Fl)+(1−α)Fl]∗xl+αbla+(1−α)bl
这样就能保证每个任务能够选择自己的网络参数。为了能够使得网络处理好多个任务,我们将
α
\alpha
α变成一个向量
α
∈
{
0
,
1
}
n
\alpha \in \{0,1\}^n
α∈{0,1}n,其中
n
n
n表示为共有多少个任务,这样的话如果
α
j
=
1
\alpha_j=1
αj=1那么我们执行第
j
j
j个任务否则执行第0个任务。因此,可以将上述的写法转换为:
x
l
+
1
=
∑
i
=
1
n
α
i
(
F
l
a
i
∗
x
l
+
b
l
i
)
x_{l+1}=\sum_{i=1}^n \alpha_i\left(F_l^{a_i} * x_l+b_l^i\right)
xl+1=i=1∑nαi(Flai∗xl+bli)
下面展示了具体的过程:
三. 代码解析
论文代码点这里
这里是控制器对应的代码,传入conv是基网络的参数,然后根据w创建一个新的参数权重,然后我们对其进行flatten操作,之后我们创建映射变量:
L
L
L。(注意,此处要先把conv的梯度进行冻结,防止被改变,如果是直接对conv进行训练的话,再手动打开梯度)。下面我们看看具体的前向传播代码:
红色框就是上述的使用
α
\alpha
α进行调控的任务选择模型。
本篇介绍就到此为止,其实作者对这个文章又进行了一些改进,基本思路还是利用原参数进行考虑,这里大家可以自行看一下论文,点这里。