模型剪枝经典论文解读:《Learning Efficient Convolutional Networks through Network Slimming》

Learning Efficient Convolutional Networks through Network Slimming
摘要:
CNN在落地中的部署,很大程度上受到其高计算成本的限制。在本文中,作者提出一种新的CNN学习方案:
1)减少模型大小;
2) 减少模型运算内存的占用;
3)在不影响准确性的同时,减少计算操作的次数。
本文提出一种简单高效的方法,具体通过网络通道的稀疏化来实现的。该方法非常适用于CNN的结构,可将训练的开销降到最低,并且生成的模型不需要特定的软硬件进行加速,部署性能更高,我们将这种方法称为网络剪枝,它将厚重的网络作为训练输入模型,在训练过程中,不重要的通道会被自动筛选并被裁掉,进而生成精确性相当的精简网络。我们使用几个经典的CNN模型(包括VGGNet、ResNet和DenseNet)在不同的图像分类数据集上验证该方法的可行性。对于VGG网络,剪枝后的模型大小减少为原来的20倍,运算操作减少为原来的5倍。
1.背景:
近年来,卷积神经网络已经成为计算机视觉任务的主要解决方法,例如图像分类、目标检测、语义分割等。大规模的数据集、发展快速的GPU显卡,和新的网络架构,使得前所未有的大模型卷积神经网络得到开发和运用。 例如,从AlexNet、VGGNet和GoogLeNet到ResNet,ImageNet分类的挑战获胜模型在这期间从8层发展到100多层。
较大的模型,虽然具有更强的性能,但更耗资源。 例如,152层Reset超过了6000万个参数,并且在推理(分辨率224×224)时Flops超过了20G。几乎没法在资源受限的平台上运行,如移动端,可穿戴设备或物联网设备。
CNN在实际部署主要受以下影响:
1)模型大小:CNN强大的表现能力来自于其数百万个可训练参数。这些参数以及网络结构信息事先存储在磁盘上,推理期间再加载到内存中。举个例子,在ImageNet上存储一个大的CNN模型会消耗超过300MB的内存空间,这对内存本来捉襟见肘的嵌入式设备来说是个巨大的负担。
2) 运行内存:在推理期间,CNN的推理运算产生的参数甚至可能比模型自身已有的参数占用更多的内存空间。这对于高端GPU来说影响微忽极微,但对于许多算力较低的设备来说负担不起。
3) 计算量:卷积操作在高分辨率图像上计算量非常大,一个大模型在移动设备上处理一张图像可能需要几分钟的时间,这在实际应用中不现实。

许多论文已经提出压缩大型CNN网络(剪枝)或直接学习更有效的CNN模型(蒸馏)以实现加速推理的方法。其中包括低秩分解、网络量化、二值化、权重修剪、动态推理等方式。然而,这些方法大多数只能解决上述一到两个难题。此外,有些还需要专门指定的软硬件加速器来加速执行。

在本文中,我们提出一种简单高效的网络剪枝方法,可解决在有限的资源下,部署大型CNN模型遇到的上述所有困难。
具体方法是:
在BN层中的缩放因子上施加L1正则化, 再使用L1正则化将BN层的缩放因子不断调整,通过缩放因子不断趋于0来识别不重要的channel。因为每个缩放因子只对应于特定的卷积通道(或全连接层中的神经元),这有助于在接下来的操作中对不重要的通道进行判别和修剪。
额外添加的正则项对模型性能的影响微忽极微,它甚至可以帮助模型训练出更高的精度。修剪不重要的通道可能会暂时带来性能的损耗,但这种影响可以通过随后的finetune进行修正。
修剪后,与最初的网络相比,生成的剪枝网络在大小、运行时间和计算操作都会更加紧凑。
模型剪枝经典论文解读:《Learning Efficient Convolutional Networks through Network Slimming》_第1张图片

图1:设计缩放因子(在BN层中重复使用)与卷积层中的每个通道串联。 在训练时,对这些缩放因子添加稀疏正规化,使他们不断缩小,从而识别冗余通道。缩放因子过小(橙色)的通道将被修剪。 修剪后,将获得更加紧凑的网络结构(右侧),然后继续微调训练,以实现与原网络相当(或更高)的准确性。

