文章目录
本文中的方法来自于论文《Learning Effcient Convolutional Network through Network Sliming》
论文:Learning Effcient Convolutional Network through Network Sliming
Introduction
CNN模型压缩最主要的是下面三个方面:
- 模型大小(model size),其中包含训练参数和关联的网络结构。
- 运行内存(run-time memory),包括加载训练参数等。
- 计算操作数量(numbers of computing operation)。
相比于CNN网络,该方法做了以下修改:
- 训练的时候,在第 i i i层和第 i + 1 i+1 i+1层加入了一层chennel scaling factors的训练层,他们与前一层的卷积层意一一对应,与后一层卷积层使用全连接。
- 在训练完成之后,检查scaling层的参数,如果参数低于某一阈值就删除该chnnel,并且还要对其他channel进行微调。
Related Work
其他CNN模型压缩的方法还有:
- Low-rank Decomposition,该方法对全连接层有奇效。
- Weight Quantuzation,该方法通过hash将权重由一个较大的范围转变到一个较小的范围。例如,在MNIST中,将像素的值由 [ 0 , 255 ] 转 变 为 [ 0 , 1 ] [0,255]转变为[0,1] [0,255]转变为[0,1]。
- weight pruning/Sparsify,权重剪枝,将一些值较小的一些权重删去,从而达到压缩的目的。
- structured pruning/sparsify,t通过随机停用一些channel来达到压缩的目的,类似于TensorFlow中的Dropout层通过将一定数量的channel变为0类似。
- neural architecture learning,这个类似于CNN中的Inception模型,让网络在预先的几个模型中进行学习,选择最好的。
网络稀疏化(Network Slimming)
稀疏化:按照我的理解即是淘汰部分对结果影响较低的权重、或者通道等。
why choose chennel-level sparsify
稀疏化可以用于不同维度。我们可以在weight-level、kernel-level、channel-level、layer-level进行稀疏化。
在weight-level、kernel-level进行处理,能够具有较高的压缩效率,同时还兼具灵活性和普遍性,但是往往需要软件以及硬件支持才能在准确度兼具的情况下进行。
相反,在layer-level层面上进行,就缺乏灵活性和普遍性,事实上只有在层数>50时,对layer进行稀疏化才能获得较好的效果。
在chennel层面进行稀疏化,能够在一定程度上兼具上述优点,同时不需要软件和硬件支持。
how to implement
在scaling层,如果仅仅只将factor较小的channel删除,那么仅仅只能压缩十分之一。因此,还需要对其他channel进行微调(fine-tune),在这里映入了L1-pealty loss即在最终的loss函数中加入正则化。
l
o
s
s
f
u
n
c
t
i
o
n
g
:
L
=
∑
(
x
,
y
)
l
(
f
(
x
,
W
)
,
y
)
+
λ
∑
γ
∈
T
g
(
γ
)
loss functiong: \\ L = \sum_{(x,y)}l(f(x,W),y)+\lambda\sum_{\gamma\in \Tau}g(\gamma)
lossfunctiong:L=(x,y)∑l(f(x,W),y)+λγ∈T∑g(γ)
其中,
(
x
,
y
)
代
表
i
n
p
u
t
,
o
u
t
p
u
t
,
W
表
示
训
练
权
重
,
λ
表
示
平
衡
前
后
l
o
s
s
的
超
参
数
,
T
表
示
s
c
a
l
i
n
g
层
的
参
数
,
一
般
g
函
数
选
择
L
1
或
者
是
s
m
o
o
t
h
−
L
1
(x,y)代表input,output,\\W表示训练权重,\\ \lambda表示平衡前后loss的超参数,\\ \Tau 表示scaling层的参数,\\一般g函数选择L1或者是smooth-L1
(x,y)代表input,output,W表示训练权重,λ表示平衡前后loss的超参数,T表示scaling层的参数,一般g函数选择L1或者是smooth−L1
下面是关于smooth-L1的解释:
L 1 ; s m o o t h = { ∣ x ∣ if ∣ x ∣ > α ; 1 ∣ α ∣ x 2 if ∣ x ∣ ≤ α L_{1;smooth} = \begin{cases}|x| & \text{if $|x|>\alpha$;} \\ \frac{1}{|\alpha|}x^2 & \text{if $|x| \leq \alpha$}\end{cases} L1;smooth={∣x∣∣α∣1x2if ∣x∣>α;if ∣x∣≤α
α \alpha α is a hyper-parameter here and is usually taken as 1. 1 α \frac{1}{\alpha} α1 appears near x 2 x^2 x2 term to make it continuous.
Smooth L1-loss combines the advantages of L1-loss (steady gradients for large values of x x x) and L2-loss (less oscillations(振荡,因为L1正则化当x在0附近时,会在-1,1振荡) during updates when x x x is small).
Another form of smooth L1-loss is Huber loss. They achieve the same thing. Taken from Wikipedia, Huber loss is
L δ ( a ) = { 1 2 a 2 for ∣ a ∣ ≤ δ , δ ( ∣ a ∣ − 1 2 δ ) , otherwise. L_\delta (a) = \begin{cases} \frac{1}{2}{a^2} & \text{for } |a| \le \delta, \\ \delta (|a| - \frac{1}{2}\delta), & \text{otherwise.} \end{cases} Lδ(a)={21a2δ(∣a∣−21δ),for ∣a∣≤δ,otherwise.
——引用自StackExchange
在模型中加入BN(Batch Normalization)层
在BN层中对数据进行下列变化:
z
^
=
z
i
n
−
μ
β
σ
2
+
ϵ
;
z
o
u
t
=
γ
z
^
+
β
{\widehat{z}=\frac{z_{in} - \mu_{\beta}}{\sqrt{\sigma^2+\epsilon}}}; {z_{out} = \gamma \widehat{z}+\beta}
z
=σ2+ϵzin−μβ;zout=γz
+β
其
中
μ
β
为
样
本
中
位
数
,
σ
为
方
差
,
γ
,
β
是
可
训
练
的
参
数
其中\mu_{\beta}为样本中位数,\sigma为方差,\\\gamma,\beta 是可训练的参数
其中μβ为样本中位数,σ为方差,γ,β是可训练的参数
事实上,如果我们不加入BN层,scaling层的factor值就无法代表重要性(虽然我们依然可以通过参数来选择channel),因为我们可以将权重的值扩大n倍,将factor的值缩小n倍,而不会影响输出结果。
(待续)