2021-04-14

对Learning Effificient Convolutional Networks through Network Slimming的 论文解读

论文提供了一种简单的方法来执行通道剪枝。这一节首先讨论channel-wise稀疏化的优势和运到的挑战,然后介绍利用BN的缩放系数来高效的鉴别和剪枝不重要的通道

这篇文章提出利用BN层的缩放系数来进行剪枝,在多个大型数据集和多个大型网络的测试结果说明了这个方法的有效性。这个方法可以在丝毫不损失精度的条件下将分类中的SOTA网络如VGG16,DenseNet,ResNet剪掉20倍以上的参数

论文的想法是对于每一个通道都引入一个缩放因子,然后和通道的输出相乘。接着联合训练网络权重和这些缩放因子,最后将小缩放因子的通道直接移除,微调剪枝后的网络,特别地,目标函数被定义为


其中(x,y)代表训练数据和标签,W是网络的可训练参数,第一项是CNN的训练损失函数。是在缩放因子上的乘法项,是两项的平衡因子。论文的实验过程中选择,即L1正则化,这也被广泛的应用于稀疏化。次梯度下降法作为不平滑(不可导)的L1惩罚项的优化方法,另一个建议是使用平滑的L1正则项取代L1惩罚项,尽量避免在不平滑的点使用次梯度。


我们将一个缩放因子(从批处理归一化层中重用)与卷积层中的每个通道联系起来。在训练过程中,稀疏正则化施加这些标度因子,以自动识别不重要的通道。将修剪比例较小(橙色)的通道(左侧)。修剪后,我们得到紧凑的模型(右边),然后微调以达到与通常训练的全网络相当(甚至更高的)精度。

剪掉一个通道的本质是剪掉所有和这个通道相关的输入和输出连接关系,然后获得一个窄的网络,而不需要借助特殊的计算软硬件。缩放因子的作用是通道选择,因为这里是将缩放因子的正则项和权重损失函数联合优化,网络可以自动鉴别不重要的通道,然后移除掉,几乎不损失精度。




利用BN层的缩放因子

BN层已经被大多数现代CNN广泛采用,做为一种标准的方法来加速网络收敛并获得更好的泛化性能。BN归一化激活值的方法给了作者设计一种简单高效的方法的灵感,即与channel-wise缩放因子的结合。尤其是,BN层使用mini-batch的统计特性对内部激活值归一化。和分别是BN层的输入和输出,B指代现在的minibatch,BN层执行下面的转换:

通常的做法就是在卷积层之后插入一个BN层,引入channel-wise的缩放/平移参数。因此,论文直接将BN层的参数作为我们网络瘦身的缩放因子,这样做的又是在于没有给网络带来额外的开销。事实上,这也可能是我们能够学习到的最有意义的做通道剪枝的缩放因子,因为1)如果我们不使用BN层,而在卷积层之后加入一个缩放层,缩放因子的值对于评估一个通道的重要性没有任何意义,因为卷积层和缩放层就是一种线性变换而已。我们可以通过一方面降低缩放因子的值一方面方法卷积层的权重来使最终的结果保持不变;2)如果我们在BN层之前插入一个缩放层,缩放层的影响将完全被BN层所掩盖;3)如果在BN层之后插入一个缩放层,那么对于每个通道将会有两个连续的缩放因子。


通道剪枝和微调

引入了缩放因子正则化后,训练出来的模型许多缩放因子都会趋近于0,如Figure1所示。具体来说,假设经过卷积层之后的特征图维度为,其中和分别代表特征图的长宽,代表特征图的通道数,将其送入BN层会得到归一化后的特征题意,特征图中的每一个通道都对应一组和,前面说的剪掉小的对应的通道实际上就是直接剪掉这个特征图对应的卷积核。至于什么样的算小呢?这个取决于我们为整个网络所有层设置的一个全局阈值,它被定义为所有缩放因子值的一个比例,例如我们要剪掉整个网络中70%的通道,那么我们先对缩放因子的绝对值排个序,然后取从小到大排序的缩放因子中70%的位置的缩放因子为阈值。这样我们最终就可以得到一个参数较少,运行时内存小,紧凑的CNN模型了。


后续介绍了相关实验情况。

附yolov3的具体网络图:



你可能感兴趣的:(2021-04-14)