在多个数据集和不同网络上进行实验,结果表明,我们获得的剪枝模型,其大小可压缩到20倍,计算操作减少5倍,于此同时,精度几乎不变甚至更高。此外,剪枝后的模型在传统硬软件上均实现了推理加速。为什么?因为生成的模型通道更窄,没有更多冗余的参数和计算操作。

2.相关工作
在本节中,我们讨论前人开展过的五个相关工作。
低秩分解
使用奇异值分解(SVD)等技术用低秩矩阵重构网络中的权重矩阵。这种方法在全连接层非常有效,但是,由于CNN中的计算操作主要来自卷积层,因此,即使能将模型大小压缩3倍,但并没有明显的加速成效。
权重量化
HashNet的论文提出量化模型权重。在训练之前,将网络权重散列到不同的组中,每个组中共享权重值。因此只需要存储共享的权重以及它们的索引,就可以节省大量的存储空间。该方法在AlexNet和VGGNet上可以实现35-49倍的压缩率。但这些技术既不解决运算内存高的问题,也不能缩短推理时间。因为在推理过程中,共享的权重需要被还原到原先的位置。
《Imagenet classification using binary convolutional neural networks》和《Training deep
neural networks with weights and activations constrained to+1 or-1》
将权重量化为二进制/三元权重(指值域限制在{-1,1}或{-1,0,1}的权重值)。 这确实能节省大量内存占用,并且还可以获得显着加速。 然而,这种极致的低比特换算方法通常会带来精度损失。
模型剪枝/稀疏
《Learning both weights and connections for efficient neural network》提出对模型不重要的连接进行剪枝。模型内部产生的权重值有不少趋于零,因此可以通过稀疏化存储来减少存储空间。 但是,这钟方法只能通过专门的稀疏矩阵运算库或硬件实现加速,且大部分运算操作是由激活函数映射(此部分仍然密集)产生,因此在推理时也很难节约到运行内存。
结构化剪枝/稀疏
《 Pruning filters for efficient convnets》提出,在训练好的模型中,修剪较小权重的通道,然后微调模型网络以恢复准确性。《The power of sparsity in convolutional neural networks》提出在训练之前,随机丢弃channel-wise的连接,引入稀疏化训练,这种方法虽然产生了更小的网络也带来了精度的损失。与这些方法相比,我们在训练过程中优化了通道稀疏化,使得通道剪枝过程更加平滑,精度损失也较小。《Towards compact cnns》在训练期间引入神经元级别的稀疏化,《 Learning structured sparsity in deep neural networks》提出一种结构化稀疏学习(SSL)的方法,用于稀疏CNN中的不同结构(如神经元、通道或神经层)。这两种方法都利用训练过程利用“组稀疏正则化”来获得模型稀疏性结构。我们的方法并不依赖于“组稀疏正则化”,而是在通道的缩放因子上引入简单的L1稀疏化,因此优化目标更简单。
由于这些方法只是剪枝部分网络结构(例如神经元、通道)而不是整个权重,因此它们通常不需要特定库来实现推理加速和保证运行时的内存节省。

神经架构学习
这是一种先进方法,但也存在一些探索性。《Neural network architecture optimization through submodularity and supermodularity》在确定好资源的情况下,为网络架构搜索引入子模块或超模块优化。《Neural architecture search with reinforcement learning》和《Designing neural network architectures using reinforcement learning》也提出通过强化学习来自动学习神经结构的方法。这些方法的搜索空间非常大,因此需要在数百个模型来区分好坏。

  1. 网络剪枝
    我们提供一种实现通道稀疏化剪枝的方案。在本节中,我们首先讨论通道稀疏化的优势和挑战,并介绍如何利用BN中的缩放层来有效识别和裁剪网络中不重要的通道。
    通道稀疏化的优势
    正如先前讨论的,稀疏化可以在不同的结构上实现,如权重、神经元、通道或卷积层。细粒度(如权重级别)的稀疏化具有高灵活性和通用性的特点,也具有很高的压缩率,但它通常需要特殊的软硬件加速器。相反,粗粒度的层稀疏化不需要特殊的工具来实现推理加速,但由于需要修剪某一层,灵活性比较差。事实上,当网络足够深时,移除层具有高效性。相比之下,通道稀疏化在灵活性和易实现性之间实现了很好的均衡。它可以应用于任何经典的CNN网络或全连接网络(将每个神经元视为一个通道),产生的网络本质上是原网络的“精简”版本,可以在传统的平台上进行高效推理。
    挑战
    实现通道稀疏化需要将其有关的所有输入输出连接剪掉,这就很难在训练好的模型上直接剪枝,因为通道输入/输出端的权值不太可能接近零,所以需要边训练边稀疏化。我们在训练好的resnet模型上进行通道剪枝,只能减少10%的参数量,但不会造成精度损失。
    《Learning structured sparsity in deep neural networks》提出在训练目标过程中实施稀疏正则化来解决此问题。具体来说,在训练过程中,他们采用group lasso【1】将同一通道对应的所有滤波器权值同时趋于0。然而,这种方法的关键在于正确计算滤波器上附加的正则项梯度。
    缩放因素和稀疏化惩罚
    我们的想法是为每个通道引入一个缩放因子γ,乘以该通道的输出。然后训练网络和这些缩放因子,训练过程中不断对缩放因子施加稀疏正则化。最后,将缩放因子值很小(甚至能达到0)的通道裁剪并重新对网络进行微调。具体如下:

