模型剪枝方法:通过网络瘦身学习高效的卷积网络

原文地址

代码实践

通过网络瘦身学习高效的卷积网络

摘要

​ 深度卷积神经网络 (CNN) 在许多实际应用中的部署在很大程度上受到其高计算成本的阻碍。在本文中,我们为 CNN 提出了一种新颖的学习方案,以同时 1) 减小模型大小; 2) 减少运行时内存占用; 3) 在不影响准确性的情况下,减少计算操作的次数。这是通过以一种简单但有效的方式在网络中实施通道级稀疏性来实现的。与许多现有方法不同,所提出的方法直接适用于现代 CNN 架构,将训练过程的开销降至最低,并且不需要为生成的模型使用特殊的软件/硬件加速器。我们称我们的方法为网络瘦身,它以宽大的网络作为输入模型,但在训练过程中,微不足道的通道会被自动识别并在之后修剪,从而产生具有类似精度的薄而紧凑的模型。我们使用多种最先进的 CNN 模型(包括 VGGNetResNetDenseNet)在各种图像分类数据集上凭经验证明了我们的方法的有效性。对于 VGGNet,网络瘦身的多通道版本使模型大小减少了 20 倍,计算操作减少了 5 倍。

1.导论

​ 近年来,卷积神经网络 (CNN) 已成为各种计算机视觉任务的主要方法,例如图像分类 [22]、目标检测 [8]、语义分割 [26]。大规模数据集、高端现代 GPU 和新的网络架构允许开发前所未有的大型 CNN 模型。例如,从 AlexNet [22]、VGGNet [31] 和 GoogleNet [34] 到 ResNets [14],ImageNet 分类挑战赛获胜者模型已经从 8 层发展到 100 多层。

​ 然而,更大的 CNN 尽管具有更强的表示能力,但更需要资源。例如,一个 152 层的 ResNet [14] 有超过 6000 万个参数,在推断分辨率为 224×224 的图像时需要 20 多个 Giga 浮点运算 (FLOP)。这在移动设备、可穿戴设备或物联网 (IoT) 设备等资源受限平台上不太可能负担得起。

CNN 在现实世界应用中的部署主要受 1) 模型大小的限制:CNN 强大的表示能力来自其数百万个可训练参数。这些参数以及网络结构信息需要存储在磁盘上并在推理期间加载到内存中。例如,存储在 ImageNet 上训练的典型 CNN 会消耗超过 300MB 的空间,这对嵌入式设备来说是一个很大的资源负担。 2) 运行时内存:在推理期间,CNN 的中间激活/响应甚至可能比存储模型参数占用更多的内存空间,即使批量大小为 1。这对于高端 GPU 来说不是问题,但是对于计算能力低的应用程序来说负担不起。 3)计算操作的数量:卷积操作在高分辨率图像上是计算密集型的。大型 CNN 可能需要几分钟才能在移动设备上处理单个图像,在实际应用中采用不现实。

​ 已经提出了许多工作来压缩大型 CNN 或直接学习更有效的 CNN 模型以进行快速推理。这些包括低秩逼近 [7]、网络量化 [3, 12] 和二值化 [28, 6]、权重修剪 [12]、动态推理 [16] 等。 然而,这些方法中的大多数只能解决上面提到的一两个问题。此外,一些技术需要专门设计的软件/硬件加速器来加速执行 [28, 6, 12]。

​ 减少大型 CNN 资源消耗的另一个方向是稀疏网络。稀疏性可以施加在不同层次的结构上[2,37,35,29,25],这会产生相当大的模型大小压缩和推理加速。然而,这些方法通常需要特殊的软件/硬件加速器来获得内存增益或节省时间,尽管这比[12]中的非结构化稀疏权重矩阵更容易。
在这里插入图片描述

图 1:我们将缩放因子(从批量归一化层复用)与卷积层中的每个通道相关联。在训练期间对这些缩放因子施加稀疏正则化以自动识别不重要的通道。具有小比例因子值(橙色)的通道将被修剪(左侧)。修剪后,我们获得紧凑模型(右侧),然后对其进行微调以达到与正常训练的完整网络相当(甚至更高)的精度。

