卷积神经网络的加速主要包括两类,硬件加速和软件加速,本篇将总结一下软件加速中网络剪枝所使用的方法。
软件加速可以分为压缩结构和压缩参数两种,压缩结构就是将模型结构简化,设计结构更小、参数更小的网络后,从头开始训练,之前博文中提到的MobileNet及ShuffleNet系列网络就是模型压缩的一种。
压缩参数是在已训练完模型的基础上,对参数进行筛选、转换已达到更少参数和更小结构的结果,包括网络剪枝、低秩估计、参数量化和模型蒸馏等。前面有博文提到了旷视科技在2017年提出的通道裁剪剪枝的一篇论文。
网络剪枝
在常用的深度学习框架中,通常将多维张量转换为矩阵乘法来实现卷积操作,而网络剪枝就是基于矩阵乘法来做的。
Tensorflow中的张量转换为矩阵[N,H,W,C]分别代表batch size,输入特征图高度,输入特征图宽度,通道数。
设输入特征图为4*4大小,卷积核大小为3*3,通道数为2,步长为1:
通道1:
通道2:
Tensorflow中先将张量转换为矩阵,将卷积运算转换为和
的矩阵乘法。[N, H, W, C]中,首先优先顺序为[C, W, H, N]。
因此,输入特征图转换的矩阵根据第一步卷积操作:
可以转换为:
batch中每一个样本都是连接在这个矩阵下面的。
下图从左到右分别为输入矩阵,卷积核矩阵和输出矩阵,蓝色的行与蓝色的列生成蓝色的单元。
以上卷积操作转矩阵乘法是网络剪枝的基础,我们可以看到,参数剪枝,是有规律可寻的。
1. filter level and channel level pruning
删除一个卷积核,等于删除第二个矩阵的一列,也就删除了第三个矩阵的一列,即输出通道数减少,相应的下层中的卷积核的通道数也减少了。
相反的,删除卷积核中的通道,相对应的输入特征图的通道就不会再对结果产生影响,同时生成输入该特征图通道的卷积核也可以删除。
2. group level
(1)对卷积核宽高进行裁剪,例如3*3的卷积核裁剪为2*3的卷积核,等同于同时删除卷积核的若干行和特征图的若干行。
(2)对卷积核中某些固定位置进行删减。
3. 稀疏矩阵
将无用参数设置为0,使矩阵稀疏,达到压缩加速的效果。