其中(x,y)表示训练的输入和目标,W表示可训练参数,左边第一项表示CNN正常训练的损失项,g(·)是缩放因子上的稀疏性惩罚,λ是平衡因子,也可以看作是对后边项进行了归一化。在我们的实验中,选择g(s)=| s |(s的绝对值),作为L1范数,用于后面的稀疏化训练。使用次梯度下降法不断优化非平滑(无法求导)的L1惩罚项。也可以使用平滑的L1惩罚替换非平滑的L1惩罚,以避免在非平滑点处使用次梯度【2】。

由于通道剪枝等价于删除关于该通道的输入输出连接关系,因此我们可以直接获得一个更加狭窄的网络(见图1)。缩放因子起着通道选择的作用,随着它们与网络一起优化,不重要的通道被移除,且不会对泛化性能造成太大影响。
使用BN层中的缩放因子
BN在现代CNN中有着广泛的应用,它能帮助模型快速收敛并拥有更好的泛化性能。BN归一化激活值的方法给了我们启发,我们借鉴它设计一种简单有效的方法来融合通道缩放因子。特别是,BN层使用mini-batch统计数据对部的激活值进行归一化内,我们假设zin和zout是BN层的输入和输出,B表示当前的mini-batch,BN层将执行以下转换:

其中,µB和σB是B上输入的平均值和标准差,γ和β是可训练的仿射变换参数(缩放和偏移),它将激活值归一化后线性变换到任意比例。
常规的做法是在卷积层后插入一个BN层,并使用通道缩放/偏移因子。因此,我们可以直接利用BN层中的γ参数作为网络剪枝所需的缩放因子。它的最大优点是不会给网络带来额外开销。事实上,这可能也是我们尝试通道剪枝最有效的方法。
1)如果我们在没有BN层的CNN中添加缩放层,缩放因子的值对于评估通道的重要性没有参考意义,因为卷积层和缩放层都是线性变换,通过缩小缩放因子的值,同时增大卷积层中的权值,获得的结果依旧不变。(这里值卷积层的值没用经过归一化,还是很大,即使缩小了γ的值,它们相互运算后的结果也难缩小,更不可能趋于0)
2)如果在BN层之前插入缩放层,则BN中的归一化会完全消除缩放层的效果
3)如果我们在BN层之后插入缩放层,则每个通道都有两个连续的缩放因子。
(其实以上三点只是为了说明只需要BN层,不需要额外添加缩放层)
通道剪枝和微调
经过添加正则项的通道稀疏化训练,我们得到很多趋于0的缩放因子,将这些通道裁掉。我们使用全局阈值作为通道裁剪的比例。例如,我们选择70%作为阈值,那么缩放因子从小到大排列的前70%通道将被裁剪。这样操作后,我们获得一个更加紧凑的网络,该网络具有更少的参数、运行占用的内存和计算操作更少。
多遍历(迭代)方案
我们还可以将单遍历学习方案(稀疏正则化、剪枝和微调训练)扩展到多遍历。具体地,网络剪枝会产生一个紧凑的网络,在这个网络上,我们可以再次通过这个过程来得到一个更加紧凑的模型。图2的虚线说明了这一点,实验结果表明,这种多遍历方案在压缩方面会产生更好的结果。

