模型剪枝学习笔记--Pruning Filters for Efficient Convnets

Pruning Filters for Efficient Convnets

是 ICLR 2017的一篇文章,属于filter pruning,论文链接https://arxiv.org/abs/1608.08710
本质思想:用weight值的大小来评判filter的重要性,对于一个filter,对所有weight的绝对值求和(求L1范数),作为该filter的评价指标,排序结果并将一层中值低的filter裁掉

1.PRUNING FILTERS AND FEATURE MAPS

n i n_i ni表示的是第i个卷积层的输入通道数, n i + 1 n_{i+1} ni+1表示的是第i+1个filter,( h i h_i hi, w i w_i wi)表示的是输入feature map的尺寸大小,单个filter(3D)的大小表示为( k , k , n i k,k,n_i k,k,ni),总的filters表示为( n i + 1 , k , k , n i n_{i+1},k,k,n_i ni+1,k,k,ni),那么可以得到:一个feature map经过总的filters得到输出feature map后,需要进行的计算量是 n i ∗ n i + 1 ∗ k ∗ k ∗ h i + 1 ∗ w i + 1 n_i *n_{i+1} *k*k*h_{i+1}*w_{i+1} nini+1kkhi+1wi+1,对应下图的kernel matrix

那么,根据下图所示,
如果剪掉一个feature map,可以直接减少 n i ∗ k 2 ∗ h i + 1 ∗ w i + 1 n_i*k^2*h_{i+1}*w_{i+1} nik2hi+1wi+1个运算(总的有 n i + 1 n_{i+1} ni+1个卷积核,输出通道数少了一个)。
输出feature map的减少一个,就会导致后面附加移除 n i + 2 ∗ k 2 ∗ h i + 2 ∗ w i + 2 n_{i+2}*k^2*h_{i+2}*w_{i+2} ni+2k2hi+2wi+2个运算(输入通道数少一个,共有 n i + 1 n_{i+1} ni+1个输入通道数)。

所以减少m个 feature maps 可以减少 m/ n i + 1 n_{i+1} ni+1 的计算量。
下图中的kernel matrix每一列表示一个3D filter,一个3D filter会有一个feature map输出。

在这里插入图片描述

** DETERMINING WHICH FILTERS TO PRUNE WITHIN A SINGLE LAYER

第i个卷积层剪掉m个卷积核的过程算法流程如下:

  1. 对每个卷积核 ,计算它的权重绝对值之和 s j s_j sj
  2. 根据 s j s_j sj结果排序。
  3. 将m个权重绝对值之和最小的卷积核以及对应的feature maps剪掉。下一个卷积层中与剪掉的feature maps相关的核也要移除。
  4. 一个对于第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

之前的工作是逐层剪枝,然后重复训练来恢复精度。然而,理解如何能一次性对多层进行剪枝是非常有必要的:

  1. 对于深度网络,逐层剪枝再训练太耗时;
  2. 整体剪枝的方法提供给网络稳健性的一个全面视野,从而导致产生一个更小的网络;
  3. 对于复杂的网络,一个整体的方法很有必要,比如对于ResNet,对恒等映射特征图或者每个残差模块的第二个层剪枝会导致额外层的修剪;
    为了对多层同时剪枝,我们考虑了两个策略:
  4. 每一层独立剪枝,即在计算(求权重绝对值之和)时不考虑上一层的修剪情况,所以计算时下图中的黄点仍然参与计算;
  5. 贪心策略,计算时不计算已经修剪过的,即黄点不参与计算;

在这里插入图片描述
实验结果证明第二种方法精度会高一点。
在这里插入图片描述
对于简单的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恢复精度。

  1. 一次剪枝和重新训练:一次性对多层的卷积核剪枝,然后重新训练直到原来的准确率恢复;
  2. 交替剪枝和训练:逐层或逐卷积核剪枝,然后再训练,重复多次。

对于具有修剪弹性的层,第一种方法可以用于删除网络的重要部分,并且可以通过短时间重新训练来恢复精度(小于原始训练时间)。但是,当敏感层的一些 Filter 被剪掉或大部分网络被剪掉时,可能无法恢复原始精度。这时第二种方法可能会产生更好的结果,但迭代过程需要更多的 epochs,特别是对于非常深的网络。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值