概述
CNN 模型在许多方面都取得了进展,但要将一些高精度 CNN 模型应用到实际场景中,还是面临一些问题:
- 模型大小:模型参数和结构需要保存在硬盘上,对于一些嵌入式系统来说是一个不小的负担;
- 运行时内存需求:推理时产生的中间变量需要地方存储;
- 计算操作次数:一个比较大的 CNN 网络在移动设备上的处理时间可能可以达到数分钟,这使得应用于实时应用不现实。
这些实际问题使得人们考虑对模型大小进行压缩。这篇文章提出,可以对 BN 层的尺度因子使用 L1 正则化,将 BN 层的尺度因子推向 0 使得我们可以辨别那些不重要的通道进行裁剪。多增加的正则化对性能造成的影响很小,尽管可能会暂时地降低模型性能,但是通过 finetune 后可以弥补甚至可能超过原有模型性能。而且这一裁剪过程可以重复多次用以获得一个更紧凑的网络。
方法
现有的一些稀疏化方法,包括权重稀疏化、核稀疏化、通道稀疏化和层稀疏化等。权重稀疏化灵活性最高,也获得最高的压缩率,但是通常需要特定硬件的支持才能达到加速的效果。层稀疏化最粗糙,灵活性最低,但是在一般的硬件上都能获得加速效果。通道裁剪有一个比较好的均衡,而且也可以在包括 CNN 或者全连层网络上都可以进行应用。
为了达到通道稀疏性的效果,和这个通道相关的输入和输出连接都需要被裁剪。
论文提出的方法,是对每个通道训练一个尺度因子,将这个尺度因子和通道输出进行相乘。在网络训练时对网络和这些尺度因子进行联合优化,然后裁剪掉尺度因子小的通道,并对裁剪后的网络进行微调。因此网络的损失函数就是:
其中
g
(
γ
)
g(\gamma)
g(γ) 是稀疏性惩罚函数,
γ
\gamma
γ 是损失平衡系数。这里使用的稀疏性惩罚函数是 L1 范数,当然也可以使用 Smooth-L1 函数。由于尺度因子和网络联合优化,因此网络可以自动识别出不重要的通道,这使得可以在不明显影响网络性能的情况下进行通道移除。整体过程如下图所示。
此外现如今的网络大都使用了 BN 层,如下式所示:
BN 层将对每个通道进行缩放和平移,因此可以直接使用 BN 层的缩放因子进行网络裁剪。
通过稀疏化训练,裁剪尺度因子在 0 附近的通道。设置一个全局阈值比例来完成裁剪,将处于这个比例外面的小权重因子对应的通道全部进行裁剪。
裁剪可能会造成网络性能暂时性的下降,但是这个下降可以通过对裁剪后的网络进行 finetune 来恢复。在作者的实验中,finetune 后的小网络甚至可以获得比之前大网络更高的精度性能。
如下图所示,这个裁剪过程还可以分成多次进行,也就是对一个裁剪过后的网络,再次进行稀疏化训练、裁剪、finetune,来获得一个更加紧凑化的小网络。
特殊的,对于跳层连接,使用一个 channel selection 层 mask 掉不重要的通道完成 add 操作。
实验及指标
实验细节
- baseline 网络都从头训练;
- 在训练稀疏化网络时,对缩放因子正则化损失权重进行了网格超参搜索( γ = 1 0 − 3 , 1 0 − 4 , 1 0 − 5 \gamma=10^{-3},10^{-4},10^{-5} γ=10−3,10−4,10−5);
- 在 finetune 小模型时,把稀疏化训练模型的参数复制给裁剪后的模型。
实验指标
如下图所示,在 cifar10 上面的实验,当裁剪比例超过一个阈值时可能造成模型性能的下降:
如下图所示,当
γ
\gamma
γ 正则化损失系数逐渐增大时,有更多的通道被认为是不重要通道:
最终,使用 VGG、DenseNet 和 ResNet,在 cifar 和 SVHN 数据集上的裁剪实验结果如下表所示。可以看到,尽管经过了大量的裁剪,但是仍然基本保持了 baseline 模型的精度性能。