图二:模型剪枝的流程图,虚线表示多次迭代
处理跨层连接和预激活结构
当它应用于具有跨层连接和预激活设计(如ResNet和DenseNet)的网络时,需要进行一些调整。对于这些网络,前层的输出是多个后层的输入,BN层则被置于两者之间(前层和后层之间),后层输入的稀疏化(前面BN层稀疏操作后),等价于后层选择性地接收的前层传过来的通道的子集(也就是没剪枝之前是全集,剪枝后变成了子集)。为了在计算时获得更少参数量和计算操作,我们需要放置一个通道选择层来选择重要的通道。
4、实验
我们在几个数据集上验证了本文方法的有效性。
4.1数据集
CIFER、SVHN、ImageNet、MNIST
4.2网络
在CIFER和SVHN数据集上,我们使用三个主流网络(VGG、DenseNet40、ResNet164)验证了该方法的可行性
在Imagenet上,我们采用VGG-A模型。 因为我们使用大量的数据增强,不得不剔除了dropout层。 在全连接层中修剪神经元时,我们可以将它们看作n个1×1大小的卷积通道。
在MNIST数据集上,我们使用3个与《 Learning

structured sparsity in deep neural networks》相同的全连接层。
4.3训练、剪枝和微调
正常训练
我们从零开始训练网络,所有网络均使用SGD算法
在CIFAR和SVHN数据集上,mini-batch=64分别进行了160和20个epochs的训练,初始学习率设为0.1,并在50%和75%的训练周期缩小10倍。
在ImageNet和MNIST数据集上,我们对模型进行60和30个epochs的训练,batch size为256,初始学习率为0.1,在训练后的1/3和2/3阶段将学习率缩小10倍。
我们设置weight decay=0.0001,Nesterov momentum=0.9,通道缩放因子初始化为0.5,与全部初始化为1相比,0.5的初始化值得到了更高的精度。
稀疏训练
对于CIFAR和SVHN数据集,当使用添加正则项的通道稀疏化训练,超参数λ在CIFAR-10验证集上设置为10−3, 10−4, 10−5 ,该值由网格搜索算法得来。对于VGG,我们设置λ= 10-4,Reset和DenSenet设置λ= 10-5。在Imagenet上的VGG-A,我们设置了λ= 10-5。 其他参数设置都与正常训练时保持一致。
剪枝
当我们修剪模型的通道时,需要确定缩放因子的修剪阈值。这里设置40%和60%(表一),修剪过程模型不断变窄。
微调
修剪后,我们获得更窄更紧凑的模型,然后进行微调。 在CiFar,SVHN和Mnist数据集上,微调时参数设置与正常训练的一致。 在Imagenet数据集上,我们微调修剪后的VGG-A,学习率为0.005,由于时间的关系,我们只训练了5个epochs。
4.4结果
CIFAR和SVHN
CIFAR和SVHN的结果如表1所示。
参数和Flops的减少
模型剪枝的目的是减少计算量。 每个模型的最后一行都是裁剪了≥60%的通道,同时仍然保持与原baseline相似的准确性。参数量最大可以修剪90%,Flops通常可以减少50%,如图三。

可以看到,VGG有大量冗余参数,进行剪枝非常合适。在ResNet-164上,参数和FLOP节省相对较小,我们推测这是由于其“bottleneck”结构已起到选择通道的作用。此外,在CiFar-100上,裁剪率通常略低于CiFar-10和SVHN,这可能是由于CiFar-100包含更多类的原因。

正则化效果
从表1中,我们可以观察到,在Reset和DenSenet上,通常在修剪40%通道时,微调网络可实现比原始模型更低的分类误差。比如经过40%通道修剪的DenseNet-40在CIFAR-10上的测试误差为5.19%,几乎比原始模型低1%。我们假设这是由于L1稀疏正则化对通道的效果,其提供了网络中间层的特征选择。 我们将在下一节中的分析这种效果。

ImageNet
ImageNet数据集的结果在表2中。当删减50%的通道时,参数量可剪枝超5倍,而FLOP可减少30.4%。有可能是因为VGG-A参与密集计算的卷积层中有378个(2752个)通道被修剪,而参数密集的全连接层中有5094个神经元(8192个)被修剪。值得关注的是,ImageNet-1000数据集上,我们的方法在不损失精度的前提下实现了裁剪,高效于其他剪枝方法。
MNIST
在MNIST数据集上,使用我们的方法与结构化稀疏学习(SSL)方法进行比较,结果见于表三,尽管我们的方法主要用于修剪卷积层通道,但它也能很好地修剪全连接层中的神经元。在这个实验中,我们观察到设置全局阈值进行修剪时,有可能会完全删除掉某一层,因此我们只修剪每一层80%的神经元。在修剪更多参数的同时,测试误差保持较低,明显优于《 Learning

