论文题目:《Pruning Filters For Efficient ConvNets》
论文地址:https://arxiv.org/abs/1608.08710
主要思想:
这篇文章主要讲了对filters的裁剪,裁剪方法是计算L1范数,然后裁剪掉较小的,多少取决于加速比。
实现效果:
1.VGG-16 34%加速
2.ResNet-110 38%加速
概述:
在模型压缩的方法中,包括剪枝,量化,多值网络,模型蒸馏等。这篇论文是模型剪枝。剪枝最初应用应该是在决策树算法中,通过降低决策树的模型复杂度防止过拟合。在CNN中也是类似的思想,因为在大型的模型中,总是不可避免的存在大量的权重冗余,这种冗余甚至有可能降低模型的准确率。因此需要借助剪枝的方法压缩模型,在压缩率合适的条件下,可以提高模型的准确率的同时减少模型大小。同时,在往移动端部署模型的时候也会考虑牺牲一点精度换取时间和空间的节约。CNN的剪枝主要分为两种,一种是基于幅度的权值剪枝,一种是基于通道的剪枝。基于幅值的剪枝主要思想是将小于一定阈值的权重抛弃,阈值用剪枝率来确定。而基于通道的剪枝主要思想是将不重要的整个权重通道剪掉,从而将模型变小。这篇论文就属于第二类。
摘要
CNNs在各种应用中的成功伴随着计算量和参数存储成本的显著增加。最近为减少这些开销所做的努力包括在不损害原有精度的情况下修剪和压缩各层的权重。然而,基于幅度(magnitude-based)的权值剪枝从完全连通的层中减少了大量的参数,由于剪枝后的网络具有不规则的稀疏性,可能不能充分降低卷积层的计算成本。我们提出了一种CNNs的加速方法,删除CNN中对输出精度影响很小的卷积核(filter)。通过去除网络中的整个卷积核(filter)及其连接的特征映射(feature maps),大大降低了计算成本。与权重剪枝相反,这种方法不会导致稀疏连接模式。因此,它不需要稀疏卷积库的支持,并且可以使用现有的高效BLAS库进行密集矩阵乘法。我们表明,即使是简单的卷积核(filter)剪枝也可以在CIFAR10上降低高达34%的VGG-16和高达38%的ResNet-110的推理成本,同时通过重新训练网络恢复接近原始的准确性。
1. 引言
ImageNet的挑战在探索CNNs的各种架构选择方面带来了重大进展(Russakovsky等人(2015);Krizhevsky等人(2012);Simonyan & Zisserman (2015);Szegedy等(2015a);He等(2016))。过去几年的总体趋势是,随着参数量和卷积运算的总体增加,网络变得越来越深。这些高容量网络有显著的推理成本,特别是当与嵌入式传感器或移动设备一起使用时,计算和电力资源可能是有限的。对于这些应用来说,除了准确性之外,计算效率和小的网络规模也是关键的实现因素(Szegedy等人(2015b))。此外,对于提供图像搜索和图像分类api的web服务(操作时间预算通常为每秒数十万张图像),推断时间较低会带来很大好处。
在通过模型压缩来降低存储和计算成本方面已经做了大量的工作(Le Cun等人(1989);Hassibi & Stork (1993);Srinivas & Babu (2015);Han et al. (2015);Mariet & Sra(2016))。最近,Han等人(2015;2016b)在AlexNet (Krizhevsky et al.(2012))和VGGNet (Simonyan & Zisserman(2015))上报告了令人印象深刻的压缩率,方法是在不影响总体精度的情况下对权重进行小幅度修剪,然后再进行训练。然而,修剪参数不一定减少计算时间,因为删除的大部分参数来自全连接层,而全连接层的计算成本低,例如,VGG-16中全连接层参数占据总数的90%,但只占比重不到1%的总体浮点运算(FLOP)。他们还证明了卷积层可以被压缩和加速(Iandola et al. (2016)),但是仍然需要BLAS稀疏库甚至专用硬件(Han等人(2016a))。在CNNs上使用稀疏操作提供加速的现代库通常是有限的(Szegedy等人(2015a);Liu等人(2015))以及维护稀疏的数据结构也会产生额外的存储开销,这对于低精度权重来说是非常重要的。
最近关于CNNs的工作已经产生了具有更高效设计的深层架构(Szegedy等人(2015a;b);He&Sun(2015);He等(2016)),将全连接层替换为平均池化层(Lin等(2013);He等人(2016)),大大减少了参数的数量。通过在早期对图像进行降采样,减小feature map的大小,降低了计算成本(He & Sun(2015))。然而,随着网络的不断深入,卷积层的计算成本继续占据主导地位。
大规模的CNNs通常在不同的卷积核和特征通道之间具有显著的冗余。在这项工作中,我们关注的是通过剪枝卷积核(filter)来降低训练良好的CNNs的计算成本。与跨网络的剪枝权值相比,卷积核剪枝是一种自然结构化的剪枝方式,无需引入稀疏性,因此不需要使用稀疏库或任何专门的硬件。修剪卷积核的数量通过减少矩阵乘法的数量直接与加速相关,这很容易调优加速。此外,我们没有采用分层迭代fine-tuning(再训练),而是采用了一次剪枝和再训练策略,以节省跨多层剪枝卷积核的再训练时间,这对于深度网络的剪枝是至关重要的。最后,我们观察到,即使对于参数和推理成本明显低于AlexNet或VGGNet的ResNets,在不牺牲太多准确性的情况下仍有大约30%的FLOP减少。我们对ResNet中的卷积层进行敏感性分析,以提高对ResNet的理解。
2. 相关工作
Le Cun等人(1989)的早期工作引入了Optimal Brain Damage,它用一个理论上合理的显著性度量来调整权重。后来,Hassibi & Stork(1993)提出了Optimal Brain Surgeon来去除由二阶导数信息决定的不重要的权重。Mariet & Sra(2016)通过识别不需要再训练的不同神经元子集来减少网络冗余。然而,这种方法只在全连接层上运行,并且引入了稀疏连接。
为了减少卷积层的计算成本,过去的工作提出了近似卷积运算,将权值矩阵表示为两个较小矩阵的低秩乘积,而不改变卷积核的原始数量(Denil et al. (2013);Jaderberg等(2014);张等(2015b;a);Tai等(2016);Ioannou等人(2016))。其他减少卷积开销的方法包括使用基于FFT的卷积(Mathieu et al.(2013))和使用Winograd算法的快速卷积(Lavin & Gray(2016))。此外,量化(Han et al. (2016b))和二值化(Rastegari et al. (2016);Courbariaux & Bengio(2016))可以用来减小模型尺寸,降低计算开销。除了这些技术之外,我们的方法还可以减少计算成本,而不会产生额外的开销。
一些工作已经研究了从训练良好的网络中去除冗余的特征映射(Anwar等人(2015);Polyak & Wolf(2015))。Anwar et al.(2015)引入了一种三级权重剪枝,并使用粒子滤波来定位剪枝候选对象,从大量随机生成的掩码中选择最佳组合。Polyak & Wolf(2015)为人脸检测应用程序使用样本输入数据来检测不太频繁激活的特征图。我们选择使用简单的基于幅度的度量来分析卷积核权重和修剪卷积核及其对应的特征映射(feature maps),而不检查可能的组合。我们还介绍了针对简单和复杂卷积网络架构的剪枝卷积核的全网络方法。
与此同时,人们对训练具有稀疏约束的紧凑CNNs越来越感兴趣(Lebedev & Lempitsky (2016);Zhou等(2016);Wen等(2016))。Lebedev & Lempitsky(2016)利用卷积核上的群稀疏性来实现结构化脑损伤(structured brain damage),即以组的方式对卷积核的条目进行修剪。Zhou等人(2016)在训练过程中对神经元进行组稀疏正则化,学习具有简化卷积核的紧凑CNNs。Wen等人(2016)在每一层上添加结构化稀疏正则化器,以减少琐碎的卷积核、通道甚至层。在卷积核级别的剪枝中,以上所有工作都使用L2,1-norm作为正则化器。
与上面的工作类似,我们使用L1-norm来选择不重要的卷积核并对它们进行物理剪枝。我们的微调(fine-tuning)过程与传统的训练过程相同,没有引入额外的正规化。我们的方法不为正则化器引入额外的分层元参数,除了要剪枝的卷积核的百分比,这与期望的加速直接相关。通过采用分段剪枝,我们可以在一个阶段中为所有层设置一个单一的剪枝率。
3. 卷积核和特征图剪枝
3.1. 确定在单层中需要剪枝的卷积核
3.2. 确定卷积层对剪枝的敏感度
为了理解每个卷积层对剪枝的敏感度,论文对每一层独立剪枝并在验证集上对剪枝后的网络进行评估。Figure2(b)展示了这一结果。其中曲线的斜率就可以代表敏感度,斜率比较平缓的说明该层对剪枝的敏感度就更高。论文根据经验来决定对每一层的卷积核进行剪枝,对于深度网络(如VGG-16或ResNets),观察到同一stage相同尺寸的特征图对应的层对剪枝的敏感度相似,论文对于同一stage的所有层使用相同的剪枝比例。而对于那些敏感度高的层,剪枝时比例很小,甚至完全不进行剪枝。
3.3. 跨多个卷积层剪枝
之前的工作是逐层剪枝然后重新训练来恢复精度损失。然而理解如何能一次性的对多层进行剪枝是有必要的:(1)因为对于深层网络来说,逐层剪枝再训练太耗时。(2)整体剪枝的方法可以为网络鲁棒性提供一个全局视野,从而形成了一个更小的网络。(3)对于复杂的网络,一个整体的方法是有必要的。例如对于ResNet,对恒等映射特征图或者每个残差模块的第二层剪枝会导致额外层的剪枝。为了对多层同时剪枝,论文考虑了两个策略。
● 每一层独立剪枝,即在计算(求权重绝对值之和)时不考虑上一层的剪枝情况,所以计算时Figure3中的黄色点权重仍然参与计算。
● 采用贪心策略,计算时不计算已经剪枝过的,即黄色点不参与计算。 实验证明采用贪心策略的计算方式精度会好一些。
Figure3说明了计算绝对权重总和的两种方法之间的区别。贪婪算法虽然不是全局最优的,但它具有全局的优点,尤其是在多个卷积核都修剪的情况下,能够得到更高的修剪精度。
对于简单的CNN网络如AlexNet,VGGNet,可以简单的对任意卷积层进行剪枝。然而,对于ResNet这种复杂的网络,这是不可行的。ResNet的结构对剪枝提出了限制条件,残差块中的第一个卷积层可以随意修剪,因为它不会改变残差块输出特征图的数目,然而第二个卷积层和特征映射的剪枝很困难。因此,为了残差模块的第二个卷积层进行剪枝,相关的projected featured maps(就是x_i)必须也要剪掉,由于恒等特征映射要比添加的residual maps重要,对第二个层的剪枝应该由shortcut层的剪枝结果决定。为了决定那些恒等特征映射图被剪掉,我们对shortcut卷积层(1x1卷积核)上采用相同的选择标准,即residual block 中第二层修剪的 Filter index 与shortcut layer 所选择的 Filter index 相同。这个过程结合Figure4比较容易懂。
3.4. 重新训练网络恢复精度
在剪枝之后,性能下降应该通过重新训练网络来补偿。有两种策略可以在多个网络层上剪枝卷积核:
● 一次剪枝和重新训练:一次性对多层的卷积核剪枝,然后重新训练直到恢复原来的准确率。
● 交替剪枝和训练:逐层或逐卷积核剪枝,然后迭代地再训练。在对下一层进行剪枝之前,对模型进行再训练,为了让权重适应剪枝过程中的变化。
我们发现,对于那些能够适应剪枝的网络层,可以使用剪枝和再训练一次策略来修剪掉网络的重要部分,任何准确性的损失都可以通过短时间(少于最初的训练时间)再训练来恢复。然而,当来自敏感层的一些过滤器被删除或大部分网络被删除时,可能不能恢复原始的准确性。迭代修剪和再训练可能会产生更好的结果,但迭代过程需要更多的时间,特别是对于深度非常深的网络。