基本思想
我们在模型生成通道数为[64,128,256,512]的特征图,但是这些特征图不一定都重要,我们希望能够体现特征图的主次之分,通过剪枝除去那些不那么重要的特征图,形成一个轻量化的模型。上述论文通过直接引用BN层的
γ
\gamma
γ参数,作为模型的scaling factor用来评判模型通道的重要程度,利用L1损失函数进行特征选择,最终达到轻量化模型。上述介绍的结构适用于大多数的CNN结构,但是对于具有跨层连接的网络,一个层的输出可以作为多个后续层的输入,例如ResNet的时候,我们将BN层放在卷积层之前,此时稀疏性是在层的传入端得到。此时该层优选地使用接收到的信息。
上图是模型的瘦身流程,据论文所述,当剪枝过高的时候,模型的精度可能会下降,但是通过微调操作可以弥补这些下降,有时候微调过后的网络比原先网络的效果更加优秀。其中我们的损失函数为
L
=
∑
(
x
,
y
)
l
(
f
(
x
,
W
)
,
y
)
+
λ
∑
g
(
γ
)
L = \sum_{(x,y)}l(f(x,W),y)+\lambda\sum g(\gamma)
L=(x,y)∑l(f(x,W),y)+λ∑g(γ)
g
(
γ
)
g(\gamma)
g(γ)是我们所说的L1损失函数。
细节部分
目前通常搭建网络结构的做法是,在卷积层之后搭建一个BN结构,再通过激活函数。不断地进行堆叠。我们可以直接利用BN层中的γ参数作为网络瘦身所需的缩放因子,它具有不给网络引入开销的巨大优势。
Batch Normalization 的优点
神经网络学习过程中就是为了学习数据的分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力将大大下降。BN 在卷积神经网络应用中,得到的数据形式不一定是原始数据分布,因为在经过了不同的卷积层,原始数据的分布也被更改。由于卷积神经网络一开始的参数是无序初始化的,因此为了能使网络更加容易的进行学习,我们希望数据的输入形式尽可能地一致,所以采用了BN层,增加网络的泛化能力。
以sigmoid激活函数为例,当数据输入处于中心点附近的时候,梯度较大, 更新的情况较快,但是当其远离中性点的时候梯度较小,且可能出现梯度消失的现象。我们希望输入在权重和偏移的作用下能够输出一个使得激活层较为敏感的值,因此需要采用BN结构。
BN层结构的目的是为了解决上述输入数据不处于原点附近,且分布不均衡的问题。通过采用BN层减去均值可以使其中心对称,在每个维度上除以各自的标准差可以使范围对称。但是BN层结构不仅仅是一个归一化处理,它是一个可学习、有参数的网络层,如下为BN层的公式。
x
^
(
k
)
=
x
(
k
)
−
E
[
x
(
k
)
]
V
a
r
[
x
(
k
)
]
\hat{x}^{(k)} = \frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}
x^(k)=Var[x(k)]x(k)−E[x(k)]
y
(
k
)
=
γ
(
k
)
x
^
(
k
)
+
β
(
k
)
y^{(k)} = \gamma^{(k)}\hat{x}^{(k)} + \beta^{(k)}
y(k)=γ(k)x^(k)+β(k)
BN引入了可学习参数 γ \gamma γ、 β \beta β ,每一层,每一个通道都会具有一个 γ \gamma γ、 β \beta β 参数,通过网络自身学习该参数,重构原始网络所需要学习的特征分布。
当BN不采用可学习的参数时,采用了BN层之后会将数值分布强制在了非线性函数的线性区域中,对于神经网络而言,多个矩阵运算在线性的条件下可以合并成一个矩阵进行计算。因此我们需要对数据进行还原
y
(
k
)
=
γ
(
k
)
x
^
(
k
)
+
β
(
k
)
y^{(k)} = \gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)}
y(k)=γ(k)x^(k)+β(k)
其中
γ
\gamma
γ的数值越大越重要,因为当其数据较小的时候,相当于一个线性激活函数,可以进行合并,无需多出一个层结构。
同时,为了体现差异性,使较为重要的数据更加重要,采用L1损失函数进行训练。L1损失函数具有天然的输出稀疏性,把不重要的特征都置为0,因此也是一个天然的特征选择器。
L
1
=
∑
i
=
1
n
∣
y
t
r
u
e
−
y
p
r
e
d
i
c
t
e
d
∣
L1=\sum_{i=1}^n|y_{true}-y_{predicted}|
L1=i=1∑n∣ytrue−ypredicted∣
L
2
=
∑
i
=
1
n
(
y
t
r
u
e
−
y
p
r
e
d
i
c
t
e
d
)
2
L2=\sum_{i=1}^n(y_{true}-y_{predicted})^2
L2=i=1∑n(ytrue−ypredicted)2
假设权重更新为
γ
^
=
γ
1
−
0.5
∗
g
r
a
d
i
e
n
t
\hat{\gamma} = \gamma_1-0.5*gradient
γ^=γ1−0.5∗gradient
权重每次下降都会稳定前进,直到参数为0的时候,相反如右图所示,L2损失函数越靠近0,则其变化越小,不具有此类特征。