structured sparsity in deep neural networks》提出的方法。
4.5 多次迭代的结果

我们使用VGG在CiFar数据集上进行多次迭代,测试结果如表四所示,VGG在CIFAR-10和CIFAR100的测试误差分别为6.34%和26.74%。“Trained”和“Fine-tuned”分别表示使用稀疏化训练的模型和微调剪枝模型的测试误差(%)。参数和FLOP修剪比率,对应于该行中的模型和下一行中的模型两者间的比值。
5 分析
在本节中分析两个超参数:修剪百分比(全局阈值)t和正则化项 λ的重要影响
修剪百分比的影响
一旦我们获得了一个经过稀疏正则化训练的模型,我们就可以决定从模型中删减多少个通道。如果我们删减的通道太少,节省的资源就会非常有限。但是,如果修剪过多通道,可能会破坏模型,并且无法通过微调恢复精度。我们训练了一个λ=10-5的DenseNet40模型,以显示修剪不同百分比通道的效果。结果汇总在图5中

只有当阈值超过80%时,微调模型才会差于基线模型。值得注意的是,当使用稀疏性进行训练时,即使没有微调,该模型也比原始模型表现得更好。这可能是由于L1稀疏化对通道缩放因子具有良好的效应。
通道稀疏正则化的影响
L1稀疏项的目的是迫使许多缩放因子接近零。在图4中,我们用不同的λ值绘制整个网络中缩放因子的分布。 而在这个实验中,我们使用VGG在CiFar-10数据集上训练。

可以观察到,随着λ的增加,缩放因子越来越集中在零附近。当λ=0时,没有稀疏正则化,分布相对平坦。当λ=10−4时,几乎所有的缩放因子都落入一个接近零的小区域。该过程可以被视为在深层网络中发生的特征选择,也就是仅选择重要的通道。我们进一步通过Heatmap可视化此过程。 图6显示了在训练过程中,VGG某一层缩放因子的大小。每个通道以相同的初始化权值开始; 随着训练,一些通道的缩放因子变大(更亮),而一些通道的缩放因子变得越来越小(较暗)。

6.总结
我们提出了网络瘦身技术来学习更紧凑的CNN。它直接对BN层中的缩放因子施加稀疏因子的正则化,从而可以在训练期间自动识别不重要的通道,然后进行修剪。在多个数据集上,我们已经证明,所提出的方法能够显著降低网络的计算成本(高达20×),而不会造成精度损失。更重要的是,所提出的方法同时减少了模型大小、运行内存和计算操作,同时为训练过程引入了最小的计算开销,并且生成的模型不需要特殊的库/硬件来进行推理。
补充:
BN计算公式:

【1】什么是group lasso:https://blog.csdn.net/hestendelin/article/details/101546489
【2】sub-gradient:https://blog.csdn.net/qq_32742009/article/details/81704139
【3】什么是低秩分解:
低秩矩阵:如果X是一个m行n列的数值矩阵,rank(X)是X的秩,假如rank (X)远小于m和n,则我们称X是低秩矩阵。低秩矩阵每行或每列都可以用其他的行或列线性表出,可见它包含大量的冗余信息。利用这种冗余信息,可以对缺失数据进行恢复,也可以对数据进行特征提取。
低秩分解:
方法:采用两个K1的卷积核替换掉一个KK的卷积核(decompose the K convolutions into two separable convolutions of size 1 × K and K × 1)
原理:权值向量主要分布在一些低秩子空间,用少数基来重构权值矩阵
用低秩的矩阵代替原先的矩阵,可以减少参数量,也就减少了计算量。
目的:去除冗余,并且减少权值参数
【4】Grid Search:https://www.cnblogs.com/ysugyl/p/8711205.html

模型剪枝经典论文解读:《Learning Efficient Convolutional Networks through Network Slimming》_第2张图片

你可能感兴趣的:(模型量化,目标检测,剪枝,计算机视觉,深度学习)