[ICLR’17]这篇论文也属于参数裁剪的一类,不同于一般的裁剪全连接层参数,这篇论文裁剪的重点是卷积层,而且把卷积核和特征图一起裁剪,统统丢掉。论文链接:https://arxiv.org/abs/1608.08710
老规矩,先看结果。
效果:
在CIFAR10上,VGG-16的推理成本可降低高达34%,ResNet-110最高可降低38%,同时通过重新训练网络恢复接近原始精度。
主要思想:
由于CNN通常在不同的 Filter 和特征信道之间具有显着的冗余,论文中通过修剪 Filter 来减少CNN的计算成本。与在整个网络中修剪权重相比, Filter 修剪是一种自然结构化的修剪方法,不会引入稀疏性,因此不需要使用稀疏库或任何专用硬件。通过减少矩阵乘法的次数,修剪 Filter 的数量与加速度直接相关,这很容易针对目标加速进行调整。
删除一个 Filter 就能减少一个输出特征图,同时特征图对应的接下来卷积操作同样可以删除掉。
修剪Filter步骤:
1)计算 Filter 中所有权值的绝对值之和
2)根据求和大小排列 Filter
3)删除数值较小的 Filter (权重数值越小,代表权重的重要性越弱)
4)对删除之后的 Filter 重新组合,生成新的Filter矩阵
多层同时修剪:
作者给出了2中修剪思路:
1)独立修剪:修剪时每一层是独立的。
2)贪心修剪:修剪时考虑之前图层中删除的 Filter 。
两种方法的区别:独立修剪在计算(求权重绝对值之和)时不考虑上一层的修剪情况,所以计算时下图中的黄点仍然参与计算;贪心修剪计算时不计算已经修剪过的,即黄点不参与计算。
结果证明第二种方法的精度高一些。
残差网络的处理:
residual block 中的第一层的 Filter 可以随便修剪,因为它不改变 block 的输出特征图的数量。
residual block 中的第二层(标记为绿色)的 Filter 的修剪由 shortcut projection 的修剪结果决定,因为要保证输入和输出的尺寸要相同才能相加(ResNet原理)。
因为 identical feature maps 比 added residual maps 更重要,因此要修剪的 feature maps 应该由shortcut layer的修剪结果确定。为了确定要修剪哪些特征图,论文中使用与1 × 1 kernels shortcut convolutional layers 相同的选择标准。
residual block 中第二层修剪的 Filter index 与shortcut layer 所选择的 Filter index 相同。
再训练:
两种策略:
1)修剪一次并重新训练:一次性同时修剪多个层的 Filter 然后重新训练。
2)迭代修剪并重新训练:一层层的修剪或者一个一个 Filter 的修剪然后迭代重新训练。
对于具有修剪弹性的图层,第一种方法可以用于删除网络的重要部分,并且可以通过短时间重新训练来恢复精度(小于原始训练时间)。但是,当敏感层的一些 Filter 被剪掉或大部分网络被剪掉时,可能无法恢复原始精度。这时第二种方法可能会产生更好的结果,但迭代过程需要更多的 epochs,特别是对于非常深的网络。
注意事项:
1)与修剪权重不同,此方法不会造成网络稀疏的连接模式。因此不需要稀疏卷积库的支持,并且可以与现有的高效BLAS库一起用于密集矩阵乘法。
2)对同一阶段(具有相同特征图大小)中的所有图层使用相同的修剪比例,对于对修剪敏感的图层,剪掉这些图层中较小的一部分或不修剪。