Centripetal SGD for Pruning Very Deep Convolutional Networks with Complicated Structure论文翻译
《 Centripetal SGD for Pruning Very Deep Convolutional Networks with Complicated Structure》论文翻译
本栏内容只供学习使用,如有违反法律,与本人无关。如因本人发布的作品内容涉及版权或存在其他问题,请于文章发布后的30日内联系我进行删除。
摘要
冗余在卷积神经网络(CNN)中存在是被广泛认可的,这使得可以从卷积层中删除不重要的卷积核,从而在网络性能下降的可接受范围内使网络变薄。受卷积的线性和组合属性的启发,我们希望使一些滤波器越来越接近,并最终对于网络瘦身来讲它们是相同的。为此,我们提出一种新颖的优化方法Centripetal SGD(C-SGD),它可以训练多个卷积核使其折叠成参数超空间中的单个点。训练完成后,移除相同的卷积核可以修剪网络而不会造成性能损失,因此不需要微调。通过这样做,我们一定程度上解决了在复杂结构的CNN上约束卷积核剪枝的问题,这种情况下其中一些层必须在其它层之后进行修剪。我们在CIFAR-10和ImageNet上的实验结果证明了基于C-SGD的卷积核剪枝方法的有效性。此外,我们通过证明使用C-SGD训练的冗余CNN优于具有相同宽度的正常训练的对应神经网络,为深度神经网络中的冗余有助于训练的收敛提供了经验证据。
1.介绍
卷积神经网络(CNN)已经成为机器学习和其它相关领域的一种重要工具。然而,当CNNs变得越来越宽、越来越深,由于其高计算强度的本质特点,CNNs的内存占用、功耗和所需浮点运算量(Flops)急剧增加,因此使得在没有充足的计算资源的情况下,很难将其部署在平台上。在这种情况下,CNN压缩和加速被深入研究,包括张量低秩展开、量化、知识蒸馏、快速卷积、特征图压缩等。
我们专注研究卷积核剪枝,也叫通道剪枝或网络瘦身,原因有三点。首先,卷积核剪枝是一种可以适用任何种类CNNs的通用技术,对应用领域、网络结构和部署平台没有要求。其次,卷积核剪枝可以有效减少网络的FLOPs,FLOPs是计算量的主要计量标准。最后,作为实际中的重要优势,卷积核剪枝无需特定的结构和额外的操作产生更薄的网络,这与其它模型压缩技术是正交的。
由于普遍性和重要性的激励,研究者投入很大的努力研究卷积核剪枝技术。因为CNNs中存在冗余是广泛认可的,许多出色的工作表明:如果对一个CNN进行适当的修剪使其具有可接受的结构损伤,接着的微调可以恢复其精度到一个确定的水平。1)一些之前的研究将卷积核按照重要性排序,直接移除不重要的卷积核,使用剩下的卷积核进行重建。由于重要的卷积核被保存下来,通过微调可以达到和原来相当的性能水平。但是,一些最近的强大的网络具有复杂的结构,例如身份映射和密集连接,其中一些层必须与其它层以相同的模式进行修剪,这增加了约束卷积核剪枝的开放性问题。这种情况进一步挑战了这种剪枝技术,因为不能假设不同层的重要的卷积核处在相同的位置。2)显然,如果剪枝的破坏影响降低,模型更有可能恢复。考虑到这一点,另一组方法试图提前清除一些置零卷积核,其中Group-Lasso是经常使用的。从本质上讲,置0卷积核可以被认为是在CNNs中产生了一种需要的冗余模式。在降低了某些卷积核参数的放大倍数后,对这些使精度下降的幅度更小的卷积核进行修剪,更容易通过微调来恢复性能。
在这篇文章中,我们也希望在CNNs中产生一些冗余模式来进行卷积核剪枝。但是,我们打算将多个卷积核合并为一个,形成有些卷积核相同的冗余模式,而不是使一些卷积核整个接近0来置零卷积核。该方法的出发点是对网络中信息流的观察(图1)。1)如果两个或两个以上的卷积核被训练成为相同的,由于卷积的线性和组合特性,我们可以简单地丢弃所有卷积核只留下一个,并沿下一层相应的输入通道增加参数。这样做不会造成性能损失,也不需要耗时的微调过程。需要注意的是,这种微调过程对于置零方法是必不可少的,因为被丢弃的卷积核只是大小很小,但仍然编码了一定数量的信息。因此,剪除这种卷积核不可避免地会降低网络的性能。2)当多个卷积核被约束在参数超空间中逐渐靠近时,我们称其为向心约束,尽管它们开始产生越来越相似的信息,但从下一层的相应输入通道传达的信息仍在充分利用, 因此,模型的表示能力要强于卷积核置零后的模型。
我们总结我们的贡献如下:
我们提出通过训练一些卷积核使其变得相同,从而在CNNs中产生冗余模式。与基于重要性的卷积核剪枝方法相比,这样做不需要对卷积核的重要性有启发性的认识。与置零法相比,该方法不需要进行微调,且保留了更有代表性的网络结构。
我们提出了一种创新的优化方法——Centripetal SGD(C-SGD)。顾名思义,我们将多个卷积核移动到卷积核参数的超空间的中心。同时,根据模型的原始目标函数,尽可能地保持模型的性能。
通过C-SGD,我们在一定程度上解决了约束卷积核剪枝的问题,这是一个现有较深复杂结构CNNs瘦身的开放问题,其中一些层必须按照与其他层相同的方式剪枝。
我们对C-SGD的有效性进行了理论和实证分析,展示了支持我们的动机和冗余有助于神经网络收敛假设的经验证据。
2.相关工作
卷积核剪枝。大量启发性的研究表明:在不显著降低性能的情况下,从神经网络移除大量的连接或者神经元是可行的。然而,由于连接剪枝方法使参数张量不是更小,而是更稀疏,所以在没有专门的硬件支持的情况下,几乎不能观察到加速。研究人员自然地进一步研究CNNs:通过删除卷积核而不是零星的连接,我们将宽卷积层转变为窄卷积层,从而大大减少FLOPs、内存占用和功耗。一种方法是通过一些方式来定义卷积核的重要性,然后小心地挑选并剔除不重要的卷积核使得性能损失最小。以前的一些工作是通过精度降低(CAR)、通道贡献方差、基于泰勒展开准则、卷积核的大小和零激活的平均百分比等方法来衡量卷积核的重要性;Luo等人基于下一层的信息挑选卷积核;Yu 等人考虑了误差传播的影响;He等人通过解决Lasso回归选择卷积核;He和Han通过强化学习帮助选择卷积核。另一类尝试在某些约束条件下训练网络,使一些卷积核置0,经常使用group-Lasso。众所周知,将一些卷积核整个剪除会大大降低网络质量,CNNs剪枝通常是一层一层或者一个一个卷积核的方式进行,并且需要微调过程来恢复精度。
其它方法。除了卷积核剪枝,一些卓越的工作希望通过其它的方法对CNNs压缩和加速。相当多的工作分解或者近似参数张量;量化和二值化技术每个参数使用更少的bits近似模型;知识蒸馏将知识从一个大型网络转移到一个较小的网络;一些研究者希望通过穿孔、FFT或者DCT加速卷积;Wang等人通过循环矩阵提取信息的方法来构造映射。值得注意的是,由于卷积核剪枝只是简单地将一个宽CNN缩小成一个不用特殊结构和额外操作的窄的CNN,所以它和其它方法是正交的。
3.通过Centripetal SGD瘦身CNNs
3.1公式
在现在的CNNs中,BN和缩放变换是经常用来增强卷积层表示能力的方法。为了表示简洁,我们将后续的BN层和缩放层视为卷积层的一部分。假设
i
i
i是层的索引,
M
(
i
)
∈
R
h
i
×
ω
i
×
c
i
M^{(i)}\in\mathbb{R}^{h_i\times\omega_i\times c_i}
M(i)∈Rhi×ωi×ci是一个有
c
i
c_i
ci个通道的
h
i
×
ω
i
{h_i\times\omega_i}
hi×ωi的特征图,
M
(
i
,
j
)
=
M
:
,
:
,
j
(
i
)
M^{(i,j)}=M_{:,:,j}^{(i)}
M(i,j)=M:,:,j(i)是第
j
j
j个通道。卷积核大小为
u
i
×
v
i
u_i\times v_i
ui×vi的卷积层最多有一个四阶张量和四个矢量参数,即
K
(
i
)
∈
R
u
i
×
v
i
×
c
i
−
1
×
c
i
K^{(i)}\in\mathbb{R}^{u_i\times v_i\times c_{i-1}\times c_i}
K(i)∈Rui×vi×ci−1×ci和
μ
(
i
)
,
σ
(
i
)
,
γ
(
i
)
,
β
(
i
)
,
∈
R
c
i
\mu^{(i)},\sigma^{(i)},\gamma^{(i)},\beta^{(i)},\in\mathbb{R}^{c_i}
μ(i),σ(i),γ(i),β(i),∈Rci,其中
K
(
i
)
K^{(i)}
K(i)是卷积核,
μ
(
i
)
\mu^{(i)}
μ(i)和
σ
(
i
)
\sigma^{(i)}
σ(i)是BN的平均值和标准方差,
γ
(
i
)
,
β
(
i
)
\gamma^{(i)},\beta^{(i)}
γ(i),β(i)是缩放变换的参数。然后我们使用
P
(
i
)
=
(
K
(
i
)
,
μ
(
i
)
,
σ
(
i
)
,
γ
(
i
)
,
β
(
i
)
)
P^{(i)}=(K^{(i)},\mu^{(i)},\sigma^{(i)},\gamma^{(i)},\beta^{(i)})
P(i)=(K(i),μ(i),σ(i),γ(i),β(i))表示第
i
i
i层的参数。在这篇文章中,
i
i
i层的卷积核
j
j
j指的是与
i
i
i层的第
j
j
j个输出通道相关的参数片的五元组,形式上,
F
(
j
)
=
(
K
:
,
:
,
:
,
j
(
i
)
,
μ
(
i
)
,
σ
(
i
)
,
γ
(
i
)
,
β
(
i
)
)
F^{(j)}=(K_{:,:,:,j}^{(i)},\mu^{(i)},\sigma^{(i)},\gamma^{(i)},\beta^{(i)})
F(j)=(K:,:,:,j(i),μ(i),σ(i),γ(i),β(i))。在前向传播时,这一层把
M
(
i
−
1
)
∈
R
h
i
−
1
×
ω
i
−
1
×
c
i
−
1
M^{(i-1)}\in\mathbb{R}^{h_{i-1}\times\omega_{i-1}\times\ c_{i-1}}
M(i−1)∈Rhi−1×ωi−1× ci−1当作输入并且输出是
M
(
i
)
M^{(i)}
M(i)。假设*是2-D卷积操作,第
j
j
j个输出通道可以由下式得到:
M
(
i
,
j
)
=
∑
k
=
1
c
i
−
1
M
(
i
−
1
,
k
)
∗
K
:
,
:
,
k
,
j
(
i
)
−
μ
j
(
i
)
σ
j
(
i
)
γ
j
(
i
)
+
β
j
(
i
)
(
1
)
M^{(i,j)}=\frac{\sum_{k=1}^{c_{i-1}}M^{(i-1,k)}\ast K_{:,:,k,j}^{(i)}-\mu_j^{(i)}}{\sigma_j^{(i)}}\gamma_j^{(i)}+\beta_j^{(i)}\;\;\;\;\;\;\;\;\;\;(1)
M(i,j)=σj(i)∑k=1ci−1M(i−1,k)∗K:,:,k,j(i)−μj(i)γj(i)+βj(i)(1)
基于重要性的卷积核剪枝放方法通过一些方式定义了卷积核的重要程度,剪除不重要的部分,用剩下的参数重构网络。假设
T
i
\mathfrak T_i
Ti是
i
i
i层卷积核的索引集,
(
e
.
g
.
,
T
2
=
{
1
,
2
,
3
,
4
}
(e.g.,{\mathfrak T}_2=\{1,2,3,4\}
(e.g.,T2={1,2,3,4}如果第二层有四个卷积核),
T
T
T是卷积核重要性评价函数而
θ
i
\theta_i
θi是阈值。剩下的集,也就是剪枝后存活的卷积核的索引集,是
R
i
=
{
j
∈
T
i
∣
T
(
F
(
j
)
>
θ
i
)
}
R_i=\{j\in{\mathfrak T}_i\vert T(F^{(j)}>\theta_i)\}
Ri={j∈Ti∣T(F(j)>θi)}。然后我们通过将从原始
i
i
i层的张量或者矢量切片得到的参数切片组装成新的参数重构网络。也就是
P
^
(
i
)
=
(
K
:
,
:
,
:
,
R
i
(
i
)
,
μ
R
i
(
i
)
,
σ
R
i
(
i
)
,
γ
R
i
(
i
)
,
β
R
i
(
i
)
)
(
2
)
\widehat P^{(i)}=(K_{:,:,:,R_{i}}^{(i)},\mu_{R_{i}}^{(i)},\sigma_{R_{i}}^{(i)},\gamma_{R_{i}}^{(i)},\beta_{R_{i}}^{(i)})\;\;\;\;\;\;\;\;\;(2)
P
(i)=(K:,:,:,Ri(i),μRi(i),σRi(i),γRi(i),βRi(i))(2)
与被剪除的卷积核对应的下一层的输入通道也应该丢弃
P
^
(
i
+
1
)
=
(
K
:
,
:
,
R
i
,
:
(
i
+
1
)
,
μ
(
i
+
1
)
,
σ
(
i
+
1
)
,
γ
(
i
+
1
)
,
β
(
i
+
1
)
)
(
3
)
\widehat P^{(i+1)}=(K_{:,:,R_{i},:}^{(i+1)},\mu^{(i+1)},\sigma^{(i+1)},\gamma^{(i+1)},\beta^{(i+1)})\;\;\;\;\;\;\;\;\;(3)
P
(i+1)=(K:,:,Ri,:(i+1),μ(i+1),σ(i+1),γ(i+1),β(i+1))(3)
3.2.更新规则
对于每个卷积层,我们首先将卷积核分成簇。簇的数量等于所需的卷积核的数量,因为我们只为每个簇保留一个卷积核。我们使用
C
i
C_{i}
Ci和
H
\mathcal H
H分别表示i层的所有卷积核的簇和一个以卷积核的索引集的形式表示的单独的簇。我们使用均匀聚类或者k-means生成簇,实验表明它们之间只有很小的差异。
K-means聚类 我们的目标是在参数超空间中生成较小群内间距的簇,自然地可以将它们压缩到一个单独的点而更小地影响模型。为此,我们简化了卷积核的核,将其作为特征向量用来K-means聚类。
平均聚类 我们可以在不考虑卷积核的固有性质的情况下生成簇。假设
c
i
c_{i}
ci和
r
i
r_{i}
ri是原有的卷积核数目和需要的簇的数目,那么每个簇将最多有
[
c
i
/
r
i
]
\lbrack c_{i}/r_{i} \rbrack
[ci/ri]个卷积核。举例第二层有6个卷积核,我们希望减少到四个,我们有
C
2
=
{
H
1
,
H
2
,
H
3
,
H
4
}
C_{2}=\{\mathcal H_{1},\mathcal H_{2},\mathcal H_{3},\mathcal H_{4}\}
C2={H1,H2,H3,H4},
H
1
=
{
1
,
2
}
,
H
2
=
{
3
,
4
}
,
H
5
=
{
5
}
,
H
6
=
{
6
}
\mathcal H_{1}=\{1,2\},\mathcal H_{2}=\{3,4\},\mathcal H_{5}=\{5\},\mathcal H_{6}=\{6\}
H1={1,2},H2={3,4},H5={5},H6={6}。
我们使用
H
j
H_{j}
Hj表示含有卷积核
j
j
j的簇,所以对上述例子而言有
H
(
3
)
=
H
2
H(3)=\mathcal H_{2}
H(3)=H2和
H
(
6
)
=
H
4
H(6)=\mathcal H_{4}
H(6)=H4。假设
F
(
j
)
F^{(j)}
F(j)是卷积核
j
j
j的核或者矢量参数,在每一次训练的迭代过程中,C-SGD的更新规则是
F
(
j
)
←
F
(
j
)
+
τ
△
F
(
j
)
,
F^{(j)}\leftarrow F^{(j)}+\tau \triangle F^{(j)},
F(j)←F(j)+τ△F(j),
△
F
(
j
)
=
−
∑
k
∈
H
(
j
)
∂
L
∂
F
(
k
)
∣
H
(
j
)
∣
−
η
F
(
j
)
+
∈
(
∑
k
∈
H
(
j
)
∂
F
(
k
)
∣
H
(
j
)
∣
−
F
(
j
)
)
(
4
)
\triangle F^{(j)}=-\frac{\sum_{k\in H(j)}{\displaystyle\frac{\partial L}{\partial F^{(k)}}}}{\left|H(j)\right|}-\eta F^{(j)}+\in(\frac{\sum_{k\in H(j)}{\displaystyle\partial F^{(k)}}}{\left|H(j)\right|}-F^{(j)})\;\;\;\;\;\;\;\;\;\;(4)
△F(j)=−∣H(j)∣∑k∈H(j)∂F(k)∂L−ηF(j)+∈(∣H(j)∣∑k∈H(j)∂F(k)−F(j))(4)
其中
L
L
L是原始目标函数,
τ
\tau
τ是学习率,
η
\eta
η是模型的原始权重衰减系数,
∈
\in
∈是引入的唯一的超参数,叫做向心力。
假设
L
\mathcal L
L是层的索引集,我们使用平方核偏差
χ
\chi
χ来度量簇内相似度,也就是簇内的卷积核有多相似,
χ
=
∑
i
∈
L
∑
j
∈
T
i
∥
K
:
,
:
,
:
,
j
(
i
)
−
∑
k
∈
H
(
j
)
K
:
,
:
,
:
,
k
(
i
)
∣
H
(
j
)
∣
∥
2
2
(
5
)
\chi=\sum_{i\in\mathcal L}\sum_{j\in{\mathfrak T}_i}\left\|K_{:,:,:,j}^{(i)}-\frac{\sum_{k\in H(j)}K_{:,:,:,k}^{(i)}}{\left|H(j)\right|}\right\|_2^2\;\;\;\;\;\;\;\;\;(5)
χ=i∈L∑j∈Ti∑∥∥∥∥∥K:,:,:,j(i)−∣H(j)∣∑k∈H(j)K:,:,:,k(i)∥∥∥∥∥22(5)
从公式4容易得到:如果忽略浮点计算错误,
χ
\chi
χ以一个适当的学习率
τ
\tau
τ单调指数下降。
公式4的原理很简单:对于在同一簇的卷积核,由目标函数得到的增量(第一项)被平均,第二项是普通的权重衰减,初始值的差异逐渐消除(最后一项),所以卷积核逐渐向它们在超空间的中心靠近。
实际应用时,我们像在普通的SGD训练时固定
η
\eta
η,
τ
\tau
τ随时间减小,随意设置
∈
\in
∈。如果
∈
\in
∈太大(比如10),卷积核可以立即合并,整个过程就相当于从头开始训练一个坏模型。如果
∈
\in
∈特别小(
1
×
1
0
−
10
1\times10^{-10}
1×10−10),从长远来看,C-SGD和普通的SGD几乎没有差别。但是,由于每一簇的卷积核间的差别是单调指数递减的,即使是很小的
∈
\in
∈早晚也能使卷积核足够接近。就像附录里展示的,C-SGD对
∈
\in
∈很敏感。
一个简单的权重衰减的类比(L2正则)可以帮助理解Centripetal SGD。Fig.2a展示了一个3-D的损失面,其中一个确定的点A对应一个2-D参数
a
=
(
a
1
,
a
2
)
\boldsymbol a=(a_1,a_2)
a=(a1,a2)。假设最陡的下降方向是
A
Q
0
→
\overrightarrow{AQ_0}
AQ0,
A
Q
0
→
=
∂
L
∂
a
\overrightarrow{AQ_0}=\frac{\partial L}{\partial\boldsymbol a}
AQ0=∂a∂L,
L
L
L是目标函数。权重衰减通常是拿来抑制过拟合,即
A
Q
1
→
=
−
η
a
\overrightarrow{AQ_1}=-\eta\boldsymbol a
AQ1=−ηa,其中
η
\eta
η是模型的权重衰减系数,例如Resnets使用
1
×
1
0
−
4
1\times10^{-4}
1×10−4。实际的梯度递减的方向是
△
a
=
A
Q
2
→
=
A
Q
0
→
+
A
Q
1
→
=
−
∂
L
∂
a
−
η
a
\triangle\boldsymbol a= \overrightarrow{AQ_2}=\overrightarrow{AQ_0}+\overrightarrow{AQ_1}=-\frac{\partial L}{\partial\boldsymbol a}-\eta\boldsymbol a
△a=AQ2=AQ0+AQ1=−∂a∂L−ηa。
形式上,使用
t
t
t表示训练迭代的次数,我们希望找到满足点A和点B逐渐接近并最终相同的公式
lim
t
→
∞
∥
a
(
t
)
−
b
(
t
)
∥
=
0
(
6
)
\lim_{t\rightarrow\infty}\left\|\boldsymbol a^{(t)}-\boldsymbol b^{(t)}\right\|=0\;\;\;\;\;\;\;\;(6)
t→∞lim∥∥∥a(t)−b(t)∥∥∥=0(6)考虑到
a
(
t
+
1
)
=
a
(
t
)
+
τ
△
a
(
t
)
\boldsymbol a^{(t+1)}=\boldsymbol a^{(t)}+\tau\triangle\boldsymbol a^{(t)}
a(t+1)=a(t)+τ△a(t),并且
b
(
t
+
1
)
=
b
(
t
)
+
τ
△
b
(
t
)
\boldsymbol b^{(t+1)}=\boldsymbol b^{(t)}+\tau\triangle\boldsymbol b^{(t)}
b(t+1)=b(t)+τ△b(t),其中
τ
\tau
τ是学习率,公式6表明:
lim
t
→
∞
∥
a
(
t
)
−
b
(
t
)
∥
+
τ
∥
△
a
(
t
)
−
△
b
(
t
)
∥
=
0
(
7
)
\lim_{t\rightarrow\infty}\left\|\boldsymbol a^{(t)}-\boldsymbol b^{(t)}\right\|+\tau\left\|\triangle\boldsymbol a^{(t)}-\triangle\boldsymbol b^{(t)}\right\|=0\;\;\;\;\;\;\;\;(7)
t→∞lim∥∥∥a(t)−b(t)∥∥∥+τ∥∥∥△a(t)−△b(t)∥∥∥=0(7)我们希望通过
lim
t
→
∞
∥
△
a
(
t
)
−
△
b
(
t
)
∥
=
0
\lim_{t\rightarrow\infty}\left\|\triangle\boldsymbol a^{(t)}-\triangle\boldsymbol b^{(t)}\right\|=0
limt→∞∥∥∥△a(t)−△b(t)∥∥∥=0和
lim
t
→
∞
∥
a
(
t
)
−
b
(
t
)
∥
=
0
\lim_{t\rightarrow\infty}\left\|\boldsymbol a^{(t)}-\boldsymbol b^{(t)}\right\|=0
limt→∞∥∥∥a(t)−b(t)∥∥∥=0来实现这一目标。也就是说,当两个点越来越接近,它们的梯度也相应地变接近以使训练收敛。
如果我们希望使A和B变得比它们以前更近,一个很自然的想法是像Fig.2b让它们靠近它们的中点
M
(
a
+
b
2
)
M(\frac{\boldsymbol a+\boldsymbol b}{2})
M(2a+b)。因此,点A的梯度减小方向是
△
a
=
A
Q
2
→
+
A
Q
3
→
=
−
∂
L
∂
a
−
η
a
+
∈
(
a
+
b
2
−
a
)
(
8
)
\triangle\boldsymbol a= \overrightarrow{AQ_2}+\overrightarrow{AQ_3}=-\frac{\partial L}{\partial\boldsymbol a}-\eta\boldsymbol a+\in(\frac{\boldsymbol a+\boldsymbol b}{2}-\boldsymbol a)\;\;\;\;\;\;\;\;\;(8)
△a=AQ2+AQ3=−∂a∂L−ηa+∈(2a+b−a)(8)其中
∈
\in
∈是一个控制A和B接近的强度或速度的超参数。有
△
b
=
−
∂
L
∂
b
−
η
b
+
∈
(
a
+
b
2
−
b
)
(
9
)
\triangle\boldsymbol b=-\frac{\partial L}{\partial\boldsymbol b}-\eta\boldsymbol b+\in(\frac{\boldsymbol a+\boldsymbol b}{2}-\boldsymbol b)\;\;\;\;\;\;\;\;\;(9)
△b=−∂b∂L−ηb+∈(2a+b−b)(9)
△
a
−
△
b
=
(
∂
L
∂
b
−
∂
L
∂
a
)
+
(
η
+
∈
)
(
b
−
a
)
(
10
)
\triangle\boldsymbol a-\triangle\boldsymbol b=(\frac{\partial L}{\partial\boldsymbol b}-\frac{\partial L}{\partial\boldsymbol a})+(\eta+\in)(\boldsymbol b-\boldsymbol a)\;\;\;\;\;\;\;\;\;(10)
△a−△b=(∂b∂L−∂a∂L)+(η+∈)(b−a)(10)
我们从中可以发现问题:我们不能保证
lim
t
→
∞
(
∂
L
∂
b
(
t
)
−
∂
L
∂
a
(
t
)
)
=
0
\lim_{t\rightarrow\infty}(\frac{\partial L}{\partial\boldsymbol b^{(t)}}-\frac{\partial L}{\partial\boldsymbol a^{(t)}})=0
limt→∞(∂b(t)∂L−∂a(t)∂L)=0。事实上,即使
a
=
b
\boldsymbol a=\boldsymbol b
a=b不能说明
∂
L
∂
b
=
∂
L
∂
a
\frac{\partial L}{\partial\boldsymbol b}=\frac{\partial L}{\partial\boldsymbol a}
∂b∂L=∂a∂L,因为它们参与不同的计算流程。结果是我们使用公式8和公式9不能保证
lim
t
→
∞
(
△
a
(
t
)
−
△
b
(
t
)
)
=
0
\lim_{t\rightarrow\infty}(\triangle\boldsymbol a^{(t)}\boldsymbol-\triangle\boldsymbol b^{\boldsymbol(\mathbf t\boldsymbol)})=0
limt→∞(△a(t)−△b(t))=0。
我们通过合并原始目标函数的梯度解决了这一问题。为了简洁和对称,通过使用
1
2
(
∂
L
∂
b
+
∂
L
∂
a
)
\frac{1}{2}(\frac{\partial L}{\partial\boldsymbol b}+\frac{\partial L}{\partial\boldsymbol a})
21(∂b∂L+∂a∂L)替换Eq.8中的
∂
L
∂
a
\frac{\partial L}{\partial\boldsymbol a}
∂a∂L和Eq.9中的
∂
L
∂
b
\frac{\partial L}{\partial\boldsymbol b}
∂b∂L,我们有
△
a
−
△
b
=
(
η
+
∈
)
(
b
−
a
)
\triangle\boldsymbol a-\triangle\boldsymbol b=(\eta+\in)(\boldsymbol b-\boldsymbol a)
△a−△b=(η+∈)(b−a)。这样就保留了目标函数相关梯度中所编码的监督信息来保证模型的性能,易于验证满足公式(6)。直观地说,我们根据一些
b
\boldsymbol b
b和偏离
b
\boldsymbol b
b的信息从最陡的下降方向偏离
a
\boldsymbol a
a,反之亦然,就像L-2正则使
a
\boldsymbol a
a和
b
\boldsymbol b
b朝着坐标原点的方向偏离。
3.3.C-SGD的有效实施
现在的CNN训练和部署的平台,比如Tesorflow,其效率是基于大规模的张量操作的。我们为此寻求通过引入最小计算负担的高效矩阵乘法来实现C-SGD。具体来说,给定一个卷积层
i
i
i,核
K
∈
R
u
i
×
v
i
×
c
i
−
1
×
c
i
K\in\mathbb{R}^{u_{i}\times v_{i}\times c_{i-1}\times\ c_{i}}
K∈Rui×vi×ci−1× ci,梯度为
∂
L
∂
K
\frac{\partial L}{\partial\boldsymbol K}
∂K∂L,我们重塑
K
K
K为
W
∈
R
u
i
v
i
c
i
−
1
×
c
i
W\in\mathbb{R}^{u_{i}v_{i}c_{i-1}\times\ c_{i}}
W∈Ruivici−1× ci,对应地
∂
L
∂
K
\frac{\partial L}{\partial\boldsymbol K}
∂K∂L为
∂
L
∂
W
\frac{\partial L}{\partial\boldsymbol W}
∂W∂L。我们按照Eq.12和Eq.13构造平均矩阵
Γ
∈
R
c
i
×
c
i
\Gamma\in\mathbb{R}^{c_{i}\times c_{i}}
Γ∈Rci×ci和衰减矩阵
Λ
∈
R
c
i
×
c
i
\Lambda\in\mathbb{R}^{c_{i}\times c_{i}}
Λ∈Rci×ci 所以容易证明Eq.11和Eq.4是等价的。显然,当簇的数量和卷积核的数量相等时,Eq.11退化为普通的SGD,
Γ
=
d
i
a
g
(
1
)
\Gamma=diag(1)
Γ=diag(1),
Λ
=
d
i
a
g
(
η
)
\Lambda=diag(\eta)
Λ=diag(η)。其它可训练的参数(比如
γ
和
β
\gamma和\beta
γ和β)被重塑为
W
∈
R
1
×
c
i
\boldsymbol W\in\mathbb{R}^{1\times c_{i}}
W∈R1×ci并且以相同的方式处理。实际上,我们在使用Nvidia Geforce GTX1080Ti GPUs,在CUDA9.0和cuDNN7.0环境下的Tensorflow进行普通SGD和C-SGD时在速度上几乎观察不到不同。
W
←
W
−
τ
(
∂
L
∂
W
Γ
+
W
Λ
)
(
11
)
\boldsymbol W\leftarrow\boldsymbol W-\tau\left(\frac{\partial L}{\partial\boldsymbol W}\boldsymbol\Gamma+\boldsymbol W\boldsymbol\Lambda\right) \;\;\;\;\;\;\;\;\;\;(11)
W←W−τ(∂W∂LΓ+WΛ)(11)
Γ
m
,
n
=
{
1
/
∣
H
(
m
)
∣
i
f
H
(
m
)
=
H
(
n
)
,
0
e
l
s
e
w
i
s
e
.
(
12
)
Λ
m
,
n
=
{
η
+
(
1
−
1
/
∣
H
(
m
)
∣
)
∈
i
f
H
(
m
)
=
H
(
n
)
,
0
e
l
s
e
w
i
s
e
.
(
13
)
{\boldsymbol\Gamma}_{\mathbf m\boldsymbol,\mathbf n}=\left\{\begin{array}{l}1/\left|H(m)\right|\;\;\;\;\;\;if\;H(m)=H(n)\;,\\0\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;elsewise\;.\end{array}\right.\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(12)\\{\boldsymbol\Lambda}_{\mathrm m,\mathrm n}=\left\{\begin{array}{l}\eta+(1-1/\left|H(m)\right|\;)\in\;\;\;\;\;if\;H(m)=H(n)\;,\\0\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;elsewise\;.\end{array}\right.\;\;(13)
Γm,n={1/∣H(m)∣ifH(m)=H(n),0elsewise.(12)Λm,n={η+(1−1/∣H(m)∣)∈ifH(m)=H(n),0elsewise.(13)
3.4.C-SGD后的卷积核修剪
C-SGD训练完成后,由于每一簇的卷积核变得相同(Sect.4.3),所以挑选任何一个都是一样的。我们为每一层从剩下的集里简单地挑选每一簇中第一个卷积核(也就是有最小索引值的卷积核),就是
R
i
=
{
m
i
n
(
H
)
∣
∀
H
∈
C
i
}
R_i=\left\{min(\mathcal H)\vert\forall\mathcal H\in C_i\right\}
Ri={min(H)∣∀H∈Ci}
对于下一层,我们把要删除的通道加到对应剩下的通道上。
K
:
,
:
,
k
,
:
(
i
+
1
)
←
∑
K
:
,
:
,
H
(
k
)
,
:
(
i
+
1
)
∀
k
∈
R
i
K_{:,:,k,:}^{(i+1)}\leftarrow{\textstyle\sum_{}^{}}K_{:,:,H(k),:}^{(i+1)}\;\;\;\;\forall k\in\;R_i
K:,:,k,:(i+1)←∑K:,:,H(k),:(i+1)∀k∈Ri然后我们删除冗余的卷积核和下一层的输入通道(根据Eq.2,3)。由于卷积的线性和组合特性(Eq.1),不会造成损伤,所以不需要微调。
3.5.C-SGD用于受约束的卷积核剪枝
近年来,随着CNN设计理念的进步,出现了几种高效、紧凑的CNN架构,并得到了实际应用的青睐。虽然有一些优秀的研究已经表明,经典的plain network,例如 AlexNet和VGG,是高度冗余的,可以大幅修剪,修剪后的版本通常在准确性和效率方面仍然不如更新和更复杂的CNNs。
我们分析了卷积核剪枝非常深和复杂的CNNs具有挑战性的三个原因。1)首先,这些网络是出于计算效率的考虑设计的,这使得它们紧致又高效。2)其次,这些网络显然比传统的网络更深,因此一层一层的剪枝不再那么有效,而且误差会在通过多层的反向传播时显著增加,导致对卷积核重要性的估计产生偏差。3)最后也是最重要的,一些创新的结构被这些网络大量使用,比如跨层连接和密集连接,导致了约束卷积核剪枝的open problem。
也就是说,在ResNets的每一个阶段,每一个残差块都用来添加学习到的残差到第一或投影层(第一个)的steam feature maps,因此每一个残差块的最后一层(后面的)必须和前面的以相同的方式修剪,也就是说,后面的层剩下的集
R
R
R必须和前面的第一层是一样的,否则整个网络将被严重破坏,以致于微调无法恢复其准确性。比如,Li等人曾经暴力地剪枝ResNets但是最终精度很低。在一些成功的探索中,Li等人通过只剪枝ResNets-56内部的层(每个残差块的第一层)回避了这一问题。Liu等人和He等人跳过剪枝这些问题层,通过在推理期间在残差块的第一层前加了一个额外的采样层来减少输入通道。虽然这些方法可以将网络修剪到一定程度,但是从整体的角度来看,网络并不是字面上的“瘦身”,而是实际上的“剪断”,如图3所示。
我们通过C-SGD部分解决了这一open problem,关键是驱使不同的层学习相同的冗余模式。比如,如果层
p
p
p和层
q
q
q需要以相同的模式剪枝,我们只要以某种方式为层
p
p
p生成簇,然后将生成的簇的集分配给层
q
q
q,叫做
C
q
←
C
p
C_q\leftarrow C_p
Cq←Cp。然后在C-SGD训练期间,层
p
p
p和层
q
q
q的卷积核产生了相同的冗余模式。也就是说,如果
p
p
p层的第
j
j
j个和第
k
k
k个卷积核变得相同,我们保证
q
q
q层的第
j
j
j个第
k
k
k个卷积核一致,所以问题层可以和其它层一起剪枝。为了更加直观,附录中有一些示意图。
4.实验
4.1.瘦身很深很复杂的CNNs
我们在CIFAR-10和ImageNet-1K上做实验评估我们的方法。对于每一个实验,我们从训练好的基础模型开始,并同时在所有目标层上应用C-SGD训练。表1和2中列出了C-SGD与其他卷积核修剪方法之间就绝对误差和相对误差的增加而言的比较,这也通常被用作衡量标准以公平比较不同基础模型上精度的变化。例如,我们的ResNet-50基础模型和C-SGD-70的Top-1精度为75.33%, 75.27%,因此绝对误差和相对误差增加分别为75.33%−75.27%= 0.06%和0.24%。
**CIFAR-10.**基本模型从头训练600代确保收敛,比通常采用的基准长的多(160或300代),这样剪枝模型的改进的精度不能简单地归因于额外训练代的基本模型并没有完全收敛。我们使用[23]采用的数据扩充技术,即,填充到40×40,随机剪切和翻转。超参数
∈
\in
∈随意设置
3
×
1
0
−
3
3\times 10^{-3}
3×10−3。我们使用批大小为64的C-SGD训练,学习率为
3
×
1
0
−
2
3\times 10^{-2}
3×10−2,当损失停止下降时衰减0.1。对于每一个网络,我们独立地进行两个实验,唯一的区别是我们生成卷积核簇的方式,也就是平均分类或k-means聚类。我们希望找到对每个模型减少大约60%FLOPs的方法,所以我们对ResNets的每个卷积层剪枝3/8,因此参数和FLOPs减少约
1
−
(
5
/
8
)
2
=
61
%
1-(5/8)^{2}=61\%
1−(5/8)2=61%。这很有效,而且没有导致明显的精度下降。对于DenseNet-40,剪枝的模型在三步中有5,8,10个增量卷积层,所以FLOPs降低了大概60.05%,并且精度有显著的增加,这和[44]一致但比它更好。
**ImageNet.**我们使用ResNet-50在ImageNet上实验来验证C-SGD在实际应用中的效果。我们在卷积核的核上使用k-means聚类来生成簇,然后使用包含128万张高质量图像的ILSVRC2015训练集进行训练。
我们采用标准的数据增强技术,包括b-box distortion and colorshift。在测试时,我们使用单一的central crop。对于C-SGD-7/10、C-SGD-6/10和C-SGD-5/10,每个残块的第一层和第二层分别缩小到原始宽度的70%、60%和50%。
**Discussions.**我们剪枝过的网络有更少的FLOPs,更简单的结构和更高或可比的精度。值得注意的是,我们在全局范围内对ResNets应用了相同的剪枝比例,如果能进行更多的敏感性分析实验,并相应地调整得到的网络结构,可能会取得更好的结果。有趣的是,即使是任意生成的簇也会产生不错的结果(表1)。
4.2.冗余训练 vs.普通训练
将C-SGD与其他剪枝-微调方法进行比较,结果表明,训练冗余网络并将其等价地转换为较窄的冗余网络,可能比剪枝后再进行微调效果更好。这与[14]和[27]一致,作者认为神经网络中的冗余是克服高度非凸优化的必要条件。
我们用普通的SGD训练一个窄的CNN,并将其与另一个用C-SGD训练的等效宽度的模型进行比较,从而验证了这一假设。例如,如果一个网络有2×数量的卷积核作为正常的对手,但每两个卷积核是相同的,他们将以相同的结构结束训练。如果冗余的比正常的表现更好,我们可以得出结论,通过利用冗余卷积核,C-SGD确实产生了更强大的网络。
在DenseNet-40上,我们将每一增量层的12个卷积核平均分成3个簇,使用C-SGD从无到有地训练网络,然后对其进行修剪,得到一个每一增量层有3个卷积核的DenseNet-40。在训练过程中,每个卷积核向心生长。作为对比,我们使用普通SGD对DenseNet-40进行训练,每层使用3个过滤器。在另一组实验中,每一层都有6个卷积核。之后,实施了在VGG上的实验,其中我们将层分别拉伸到原来宽度的1/4和1/2。从表3中可以得出,冗余卷积核与通常训练的具有相同宽度的卷积核相比更有效。这一观察结果支持了我们的猜想,即向心生长的卷积核可以在一定程度上保持模型的表征能力,因为尽管这些卷积核受到限制,但它们相应的输入通道仍在充分使用,可以在没有限制的情况下生长(图1)。
4.3.使卷积核相同 vs.置零
由于制作相同的卷积核和对卷积核进行归零是产生冗余模式进行剪枝的两种方法,我们在ResNet-56上进行了控制实验来探究差异。为了公平比较,我们的目标是在使用C-SGD训练的模型和使用group- lasso正则化训练的模型中产生相同数量的冗余卷积核。对于C-SGD,每层的簇数是卷积核数的5/8。对于Lasso,在开头的层和中间层中,有3/8的原始卷积核是用组Lasso进行正则化的,后面的卷积核也是用相同的模式处理的。我们使用前面提到的平方核偏差
χ
\chi
χ和平方和残差
ϕ
\phi
ϕ测量冗余。假设
L
\mathcal L
L是层的索引集,
P
i
P_{i}
Pi是
i
i
i层要剪枝的卷积核的集,也就是,卷积核的3/8的group-Lasso正则的集
ϕ
=
∑
i
∈
L
∑
j
∈
P
i
∥
K
:
,
:
,
:
,
j
(
i
)
∥
2
2
\phi=\sum_{i\in\mathfrak L}\underset{}{\sum_{j\in P_i}\left\|K_{:,:,:,j}^{(i)}\right\|_2^2}
ϕ=i∈L∑j∈Pi∑∥∥∥K:,:,:,j(i)∥∥∥22
我们在图4展示了曲线
χ
\chi
χ,
ϕ
\phi
ϕ以及剪枝之前和之后的测试精度。初始学习率设置为
3
×
1
0
−
2
3\times 10^{-2}
3×10−2并且在100代和200代的时候减少0.1。可以观察到:1)GroupLasso不能归零卷积核,但在一定程度上可以减少它们的大小,当正则化项得到的梯度与原目标函数得到的梯度接近时
ϕ
\phi
ϕ停滞。根据经验我们发现即使
ϕ
\phi
ϕ达到
4
×
1
0
−
4
4\times 10^{-4}
4×10−4左右,比初始值小约
2
×
1
0
6
2\times 10^{6}
2×106倍,但剪枝仍会造成明显的损害(准确率下降10%左右)。当学习速率衰减并且
ϕ
\phi
ϕ在200代减少时,我们观察到剪枝精度没有改善,因此没有进行更多的小学习率或强group-Lasso正规化实验。我们认为这是由于非常深的CNNs中的误差传播和放大。2)通过C-SGD,
χ
\chi
χ单调和完美地指数减少,这导致更快的收敛性,即每个簇中的卷积核可以以恒定的速率无限恒定地相互靠近且学习速率恒定。 对于C-SGD,修剪大约90代后绝对不会造成任何性能损失。3)使用Group-Lasso进行训练比C-SGD慢2倍,因为它需要复杂的平方根运算。
4.4.C-SGD vs.其它卷积核剪枝方法
我们通过控制实验在DenseNet-40上比较C-SGD和其它方法。我们瘦身训练好的DenseNet-40网络的增量层到3到6个卷积核。实验进行了3次,结果如图5。对每个模型训练设置保持一致:学习率
τ
=
3
×
1
0
−
3
,
3
×
1
0
−
4
,
3
×
1
0
−
5
,
3
×
1
0
−
6
\tau=3\times 10^{-3},3\times 10^{-4},3\times 10^{-5},3\times 10^{-6}
τ=3×10−3,3×10−4,3×10−5,3×10−6对于200,200,100和100代,保证每个模型收敛。我们的方法是用C-SGD对模型进行训练并进行剪枝。对于Magnitude- [40], APoZ- [28] andTaylor-expansion-based [49],采用不同的标准对模型进行剪枝和微调。对标记为Lasso的模型,先进行600个epoch的group-Lasso正则化训练,然后进行剪枝,再对其他600个epoch进行微调,并采用相同的学习速率计划,从而使比较结果实际上更倾向于Lasso方法。模型每10,000次迭代(12.8 epoch)在验证集上测试一次。结果表明,C-SGD具有较高的精度和较好的稳定性。虽然group-Lasso正则化确实可以减少剪枝带来的性能下降,但是C-SGD的性能有很大的优势。有趣的是,被严重剪枝的网络是不稳定的,很容易陷入局部最小值,例如,精度曲线在开始时急剧上升,之后略有下降。这一观测结果与刘等人的[45]观测结果一致。
5.结论
我们提出了CNNs中生成相同卷积核用于网络瘦身的方法。想法是使卷积核相同不仅可以消除微调的需求也保留更多的网络表征能力,相比zeroing-out fashion(图1)。我们已经部分地解决了在非常深和复杂的CNNs上的受限卷积核剪枝的open problem,并在几个常见的基准上取得了最先进的结果。通过使用C-SGD对具有冗余卷积核的神经网络进行训练,证明了冗余有助于神经网络训练收敛这一假设的经验证据,为今后的研究提供了参考。除了剪枝之外,我们认为C-SGD还可以作为正则化或训练技术的一种手段。