通道剪枝Channel Pruning
论文:Channel Pruning for Accelerating Very Deep Neural Networks
Github: https://github.com/yihui-he/channel-pruning
ICCV2017 旷视科技
论文提出了新的通道剪枝方法,基于2步迭代的剪枝方法。首先基于LASSO回归选择通道,然后基于最小均方误差,进行权值的重新学习。该方法在VGG-16上取得了5倍的加速,并且只产生0.3%的误差。
同时,论文给出了残差结构,多分支结构网络的剪枝方法。
传统的CNN加速方法,FFT,freeze ,optimize, quantize ,BinaryNet ,distlation,Structured simplification。
结构简化(Structured simplification)的加速方法:
(a)一个网络的3个卷积层
(b)让网络变得稀疏,去掉网络中的稀疏连接
(c)张量分解,分解一个矩阵为多个
(d)通道剪枝
通道剪枝:
N:样本数目,batch数目
n:输出通道数
kh,kw:卷积核大小
卷积核滤波器W大小为n*c
输入特征图大小X为N*c*kh*kw
输出特征图Y大小为N*n
c’:剪枝后的通道数
||.||F表示弗洛贝尼乌斯范数,也就是2范数
Βi表示第i个特征图通道的
整个剪枝过程,在输入X一定的情况下,需要选择剪掉第几个通道,同时还需要在通道被剪后,进行weights的重新学习,保证,剪枝前和剪枝后,输出的特征图具有最小的L2范数。
另外这里和PocketFlow一样,所谓剪枝,就是找一个mask,也就是Β给乘上去,并不是真正的剪掉,只有在最后导出模型的时候,才会真正把mask为0的通道删掉。
由于上面的式子中有Β和W2个需要优化的变量,是一个NP hard问题。所以,作者提出,首先固定W学习Β,得到要剪枝的通道,再固定Β,只学习W,这样来实现整体的剪枝过程。
(1)只学习β.
这里采用LASSO回归,增加基于β.的L1范数,可以学习到非常稀疏的β.数值。λ参数控制剪枝率,越大,表示剪枝率越大,最后模型越小。
(2)只学习W
这里,对W除以了W的2范数,进行了归一化操作,更方便学习优化。为了保证最终X*W的输出不变,对β乘以了W的2范数
剪枝残差结构模块:
残差模块的最后一层:
对于最后一个1x1 conv的pruning,我们不仅要考虑residual分支上的信息恢复,同样要考虑到identity maping分支上面的信息丢失。因此最终用于恢复的目标值并非是Y2,而是Y1 - Y'1 + Y2。
这样就可以在W的计算中考虑进去identity maping上信息的恢复了。
残差模块的第一层:
由于identity maping分支和shortcut 分支共享输入,所以不能直接进行剪枝。而是通过对
identity maping分支的输入进行通道采样,从C0采样为C0‘,实现了通道的剪枝,而shortcut分支通道没有进行剪枝,因为该分支没有卷积参数可以学习。
实验结果:
本文的channel pruning方法在单个层pruning比filter pruning方法的效果要好。在相同加速比的情况下,具有更小的误差。
总结:
通道剪枝,可以实现主流网络结构VGG,Inception ,Resnet等的加速。