此论文翻译仅仅用于自己方便学习。译文来自其他处。
在许多实际应用中部署深度卷积神经网络(CNN)很大程度上受到其计算成本高的限制。在本文中,我们提出了一种新的CNNs学习方案,能同时1)减小模型大小; 2)减少运行时内存占用; 3)在不影响准确率的情况下降低计算操作的数量。这种学习方案是通过在网络中进行通道层次稀疏来实现,简单而有效。与许多现有方法不同,我们所提出的方法直接应用于现代CNN架构,引入训练过程的开销最小,并且所得模型不需要特殊软件/硬件加速器。我们将我们的方法称为网络瘦身(network slimming),此方法以大型网络作为输入模型,但在训练过程中,无关紧要的通道被自动识别和剪枝,从而产生精度相当但薄而紧凑(高效)的模型。在几个最先进的CNN模型(包括VGGNet,ResNet和DenseNet)上,我们使用各种图像分类数据集,凭经验证明了我们方法的有效性。对于VGGNet,网络瘦身后的多通道版本使模型大小减少20倍,计算操作减少5倍。
近年来,卷积神经网络(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)-即20G flop的运算量。这在资源受限的情况下不可能负担得起,如在移动设备,可穿戴设备或物联网(IoT)设备等平台上。
CNN在实际应用中的部署主要受以下因素的限制:1)模型大小:CNN的强大表现力来自其数百万可训练参数。这些参数以及网络结构信息需要存储在磁盘上并在推理期间加载到内存中。例如,存储一个ImageNet上训练的典型CNN会占用超过300MB的空间,这对嵌入式设备来说是一个很大的资源负担。
2)运行时内存(占用情况):在推理期间,即使批量大小为1,CNN的中间激活/响应占用的内存空间甚至可以比存储模型的参数更多.这对于高端GPU来说不是问题,但是对于许多计算能力低的应用而言是无法承受的。
3)计算操作的数量:在高分辨率图像的卷积操作上是计算密集的。大型CNN在移动设备上处理单个图像可能需要几分钟,这使得在实际应用中采用大型CNN是不现实的。
许多工作已经提出了压缩大型CNN或直接学习更有效的CNN模型以进行快速推理。 这些工作包括低秩逼近(这么翻译正确吗?)[7],网络量化[3,12]和网络二值化[28,6],权重剪枝[12],动态推理[16]等。但是,这些方法大多数只能解决一个或两个上面提到的挑战。 此外,一些技术需要专门设计的软件/硬件加速器来实行加速[28,6,12]。
减少大型CNN资源消耗的另一个方向是稀疏化网络。 可以对不同级别的结构施加稀疏性[2,37,35,29,25],这产生了相当大的模型大小压缩和推理加速。 尽管它比[12]中的非结构化稀疏权重矩阵更容易,然而,这些方法通常需要特殊的软件/硬件加速器来获得内存增益或节省时间。
在本文中,我们提出了网络瘦身,这是一种简单而有效的网络训练方案,它解决了在有限资源的条件下应用大型CNN时所面临的所有挑战。我们的方法对批量归一化(BN)层中的缩放因子强加L1正则化,因此很容易实现,而不会对现有CNN架构进行任何更改。通过L1正则化将BN缩放因子的值逼近零使得我们能够识别不重要的通道(或神经元),因为每个缩放因子对应于特定的卷积通道(或完全连接的层中的神经元)。这有助于在随后的步骤中进行通道层次的修剪。额外的正则化术语很少会影响性能。实际上,在某些情况下,它会导致更高的泛化精度。修剪不重要的通道有时会暂时降低性能,但是这种影响可以通过修剪网络的后续调整来补偿。修剪后,与初始的大型网络相比,由此产生的轻量化网络在模型大小,运行时内存和计算操作方面更加紧凑。上述过程可以重复多次以产生多通道网络瘦身方案,这能产生更紧凑的网络。
在几个基准数据集和不同网络架构上的实验表明,我们获得的CNN模型,其大小压缩高达20倍,原始计算操作减少5倍,同时实现了相同甚至更高的精度。此外,我们的方法利用传统硬件和深度学习软件包实现模型压缩和推理加速,因此得到的轻量化模型不需要任何稀疏存储格式或特殊的计算操作。
在本节中,我们将从五个方面讨论相关工作。用奇异值分解(SVD)等技术使具有较低秩的矩阵去逼近神经网络中的权重矩阵[7]。 这种方法在全连接的层上工作得特别好,产生~3倍模型大小的压缩,但没有明显的速度加速,因为CNN中的计算操作主要来自卷积层。
权重量化。 HashNet [3]建议量化网络权重。 在训练之前,网络权重被散列到不同的组,并且在每个组内共享该权重值。 这样,只需要存储共享权重和哈希索引,从而可以节省大量的存储空间。 [12]在深度压缩流程中使用改进的量化技术,在AlexNet和VGGNet上实现35x到49x的压缩率。 但是,这些技术既不能节省运行时内存也不能节省推理时间,因为在推理期间,需要将共享权重恢复到其原始位置。
[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]提出通过强化学习自动学习神经结构。 这些方法的搜索空间非常大,因此需要训练数百个模型来区分好与坏。 网络瘦身也可以被视为架构学习的一种方法,尽管选择仅限于每层的宽度。 然而,与上述方法相比,网络瘦身仅通过一个训练过程来学习网络架构,这符合我们的效率目标。
我们的目标是提供一个简单的方案来实现深度CNN中的信道层次的稀疏。 在本节中,我们首先讨论了信道层次稀疏的优势和挑战,并介绍了如何利用批量规范化中的扩展层(缩放因子)来有效地识别和修剪网络中不重要的信道。
通道层次稀疏性的优势。如在先前的工作[35,23,11]中所讨论的,稀疏性可以在不同的层次实现,例如,权重级,内核级,通道级或层级。细粒度级别(例如,权重级别)稀疏性提供最高的灵活性和通用性导致更高的压缩率,但它通常需要特殊的软件或硬件加速器来对稀疏模型进行快速推理[11]。相反,粗糙层级稀疏性不需要特殊的包来获得推理加速,而它不太灵活,因为需要修剪一些整个层。实际上,去除整层仅在模型深度足够大时才有效,例如,超过50层[35,18]。相比之下,通道层次稀疏性提供了灵活性和易于实现之间的良好折衷。它可以应用于任何典型的CNN或全连接的网络(将每个神经元视为信道),并且所得到的网络本质上是未修整网络的“稀疏”版本,其可以在传统CNN平台上被有效地推断。
挑战。 实现通道层次稀疏性需要修剪与通道关联的所有传入和传出连接,这使得在预训练模型上直接修剪权重的方法无效,因为通道的输入或输出端处的所有权重不可能恰好具有接近零的值。 如[23]所述,预训练的ResNets上的通道修剪只能减少参数数量的~10%才不会导致精度损失。 [35]通过将稀疏正规化强制纳入训练目标来解决这个问题。 具体而言,他们采用组LASSO在训练期间将所有对应于同一通道的滤波器权重同时逼近零。 然而,这种方法需要相对于所有滤波器权重来计算附加正则化项的梯度,这是非常重要的。 我们引入一个简单的想法来解决上述挑战,详情如下。
缩放因素和稀疏性惩罚。 我们的想法是为每个通道引入一个比例因子γ,它乘以该通道的输出。 然后我们联合训练网络权重和这些比例因子,并对后者施加稀疏正则化。 最后,我们修剪这些小因子通道,并调整修剪后的网络。 具体而言,我们的方法的训练目标是:
其中(x,y)表示训练输入和目标,W表示可训练的权重,第一个和项对应于CNN的正常训练损失,g(·)是比例因子的稀疏性引起的惩罚,以及 λ平衡这两个损失。 在我们的实验中,我们选择g(s)= | s |,它被称为L1范数并广泛用于实现稀疏性。 采用次梯度下降作为非光滑L1惩罚项的优化方法。 另一种选择是将L1惩罚替换为平滑L1惩罚[30],以避免在非平滑点使用子梯度。
修剪一个通道基本上对应于删除该通道的所有传入和传出连接,我们可以直接获得一个轻量化的网络(见图1),而不需要使用任何特殊的稀疏计算包。 缩放因子充当频道选择的代理。 由于它们与网络权重共同优化,因此网络可以自动识别无关紧要的通道,这些通道可以安全地移除而不会极大地影响泛化性能。
利用BN图层中的缩放因子。 批量归一化[19]已被大多数现代CNN采用作为实现快速收敛和更好的泛化性能的标准方法。 BN规范化激活的方式促使我们设计一种简单有效的方法来合并通道方式的缩放因子。 特别地,BN层使用小批量统计来标准化内部激活。 令zin和zout为BN层的输入和输出,B表示当前的小批量,BN层执行以下转换:
其中μB和σB是B上输入激活的平均值和标准偏差值,γ和β是可以通过训练变换的参数(比例和偏移),这提供了将归一化激活线性转换到任何尺度的可能性。
通常的做法是在卷积层之后插入BN层,保留通道缩放/移位参数。因此,我们可以直接利用BN层中的γ参数作为网络瘦身所需的比例因子。它具有不向网络引入任何开销的巨大优势。事实上,这也许是我们学习有用的通道修剪缩放因子的最有效方法。 1),如果我们将缩放层添加到没有BN层的CNN,则缩放因子的值对于评估通道的重要性没有意义,因为卷积层和缩放层都是线性变换。通过放大卷积层中的权重的同时减小缩放因子值,可以获得相同的结果。 2),如果我们在BN层之前插入缩放层,缩放层的缩放效果将被BN中的归一化处理完全取消。 3),如果我们在BN层之后插入缩放层,则每个通道有两个连续的缩放因子。
通道剪枝和微调。 在通道层次稀疏诱导正则化训练之后,我们获得了一个模型,其中许多比例因子接近于零(见图1)。 然后我们可以通过删除所有传入和传出连接以及相应的权重来修剪具有接近零比例因子的通道。 我们使用全局阈值在所有层上修剪通道,其被定义为所有比例因子值的特定百分位数。 例如,我们通过选择百分比阈值为70%来修剪具有较低缩放因子的70%通道。 通过这样做,我们获得了一个更紧凑的网络,具有更少的参数和运行时内存,以及更少的计算操作。当修剪比例高时,修剪可能暂时导致一些精确度损失。 但是,这可以通过修剪网络上的后续微调过程得到很大程度的补偿。 在我们的实验中,在许多情况下,微调的轻量化网络甚至可以实现比原始未修网络更高的精度。
多通道方案。 我们还可以将所提出的方法从单程学习方案(具有稀疏正则化,修剪和微调的训练)扩展到多程方案。 具体而言,网络瘦身过程导致网络狭窄,我们可以再次应用整个训练程序来学习更紧凑的模型。 这由图2中的虚线说明。实验结果表明,这种多次通过方案可以在压缩率方面产生更好的结果。
处理跨层连接和预激活结构。 上面介绍的网络瘦身过程可以直接应用于大多数简单的CNN架构,如AlexNet [22]和VGGNet [31]。 当它应用于具有跨层连接的现代网络和预激活设计(如ResNet [15]和DenseNet [17])时,需要进行一些调整。 对于这些网络,层的输出可以被视为多个后续层的输入,其中BN层被放置在卷积层之前。 在这种情况下,在层的输入端实现稀疏性,即,该层选择性地使用它接收的通道子集。 为了在测试时获得参数和计算节省,我们需要设置一个通道选择层来屏蔽我们识别出的无关紧要的通道。
我们经验性地证明了网络瘦身对几个基准数据集的有效性。 我们基于[10]的ResNets的公开可用的Torch 版本[5]实现来验证我们的方法。 该代码可在https://github.com/liuzhuang13/slimming获得