​ 在本文中,我们提出了网络瘦身,一种简单而有效的网络训练方案,它解决了在有限资源下部署大型 CNN 时的所有上述问题。我们的方法在批量归一化 (BN) 层中的缩放因子上加 L1 正则化,因此很容易实现,而无需对现有 CNN 架构进行任何更改。使用 L1 正则化将 BN 缩放因子的值推向零,使我们能够识别无关紧要的通道(或神经元),因为每个缩放因子对应于特定的卷积通道(或完全连接的神经元层)。这有助于后续步骤中的通道级修剪。额外的正则化项很少会影响性能。事实上,在某些情况下,它会导致更高的泛化精度。修剪不重要的通道有时可能会暂时降低性能,但这种影响可以通过对修剪后的网络进行后续微调来补偿。修剪后,与最初的宽网络相比,由此产生的更窄网络在模型大小、运行时内存和计算操作方面更加紧凑。上述过程可以重复多次,产生多通道网络瘦身方案,从而使网络更加紧凑。

​ 在几个基准数据集和不同网络架构上的实验表明,我们可以获得模型大小压缩高达 20 倍、计算操作减少 5 倍的 CNN 模型,同时实现相同甚至更高的精度。此外,我们的方法通过传统的硬件和深度学习软件包实现了模型压缩和推理加速,因为由此产生的更窄的模型没有任何稀疏存储格式或计算操作。

2.相关工作

​ 这部分,我们从五个方面讨论相关工作。

低秩分解使用诸如奇异值分解 (SVD) [7] 之类的技术来近似具有低秩矩阵的神经网络中的权重矩阵。这种方法在全连接层上效果特别好,产生~3x 模型大小的压缩,但没有显着的速度加速,因为 CNN 中的计算操作主要来自卷积层

权重量化HashNet [3] 建议量化网络权重。在训练之前,网络权重被散列到不同的组,并且在每个组权重内共享值。这样只需要存储共享的权重和哈希索引,可以节省大量的存储空间。 [12] 在深度压缩管道中使用改进的量化技术,并在 AlexNetVGGNet 上实现了 35 到 49 倍的压缩率。然而,这些技术既不能节省运行时内存也不能节省推理时间,因为在推理期间共享权重需要恢复到它们的原始位置

​ [28, 6] 将实值权重量化为二元/三元权重(权重值限制为 {−1,1} 或 {−1,0,1})。这产生了大量的模型大小节省,并且在给定按位运算库的情况下也可以获得显着的加速。然而,这种激进的低位近似方法通常会带来一定的精度损失

权重修剪/稀疏化。 [12] 建议在训练好的神经网络中用小权重修剪不重要的连接。最终网络的权重大部分为零,因此可以通过以稀疏格式存储模型来减少存储空间。然而,这些方法只能通过专用的稀疏矩阵运算库和/或硬件来实现加速。运行时内存节省也非常有限,因为大部分内存空间被激活映射(仍然密集)而不是权重消耗

​ 在[12]中,在训练期间没有关于稀疏性的指导。 [32] 通过使用额外的门变量显式地对每个权重施加稀疏约束来克服这一限制,并通过修剪零门值的连接来实现高压缩率。这种方法比[12]实现了更好的压缩率,但也有同样的缺点。

结构化修剪/稀疏化。最近,[23] 建议在经过训练的 CNN 中修剪具有较小传入权重的通道,然后微调网络以重新获得准确性。 [2] 通过在训练前随机停用卷积层中的输入-输出通道连接来引入稀疏性,这也产生了具有中等精度损失的较小网络。与这些工作相比,我们在训练过程中明确地在优化目标中强加了通道稀疏性,从而使通道修剪过程更平滑,精度损失很小

