当前位置: 代码迷 >> 综合 >> 【模型压缩】通道剪枝--《Pruning Filters for Efficient ConvNets》
  详细解决方案

【模型压缩】通道剪枝--《Pruning Filters for Efficient ConvNets》

热度:93   发布时间:2023-12-14 04:00:46.0

论文题目:《Pruning Filters For Efficient ConvNets》
论文地址:https://arxiv.org/abs/1608.08710

1. 概述

       由于CNN通常在不同的 Filter 和特征信道之间具有显着的冗余,论文中通过修剪 Filter 来减少CNN的计算成本。与在整个网络中修剪权重相比, Filter 修剪是一种自然结构化的修剪方法,不会引入稀疏性,因此不需要使用稀疏库或任何专用硬件。通过减少矩阵乘法的次数,修剪 Filter 的数量与加速度直接相关,这很容易针对目标加速进行调整。

2. 主要思想

       这篇文章主要讲了对filters的裁剪,裁剪方法是计算L1范数,然后裁剪掉较小的,多少取决于加速比。

3. 效果

       在CIFAR10数据集上,VGG-16的推理成本可降低高达34%,ResNet-110最高可降低38%,同时通过重新训练网络恢复接近原始精度。

4. 具体实现

在这里插入图片描述
从第i个卷积层剪掉m个卷积核的算法过程如下:

① 计算filter中所有权值的绝对值之和。
② 根据求和大小排列filter。
③ 将m个权重绝对值之和最小的filter及对应的feature map剪掉(权重数值越小,代表权重的重要性越弱),下一个卷积层中和剪掉的feature map相关的filter也要剪掉。
④ 对删除之后的filter重新组合,生成新的filter矩阵。

5. 实现细节

1)跨多层剪枝

在这里插入图片描述

● 在跨越多层裁剪的过程中,可能出现kernel matrix裁剪交叉的情况,两种处理方法:
(1)独立剪枝: 即在计算(求权重绝对值之和)时不考虑上一层的剪枝情况。假设蓝色是确定要裁剪的,然后计算绿色的L1时,要考虑黄色的值,跟之前的裁剪无关。
(2)贪心策略:计算时不计算已经剪枝过的,即黄色值不参与运算 。
       实验证明,采用贪心策略的计算方式精度会好一些。

在这里插入图片描述

● 残差网络(ResNet)的处理:
       对于简单的CNN网络如AlexNet,VGGNet,可以简单的对任意卷积层进行剪枝。然而,对于ResNet这种复杂的网络,这是不可行的。ResNet的结构对剪枝提出了限制条件,residual block中的第一个卷积层可以随意修剪,因为它不会改变residual block输出特征图的数目,然而第二个卷积层和feature map的剪枝很困难(因为要保证输入和输出的尺寸要相同,才能累加)。因此,residual block为了的第二个卷积层进行剪枝,相关的projected featured maps(就是x_i)必须也要剪掉,由于identical feature map要比added residual maps重要,对第二个层的剪枝应该由shortcut层的剪枝结果决定。为了决定那些feature map被剪掉,论文中使用与1 × 1 kernels shortcut convolutional layers 相同的选择标准,即residual block 中第二层修剪的 Filter index 与shortcut layer 所选择的 Filter index 相同。

2)重新训练恢复网络精度

       在剪枝之后,性能下降应该通过重新训练网络来补偿。有两种策略:
(1)修剪一次并重新训练:一次性修剪多个层的 filter 然后重新训练。
(2)迭代修剪并重新训练:一层层的修剪或者一个一个 filter 的修剪然后迭代重新训练,在对下一层进行剪枝之前,对模型进行再训练,为了让权重适应剪枝过程中的变化。
       对于那些能够适应剪枝的网络层,可以使用第一种策略来修剪掉网络的重要部分,任何准确性的损失都可以通过短时间(少于最初的训练时间)再训练来恢复。然而,当来自敏感层的一些filter被删除或大部分网络被删除时,可能无法恢复原始精度。这时第二种方法可能会产生更好的结果,但迭代过程需要更多的时间,特别是对于深度非常深的网络。

  相关解决方案