2017 || Slimming-pytorch(剪枝)
Official Code(torch):https://github.com/liuzhuang13/slimming
Paper : https://arxiv.org/abs/1708.06519
Third party Code (pytorch):
https://github.com/mengrang/Slimming-pytorch
https://github.com/foolwood/pytorch-slimming
震惊!!!所提出的方法竟能够显著减少计算成本(高达20倍)的最先进的网络,没有精度损失,甚至提升精度。
1.动机:
随着网络的深度以及广度的加大,神经网络的模型也越来越大,为了在训练过程中引入的开销最小,生成的模型不需要特殊的软件/硬件加速器。我们将该方法称为网络瘦身,本文的剪枝就是为了得到一个相对紧凑而小的网络。
2.主要实现过程:
在Bn层引入放缩因子γ,把放缩因子与卷积层中的每个通道联系起来,在训练过程中对这个放缩因子进行L1稀疏化,通过不断的训练,可以把自动识别不重要的通道(越重要的放缩因子越大,不重要的放缩因子越小),最后依靠放缩因子把不重要的通道裁剪。
3.其他的相关工作:
低秩分解:
利用像SVD等带有低秩矩阵的技术,靠近神经网络中的权矩阵。这种方法在全连接层上工作得特别好,产生了约3倍模型大小的压缩,但没有显著的速度加速,因为CNN的计算操作主要来自卷积层。
权值量化:
HashNet提出量化网络权值。在训练前,网络权重被散列到不同的组,每个组的权重值被共享。这样只需要存储共享的权重和哈希索引,从而节省了大量的存储空间。有在深度压缩管道中使用了改进的量化技术,在AlexNet和VGGNet上实现了35到49倍的压缩率。然而,这些技术既不能节省运行时内存,也不能节省推理时间,因为在推理期间,共享权重需要恢复到它们的原始位置。也有将实值权重量化为二进制/三元权重(权重值限制为{−1,1}或{−1,0,1})。这产生了减少了大量的模型,并且通过按位操作库也可以获得显著的加速。然而,这种极端的低位近似方法通常会带来中等的精度损失。
重剪枝/疏伐:
提出用小权重剔除训练过的神经网络中不重要的连接。得到的网络权值大多为零,因此可以通过稀疏存储模型来减少存储空间。然而,这些方法只能通过专用的稀疏矩阵操作库和/或硬件来实现加速。运行时内存节省也非常有限,因为大部分内存空间都被激活映射所消耗,而不是权重。在论文[12]中,训练过程中没有对稀疏性的指导。论文[32]克服了这一限制,通过显式地在每个权重上附加门变量的稀疏约束,并通过修剪门值为零的连接来实现高压缩率。这种方法比论文[12]获得更好的压缩率,但也有同样的缺点。
4.原理:
通道稀疏的优势:
最粗糙的层级稀疏性不需要特殊的包来获取推断加速,但由于某些整个层需要修剪,它的灵活性较低。事实上,只有当深度足够大时,例如超过50层,才能有效地去除层。相比之下,信道级的稀疏性在灵活性和易于实现之间提供了一个很好的折中,它可以应用于任何典型的CNN或全连接网络(将每个神经元视为一个通道),得到的网络本质上是未修剪网络的“精简”版本,可以在传统的CNN平台上有效地推理。
修剪一个通道本质上相当于删除该通道所有进出的连接,在不需要借助于任何特殊的稀疏计算包的情况下,可以直接获得一个狭窄的网络。比例因子作为渠道选择的中介。由于它们与网络权值共同优化,网络可以自动识别不重要的通道,不对泛化性能产生很大的影响,安全去除。
通道稀疏相对的挑战:
要实现通道级稀疏性,需要修剪与通道相关的所有传入和传出连接。这使得在预先训练过的模型上直接裁剪权值的方法没有效果,因为不太可能在一个通道的输入或输出端所有权值都接近于零。在预先训练的resnet上修剪通道只能修剪约 10% 的参数,而不会造成精度损失。为了达到更好的效果,我们在训练目标中强制执行稀疏正则化来解决这个问题。
缩放因子和稀疏诱导的惩罚:
为了达到我们所要的效果,我们引入了一个放缩因子γ 。它乘以该通道的输出,然后我们对网络权值和放缩因子进行联合训练,对放缩因子进行稀疏正则化处理,这里我们选择g(s) = |s|,也就是广泛运用于稀疏性的L1范数,用次梯度下降法对非光滑L1罚项进行优化。最后,我们凭借这些小的放缩因子对通道进行修剪,并对修剪后的网络进行微调。
其中(x, y)表示训练输入和目标,W表示可训练权值,第一个求和项对应于CNN的正常训练损失,g(·)是对比例因子的稀疏性惩罚,λ平衡了这两项。
为什么要在BN层插入缩放因子γ:
它的一大优点是没有给网络带来开销。事实上,这可能也是我们学习有意义的通道剪枝比例因子的最有效的方法。
1)如果我们在一个没有BN层的CNN中添加缩放层,缩放因子的值对于评估一个信道的重要性没有意义,因为卷积层和缩放层都是线性变换。通过减小比例因子值,同时放大权重,可以得到相同的结果。
2)如果我们在BN层之前插入一个尺度层,BN的归一化过程将完全抵消尺度层的尺度效应。
3) 如果在BN层之后插入缩放层,则每个通道有两个连续的缩放因子。
其中 分别是平均值和标准偏差值的输入激活B, )是可训练的仿射变换参数(尺度和位移),这提供了可能性线性转换归一化激活回任何尺度。
通道修剪和微调:
当剪枝率较高时,剪枝可能会暂时导致一定的精度损失。但是,这在很大程度上可以通过修剪后的网络上的微调过程来补偿。在我们的实验中,微调的窄网络在许多情况下甚至可以达到比原始的未修剪网络更高的精度。
5、实现:
对于CIFAR和SVHN数据集,当使用信道稀疏正则化训练时,控制经验损耗和稀疏性之间权衡的超参数λ是由CIFAR-10验证集上 的网格搜索决定的。对于VGGNet,我们选择λ=10−4,对于ResNet,vgg - a和DenseNet, λ=10−5。 其他设置保持一致。
剪枝:
当我们对用稀疏度训练的模型的通道进行修剪时,需要确定比例因子的修剪阈值。不像其他的通道剪枝,不同的层用不同的比例进行修剪,为了简单起见,我们使用全局修剪阈值。修剪阈值由所有缩放因子中的一个百分比决定,例如,40%或60%的通道被修剪。剪枝过程是通过建立一个新的更窄的模型,并从经过稀疏度训练的模型中复制相应的权值来实现的。
微调:
经过修剪后,我们得到一个更窄、更紧凑的模型,然后进行微调。在CIFAR、SVHN和MNIST数据集上,微调使用与训练中相同的优化设置。对于ImageNet数据集,由于时间限制,我们以10 - 3的学习速率对修剪后的vgg - a进行微调,仅5次迭代。
6.分析
对本次剪枝中的唯一两个超参数修剪比例跟稀疏正则化项λ系数,进行分析。
修剪比例的影响:
我们通过实验,绘制出来图5, 从(图5)可以看出,修剪或微调模型的分类性能只有在修剪率超过阈值时才会下降。微调过程通常可以补偿剪枝可能造成的精度损失。只有当阈值超过80%时,微调模型的测试误差才会落后于基线模型。值得注意的是,当使用稀疏度训练时,即使没有微调,模型也比原始模型表现得更好。这可能是由于L1稀疏性对信道尺度因子的正则化效应。
超参数λ的设置:
L1稀疏性项的目的是迫使许多比例因子接近于零。公式1中的λ参数与正常训练损失相比控制其显著性。在图4中,我们绘制了不同λ值下整个网络中比例因子的分布。在这个实验中,我们使用在CIFAR-10数据集上训练的VGGNet。
结果表明,随着λ的增大,标度因子越来越集中在零附近。当λ=0时,即没有稀疏正则化,分布相对平坦。当λ=10−4时,几乎所有的比例因子都落在一个接近于零的小区域内。这一过程可以看作是发生在深度网络中间层的特征选择,其中只有具有不可忽略的比例因子的通道被选择。我们进一步通过热图来可视化这一过程。图6显示了VGGNet中一层的比例因子沿训练过程的大小。每个通道的权重都相等;随着训练的进行,一些通道的比例因子变大(变亮),而另一些通道的比例因子变小(变暗)。
7.总结:
为了得到更小的模型,本文处理归一化层的比例因子上引入稀疏诱导正则化,从而在训练过程中自动识别不重要的通道并对其进行修剪。多个数据集上,我们已经证明,所提出的方法能够显著减少计算成本(高达20倍)的最先进的网络,没有精度损失,甚至提升精度。更重要的是,所提出的方法同时减少了模型的大小、运行时内存和计算操作,同时将训练过程的开销引入到最小,并且生成的模型不需要特殊的库/硬件来进行有效的推理。
本文为个人对该论文及代码的一些粗浅的理解跟总结,如有不同意见,欢迎指出讨论。