​ [37] 在训练期间施加神经元级稀疏性,因此可以修剪一些神经元以获得紧凑的网络。 [35] 提出了一种结构化稀疏学习(SSL)方法来稀疏化 CNN 中不同级别的结构(例如过滤器、通道或层)。这两种方法都在训练期间利用组稀疏正则化来获得结构化稀疏。我们的方法不是在卷积权重上采用组稀疏性,而是在通道缩放因子上施加简单的 L1 稀疏性,因此优化目标要简单得多

​ 由于这些方法修剪或稀疏化部分网络结构(例如,神经元、通道)而不是单个权重,因此它们通常需要较少专门的库(例如用于稀疏计算操作)来实现推理加速和运行时内存节省.我们的网络瘦身也属于这一类,绝对不需要特殊的库来获得好处。

神经架构学习。虽然最先进的 CNN 通常由专家设计 [22, 31, 14],但也有一些关于自动学习网络架构的探索。 [20] 为给定资源预算的网络架构搜索引入了子模块/超模块优化。最近的一些工作 [38, 1] 建议通过强化学习自动学习神经结构。这些方法的搜索空间非常大,因此需要训练数百个模型来区分好坏。网络瘦身也可以被视为架构学习的一种方法,尽管选择仅限于每一层的宽度。然而,与上述方法相反,网络瘦身仅通过单一的训练过程来学习网络架构,这符合我们的效率目标。

3.网络瘦身

​ 我们的目标是提供一个简单的方案来实现深度 CNN 中的通道级稀疏性。在本节中,我们首先讨论通道级稀疏性的优势和挑战,并介绍我们如何在批量归一化中利用缩放层来有效识别和修剪网络中不重要的通道。

通道级稀疏性的优势。正如之前的工作 [35, 23, 11] 中所讨论的,可以在不同的级别实现稀疏性,例如,权重级别、内核级别、通道级别或层级别。细粒度级别(例如权重级别)的稀疏性提供了最高的灵活性,通用性导致更高的压缩率,但它通常需要特殊的软件或硬件加速器来对稀疏模型进行快速推理 [11]。相反,最粗糙的层级稀疏性不需要特殊的包来获得推理加速,而它的灵活性较差,因为需要修剪一些整个层。事实上,去除层只有在深度足够大时才有效,例如超过 50 层 [35, 18]。相比之下,通道级稀疏性在灵活性和易于实施之间提供了很好的权衡。它可以应用于任何典型的 CNN 或全连接网络(将每个神经元视为一个通道),由此产生的网络本质上是未剪枝网络的“精简”版本,可以在传统的 CNN 平台上进行高效推理。

挑战。实现通道级别的稀疏性需要修剪与通道相关的所有传入和传出连接。这使得在预训练模型上直接修剪权重的方法无效,因为通道输入端或输出端的所有权重不太可能接近零值。正如 [23] 中所报告的,在预训练的 ResNet 上修剪通道只能导致参数数量减少约 10%,而不会遭受精度损失。 [35] 通过在训练目标中实施稀疏正则化来解决这个问题。具体来说,他们采用组LASSO在训练期间将对应于同一通道的所有滤波器权重同时推向零。然而,这种方法需要计算关于所有滤波器权重的附加正则化项的梯度,这是非常重要的。我们介绍了一个简单的想法来解决上述挑战,详细信息如下。

缩放因子和稀疏性引起的惩罚。我们的想法是为每个通道引入一个缩放因子 γ,它与该通道的输出相乘。然后我们联合训练网络权重和这些缩放因子,并对后者进行稀疏正则化。最后,我们用小因子修剪那些通道,并对修剪后的网络进行微调。具体来说,我们方法的训练目标由下式给出
L = ∑ ( x , y ) l ( f ( x , W ) , y ) + λ ∑ γ ∈ Γ g ( γ ) ———— ( 1 ) L=\sum_{(x,y)}l(f(x,W),y)+λ\sum_{\gamma\in\Gamma}g(\gamma)————(1) L=(x,y)l(f(x,W),y)+

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值