模型剪枝学习笔记3--Pruning Filters for Efficient Convnets
Pruning Filters for Efficient Convnets
是 ICLR 2017的一篇文章,属于filter pruning,论文链接。
本质思想:用weight值的大小来评判filter的重要性,对于一个filter,对所有weight的绝对值求和(求L1范数),作为该filter的评价指标,排序结果并将一层中值低的filter裁掉。
1.PRUNING FILTERS AND FEATURE MAPS
表示的是第i个卷积层的输入通道数,表示的是第i+1个filter,(, )表示的是输入feature map的尺寸大小,单个filter(3D)的大小表示为(),总的filters表示为(),那么可以得到:一个feature map经过总的filters得到输出feature map后,需要进行的计算量是,对应下图的kernel matrix
。
那么,根据下图所示,
如果剪掉一个feature map
,可以直接减少个运算(总的有个卷积核,输出通道数少了一个)。
输出feature map
的减少一个,就会导致后面附加移除个运算(输入通道数少一个,共有个输入通道数)。
所以减少m个 feature maps
可以减少 m/ 的计算量。
下图中的kernel matrix
每一列表示一个3D filter,一个3D filter会有一个feature map
输出。
** DETERMINING WHICH FILTERS TO PRUNE WITHIN A SINGLE LAYER
第i个卷积层剪掉m个卷积核的过程算法流程如下:
- 对每个卷积核 ,计算它的权重绝对值之和 。
- 根据结果排序。
- 将m个权重绝对值之和最小的卷积核以及对应的
feature maps
剪掉。下一个卷积层中与剪掉的feature maps
相关的核也要移除。 - 一个对于第i层和第i+1层的新的权重矩阵被创建,并且剩下的权重参数被复制到新模型中。
** DETERMINING SINGLE LAYER’S SENSITIVITY TO PRUNING
为了弄清楚每层的敏感度,论文对每一层独立剪枝并在验证集上对剪枝后的网络进行评估。Figure 2(b)展示了结果,很明显斜率比较平缓的层对剪枝的敏感度更高,我们根据经验来决定对每一层的卷积核进行剪枝,对于深度网络(如VGG-16或ResNets),我们观察到同一stage(相同尺寸的特征图)对应的层对剪枝的敏感度相似,为了避免引入layer-wise meta-parameters,我们对于同一stage的所有层使用相同的剪枝比例。对于那些敏感度高的层,我们剪枝时比例很小,甚至完全不进行剪枝。
** Puring filters across multiple layers
之前的工作是逐层剪枝,然后重复训练来恢复精度。然而,理解如何能一次性对多层进行剪枝是非常有必要的:
- 对于深度网络,逐层剪枝再训练太耗时;
- 整体剪枝的方法提供给网络稳健性的一个全面视野,从而导致产生一个更小的网络;
- 对于复杂的网络,一个整体的方法很有必要,比如对于ResNet,对恒等映射特征图或者每个残差模块的第二个层剪枝会导致额外层的修剪;
为了对多层同时剪枝,我们考虑了两个策略: - 每一层独立剪枝,即在计算(求权重绝对值之和)时不考虑上一层的修剪情况,所以计算时下图中的黄点仍然参与计算;
- 贪心策略,计算时不计算已经修剪过的,即黄点不参与计算;
实验结果证明第二种方法精度会高一点。
对于简单的CNN网络,如VGGNet和AlexNet,我们可以简单的对任意卷积层剪枝。然而,对于如ResNet这样的复杂网络,这是不可行的。ResNet的结构对剪枝提出了限制条件,残差块中的第一个卷积层可以随意修剪,因为它不会改变残差块输出特征图的数目,然而第二个卷积层和特征映射的剪枝很困难。因此,为了残差模块的第二个卷积层进行剪枝,相关的projected featured maps必须也要剪掉,由于恒等特征映射要比添加的residual maps重要,对第二个层的剪枝应该由shortcut层的剪枝结果决定。为了决定那些恒等特征映射图被剪掉,我们对shortcut卷积层(1x1卷积核)上采用相同的选择标准,即residual block 中第二层修剪的 Filter index 与shortcut layer 所选择的 Filter index 相同
** Retrained pruned networks to regain accuracy
论文提供了两种策略进行retrain恢复精度。
- 一次剪枝和重新训练:一次性对多层的卷积核剪枝,然后重新训练直到原来的准确率恢复;
- 交替剪枝和训练:逐层或逐卷积核剪枝,然后再训练,重复多次。
对于具有修剪弹性的层,第一种方法可以用于删除网络的重要部分,并且可以通过短时间重新训练来恢复精度(小于原始训练时间)。但是,当敏感层的一些 Filter 被剪掉或大部分网络被剪掉时,可能无法恢复原始精度。这时第二种方法可能会产生更好的结果,但迭代过程需要更多的 epochs,特别是对于非常深的网络。