剪枝-Pruning felters for efficient convnets

Pruning Filters for Efficient ConvNets

这篇论文也属于参数裁剪的一类,不同于一般的裁剪全连接层参数,这篇论文裁剪的重点是卷积层,而且把卷积核和特征图一起裁剪,统统丢掉。

1. 背景:

CNN在各种应用中的成功伴随着计算和参数存储成本的显着增加,通过模型压缩来降低存储和计算成本已经有大量的工作,主要是通过修剪权重较小的参数,然后在不影响总体精度的情况下进行再培训。然而,剪枝参数并不一定会减少计算时间,因为删除的大多数参数来自计算成本较低的完全连接层。也有些人产生了更有效的深层结构设计,比如用完全连接层替代平均池层,但是因为卷积层的计算成本仍然占主导地位,所以这种计算量成本的降低还是有限的

论文就是提出了对卷积层进行剪枝操作,然后进行重新训练恢复精度。不采用分层剪枝之后再训练的策略,而是采用一次剪枝和再训练策略,以节省多层剪枝滤波器的再训练时间,这对于修剪非常深的网络至关重要。

2. 具体实现

2.1 step1 根据L1范数单层剪枝

表示第i层的一个卷积核,我们通过(一个卷积核内所有权值绝对值的和——L1正则项)来表征每个层中该卷积核的重要性。

作者认为 权重的绝对值越小,则权重的作用也就越小。

从积层剪掉m个卷积核的过程如下:

  1. 对每个卷积核 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMnYV4ON-1613149718633)(https://www.zhihu.com/equation?tex=F_%7Bi%2Cj%7D)] ,计算它的权重绝对值之和 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P57YDqq1-1613149718634)(https://www.zhihu.com/equation?tex=s_%7Bj%7D%3D%5Csum_%7Bl%3D1%7D%5E%7Bn_%7Bi%7D%7D%5Csum+%7CK_%7Bl%7D%7C)] ;

  2. 根据 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qPBrmjP-1613149718637)(https://www.zhihu.com/equation?tex=s_%7Bj%7D)] 排序;

  3. 将m个权重绝对值之和最小的卷积核以及对应的feature maps剪掉。下一个卷积层中与剪掉的feature maps相关的核也要移除;

  4. 一个对于第i层和第i+1层的新的权重矩阵被创建,并且剩下的权重参数被复制到新模型中;更新一下模型,剩余的卷积核组成新的卷积核矩阵

  5. 文章和随机选择相同数量的filters和选择最大值的结果比较,此方法最好。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdnFM9n1-1613149718638)(image-20210205174831738.png)]

2.2 step2 确定单层剪枝的敏感性

为了理解每一层的敏感性,我们独立的修剪每一层,并在验证集上评估修剪后的网络的准确性。图2(b)显示,我们观察到有差不多数量的卷积核的图层对于修剪具有类似的敏感性。我们对同一阶段的所有图层使用相同的剪枝比。对于修剪敏感的图层,我们剪掉这些图层中较小的一部分,或者完全跳过修剪。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAtxkERh-1613149718639)(image-20210205200343434.png)]

2.3 多层同时剪枝(一次性剪枝)

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

  1. 对于深度网络,逐层剪枝再训练太耗时;

  2. 整体剪枝的方法提供给网络稳健性的一个全面视野,从而导致产生一个更小的网络;

  3. 对于复杂的网络,一个整体的方法很有必要,比如对于ResNet,对恒等映射特征图或者每个残差模块的第二个层剪枝会导致额外层的修剪;

为了对多层同时剪枝,作者考虑了两个策略:

  1. 每一层独立剪枝,即在计算(求权重绝对值之和)时不考虑上一层的修剪情况,所以计算时下图中的黄点仍然参与计算;

  2. 贪心策略,计算时不计算已经修剪过的,即黄点不参与计算;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j3qqhmYp-1613149718639)(image-20210205174410455.png)]

上图说明了两种方法之间的区别,实验结果证明第二种方法精度会高一点。

2.4 如何恢复剪枝之后的准确度

采用重新训练剪枝网络以恢复准确性

在剪枝过后,通过预训练可以补偿剪枝造成的精度损失,有两种策略:

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

  2. 交替剪枝和训练:逐层或逐卷积核剪枝,然后再训练,重复多次。

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

3. 效果:

在CIFAR10上,,在保证没有明损失原来的准确度的基础上,可以实现VGG-16的推理成本可降低高达34%,ResNet-110最高可降低38%

IFAR10上,,在保证没有明损失原来的准确度的基础上,可以实现VGG-16的推理成本可降低高达34%,ResNet-110最高可降低38%

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqFgiqgN-1613149718640)(image-20210205175351414.png)]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值