https://arxiv.org/abs/1707.06342
Abstract
我们提出了一个高效统一的框架,即ThiNet,在训练和推理阶段同时加速和压缩CNN模型。我们关注的是过滤器级别的剪枝,也就是说,如果整个滤波器不那么重要,那么它将被丢弃。我们的方法不改变原有的网络结构,因此它可以被任何现成的深度学习库完美地支持。我们将滤波器剪枝作为一个优化问题建立起来,并揭示我们需要根据从下一层计算的统计信息来修剪滤波器,而不是当前的层,这ThiNet与现有的方法不同。实验结果表明了该策略的有效性,提高了系统的性能。
- 在ILSVRC- 12基准测试上,我们也展示了ThiNet的性能。ThiNet在vgg-16上实现了【3.31x】 FLOPs减少和【16.63X】压缩,前5位精度仅下降0.52%。
- 用ResNet- 50进行的类似实验表明,即使是在一个紧凑的网络中,ThiNet也可以减少一半以上的参数和FLOPs,而代价是前5位精度下降约1%。
- 此外,原始的VGG-16模型可以进一步修剪成仅5.05MB的非常小的模型,保持了AlexNet水平的精度,但泛化能力要强得多。
1 Introduction
【神经网络得到发展】
在过去的几年中,我们已经目睹了深层神经网络快速发展的计算机视觉领域,从基本的图像分类任务,比如ImageNet识别的挑战,一些更高级的应用程序,例如,对象检测,语义分割,图像字幕。与传统的基于人工设计视觉特征的方法相比,深度神经网络在这些领域取得了最先进的性能。
【引出压缩模型的问题】
尽管它取得了巨大的成功,但一个典型的深度模型很难部署到资源有限的设备上,例如移动电话或嵌入式设备。资源受限场景意味着 计算任务必须在有限的资源供应下完成,例如计算时间、存储空间、电池电量等。深度神经网络的主要问题之一是其巨大的计算成本和存储开销,这对移动设备构成了严峻的挑战。例如,VGG-16模型有13834万个参数,占用超过500MB的存储空间,需要309.4亿浮点运算(FLOPs)来对单个图像进行分类。这种笨重的模型很容易超出小型设备的计算极限。因此,网络压缩在学术界和工业界都引起了极大的兴趣。
【剪枝,压缩模型最流行的方法】
剪枝是目前最流行的降低网络复杂度的方法之一,在模型压缩领域得到了广泛的研究。在20世纪90年代,LeCun等人观察到,几个不重要的权重可以从训练过的网络中移除,而精度损失可以忽略不计。这一过程类似于哺乳动物大脑中的生物现象,即神经元突触的数量在儿童早期达到峰值,随后在发育过程中逐渐减少。但这些方法主要基于二阶导数,内存和计算成本昂贵,不适用于今天的deep模型。
【已有的剪枝策略,以及局限性、针对局限性的优化方式】
最近,Han et al.[10]引入了一种简单的剪枝策略:去除权重低于阈值的所有连接,然后微调以恢复其精度。这个迭代过程被执行了几次,生成了一个非常稀疏的模型。然而,这种非结构化稀疏模型不能被现成的库支持,因此需要专门的硬件和软件来进行有效的推理,这在现实应用中是困难和昂贵的。另一方面,非结构化随机连接忽略了缓存和内存访问问题。正如[32]所示,由于随机连接导致的缓存局域性差和跳跃内存访问,实际的加速非常有限(有时甚至会变慢),尽管实际的稀疏性相对较高。
为了避免上述非结构化剪枝的局限性,我们建议【滤波器级别剪枝】是更好的选择。去掉整个不重要的过滤器的好处有很多:
- 1)剪枝模型在网络结构上没有差异,因此可以被任何现成的深度学习库完美支持。
- 2)内存占用将大大减少。这种记忆减少不仅来自于模型参数本身,也来自于中间激活,这在以往的研究中很少被考虑。
- 3)由于修剪后的网络结构没有被破坏,可以通过其他压缩方法进一步压缩和加速,如参数量化方法[33]。
- 4)使用剪枝模型可以大大加速更多的视觉任务,如目标检测或语义分割。
【本文提供的剪枝策略】
在本文中,我们提出了一个统一的框架,即ThiNet (Thin Net),用来对不重要的滤波器进行删减,从而在训练和测试阶段同时加速和压缩CNN模型,性能下降很小。有了我们的修剪网络,一些重要的传输任务,如目标检测或细粒度识别可以运行得更快(训练和推理),特别是在小型设备上。我们的主要观点是,我们建立了一个定义良好的优化问题,它表明一个滤镜是否可以被修剪取决于它的下一层的输出,而不是它自己的层。这一新发现使ThiNet有别于现有的方法,即使用从它们自己的层计算出的统计数据来修剪滤波器。
然后,我们将提出的方法与其他最先进的标准进行比较。实验结果表明,该方法明显优于现有方法,特别是在压缩率较高的情况下。我们在大规模的ImageNet分类任务中评估ThiNet。
- ThiNet在vgg-16模型[28]上实现了3.31× FLOPs减容和16.63× compression,前5位精度仅下降0.52%。
- 与经典的CNN模型相比,ResNet-50[11]模型的冗余度更小。ThiNet仍然可以减少2.26× FLOPs和2.06×参数,前5位精度下降约1%。
- 为了探究ThiNet的局限性,我们发现原始的VGG-16模型甚至可以剪成5.05MB,但仍然保持AlexNet水平的精度。
此外,我们也探讨了ThiNet在一个更实际的任务,即小尺度数据集上的迁移学习中的性能。实验结果表明,ThiNet具有良好的有效性,在模型尺寸和精度之间取得了最佳的平衡
【ThiNet 的优势和贡献】
本文的主要优势和主要贡献可以总结如下。
- 我们提出了一个简单而有效的框架,即ThiNet,来同时加速和压缩CNN模型。在许多任务上,ThiNet比现有的方法有了显著的改进。
- 我们正式建立了过滤器修剪作为一个优化问题,并揭示了我们需要使用从下一层计算的统计信息来修剪过滤器,而不是当前层,这将ThiNet与现有方法区别开来。
- 在实验中,VGG-16模型可以精简为5.05MB,在迁移学习方面显示出良好的泛化能力。利用ThiNet建立更精确的模型可以保持更高的精度。
2 Related work
许多研究人员发现,深度模型遭受严重的过度参数化。例如Denil等人[4]证明了只需原始参数的一个小子集就可以有效地重构网络。然而,这种冗余在模型训练中似乎是必要的,因为目前的技术很难解决高度非凸优化[5,13]。因此,在它的训练后,有很大的需要缩小模型的尺寸。
提出了一些在模型尺寸和精度之间寻求平衡的方法。Han等人[10]提出了一种迭代剪枝方法来去除深层模型中的冗余。他们的主要观点是,低于阈值的轻量级连接应该被丢弃。在实践中,这可以通过应用“L1”或“L2”正则化来推动连接性值变得更小。这种策略的主要缺点是缺乏普遍性和灵活性,因此在实际应用中似乎不太实用。
为了避免这些弱点,一些注意力集中在群体的稀疏性上。Lebedev和Lempitsky[19]探讨了群稀疏卷积,将群稀疏正则化引入到损失函数中,某些整组权值会缩小到零,从而可以被去除。同样,Wen等[32]提出了结构化稀疏学习(Structured Sparsity Learning, SSL)方法来正则化滤波器、信道、滤波器形状和深度结构。尽管他们取得了成功,但原有的网络结构已经被摧毁。因此,需要一些专用的库来有效地加速推理。
在我们的工作中,我们也探索了一些过滤级别的剪枝策略。其核心是评估神经元的重要性,这在社区中得到了广泛的研究[34,27,21,14,23]。最简单的方法是基于权重的大小。Li等人[21]通过计算每个滤波器的绝对权重和来测量其重要性。另一个实用的标准是测量ReLU函数后激活的稀疏性。Hu等人[14]认为,如果某些神经元的大部分输出为零,这些激活应该是冗余的。他们计算每个过滤器的0的平均百分比(APoZ)作为其重要性评分。这两个标准简单明了,但与最终的损失没有直接关系。受此启发,Molchanov等[23]采用泰勒展开来近似去除每个滤波器对损失函数的影响。
除了修剪,还有其他的策略来获得小的CNN模型。一种流行的方法是参数量化[8,3,33,9]。低秩近似也得到了广泛的研究[5,29]。需要注意的是,这些方法是对滤波器剪枝的补充,可以结合ThiNet进行进一步的改进。
3 ThiNet
在本节中,我们将全面介绍我们的滤波器级剪枝方法:ThiNet。首先,将提出总体框架。接下来,我们将更详细地介绍我们的选择算法。最后,我们将展示我们的剪枝策略,它兼顾了效率和有效性。
3.1 ThiNet 框架
剪枝是降低模型复杂度的一种经典方法。尽管存在着巨大的差异(例如在选择什么应该被修剪的不同标准),但在深度神经网络中修剪过滤器的总体框架是相似的。可以用一句话来概括:评估每个神经元的重要性,去掉不重要的,微调整个网络。
这个框架如图1所示。在下一小节中,我们将重点介绍虚线框部分,以介绍我们的数据驱动通道选择方法,它确定要删除的通道(及其相关的滤波器)。
- 图1所示。ThiNet的插图。首先,我们将重点放在虚线框部分,以确定几个弱通道及其对应的滤波器(在第一行用黄色突出显示)。这些通道(及其相关的过滤器)对整体性能的贡献很小,因此可以丢弃,从而导致修剪模型。最后,对网络进行微调以恢复其准确性。(这张图最好是彩色的。)
【ThiNet框架流程】
给定一个预先训练好的模型,按照预先设定的压缩率逐层进行修剪。我们将我们的框架总结如下:
- 1 【滤波器的选择】。不像现有的方法,用第 i i i层的统计数据来指导第 i i i层的剪枝,我们的方法是用第 i + 1 i+1 i+1层来指导第 i i i层的修剪。
关键的想法是:如果我们可以使用的一个 第 i + 1 i+1 i+1层的输入的 子channels 来接近 第 i + 1 i+1 i+1层的输出,输入的中的其他channels可以安全地删除。注意,第 i + 1 i+1 i+1层的一个channels是由第 i i i层的一个滤波器产生,因此我们可以安全地修剪第 i i i层中相应的滤波器。- 2 【剪枝】。第 i + 1 i+1 i+1层的输入中的弱通道和它们在第 i i i层中的对应滤波器将被删除,来得到一个更小的模型。注意,修剪后的网络具有完全相同的结构,但具有更少的滤波器和通道。换句话说,原来的宽网络变得thinner。这就是为什么我们称我们的方法为“ThiNet”。
- 3 【微调】。为了恢复因滤波器剪枝而导致的泛化能力受损,需要进行微调。但对于大型数据集和复杂模型来说,这需要很长时间。为了节省时间,我们在修剪一层后微调一到两个epoch。为了得到一个准确的模型,当所有的层都被修剪后,将进行额外的epoch。
- 4 【迭代到步骤1来修剪下一层】。
3.2 数据驱动的通道选择
我们使用 ( L i , W i , ∗ ) (L_i, W_i,∗) (Li,Wi,∗)三元组来表示第 i i i层的卷积过程,其中 L i ∈ R C × H × W L_i∈R^{C×H×W} Li∈RC×H×W是输入张量,它有C通道、H行和W列。 W i ∈ R D × C × K × K W_i∈R^{D×C×K×K} Wi∈RD×C×K×K是一组具有 K × K K×K K×K核大小的滤波器,它生成一个新的具有 D D D通道的张量。
我们的目标是删除 W i W_i Wi中一些不重要的滤波器。注意,如果 W i W_i Wi中的滤波器被移除,它在 L i + 1 L_{i+1} Li+1和 W i + 1 W_{i+1} Wi+1中的对应通道也会被丢弃。然而,由于第 i + 1 i+1 i+1层的滤波器数没有改变,其输出张量的大小,即 L i + 2 L_{i+2} Li+2,将保持完全相同。受此启发,我们认为,如果我们去掉几个对 L i + 2 L_{i+2} Li+2(也是第 i + 1 i+1 i+1层的输出)影响不大的过滤器,对整体性能的影响也会很小。也就是说,最小化 L i + 2 L_{i+2} Li+2的重构误差与网络的分类性能密切相关。
3.2.1 收集训练样本
为了确定哪些通道可以安全地移除,我们将收集一个用于重要性评估的训练集。如图2所示,从张量 L i + 2 L_{i+2} Li+2 (ReLU之前)中随机抽样一个元素,用y表示。也可以根据其位置确定相应的滤波器 W ^ ∈ R C × K × K \hat{W} ∈R^{C×K×K} W^∈RC×K×K和滑动窗口 x ∈ R C × K × K x∈R^{C×K×K} x∈RC×K×K (ReLU后)。为了更清楚地表示,这里省略了一些索引符号。通常,用相应的偏置b可以计算卷积运算,如下:
其中 y ^ = y − b \hat{y}= y-b y^=y−b。值得注意的是, x ^ \hat{x} x^ 和 y ^ \hat{y} y^是随机变量,它们的实例化需要固定的空间位置索引,通过 c c c、 k 1 k_1 k1 和 k 2 k_2 k2获取。一个关键的观察结果是 x ^ = ( x 1 ^ , x 2 ^ , . . . x C ^ ) \hat{x}=(\hat{x_1},\hat{x_2},...\hat{x_C}) x^=(x1^,x2^,...xC^) 中的channels 是独立的: x c ^ \hat{x_c} xc^ 只与 x c , : , : x_{c,:,:} xc,:,:独立,不与 x c ′ , : , : x_{c',:,:} xc′,:,: 独立,当 c ′ ≠ c c'\neq c c′=c
换句话说,如果我们能找到一个子集 S ⊂ { 1 , 2 , . . . C } S⊂ \{1,2,...C\} S⊂{1,2,...C},让等式(4)总是成立,那么如果 c ∉ S c \notin S c∈/S,我们不需要任何 x c ^ \hat{x_c} xc^,并且这些变量可以在不改变CNN模型结果的情况下安全地移除
当然,Eq. 4对于随机变量 x ^ \hat{x} x^ 和 x ^ \hat{x} x^的所有实例并不总是正确的。然而,我们可以手动提取它们的实例,以找到一个子集S,使Eq. 4近似正确。
给定一个输入图像,我们首先在正向运行CNN,计算出 第 i + 1 i+1 i+1的输入和输出。那么对于任意可行的 ( c , k 1 , k 2 ) (c, k_1, k_2) (c,k1,k2)三元组,我们可以得到一个 c c c维向量变量 x ^ = ( x 1 ^ , x 2 ^ , . . . ( ^ x C ) ) \hat{x}=(\hat{x_1},\hat{x_2},...\hat(x_C)) x^=(x1^,x2^,...(^xC)) 和标量值 y ^ \hat{y} y^,使用Eq. 1到Eq. 3。由于 x ^ \hat{x} x^和 y ^ \hat{y} y^可以被视为随机变量,因此可以通过选择不同的输入图像、不同的通道、不同的空间位置来采样更多的实例。
3.2.2 cnannels选择的贪婪算法
现在,给定一组 m m m (图像数量与位置数量的乘积)的训练样例 { ( x i ^ , y i ^ ) } \{(\hat{x_i},\hat{y_i})\} {(xi^,yi^)},原始channels选择问题变成了以下优化问题:
这里 ∣ S ∣ |S| ∣S∣是子集 S S S中的元素个数, r r r 是预定义的压缩率(即保留多少通道)。同样,设 T T T为已删除的子集通道( S ∪ T = { 1 , 2 , … , C } , S ∩ T = ∅ S∪T =\{1,2,…,C\}, S∩T =∅ S∪T={1,2,…,C},S∩T=∅),可最小化如下备选目标:
Eq. 6与Eq. 5等价,但速度更快,因为 ∣ T ∣ |T| ∣T∣通常小于 ∣ S ∣ |S| ∣S∣。求解Eq. 6仍然是NP hard,因此我们使用贪婪策略(如算法1所示)。我们每次向 T T T 添加一个元素,在当前迭代中选择导致目标值最小的通道。显然,这个贪婪解是次优的。但这种差距可以通过微调来弥补。我们还尝试了其他一些复杂的算法,如稀疏编码(特别是同伦方法[6])。然而,我们的实验表明,我们的简单贪心方法具有更好的性能和更快的速度。
3.2.3 最小化重构误差
到目前为止,我们已经得到了子集 T T T,使得当 n ∈ T n∈T n∈T时,第 i + 1 i+1 i+1层每个滤波器中的第 n n n通道都可以被安全地删除。因此,前一层 i i i中相应的滤波器也可以被修剪。现在我们将 进一步减小重构误差(c.f。Eq. 5)通过weighing the channels,可定义为:
其中 x i ∗ ^ \hat{x_i^*} xi∗^表示channels选择后的训练样本。Eq. 7是一个经典的线性回归问题,它有一个唯一的封闭解,使用普通最小二乘方法: w ^ = ( X T X ) ) − 1 X T y \hat{w} = (X^TX))^{-1}X^Ty w^=(XTX))−1XTy。
w ^ \hat{w} w^中的每个元素都可以视为对应滤波器通道的比例因子, W : , i , : , : = w i ^ W : , i , : , : W_{:,i,:,:} =\hat{w_i}W_{:,i,:,:} W:,i,:,:=wi^W:,i,:,:。从另一个角度来看,这种缩放操作为微调提供了更好的初始化,因此网络更有可能达到更高的精度
3.3 压缩策略
【两种网络体系结构】
主要有两种不同的网络体系结构:传统的卷积/全连接体系结构,以及最近的结构变体。前者以AlexNet[18]或VGGNet[28]为代表,后者主要包括近期出现的googleNet[30]、ResNet[11]等网络。这两种类型的主要区别在于,较新的网络通常用全球平均池化层代替FC层[22,3],并采用一些新颖的网络结构,如google中的Inception或ResNet中的残块。
【对于VGG的剪枝策略】
我们使用不同的策略来修剪这两种类型的网络。对于VGG-16,我们注意到90%以上的FLOPs存在于前10层(conv1-1 to conv4-3),而FC层贡献了近86.41%的参数。因此,为了加速考虑,我们修剪了前10层,用全局平均池化层代替了全连接层。虽然所提出的方法也适用于FC层,但我们认为去除它们更简单、更有效。
【对于ResNet的剪枝策略】
对于ResNet,由于其特殊的结构,存在一些限制。例如,为了完成求和操作,同一组中每个block的通道数 需要保持一致。因此,很难直接对每个残差块的最后一个卷积层进行修剪。由于大多数参数位于前两层,因此修剪前两层是一个很好的选择,如图3所示
4 Experiments
本节对ThiNet的性能进行了实证研究。首先,对几种不同的滤波器选择标准进行比较。实验结果表明,该方法明显优于其他方法。然后,我们将报告在ILSCVR-12上的性能。两种广泛使用的网络都进行了修剪:VGG-16和ResNet-50。最后,我们关注一个更实用的场景来展示ThiNet的优势。所有实验均在caffe内进行。
4.1 不同滤波器的选择标准
【已有的剪枝策略】
文献中有一些启发式的标准来评估每个滤波器的重要性。我们将我们的选择方法与两个最近提出的标准进行比较,以证明我们的评价标准的有效性。这些标准简要总结如下:
- 【权重之和】。具有较小核权重的滤波器往往产生较弱的激活。因此,在这个策略中,计算每个滤波器的绝对和,作为它的重要性分数 s i = ∑ ∣ W ( i , : , : , : ) ∣ s_i = \sum|W(i,:,:,:)| si=∑∣W(i,:,:,:)∣。
- 【APoZ(0的数量的平均百分比)】。该准则 计算输出激活中各通道的稀疏性,作为其重要性分数 s i = 1 ∣ L ( i , ; , ; ∣ ) ∑ ∑ I ( L ( i , ; , ; ) ) = = 0 ) s_i = \frac{1}{|L(i,;,;|)}\sum \sum \mathbb{I} (L(i,;,;))==0) si=∣L(i,;,;∣)1∑∑I(L(i,;,;))==0),其中 ∣ L ( i , : , : ) ∣ |L(i,:,:)| ∣L(i,:,:)∣为张量 L L L(ReLU后)在第 i i i个通道中的元素数, I ( ⋅ ) \mathbb{I}(·) I(⋅)为指标函数。
【vgg在 CUB-200 上的剪枝介绍】
为了比较这些不同的选择方法,我们在广泛使用的细粒度数据集上评估了它们,数据集:CUB-200[31]上的性能,该数据集包含200种不同鸟类的11788张图像(分别为5994/5794张用于训练/测试)。除了标签外,没有额外的监督信息(如边界框)被使用。
按照3.3节中的修剪策略,VGG-16中
- 所有的FC层都被删除,并用一个全局平均池化层替换,并在新的数据集上进行微调。
- 从这个经过微调的模型开始,我们用不同的压缩率逐层裁剪网络。每次修剪之后都有一个epoch微调,在最后一层执行12个epoch以提高准确性。这个过程 用不同的channel选择策略重复几次。
- 由于ThiNet的随机性,我们重复了我们的方法4次,并报告了平均结果。
图4显示了CUB bird数据集上的修剪结果。我们也评估了在相同的修剪策略下随机选择的性能。此外,我们还对另一种不含最小二乘的ThiNet(用 【ThiNet w/o w ^ \hat{w} w^】表示)进行了评估,以证明我们方法中最小二乘的有效性。显然,与其他的选择方法相比,ThiNet取得了一致且明显更高的精度。
一个有趣的结果是:随机选择显示了相当好的性能,在某些情况下甚至比启发式标准更好。事实上,根据分布式表示的性质(即每个concept由多个神经元表示;而且,每个神经元都参与了许多concept的表示[12,1],随机选择的通道在理论上可能非常强大。然而,这一标准并不可靠。如图4所示,它会导致非常糟糕的结果,所有层压缩后的精度非常低。因此,随机选择在实践中并不适用。
【权重总和】在 CUB-200 上的精度很差。这个结果是合理的,因为它只考虑了核权值的大小,这与最终的分类精度没有直接关系。事实上,较小的权重仍然可能对损失函数产生较大的影响。当我们同时丢弃大量的小滤波器时,最终的精度会受到很大的破坏。例如,如果我们使用小权重准则去除conv1-1中60%的过滤器,top-1精度仅为40.99%(微调前),而随机准则为51.26%。相比之下,我们的方法【ThiNet w/o w ^ \hat{w} w^】可以达到68.24%,用最小二乘法(ThiNet)可以达到70.75%。权重总和的精度损失是如此之大,以至于微调不能完全从下降中恢复它。
相比之下,我们的方法显示了更高的和稳健的结果。最小二乘方法确实有助于获得更好的权值初始化以进行微调,特别是在压缩率相对较高的情况下。
4.2 VGG-16 on ImageNet
我们现在评估 ThiNet在大规模ImageNet分类任务中的性能。ILSCVR-12数据集[26]由来自1000个类别的超过100万张训练图像组成。我们从训练集的每个类别中随机选择10张图像来组成我们的评估集(即为通道选择收集的训练示例)。对于每个输入图像,如3.2.1节所述,随机采样10个实例,使用不同的通道和不同的空间位置。因此,通过算法1寻找 optimal channel subset 的 训练样本总共有100,000个。我们比较了几种不同的图像选择和位置数目,发现当前的选择(每类10张图像和每幅图像10个位置)足以评价神经元的重要性。最后,使用单视图测试方法(central patch only),在50k标准验证集上报告了top-1和top-5分类性能。
【vgg在 ImageNet 上的剪枝操作】
- 在微调过程中,将图像大小调整到256 × 256,然后采用224 × 224的随机裁剪将数据输入网络。水平翻转也用于数据增强。
- 在推断阶段,我们将调整大小的图像中间裁剪为224 × 224。这里不再使用任何技巧。
- 整个网络一层一层的修剪,并使用学习率 1 0 − 3 10^{-3} 10−3 在一个 epoch上进行微调。因为每组的最后一层(即conv1-2 conv2-2, conv3-3)更重要(修剪这些层会导致很大的准确性下降),我们调整这些层使用学习率 1 0 − 4 10^{-4} 10−4 在一个 epoch上,以防止精度下降太多。修剪的最后一层时,更多的epoch(12epoch),采用学习速率不同从 1 0 − 3 10^{-3} 10−3 到 1 0 − 5 10^{-5} 10−5 ,从而得到得到一个精确的结果。
- 我们使用的是SGD,小批尺寸为128,其他参数与原VGG保持一致。
【vgg在 ImageNet 上的剪枝实验结果】
- 我们在表1中总结了ThiNet方法的性能。这里的 ThiNet-Conv 是指如上所述,只对前10个卷积层进行修剪,压缩率为0.5(即每一层去掉一半的滤波器,直到conv4-3)的模型。由于一些无用的滤波器被丢弃,剪枝模型甚至可以优于原始的VGG-16模型。
然而,如果我们从头训练这个模型,top-1/top-5的准确率分别只有67.00%/87.45%,这比我们的修剪网络差得多。- 然后,FC层被移除,用GAP(全球平均池)层代替,并在12个epoch用相同的超参数进行微调,用“ThiNet-GAP”表示。由于模型尺寸大幅减小,GAP模型的分类精度略低于原始模型。在更高的压缩率(用“ThiNet-Tiny”表示)下,可以得到进一步的压缩,这将在后面讨论。
【vgg在 ImageNet 上的剪枝的提速】
- 也提出了ThiNet的实际加速。我们在Caffe中使用官方的“time”命令测试每个模型的向前/向后运行时间。该评估是在一个批大小为32的M40 GPU上进行的,使用cuDNN v5.1加速。由于卷积运算是VGG-16的主要计算开销,减少FLOPs可以大大提高推理速度,如表1所示。
【几种最先进的剪枝方法进行比较】
在VGG-16模型上,我们将我们的方法与几种最先进的剪枝方法进行比较,如表2所示。这些方法也关注于滤波器级剪枝,但选择标准完全不同。
【APoZ】
- APoZ[14]的目标是减少参数数量,但其性能有限。
APoZ-1去掉了几个层(conv4、conv5和FC层),导致了显著的精度下降。
APoZ-2只对conv5-3和FC层进行修剪。虽然该模型的精度得到了提高,但几乎没有减少FLOP。因此,需要对卷积层进行压缩。
【Taylor】
- 相比之下,Molchanov等人[23]注重模型加速,只对卷积层进行修剪。他们认为,如果滤波器对损耗函数的影响很小,就可以安全地去除滤波器。但计算过程非常耗时,因此他们使用泰勒展开来近似损失变化。他们的动机和目标与我们相似,但选择标准和训练框架完全不同。
- 如表2所示,ThiNet Conv模型明显优于泰勒方法。我们的模型甚至可以通过减少更多的错误次数来提高分类的准确性。
【ThiNet- ws】
- 关于weight sum[21],他们还没有探索它在VGG-16上的性能。因此,我们在ThiNet框架中简单地用权重和代替我们的选择方法,并报告以“ThiNet- ws”表示的最终精度。除选择标准外,其余参数均保持一致。请注意,不同的微调框架可能会导致非常不同的结果。因此,如果Li等人使用他们自己的框架进行了这一操作,其准确性可能会有所不同。因为其他设置是相同的,比较ThiNet- ws和ThiNet是公平的,ThiNet获得了更好的结果。
【ThiNet-Tiny】
- 为了探索ThiNet的局限性,我们以更大的压缩率0.25对VGG-16进行修剪,在卷积层中实现了16×参数的缩减。conv5层也被修剪成更小的模型。对于与最终特征表示直接相关的conv5-3,为了精度考虑,我们只修剪了一半的滤波器。
- 利用这些较小的压缩比,我们训练出一个非常小的模型。在表1中表示为 “ThiNet-Tiny”,它只占用5.05MB的磁盘空间(1MB=2 20字节),但仍然具有AlexNet水平的精度(AlexNet的top-1/top-5精度分别为57.2%/80.3%)。ThiNet-Tiny的模型复杂度与最近提出的compact网络SqueezeNet[15]完全相同,但精度较高。尽管ThiNet-Tiny需要更多的FLOPs,但它的实际速度甚至比SqueezeNet还要快,因为它的网络结构要简单得多。SqueezeNet采用了一种特殊的结构,即Fire module,该模块参数高效,但依赖于人工网络结构设计。相比之下,ThiNet是一个统一的框架,如果我们从一个更精确的模型出发,就会得到更高的精度。
4.3 ResNet-50 on ImageNet
我们还探讨了ThiNet在最近提出的强大的CNN架构:ResNet上的性能。我们选择ResNet-50作为ResNet系列的代表,它的架构与系列中其他完全相同,差别不大。
【ResNet上剪枝的操作】
与VGG-16类似,我们反复地将ResNet-50从区块2a修剪到5c。除滤波器外,批次归一化层中对应的通道也被丢弃。修剪之后,使用学习率为 1 0 − 4 10^{-4} 10−4进行微调一个epoch。9个epoch的微调和学习速率变化从 1 0 − 3 10^{-3} 10−3 到 1 0 − 5 10^{-5} 10−5执行在最后一轮之后,获得更高的精度。其他参数与我们的VGG-16剪枝实验保持一致。
【ResNet上剪枝的结果】
因为ResNet是一个最近提出的模型,文献中缺乏足够的作品来压缩这个网络。我们报告了ThiNet在修剪ResNet-50时的性能,如表3所示。我们用3种不同的压缩率(每个块分别保留70%、50%、30%的滤波器)对该模型进行修剪。不像VGG-16, ResNet更紧凑。存在较少的冗余,因此修剪大量的过滤器似乎更具挑战性。尽管如此,我们的方法ThiNet-50仍然可以修剪一半以上的参数,top-5准确率下降约1%。还可以进行进一步的剪枝,得到更小的模型,但代价是更多的精度损失。
【ResNet上剪枝的问题】
然而,减少的FLOPs并不能给ResNet带来同样水平的加速。由于ResNet-50的结构约束,非张量层(如批处理归一化和池化层)在GPU上占用了40%以上的推断时间。因此,对这些非张量层进行加速是很有必要的,这应该在将来进行探索。
在这个实验中,为了简单起见,我们只修剪了ResNet中每个块的前两层,保留块输出和projection shortcuts 方式不变。修剪这些部分会进一步的压缩,也会相当困难。这种探索似乎是未来工作的一个有希望的扩展。
4.4 剪枝模型的领域适应能力
ThiNet的一个主要优点是我们没有改变网络结构,因此在ImageNet上修剪的模型可以很容易地转移到其他领域。为了帮助我们更好地理解这个好处,让我们考虑一个更实用的场景:在特定数据集上获得一个小模型。在实际应用程序中,这是一个非常常见的需求,因为我们不会直接在实际应用程序中应用ImageNet模型。要实现这个目标,有两种可行的策略:从预先训练的ImageNet模型开始,然后对新数据集进行修剪,或者从零开始训练一个小模型。在本节中,我们认为,如果我们对一个在ImageNet上压缩的已经修剪过的模型进行微调,那将是一个更好的选择。
在两个不同的特定数据集上比较这些策略:用于细粒度分类的CUB-200和用于场景识别的Indoor-67。我们在4.1节中介绍了CUB-200。对于Indoor-67,我们遵循官方的训练/测试分割(5360训练和1340测试图像)来组织这个数据集。所有的模型都用相同的超参数和epoch进行了微调,以便进行公平的比较。其性能如表4所示。
【微调–>剪枝】
- 我们首先在新的数据集上微调预先训练好的VGG-16模型,这是在许多识别任务中采用的一种流行策略。正如我们所看到的,经过微调的模型以庞大的模型尺寸和缓慢的推理速度为代价拥有最高的准确性。
- 然后,我们使用提出的ThiNet方法来修剪一些不重要的滤波器(表示为“FT & prune”),将笨重的模型转换成一个更小的模型。在小规模的训练实例中,不能完全恢复剪枝模型的精度,即剪枝模型容易陷入不良的局部极小值。然而,如果我们用同样的结构从头开始训练一个网络,它的准确性可能会低得多。
【剪枝–>微调】
- 我们建议对ThiNet模型进行微调,该模型首先使用ImageNet数据进行修剪。如表4所示,该策略在模型规模和分类精度之间取得了最好的平衡。值得注意的是,ThiNet-Conv模型甚至可以获得与原始VGG-16相似的精度,但体积更小,速度更快。
我们也报告了ThiNet-Tiny在这两个数据集上的性能。虽然ThiNet-Tiny与ImageNet上的AlexNet具有相同的精度水平,但它表现出更强的泛化能力。当转换到特定领域的任务时,这个小模型的分类精度比AlexNet高3% ~ 8%,而参数更少。而且它的模型尺寸足够小,可以部署在资源有限的设备上。