重新思考卷积通道剪枝中的更小范数、更小信息量的假设
- intro:ICLR2018
- arxiv:https://arxiv.org/abs/1802.00124
- github:https://github.com/jack-willturner/batchnorm-pruning
摘要
模型剪枝已成为一种可以提高深度学习的计算效率的有用技术,从而让深度学习模型在资源有限的场景中部署成为可能。相关工作中,广泛使用的实践假设:较小范数的参数或含较少信息的特征在推理中起着较小的作用。在本文中,我们提出了一种用于加速深度卷积神经网络(CNN)计算的通道剪枝技术,该技术并不严格依赖于这种假设。相反,它侧重于CNN的通道到通道计算图的直接简化,而不需要执行复杂的计算和不一定总有用的CNN高维张量结构稀疏方法。我们的方法分两个阶段:首先采用端到端随机训练方法,最终迫使某些通道的输出保持不变,然后通过调整其影响层的偏差值来修剪原始神经网络中的那些常量通道,这样,产生的紧凑模型可以快速finetune。从优化的角度来看,我们的方法在数学上具有吸引力,并且易于复现。我们通过几个图像学习基准试验了我们的方法,并展示了它的有趣方面和竞争性能。
1 引言
深度神经网络中并非所有的计算都有同样的重要性。在典型的深度学习管道中,专家设计神经网络结构,使用准备好的数据集进行训练。训练深度模型的成功通常需要反复试错,并且这种试错通常不会把控制神经网络的计算复杂度作为优先考虑的问题。最近研究人员开始为卷积神经网络(CNN)开发模型简化方法,同时记住一些计算确实是非关键或冗余的,因此可以安全地从训练模型中移除,而不会显着降低模型的性能。这些方法不仅可以提高计算效率,还可以减轻模型的过度拟合效应。
因而,发现训练的CNN的哪些计算子集被修剪更加合理是非常重要的。现有方法可以从学习角度或从计算角度进行分类。从学习的角度来看,一些方法使用数据无关的方法,其中训练数据无助于训练CNN的那些部分就应该修剪,如CVPR2017:Channel pruning for accelerating very deep neural networks和Accelerating very deep convolutional networks for classification and detection等。而其他人通常使用数据相关的方法,通过联合优化来生成修剪决策,如NIPS2015:Learning both weights and connections for efficient neural
network和Structured pruning of deep convolutional neural networks等。从计算的角度来看,虽然大多数方法都侧重于将卷积和线性计算的密集权重映射为稀疏结构,但是我们在此提出一种新的方法来实现相同的目标。
我们不是将CNN的计算视为不同层的单独计算的集合,而是将CNN视为一个网络流,通过不同层的不同通道将信息从输入传递到输出。我们认为CNN的节省计算不仅仅是减少在单个层中计算的内容,而且更重要的是了解在深层计算图中的每个通道如何对整个信息流做出贡献同时删除贡献较少的通道。受这一新概念的启发,我们提出在CNN的每个通道设计一个“门”,控制其接收的信息是否在处理后实际发送到其他频道。如果通道“门”关闭,其输出将始终为常量。实际上,每个设计的“门”都有预先关闭的意图,除非它有一个“强大”的职责,即将一些接收到的信息从输入发送到后续的层。我们发现在修剪CNN时实现这个想法并不复杂,详见第4节。
我们的方法既不向现有CNN引入任何额外参数,也不改变其计算图。事实上,它只会为现有的CNN梯度训练带来边际开销。它还具有一个吸引人的特点,即可以在一轮资源密集型训练中连续构建具有不同推理性能的多个紧凑模型(如我们的实验)。在生产中,这简化了选择平衡模型部署的过程。可能,我们方法的唯一应用约束是CNN中的所有卷积层和完全连接层(除了最后一层)应该进行BatchNorm。鉴于BatchNorm已成为设计最先进深度学习模型的广泛采用的成分,并且许多成功的CNN模型正在使用它,我们认为我们的方法具有广泛的潜在影响。
这篇论文,开始于我们重新思考在现有通道剪枝工作中广泛采用的基本假设。我们指出了成功实现这一假设的一些问题和差距。然后,我们提出了我们的替代方法,来解决这些困难。最后,我们在不同的基准测试中测试我们的方法并验证其有用性和优势。
2 相关工作
在神经网络和深度学习社区中,缩小神经网络的大小以加快其在推理阶段的计算性能一直是一个长期研究的课题。早期工作包括Optimal Brain Damage(LeCun等,1990)和Optimal Brain Surgeon(Hassibi&Stork,1993)。最近的发展集中在降低所提供网络的结构复杂性或从头开始训练紧凑或简化的网络。我们的工作可以归类为前者,因此下面的文献综述围绕着降低结构复杂性
。
为了降低深度学习模型的结构复杂性,以前的工作主要集中在稀疏卷积核的权重或网络中多个层的特征映射(Structured pruning of deep convolutional neural networks NIPS2015:Learning both weights and connections for efficient neural network)。最近的一些研究从专用硬件的实施角度出发的动机提出了对这些向量组件施加结构化稀疏性(Learning structured sparsity in deep neural
networks,ECCV2016:Less is more: Towards compact cnns,NIPS2016:Learning the number of neurons in deep networks,CVPR2016:Fast convnets using group-wise brain damage)。然而正如Molchanov等人所论述的那样(ICLR2017:Pruning convolutional neural networks for resource efficient transfer learning),基于正则化的剪枝技术需要对每层进行灵敏度分析,这增加了额外的计算。他们的方法依赖于对所有层进行标准的全局rescaling,而不需要灵敏度估计,这些有益特征在我们的方法中也有使用。据我们所知,还不清楚这些工作在深度学习中的广泛应用。在第3节中,我们详细讨论了基于正则化的剪枝技术中潜在的问题,这些技术可能会对它们的广泛应用产生影响,尤其是那些正则化高维张量参数或基于权值大小强度的剪枝技术。我的的方法仅把预测的修剪操作约束在BatchNorm-Convolution层
,而不是在内核或特征映射上构造结构化稀疏性,我们在BatchNorm算子上执行稀疏的缩放因子γ,这会阻止通过卷积层中部分通道传递样本信息,而这实际上意味着可以安全地删除这部分通道。
最近的一项工作(ECCV2018:Data-driven sparse structure selection for deep neural networks)使用了与我们类似的技术,通过在原始网络中引入额外的缩放因子来去除ResNet中不重要的残差模块。然而,我们的论文中指出的一些优化细微之处在这篇文章中并未得到很好的解释。最近另一项名为Network-Slimming的工作(ICCV2017:Learning efficient convolutional networks through network slimming)也旨在简化BatchNorm的Scale缩放参数。但是,我们提出了一种基于ISTA和rescaling技巧的新算法方法,而不是像他们那样使用现成的梯度学习,从而提高了经验优化的稳健性和速度。特别是刘等人的Network-Slimming工作能够在ImageNet上修剪VGG-A模型。目前还不清楚他们的工作如何处理γ-W重新缩放效应,以及他们的方法是否可以用于大型预训练模型,如ResNets和Inceptions。我们对经过预先训练的ResNet-101进行了实验,并与最近的大型CNN工作相比较。我们还尝试了一种图像分割模型,该模型具有类似Inception的模块(在ImageNet上预先训练)去定位前景对象。
3 重新思考更小范数-更少信息量的假设
在大多数正则化线性回归中,大范数系数通常是高信息量特征的显著指标。这在统计学和机器学习中被广泛认同,删除具有小系数的特征不会明显影响回归误差。因此,已经建立的做法是使用易处理的范数来优化模型中的参数,并通过在训练之后比较它们的范数来挑选重要的参数。但是,这种假设不是无条件的。通过使用Lasso回归或Ridge岭回归来选择线性模型中的重要预测变量,人们总是必须首先对每个预测变量进行归一化。否则,结果可能不是解释性的。例如,岭回归惩罚更多具有低方差的预测因子,并且Lasso回归强制稀疏在OLS(?)中已经很小的系数。对于非凸学习,正确使用正则化的这种正常化条件,通常是不令人满意的。例如,必须仔细考虑下列的两个问题。我们提供这两个案例来举例说明正规化可能会失败或使用有限。确实存在避免上述失败的方法。
模型重新参数化
在第一种情况下,我们表明,对不同层的权重规范化进行细粒度控制并不容易,必须要么在所有层中采用统一惩罚或者与重新参数化模式继续斗争。考虑找个深度线性(卷积)网络,应用最小二乘Lasso回归,当λ>0,
上述公式不是一个定义明确的问题,因为对于任意参数集W,总可以找到另一个参数集W’,通过设置保持相应的1范数不变,实现较小的总损失。
其中α>1。换句话说,对于任意ε>0,总可以找到一个参数集W(通常是非稀疏的),可以是的第二个最小二乘损失最小化,同样使第二个Lasso项小于ε。
我们注意到基于梯度的学习在探索这种模型重新参数化模式方面是非常低效的。事实上,最近有一些关于这一问题的讨论(Sharp minima can generalize for deep nets)。如果采用预先训练的模型,并使用新的基于范数的参数正则化来增加其原始目标,则新的梯度更新可能加速,或者可能需要很长时间才能使沿着模型的重新参数化轨迹行进的变量(也就是不确定
)。这突出了一个理论上的差距,质疑现有的稀疏性诱导公式和实际计算算法是否可以为深度学习模型实现广泛满意的参数稀疏性。
变换不变性
在第二种情况下,我们表明BatchNorm与权重正则化不兼容。这个例子是在带BatchNorm的卷积层中对滤波器kernel进行处罚:在第1层,我们让
其中γ和β是长度为通道数的向量。同样,可以清楚地看到
的任何统一缩放都会改变它的
和
-norms,这将导致对输出不产生影响。或者说,如果一个人想要将多个层的权重范围最小化在一起,则不清楚如何为每个层选择适当的惩罚。从理论上讲,总会存在一个优化器,它可以将权重改变为具有最小幅度,而不会损害任何推理性能。正如其中一位评论家指出的那样,人们可以通过将重物投射到单位球的表面来暂时避免这个问题。然后,必须处理非凸的可行参数集,在开发数据依赖修剪方法的优化时引起额外的困难。值得注意的是,一些现有的工作以逐层贪婪的方式使用这种策略(ICCV2017:Channel pruning for accelerating very deep neural networks,Accelerating very deep convolutional networks for classification and detection)。
基于此讨论,现有的许多声称使用Lasso,Group Lasso(例如Wen等人(2016); Anwar等人(2017))或阈值处理(例如Molchanov等人(2017))工作,强制执行参数稀疏性有一些理论上的缺陷可以改进。事实上,神经网络剪枝中的许多启发式算法实际上并不自然地生成稀疏参数化解决方案。更常见的是,阈值处理用于将网络中的某些参数子集直接设置为零,这可能是有问题的。原因实质上是围绕两个问题。首先,通过将小于阈值的参数设置为零,是否在某些情况下能保证神经网络功能得到保留?如果是,那么在什么条件下呢?其次,如何设置不同层次的权重阈值?并非每一层在神经网络中都有相同的贡献。预计某些层对性能起着关键作用,但只使用较小的计算和内存预算,而其他一些层对性能起很小的作用,但却消耗了大量资源。自然更希望修剪后一种层的计算,而不是前者。
与这些现有方法相比,我们专注于在所有BatchNorm中强制实施CNN中的一小组参数的稀疏性 - 缩放因子γ。不仅对γ设置稀疏约束更简单,更容易监控,更重要的是,我们有两个强有力的理由
:
- 每个γ总是乘以归一化随机变量,因此通过测量γ的幅度值,在不同层之间的通道重要性变得可比较;
- 如果其后续卷积层也是BatchNorm,则避免了跨不同层的重新参数化效应。换句话说,在不同层之间缩放因子γ参数的影响是独立的。
尽管如此,我们目前的工作仍未达到强有力的理论保证。我们相信通过将标准化特征输入及其正则化系数结合在一起,可以更接近更强大和有意义的方法。稀疏性不是目标,而是使用稀疏诱导公式来找到不那么重要的通道
。
4 CNN BatchNorm通道剪枝
我们描述我们的通道剪枝技术的基本原理和算法。
4.1 初步分析
修剪常量通道。考虑带BatchNorm的卷积:
为了方便记忆,我们让
。请注意如果
中的某个元素设置为零,例如
,则其输出图像
变为常量
,并且常量图像通道的卷积会占绝大多数(处理padding区域,这个问题将在后面讨论)。因此,我们展示了可以修剪那些常量的图像通道,同时还能保持相同的网络功能:
-
如果后续卷积层没有BatchNorm,
其值(又叫 中的元素)通过下列等值会被合并到bias项中去
如
其中 表示沿着非零 通道索引的卷积算子。注意如果 则 。 -
如果后续卷积层具有BatchNorm,
取而代之,滑动平均值更新如下:
注意,如果在卷积算子 中没有使用padding,则近似( )是严格的等式( ),这一特征在同期的工作ICCV2017:Learning efficient convolutional networks through network slimming中是没有的。当在卷积使用padding的原始模型中,修剪后网络功能不是严格的保留。在我们的实践中,我们最终通过调整修剪过的网络去修复性能下降。简而言之,我们将修剪网络转变成让更多的
元素为0一样的简单操作
。因为没有引入额外的参数或层,部署修剪模型也更容易了。
为了更好地理解它在整个CNN中的工作原理,想象一下,由各层连接形成的通道到通道的计算图。在该图中,每个通道都是一个节点,它们的推理依赖关系由有向边表示。γ参数在每个节点处充当“坝”,决定是否让接收信息“流”并传播到计算图之后的其他节点。通道修剪的端到端训练基本上就像一个流量控制系统。假设输入分布的信息丰富,并且在两种方式中,大部分原始输入信息在CNN推理过程中丢失,而有用的部分应该是标签敏感的,需要由网络推理保留。传统的CNN有一种减少信息的方法:通过前向传播变换特征图(不可逆)。我们的方法引入了另一种方式:通过使用ISTA强制其输出保持不变来阻止每个通道的信息。
ISTA尽管Lasso与非凸优化中的稀疏性存在不理想,但我们发现Iterative Shrinkage-Thresholding Algorithms-ISTA仍然是一种有用的稀疏提升方法。而我们只需要更仔细地使用它。具体而言,我们采用ISTA更新γ因子。基本思想是在梯度下降的每一步中将缩放因子投影到可能更稀疏的目标上:让l表示感兴趣的训练损失,在t+1步骤中,我们设置
其中
是步骤t中计算的
导数,
是学习率,
是惩罚,在随机学习中,
是每步最小批处理中估算值。等式(1)简化形式为:
其中,
ISTA方法在我们的端到端学习中本质上相当于一个流量控制系统。其中每个γ的功能类似于大坝的功能。当
时,信息流被完全阻挡,而
,相同数量的信息以几何量的形式通过,其结果值与γ成比例。
缩放影响。可以看到,如果γ按α缩放,同时
按
缩放,即
对于相同的输入
,输出
保持不变。尽管没有改变输出,但是
和
分别被缩放
和
,所以同样的它们的梯度
和
也被缩放。正如我们所观察到的,如果一个人决定选择除1.0之外的其他值,ISTA的梯度学习的参数动态范围取决于缩放因子α。直观地,如果α很大,则
的优化比γ的优化更慢。
4.2 算法
我们在下面描述我们的算法以下方法适用于从头开始训练或从预训练模型重新训练。给定训练损失 ,卷积神经网络 和超参数 ,我们的方法如下:
- 计算每层的稀疏惩罚。计算
表示每层每个通道的内存成本,并将第
层的ISTA惩罚设置为
.公式如下:
其中,
- 网络输入图像的尺寸
- 层 卷积核尺寸, 是后续卷积层 的卷积核尺寸
- 表示层 后续卷积层的结合
- 表示层 前一层的通道数量, 一个后续卷积层的通道数量。
- 层 的特征图尺寸
- 重新缩放技巧。对层所有通道都将减少,将BatchNorm中所有 按 缩放,同时其后续卷积权重按照 缩放
- 使用ISTA对 进行端到端训练。由常规SGD训练网络 ,由ISTA更新,其初始学习率为 。训练 直到损失 平稳, 的总稀疏度收敛,并且Lasso回归 收敛。
- 删除常量通道。修剪第 层中 中元素为0的通道,并通过将所有常量通道并入后续层输出剪枝后的模型 。
- 重新缩放技巧。在训练前对于缩放参数 和权重在步骤2中被缩放,分别按 和α进行缩放(缩小)。
- 使用常规的随机梯度学习对模型
进行微调。
注意:在ISTA中使用一个大的
需要为步骤2和5选择一个合适的
,才能使得
的稀疏度快速增加。
4.3 优化超参数指南
我们总结了超参数的敏感性及其对优化的影响,如下:
- 较大的μ导致较少的迭代迭代和更快的稀疏性进展。但是如果μ太大,则SGD方法可能不会收敛。
- 较大的ρ导致收敛时更稀疏的模型。如果用非常大的ρ训练,所有通道最终都将被修剪。
-
我们使用除1之外的α仅用于预训练模型,我们通常从{0.001,0.01,0.1,1}中选择α,并且较小的α加快稀疏性的进展。
我们建议使用以下参数调整策略。
- 检查交叉熵损失和正则化损失,选择ρ,使这两个量在开始时具有可比性。
- 选择合理的学习率 。
- 如果模型是预训练的,检查网络中 的平均幅度,选择 ,使得重新缩放的幅度在 附近。我们发现只要在正确的幅度范围内选择那些参数,优化进度就足够稳健了。
- 可以在训练期间监视所提到的三个量,并且当所有三个量稳定时终止迭代。
我们在实验中发现了几种可能表明参数调整没有成功的情况。如果在前几个时期基于Lasso的正则化损失保持线性下降而γ的稀疏度保持接近零,则可以减小α并重新开始。如果在最初几个时期内γ的稀疏度迅速上升到100%,则可能会降低ρ并重新启动。如果在最初的几个时期期间,交叉熵损失保持在或非显着地增加到非信息性水平,则可以减小μ或ρ并重新开始。
5 实验
效果看起来很不错,flops下降明显。