一、精读论文
论文题目
PRUNING FILTERS FOR EFFICIENT CONVNETS
高效卷积网络的剪枝滤波器
论文作者
Hao Li
(李浩)
刊物名称
ICLR 2017
出版日期
2017
摘要
cnn在各种应用中的成功伴随着计算和参数存储成本的显著增加。最近为减少这些开销所做的努力包括在不损害原始准确性的情况下修剪和压缩各个层的权重。然而,基于幅度的权值剪枝会从全连通层中减少大量的参数,由于剪枝网络的不规则稀疏性,可能不能充分降低卷积层的计算成本。我们提出了一种针对cnn的加速方法,在这种方法中,我们从被识别为对输出精度有小影响的cnn中删除滤波器。通过去除网络中的整个滤波器及其连接特征映射,大大降低了计算量。与剪枝权值相比,这种方法不会产生稀疏连接模式。因此,它不需要稀疏卷积库的支持,可以与现有的高效BLAS库一起进行密集矩阵乘法。我们表明,即使是简单的滤波修剪技术,在CIFAR10上也能将VGG-16和ResNet-110的推理成本分别降低高达34%和38%,同时通过重新训练网络恢复接近原始准确性。
关键词
剪枝网络、删除滤波器
总结
本质思想:用weight值的大小来评判filter的重要性,对于一个filter,对所有weight的绝对值求和(求L1范数),作为该filter的评价指标,排序结果并将一层中值低的filter裁掉。
现代cnn通常具有高容量和大量的训练和推理成本。本文提出了一种在不引入不规则稀疏性的情况下,用相对较低的权重值裁剪滤波器来生成计算成本较低的cnn的方法。它在VGGNet(在CIFAR-10上)和深层ResNets的flops中实现了约30%的降低,而在原始准确性方面没有显著损失。为了简化和易于实现,我们采用了一次性修剪和再训练策略,而不是使用特定的分层干草参数和耗时的迭代再训练。通过对非常深的cnn进行损伤研究,我们确定了对剪枝具有鲁棒性或敏感性的层次,这有助于进一步理解和改进结构。
二、研读总结(分三段总结,500字左右)
1、 针对问题与解决方法
论文首先指出了现有剪枝网络的两个主要问题:一个是有些剪枝方法在剪枝后并不能减少计算时间,因为大多数的剪枝操作是在计算量不大的FC层完成的;另一个问题是,有些能剪枝CNN的方法在剪枝后需要使用单独的稀疏网络框架(BLAS)甚至专门的硬件上才能运行。
所以本文专注于对卷积核剪枝,与权重剪枝相比,卷积核剪枝对于剪枝操作更自然,不会引入稀疏连接,所以不需要使用专门的框架或者硬件。
剪枝卷积核和特征图
当其中一个卷积核Fi,j被剪枝后,根据卷积操作方式,它所对应的特征通道Xi+1,j也会被移除,就减少了一个卷积核的计算量(nik2hi+1wi+1)。同时,由于特征通道Xi+1,j的移除,对其进行的下一层卷积操作计算量也会相应减少(ni+2k2hi+2wi+2)。所以,剪枝第i层的m个卷积核会减少第i层和i+1层的共计m/ni+1的计算量。
决定单个卷积层中哪些卷积核被剪枝
文中声明所提出来的剪枝方法可以在对已训练好的模型剪枝用处较小的卷积核的同时尽可能地不损失精度。该方法通过计算当前卷积层的每个卷积核的F1-norm来确定各个卷积核的相对重要性,它也同样代表着卷积核的平均权重大小:F1-norm值低(权重小)的卷积核相对于其他卷积核一般会产生较弱激活的特征图。
这里之所以用F1-norm而不是F2-norm,是因为这是经过实验测试后的,如下图:
虽然从图中可以看出:F1-norm和F2-norm并没有明显的区别,但是F1-norm效果还是要稍微好一点,所以文中选择了F1-norm。
对第i层卷积层剪枝m个卷积核的步骤如下:
-
-
对sj进行排序;
-
对m个最小的s值的卷积核和相应输出特征图进行剪枝,下一层卷积层的对应卷积核通道也删除;
-
创建第i层和第i+1层的新的卷积核矩阵,同时保留其原来的权重并拷贝到新模型中。
确定单层卷积层对剪枝的敏感度
为了确定模型每一层的敏感度,论文对每一层都进行了单独的剪枝实验并且在validation集上进行验证。结果如下图b所示:
为了看懂图b,首先需要解释一下图a:图a表示VGG网络在cifar-10数据集根据sj值排序后的每层卷积核,由于每一层卷积层的卷积核个数不同,所以将卷积核其归一化到1(100%)放在x轴,将相应归一化后的sj值放在y轴。可以看出,曲线开始越陡峭的卷积层(如conv1、conv11)表示其sj值较小的卷积核越多(如conv1的60%左右的卷积核的sj值在0.2以下),而曲线开始越平坦的曲线(如conv2、conv5)表示其sj值越小的卷积核越少(如conv5的90%以上的卷积核都大于0.6)。
看懂了图a就能很好的理解图b了,从图b中可以看出,在图a中曲线越陡峭的卷积层(sj值较小的卷积核多)在剪枝过后更能保持其原精度;相反,曲线越平坦的卷积层(sj值较小的卷积核少)会对剪枝更加敏感。所以,论文倾向于剪枝sj值较小的卷积核以维持模型精度。
根据上述分析,在剪枝过程中,需要根据每一层对剪枝的敏感度来确定具体剪枝的比例。但是,如果一层一层的进行测试不仅费时且会出现层级的超参数设置问题。文中观察到VGG和ResNet网络相同stage的敏感度相似,所以文中对同一个stage的所有卷积层使用了相同的剪枝比例以避免超参设置问题。而对于敏感度很高的卷积层,设置很小的剪枝比例,或者甚至不进行剪枝。
多层卷积层的剪枝
对于连续多层的卷积层剪枝,文中提出了两种策略:
- 独立剪枝,每一层剪枝都与其他层独立。如下图中,在剪枝计算F1-norm时(绿色)并没有去处前一层剪枝后的移除的特征图(蓝色),所以卷积核中黄色位置的权重依然被计算;
- 贪心剪枝,不考虑已经被上一层剪枝后移除的特征图,即不计算下图中蓝色的特征图。
贪心剪枝虽然不是全局最优的方法,但是当较多卷积核被剪枝时,它能保留更高的精度。
接下来文中讲述了如何进行残差层的剪枝,在叙述之前首先要说明一下,文中提供的剪枝方法是在ResNet-34、ResNet-56、ResNet-110这三个网络上剪枝的,它们使用的残差块是两个3x3卷积连接的basicblock,即下图:
由于残差块中有横向连接(shortcut),所以剪枝比较复杂,如下图:
这里第一层卷积A因为剪枝后不影响残差块特征图的输出,所以可以按之前的规则随意剪枝。但是,由于第二层卷积B输出的特征图需要跟横向连接的P(Xi)层进行相加,所以B的剪枝比较复杂。因此,为了剪枝B,其对应的特征图Xi+2以及横向连接的特征图P(Xi)的对应特征图要同时进行剪枝。由于横向连接的特征图比残差块的特征图更加重要,B中哪个卷积核被剪枝是由C的剪枝结果决定的(即图中C中的绿色卷积核先被剪枝,然后移除相应特征图P(Xi)的特征通道,接着Xi+2对应P的通道也被剪枝,最后根据特征通道被移除的位置剪枝B中绿色卷积核)。这里需要特别注意一下,由于在原有的basicblock残差块中,只有在下采样的时候横向连接才进行卷积,即图2的Downsample,所以文中仅在网络中存在downsample的时候进行剪枝,即resnet中每个stage的开始。
重训练剪枝后的网络
有两种重训练的策略:
- 剪枝一次然后重训练:对网络的多层卷积层只进行一次剪枝,然后进行重训练知道得到原有的精度;
- 迭代式剪枝和重训练:一层一层地剪枝然后进行重训练,在下一层被剪枝之前,模型进行重训练以适应前一层被剪枝后的变化。
论文中通过实验发现,对于不敏感的卷积层,使用第一种方法能剪枝掉高比例的卷积核并且能在少量epoch的重训练中恢复精度;但是,若是敏感的卷积层的大比例卷积核被剪枝,则很难恢复到原有精度。第二种方法虽然可能获取更好的结果,但是需要更多的epoch进行重训练。
2、 数据实验与结论分析
对于VGG-16、ResNet-56、ResNet-110在cifar10数据集来说,可以在剪枝64.0%、13.7%和2.3%的参数后,甚至得到更高分类精度,这一点在图1c中也有提现,这是因为冗余的卷积核被剪枝。
在剪枝Resnet时,实验发现敏感层都位于接近特征通道数变化的残差块,即每个stage中的第一个和最后一个残差块。所以在上述的结果中,这些敏感层都被跳过剪枝。
对于ResNet-34在ImageNet数据集中的剪枝,最好的结果是剪枝7.6%的同时损失了0.67%的精度。
3、 科研启发与积累工作
正在复现代码,对于滤波器的剪枝方面填补了很大的空白,学到了很多知识。