Pruning Filters for Efficient ConvEnts文章阅读

Pruning Filters for Efficient ConvEnts

Abstract

最近减少网络计算量的方法包括修剪和压缩网络权重而不损失整体CNN性能。然而,使用模型压缩产生稀疏的CNN网络主要减少的是全链接层的参数,这并不一定能较好的减少计算量。

Introduction

这些大体积的网络在预测时有着较大的开销,所以当被应用于嵌入式元件或者移动设备时等一些计算能力收到限制的设备,就非常的不友好。
最近,在提高大而且深的网络效率的工作上,也包括对于整个网络参数的修剪。这会在CNNs上创建稀疏的网络。这个方法存在三个问题,首先,修剪参数并不会显著减少计算量,因为去除的参数大部分来自全链接层,而其所需要的计算量时比较低的。比如训练VGG16,卷积操作占了整个网络FLOP的90.9%,因此,修剪来自全链接层的参数并不会显著的降低计算量。第二,修剪参数会造成网络的稀疏性,,而现在的一些库对稀疏操作的加速是有限的。第三,维护稀疏数据结构会产生额外的存储开销。而这些存储开销对于低精度的权重是非常重要的。
为了解决这一问题,我们提出了一种从训练好的网路修剪卷积过滤器和特征图的方法,而不是移除它的一些参数。这从卷积操作中减少了计算开销。

Pruning Filters and Feature Maps

假设当前层是第一层,输入图片的大小是3×227×2273\times227\times227,卷积和的大小是3×3(k×k)3\times3(k\times k),那么对应一个filter就是3×3×33\times3\times3,对于VGG16,输出通道是64,那么这个卷积核矩阵哒大小就是3×64×3×33\times64\times3\times3,那么总的操作次数就是64×3×k×k×227×22764\times3\times k\times k \times 227 \times 227,假设下一层的卷积核参数是64(in_channels)×64(out_channels)×3×364(in\_channels)\times64(out\_channels)\times3\times3,如果该层删减了5个卷积核,即由原来的3×64×3×33\times64\times3\times3变为3×59×3×33\times59\times3\times3,则对应于下一层的卷积核矩阵也跟着改变,变为59(in_channels)×64(out_channels)×3×359(in\_channels)\times64(out\_channels)\times3\times3.

Determining which filters to prune

计算一个filter权重Fi,j\mathcal{F}_{i,j}的大小。对于第一层卷积,则可以获得64个filter的值,然后把他们从大到小排列。然后按照上述方法,裁剪到mm个最小的filter。修剪之后,剩余的保留下来,组成新的卷积核矩阵。
**同修剪权重的关系:**修剪权重绝对值较低的filter是和修剪较低的权重是相似的。当一个卷积核的所有参数都低于阈值时,那么修剪权重也相当于修剪据filter。

Determining single layer’s sensitivity to pruning

为了了解每一层的敏感程度,我们独立的修剪每一层,然后在测试集上验证修剪后的网络准确度。
Pruning Filters for Efficient ConvEnts文章阅读
由图可以看到,两图中的虚线部分代表的层,也即比较深的层,对修剪较为不敏感。而实线部分则比较敏感,实线部分代表的层为浅层。但是第一层是例外的。

Pruning filters across multiple layers

之前的工作逐层修剪权重,然后迭代重新训练来补偿精度损失。然而,理解如何修剪filter是非常重要的。1)逐层修剪很费时,2)通过网络修剪层可以全面了解网络的稳健性,从而实现更小的网络, 3)对于复杂网络,可能需要采用整体方法。 例如,对于ResNet,修剪身份特征图或每个残余块的第二层导致其他层的额外修剪。
在多层中整体修剪filter时,有两种方法:

  • 独立修剪,不依赖于其他层
  • 贪婪修剪,考虑之前修剪的情况。
    由于是整体修剪,所以当一层修剪后,再进行下一层修剪时,就会有是否考虑上一层已经修剪过的卷积核的问题。independent pruning是指的不考虑已经修剪的情况,把每一层单独看待。直接计算。而greedy pruning则是指在计算绝对值之和时,去除上一层已经修剪过的核。
Retraining pruned networks to regain accuracy

多层修剪的策略

  • Prune once and retrain
  • Prune and retrain iteratively
    对于具有修剪弹性的层,可以使用第一种方法,通过再训练就可以很快的获取到原始精度。但是当一些敏感层被修剪或者一层中很大一部分被修剪时,可能无法获得原始精度。这时第二种方法可能会产生更好的效果。但是对于非常深的层是非常不友好的。

Experiments

Pruning Filters for Efficient ConvEnts文章阅读
在上面说层的敏感度时,有一层是例外的,就是第一层。第一层的特点好像和深层比较类似。文章中给出的解释是,当第一层由64修剪到12时,相较于输入通道3,仍有较多的冗余。但是对于第二层,如果由64修剪为12,那么相对于前一层来说,就大大减少了特征的数目。