原始题目 | Learning Efficient Convolutional Networks through Network Slimming |
---|---|
中文名称 | 通过网络 瘦身(Slimming) 学习高效卷积网络 |
发表时间 | 2017年8月22日 |
平台 | ICCV 2017 |
来源 | Intel Labs China |
文章链接 | https://arxiv.org/abs/1708.06519 |
开源代码 | 官方实现: https://github.com/Eric-mingjie/network-slimming (Pytorch) |
摘要
深度卷积神经网络(CNNs)在许多现实应用中的部署在很大程度上受到其高计算成本的 阻碍(hindered) 。在本文中,我们提出了一种新的 CNNs 学习方案,同时:.
- 1)减少模型大小;
- 2)减少运行时内存占用;
- 3)在不影响精度的情况下,减少计算操作的数量。
这是通过在网络中以简单而有效的方式 强制 channel-level sparsity 来实现的。与许多现有的方法不同,所提出的方法直接应用于现代 CNN 架构,为训练过程引入 minimum overhead,并且不需要为得到模型提供特殊的软件/硬件加速器。
我们称我们的方法为 Network Slimming ,它以宽而大的网络作为输入模型,但 在训练过程中,不重要的通道会被自动识别并修剪,得到具有相当精度的薄而紧凑的模型。我们用几种最先进的 CNN 模型(包括VGGNet、ResNet和DenseNet)在各种 图像分类数据集 上实证地证明了我们方法的有效性。对于 VGGNet,multi-pass 版本 的Network Slimming 使模型尺寸减少了 20 倍,计算操作减少了 5 倍。
6. 结论
为了学习更紧凑的 CNNs,我们提出了 network slimming 技术。它直接对 batch normalization 层中的 scaling factors 进行 sparsity-induced
regularization ,从而在训练过程中自动识别不重要的通道并进行修剪。在多个数据集上,我们已经证明了所提出的方法能够显著降低最先进网络的计算成本(高达20倍),并且没有精度损失。更重要的是,所提出的方法同时减少了模型大小、运行时内存和计算操作,同时为训练过程引入了最小的开销,并且所得到的模型不需要特殊的库/硬件来进行高效推理。
1. 引言
近年来,卷积神经网络(CNNs)已经成为各种计算机视觉任务的主导方法,如图像分类[22]、目标检测[8]、语义分割[26]。大规模的数据集、高端的现代 GPUs 和新的网络架构使前所未有的大型 CNN 模型得以发展。例如,从AlexNet [22], VGGNet[31]和GoogleNet[34]到ResNets [14], ImageNet分类挑战获胜者模型已经从 8 层发展到 100 多层。
然而,更大的 CNN 虽然具有更强的表示能力,但却更需要资源。例如,152 层的 ResNet[14]具有超过 6000 万个参数,在推理分辨率为 224× 224 的图像时,需要超过 20 Giga 浮点运算(FLOPs)。这在移动设备、可穿戴设备或物联网(IoT)设备等资源受限的平台上不太可能负担得起。
CNNs 在现实世界应用中的部署主要受限于
- 1)模型大小: CNNs 强大的表示能力来自于其数百万个可训练参数。这些参数以及网络结构信息需要存储在 (磁盘)disk 上,并在推理时加载到内存中。例如,存储一个在 ImageNet 上训练的典型 CNN 需要超过 300MB 的空间,这对嵌入式设备来说是一个很大的资源负担。
- 2)运行时内存:在推理期间,即使 batch size 为1, CNN 的中间激活/响应甚至可能比存储模型参数占用更多的内存空间。这对于高端(high-end) GPUs 来说不是问题,但对于许多低计算能力的应用程序来说是负担不起的。
- 3)计算操作( computing operations )数量:在高分辨率图像上,卷积操作的计算量很大。一个大型 CNN 可能需要几分钟才能在移动设备上处理一张图像,这使得它不太可能用于实际应用。
已经提出了许多工作来 压缩大型CNN 或 直接学习更有效的 CNN 模型 以快速推理。这些包括 低秩近似[7],网络量化[3,12]和二值化[28,6],权重剪枝[12],动态推理[16](low-rank approximation [7], network quantization [3, 12] and binarization [28, 6], weight
pruning [12], dynamic inference [16])等。然而,这些方法中的大多数只能解决上述一两个挑战。此外,一些技术需要专门设计的软件/硬件加速器来提高执行速度[28,6,12]。
减少大型 CNNs 资源消耗的另一个方向是对网络进行稀疏化。稀疏性可以施加在不同层次的结构上[2,37,35,29,25],这产生了相当大的模型大小的压缩和推理加速。
然而,这些方法通常需要特殊的软件/硬件加速器来获得内存或时间的增益,尽管它比[12]中的非结构化稀疏权重矩阵更容易。
本文提出 network slimming,一种简单而有效的网络训练方案,在有限资源下部署大型 CNNs 时解决了上述所有挑战。
该方法对 batch normalization (BN) 层中的 缩放因子 施加了 L1 regularization ,因此很容易实现,而不需要对现有的 CNN 架构进行任何更改。使用 L1 regularization 将 BN 缩放因子的值趋近于零,使我们能够识别不重要的 channels(或神经元),因为 每个缩放因子 对应于特定的卷积通道(或全连接层中的神经元)。这有助于后续步骤中的通道级修剪。额外的 regularization 项很少影响性能。事实上,在某些情况下,它会导致更高的泛化精度。修剪不重要的通道有时可能会暂时降低性能,但这种影响可以通过随后对修剪后的网络进行 fine-tuning 来补偿。修剪之后,与初始的宽网络相比,所得到的更窄的网络在 模型大小、运行时内存和计算操作方面更加紧凑。上述过程可以重复多次,得到一个 multi-pass network slimming 方案,使网络更加紧凑。
multi-pass 是重复多次这个过程的意思。
在多个基准数据集和不同网络架构上的实验表明,我们可以获得比 原始模型压缩 高达 20倍 模型大小、计算操作减少 5 倍 的 CNN 模型,同时获得相同甚至更高的精度。此外,我们的方法通过传统硬件和深度学习软件包实现了模型压缩和推理加速,因为所得到的 更窄的模型 没有任何稀疏存储格式或计算操作。
2. 相关工作
Low-rank Decomposition
利用 奇异值分解(Singular Value Decomposition (SVD))[7]等技术,用低秩矩阵近似神经网络中的权重矩阵。这种方法在 全连接层 上效果特别好,产生 3倍 模型大小的压缩,但没有显著的速度加速,因为 CNN 中的计算操作主要来自卷积层。
Weight Quantization.
HashNet
[3]提出对网络权值进行量化。在训练之前,网络权重被 hashed 到不同的组,并在每个组内共享权重值。这种方法只需要存储共享的权值和哈希索引,从而节省了大量的存储空间。[12]在深度压缩 pipeline 中使用了一种改进的量化技术,并在 AlexNet 和 VGGNet 上实现了 35 到 49 倍的压缩率。然而,这些技术既不能节省运行时内存,也不能节省推理时间,因为在推理过程中共享权重需要恢复到原始位置。
[28, 6]将 real-valued weights 量化为 binary/ternary weights (权重值限制为{- 1,1}或{- 1,0,1})。这可以节省大量的模型大小,并且给定 bitwise operation libraries 也可以获得显著的速度提升。然而,这种激进的低位近似方法通常会有适度的精度损失。
Weight Pruning / Sparsifying.
[12]提出在训练好的神经网络中,用较小的权重来修剪不重要的连接。由此产生的网络权重大多为零,因此可以通过以稀疏格式存储模型来减少存储空间。然而,这些方法只能通过专用的稀疏矩阵运算库和/或硬件来实现加速。运行时内存节省也非常有限,因为大多数内存空间是由 activation maps (still dense) 而不是权重消耗的。
在[12]中,训练期间没有对稀疏性的指导。[32]通过使用 additional gate 变量 显式地对每个权重施加 稀疏约束 来克服这一限制,并通过修剪 zero gate 值的连接来实现高压缩率。该方法具有比[12]更好的压缩率,但也存在同样的缺点。
Structured Pruning / Sparsifying
最近,[23]提出 在训练好的 CNNs 中剪枝具有较小输入权重的通道,然后微调网络以恢复精度。[2]通过 在训练前 随机停用卷积层中的 input-output channel-wise connections 来引入稀疏性,这也产生了较小的网络,具有适度的精度损失。
与这些工作相比,我们 在训练过程中 明确地在优化目标中施加了 channel-wise sparsity ,导致更平滑的通道修剪过程和很少的精度损失。
[37] 在训练过程中 施加了 neuron-level sparsity,因此可以修剪一些神经元以获得紧凑的网络。[35]提出了一种 Structured Sparsity Learning (SSL) 方法来稀疏化 CNNs 中不同层次的结构(如 filters, channels
or layers)。两种方法都在训练过程中利用 group sparsity regualarization 来获得 structured sparsity。
我们所提出方法没有借助于卷积权重的组稀疏性,而是对 channel-wise scaling factors 施加了简单的 L1 sparsity,因此优化目标简单得多。
由于这些方法修剪或稀疏化部分网络结构(如 neurons, channels )而不是单个权重,它们通常需要较少的专门库(如稀疏计算操作)来实现推理加速和运行时内存节省。我们的 network slimming 也属于这一类,绝对不需要特殊的库来获得好处。
Neural Architecture Learning.
虽然最先进的 CNNs 通常是由专家设计的[22,31,14],但也有一些关于自动学习网络架构的探索。[20]引入了sub-modular/supermodular optimization,用于在给定资源预算的情况下进行网络体系结构搜索。最近的一些工作[38,1]提出用强化学习自动学习神经架构。这些方法的搜索空间非常大,因此需要训练数百个模型来区分好坏。
twork slimming 也可以被视为架构学习的一种方法,尽管 择 被限制为 每层的宽度。然而,与上述方法相比, network slimming 只通过单一的训练过程来学习网络架构,这符合我们追求效率的目标。
3. Network slimming
leverage: 充分利用
本文旨在提供一种简单的方案来实现 channel-level sparsity in deep CNNs 在本节中,我们首先讨论了channel-level sparsity 的优势和挑战,并介绍了如何 利用 the scaling layers in batch normalization 来有效识别和修剪网络中不重要的通道。
Advantages of Channel-level Sparsity.
- Fine-grained: 细粒度;
- harvest: 收获;
- effective: 有效的;
- sufficiently: 充分地;
- comparison: n. 比较
- essentially: adv. 本质上
如之前的工作所讨论的[35,23,11],sparsity 可以在不同的 levels 上实现,例如 weight-level, kernel-level, channel-level or layer-level 。
- Fine-grained level (e.g., weight-level) sparsity 提供了最高的灵活性和通用性,从而带来更高的压缩率,但通常需要特殊的软件或硬件加速器来对稀疏化模型[11]进行快速推理。
- 相反,最粗的 layer-level sparsity 不需要特殊的包来获取推理加速,而它不太灵活,因为需要修剪一些整个层。事实上,只有当深度足够大时,删除层才有效,例如超过50层[35,18]。
- 相比之下,channel-level sparsity 在灵活性和易于实现之间提供了一个很好的折衷。它可以应用于任何典型的 CNN 或全连接网络(treat each neuron as a channel),由此产生的网络本质上是未剪枝网络的“精简”版本,可以在传统的 CNN 平台上有效地进行推理。
Challenges.
- renders:n. 渲染, v. 表现
- simultaneously: adv. 同时地
- nontrivial:adj. 重要的
- resorting :求助
实现通道级稀疏性需要修剪与 a channel 关联的所有 输入 和 输出 连接。这使得直接修剪预训练模型权重的方法无效,因为 a channel 的 输入或输出端的所有权重不太可能恰好有接近零的值。
正如[23]中报道的那样,在预训练的 ResNets 上修剪 channels 只能导致参数数量减少~ 10%,而不会造成精度损失。
[35]通过在训练目标中强制执行 sparsity regularization 来解决这个问题。具体来说,他们在训练过程中采用 group LASSO 将同一 channel 对应的所有 filter weights 同时推向零。然而,这种方法需要计算关于所有 filter weights 的 the additional regularization term 的梯度,这是不平凡的。我们介绍了一个简单的想法来解决上述挑战,详细信息如下所示。
Scaling Factors and Sparsity-induced Penalty.
我们的想法是为每个通道引入 a scaling factor γ,乘以该 channel 的输出。然后,我们联合训练网络 weights and these scaling factors,对后者施加 sparsity regularization 。最后,用 小 factors 对这些 channels 进行剪枝,并对剪枝后的网络进行微调。具体来说,所提出方法的训练目标由:
\[L=\sum_{(x,y)}l(f(x,W),y)+\lambda\sum_{\gamma\in\Gamma}g(\gamma) \tag{1} \]其中 \((x,y)\) 表示训练输入和目标,W 表示可训练 weights ,第一个 sum-term 对应于 CNN 的正常训练 loss,g(·)是 a sparsity-induced penalty on the scaling factors,λ 平衡两项。在我们的实验中,我们选择 \(g(s) = |s|\),这被称为 L1-norm ,广泛用于实现稀疏性。
对于 nonsmooth L1 penalty term,采用 Subgradient descent 进行优化。另一种选择是将 L1 penalty 替换为 the smooth-L1 penalty[30],以避免在 non-smooth poin 使用 sub-gradient。
因为修剪 a channel 本质上相当于删除该 channel 的所有输入和输出连接,所以我们可以直接获得一个 狭窄的网络(参见图1),而无需求助于任何特殊的稀疏计算包。The scaling factors 作为 channel 选择的 agents。由于它们与网络 weights 联合优化,网络可以自动识别不重要的通道,可以安全地删除这些通道,而不会对泛化性能产生很大影响。
图1:我们将一个 scaling factor (从 a batch normalization layer 重用)与卷积层中的每个 channel 关联。在训练过程中,对这些 scaling factors 施加 Sparsity regularization ,以自动识别不重要的通道。scaling factors 值较小的 channel(橙色)将被修剪(左侧)。剪枝后,我们得到紧凑的模型(右侧),然后对其进行微调,以达到与正常训练的全网络相当(甚至更高)的精度。
Leveraging(充分利用) the Scaling Factors in BN Layers.
incorporates: 包含;将…包括在内
overhead: 开销
consecutive: 连续的
Batch normalization [19]已被大多数现代 CNNs 作为一种标准方法,以实现快速收敛和更好的泛化性能。BN normalizes the activations 的方式激励我们设计一种简单有效的方法来纳入 the channel-wise scaling factors。特别是,BN 层使用 mini-batch 统计数据对内部 activations 进行了 normalizes 。设 \(z_{in}\) 和 \(z_{out}\) 为 BN 层的输入和输出,\(\mathcal B\) 表示当前的 mini-batch , BN 层进行如下转换:
\[\hat z=\dfrac{z_{in}-\mu_{\mathcal B}}{\sqrt{\sigma_{\mathcal B}^2+\epsilon}};z_{out}=\gamma\hat z+\beta \tag{2} \]其中 \(\mu_{\mathcal B}\) 和 \(\sigma_{\mathcal B}\) 是 input activations 在 B 上的均值和标准差, \(\gamma\) 和 \(\beta\) 是可训练的仿射变换参数(scale and shift),它提供了 linearly transforming normalized activations back to any scales 的可能性。
通常的做法是 在卷积层之后插入 BN 层,具有 channel-wise scaling/shifting 参数。因此,我们可以直接利用 BN 层中的 γ 参数作为网络瘦身所需的 scaling factors。它的最大优点是不会给网络带来任何开销。事实上,这可能也是我们学习有意义的 scaling factors 用于 channel pruning 的最有效方法。
-
- 如果我们向没有 BN 层的 CNN 添加 scaling 层, scaling factors 的值对于评估 a channel 的重要性没有意义,因为 convolution layers and scaling layers 都是线性变换。人们可以通过减小 scaling factor 值,同时放大卷积层中的权重来获得相同的结果。
-
- 如果我们 在BN层之前 插入一个 scaling layer,scaling layer 的 scaling 效应将被 BN 中的 normalization 过程完全抵消。
-
- 如果我们 在BN层之后 插入 scaling layer ,每个 channel 有两个连续的 scaling factors 。
Channel Pruning and Fine-tuning.
在 channel-level sparsity-induced regularization 的训练后,我们得到一个许多 scaling factors 接近于零的模型(见图1)。然后,我们可以通过删除所有输入和输出连接和相应的权重,修剪具有接近于零 scaling factors 的 channel。我们在所有层使用一个 全局 threshold 来修剪 channels,threshold 定义为所有 scaling factor 值的某个百分比。例如,通过选择 百分数 threshold 为70%,我们用较低的 scaling factors 修剪 70% 的 channel。通过这样做,获得了一个更紧凑的网络,具有更少的参数和运行时内存,以及更少的计算操作。
当剪枝率较高时,剪枝可能会暂时导致一定的精度损失。但这在很大程度上可以通过修剪后的网络上随后的微调过程得到补偿。在实验中,经过微调的 狭窄的 网络在许多情况下甚至可以达到比原始的未剪枝网络更高的精度。
Multi-pass Scheme.
还可以将所提出的方法从 single-pass learning 方案(training with sparsity regularization, pruning, and fine-tuning) 扩展到 a multipass scheme。具体来说,网络瘦身过程会导致一个狭窄的网络,我们可以再次应用整个训练过程来学习一个更紧凑的模型。图2 中的虚线说明了这一点。实验结果表明,这种 multi-pass scheme 可以获得更好的压缩率。
图2:network slimming 过程 流程图(Flow-chart)。虚线表示 multi-pass/iterative 方案。Handling Cross Layer Connections and Pre-activation Structure. 处理跨层连接和预激活结构。
上述介绍的 network slimming 过程可以直接应用于大多数 普通的 CNN 架构,如 AlexNet[22]和VGGNet[31]。而当它应用于具有 cross layer connections 和 pre-activation 设计的现代网络时,如ResNet[15]和DenseNet[17],则需要一些适应。对于这些网络,一层的输出可以被视为多个后续层的输入,其中 BN 层位于卷积层之前。在这种情况下,sparsity 在层的输入端实现,即层有选择地使用它接收到的 channels 子集。为了在测试时获得节省的参数和计算量,我们需要放置一个 channel selection 层 来屏蔽已识别的无关紧要的通道。
4. Experiments
4.1. Datasets
- CIFAR
- SVHN
- ImageNet
- MNIST
4.2. Network Models
CIFAR and SVHN dataset:
- VGGNet[31], ResNet [14] and DenseNet [17].
ImageNet dataset:
- “VGG-A” network [31]
MNIST dataset:
- 3-layer fully-connected network
4.3. Training, Pruning and Fine-tuning
Normal Training.
baselines:
- train all the networks normally from scratch
- SGD
- CIFAR and SVHN :
- minibatch size 64 for 160 and 20 epochs, respectively.
- initial learning rate: 0.1, 全部 epochs 的 50% and 75% 除 10
- ImageNet and MNIST :
- batch size=256, 60 and 30 epochs respectively
- initial learning rate: 0.1,全部 epochs 的 1/3 and 2/3 除 10
- weight decay:10−4
- Nesterov momentum :0.9 without dampening(阻尼)
- weight initialization:kaiming[13]
- initialize all channel scaling factors to be 0.5
Training with Sparsity.
CIFAR and SVHN:
- the hyperparameteer λ, which controls the tradeoff between empirical loss and sparsity, is determined by a grid search over 10−3 , 10−4 , 10−5 on CIFAR-10 validation set.
VGGNet:
- λ=10−4
ResNet and DenseNet:
- λ=10−5
VGG-A on ImageNet:
- λ=10−5
所有其他设置保持与正常训练相同。
Pruning
use a global pruning threshold for simplicity.
The pruning process is implemented by building a new narrower model and copying the
corresponding weights from the model trained with sparsity.
**Fine-tuning. **
CIFAR, SVHN and MNIST datasets: the same optimization setting as in training.
ImageNet dataset: VGG-A with a learning rate of 10−3 for only 5 epochs.
5. Analysis
two crucial hyper-parameters in network slimming, the pruned percentage t and the coefficient of the sparsity regularization term λ.
Effect of Pruned Percentage.
Once we obtain a model trained with sparsity regularization, we need to decide what percentage of channels to prune from the model.
图5: 修剪不同百分比通道的效果,来自在 CIFAR-10 上训练的 DenseNet-40, λ=10^−5^。the classification performance of the pruned or fine-tuned models degrade(下降) only when the pruning ratio surpasses a threshold.
The finetuning process can typically compensate the possible accuracy loss caused by pruning.
Only when the threshold goes beyond 80%, the test error of fine-tuned model falls behind the baseline model.
Notably, when trained with sparsity, even without fine-tuning, the model performs better than the original model. This is possibly due the the regularization effect of L1 sparsity on channel scaling factors.
Channel Sparsity Regularization.
The purpose of the L1 sparsity term is to force many of the scaling factors to be near zero.
个人总结
过程见 图2.
- 训练一个稀疏的网络:其实就是通过在 损失函数中加了一项(BN 中 λ 的 L1-norm),让模型在训练中,使得 λ 往 0 优化。
- 剪枝:对于 λ 设定一个全局的阈值,将 λ 小于该阈值的 channel 全部剪掉。
- 微调网络:即将剩下的大模型的架构,copy 到一个小模型,微调小模型。
- 可重复多次上述步骤。
本文的巧妙点在于 直接利用了 BN 中的 λ。通过 L1-norm 让其往 0 优化,从而用来选择 训练好模型中 λ 小的 channel 剪掉以压缩模型。
此外, λ 的调整是模型自己在训练过程中 自己去优化的。
https://github.com/he-y/Awesome-Pruning
标签:Convolutional,scaling,Network,训练,模型,网络,Slimming,sparsity,channel From: https://www.cnblogs.com/odesey/p/17196760.html