1. 概述
这篇文章提出了一种基于LASSO回归的通道选择和最小二乘重构的迭代两步算法,有效地对每一层进行修剪。并进一步将其推广到多层和多分枝的场景下。论文中的方法能够减少累积误差并且提升对于不同结构的适应性。该方法在VGG-16数据集上实现了5倍加速并且只有0.3%误差提升。更重要的是文章中的方法可以用于加速像ResNet和Inception,在加速两倍的情况下只牺牲了1.4%和1.0%的准确率。基于caffe的代码开源:channel-pruning
图中(a)代表原始的网络结构,接下来就要对其进行剪裁,可以分为如下几种情况:
1)sparse connection,也就是是的网络中的神经元或是channel连接稀疏;
2)tensor factorization,采用类似GoogleNet之类的结果来降低参数量。
3)channel pruning,就是裁剪channel来使得网络减小。
在这篇文章中提出了一种利用通道内部荣誉实现一种时间推理的通道剪枝方法。这个方法的灵感来自于张量因式分解的启发,而不是依靠分析滤波器的权重大小。这是通过使剪枝之后的网络在剪枝之处特征图的重构错误最小化实现的。
上图展示了通道剪裁加速网络的示意图。我们减少feature map B的数量,同时使得由剪裁之后的B得到feature map C的重构误差最小。上图中B前面的两个channel被剪裁掉了,对应在B中的feature map也会被剪裁掉。
通道剪裁分为两步:
1)通过LASSO回归选择重要的channel,剪除不重要的channel;
2)使用最小二乘法去减小剩余feature map重构下一层feature map的误差。
在VGG-16网络上实现了4倍加速,而且只增加了1%的top 5错误率,与张量分解结合可以使其实现5被加速且只增加0.3%错误率。在ResNet-50与Xception-50上实现2倍加速,只损失了1.4%与1.0%的准确率。
2. 剪枝
2.1 基本结构
通道剪裁涉及到两点:选择需要剪裁的通道;使用剩下的通道去重建下一层的feature map,然后使得这个重建的误差最小化。
那么接下来就是需要解决如何确定剪裁的通道(规定了必须剪裁掉的数量)并且使得重构的误差最小化。这就是一个组合优化问题,那么论文中是怎么做的呢?那就是将这个问题转换为一个最优化问题,如下形式:
其中 X = N ∗ c ∗ k h ∗ k w X=N*c*k_h*k_w X=N∗c∗kh∗kw