Soft Filter Pruning(SFP)论文解读

论文地址:https://arxiv.org/abs/1808.06866
GitHub:https://github.com/he-y/soft-filter-pruning

Abstract

这篇论文提出了SFP(Soft Filter Pruning)方法来加速CNN网络的推理过程,特别的地方在于,我们提出的SFP算法在训练剪枝后的网络时,对原来已经剪枝的卷积核同样要做参数更新。与之前的工作相比,SFP有两大优势:

  1. 更大的模型容量:对之前剪掉的卷积核更新使得我们的方法相比于固定卷积核为0,有更大的网络容量。因此,通过我们的方法训练得到的网络由于有更大的网络容量可以从训练数据学得更好;
  2. 对预训练模型的依赖减弱:大的网络容量使得SFP可以从头开始训练,同时对模型进行剪枝。相反,之前的卷积核剪枝方法是在预训练模型的基础指导之下保证网络性能。而从头开始训练的SFP优于之前的卷积核剪枝方法;

而且,我们的方法已经在很多先进的CNN结构中展示出了高效性,值得一提的是,在ILSCRC 2012上,SFP讲ResNet-101的FLOPs减少了42%,同时top-5的准确率却提升了0.2%,已经达到了最先进的水平。

1. Introduction

在这里插入图片描述
之前的结构化稀疏剪枝——卷积核层面的剪枝只要存在两个问题:模型容量的减小和对预训练模型的依赖。具体来讲,可以看Figure 1,大多数之前的工作都是"hard filter pruning",它是直接删除剪掉的卷积核,这样做的后果就是模型容量减小了,这会使得性能受损。而且,为了维持一个相对不错的精度,在之前的工作中我们往往要对剪枝后的模型进行微调,这会降低训练效率,并且通常要比传统的训练方案花费更多的训练时间。

为了解决上面的问题,我们提出了一个新颖的SFP(Soft Filter Pruning)方法,SFP算法以一种柔和的方式对卷积核进行剪枝:在第一个训练epoch之前,我们先将所有层中具有较小的L2范数的卷积核置0,然后在这个epoch中使用训练数据对所有卷积核(包括被设置为0的)的参数进行更新,这个训练过程一直持续指导模型收敛。最后,没有进一步更新的卷积核被选择并丢弃。

本文的贡献:

  1. 我们提出的SFP算法允许剪掉的卷积核在训练期间继续更新,这种"柔和"的方式可以动态的维持网络容量,因此可以得到很高的性能;
  2. 我们的加速方法可以从头开始训练网络,并且与最先进的模型相比实现了更好的性能。通过这种方法,我们不需要微调这个环节,节省了整个微调所需要的训练时间。而且,使用预训练模型可以进一步提高我们方法的性能,实现了更加优越的加速;
  3. 我们在两个基准测试集上做的实验也验证了我们SFP算法的高效性,我们在CIFAR-10数据集上,把ResNet-101加速了两倍,并且精度提高了4个百分点,在ILSVRC-2012上也实现了优越的结果;

2. Related Work

在卷积核剪枝方面的几篇重要工作:

  • [Li et al., 2017] 使用L1-norm挑选出不重要的卷积核,并且探索了层的敏感度用来指导每层的简直比例的选择;
  • [Liu et al., 2017] 将BN层的缩放因子的 L1正则化引入损失函数中,然后将缩放因子小的BN层对应的卷积核删掉;
  • [Molchanov et al., 2017] 提出了基于剪枝标准的泰勒展开用来近似优于剪枝而造成的损失函数的变化;
  • [Luo etal., 2017] 采用了来自下一层的统计信息对卷积核的重要性做评估;
  • [He et al., 2017] 提出了一种基于Lasso的通道选择策略和最小二乘重建算法来对卷积核剪枝;

然而,对于这些卷积核剪枝方法,在剪枝之后网络的表达性能都会受到更小的优化空间影响;

3. Methodology

3.1 初步介绍

我们先来介绍一下本节中会使用的符号和标记。WiRNi+1×Ni×K×K,1iL{W^{i}\in R^{N_{i+1}\times N_{i}\times K\times K},1\leqslant i\leqslant L}表示第i层的连接权重矩阵,其中NiN_{i}是第i个卷积层的输入特征图的通道数,L是层数,Ni+1N_{i+1}是第i个卷积层的卷积核的个数,输入张量U 和输出张量V的形状分别为:Ni×Hi×WiN_{i}\times H_{i}\times W_{i}Ni+1×Hi+1×Wi+1N_{i+1}\times H_{i+1}\times W_{i+1}。第i层的卷积操作可以记为:Vi,j=Fi,jUfor1jNi+1V_{i,j}=F_{i,j}*U for 1\leqslant j\leqslant N_{i+1}

在这里,Fi,jRNi×K×KF_{i,j}\in R^{N_{i}\times K\times K}代表第i个卷积层的第j个卷积核,即Wi=Fi,j1jNi+1W^{i}={F_{i,j},1\leqslant j\leqslant N_{i+1}}Vi,jV_{i,j}是第i个卷积层的第j个输出特征图。

对卷积核剪枝意味着对输出特征图的移除,通过这种方法,神经网络的计算成本会明显的减少。我们假设SFP第i层的剪枝比率为PiP_{i},该层的卷积核数量由Ni+1N_{i+1}减少至Ni+1(1Pi)N_{i+1}(1-P_{i}),同时输出张量Vi,jV_{i,j}维度变为Ni+1(1Pi)×Hi+1×Wi+1N_{i+1}(1-P_{i}) \times H_{i+1}\times W_{i+1}。正因为第i层的输出张量又是第i+1层的输入张量,这意味第i+1层的卷积核通道维度上缩减了,进一步实现了更高的压缩比率。

3.2 Soft Filter Pruning(SFP)

之前的卷积核剪枝都可以看作是“hard filters pruning”,这些算法首先逐层的对预训练模型进行剪枝,然后微雕以恢复精度,接着继续对下一层进行剪枝再微调…直到模型最后一层被剪枝。然而,一旦卷积核被剪枝,这些方法都不会再会这些卷积核更新,因此,模型的容量大幅度缩小,会对模型的性能造成比较大的影响。
在这里插入图片描述

正如Algorithm 1所描述的,提出的SFP算法可以以一种柔和的方式对卷积核动态剪枝,关键就在于在训练阶段我们对剪枝掉的卷积核仍然是更新的。这样一种更新方式带来了几个优势,它不仅保持了和原始CNN模型相同的网络容量,而且避免了贪心的逐层剪枝过程以及它可以同时对所有层进行剪枝。更具体的讲,我们的方法不仅适合从头训练一个模型的过程,同样的也适合预训练好的模型。在每个训练epoch,整个模型被优化并在训练数据中做训练,在每个epoch之后,对每个层的所有卷积核计算L2范数的值作为我们卷积核选择策略的标准,接着我们将选择的要进行剪枝的卷积核的相关权重参数设置为0,接下来就是下一个epoch,最后,原始的深度神经网络被剪枝成一个紧凑高效的模型,SFP算法的细节如Alg 1所示,它可以分为四个主要步骤:

Filter Selection:我们使用如下的等式(2)所描述的 Lp_norm 来评估每个卷积核的重要性。通常来讲,Lp-norm值较小的卷积核的卷积结果会导致相关的激活值比较小,从而对CNN模型的最终预测值影响比较小。基于这种理解,我们优先考虑将 Lp-norm值小的卷积核剪枝掉,对于第i个权重层,我们根据该层的剪枝比率PiP_{i}来挑选出Ni+1PiN_{i+1}P_{i}个不重要卷积核。
在这里插入图片描述

Filter Pruning:我们将选择的Ni+1PiN_{i+1}P_{i}个卷积核置零,这样可以暂时消除它们对网络输出的贡献,然而,在下一个训练epoch,我们仍然允许这些被剪枝的卷积核更新参数,这是为了保持网络容量而不影响到网络性能。

在对网络剪枝时,我们简单的同时将所有层的待剪枝的卷积核置0,这是并行发生的,几乎不会造成计算时间上的成本。相反,之前的卷积核剪枝方法允许逐层的贪心剪枝,在完成对但单个层的剪枝后,已有的方法都是总是需要重新训练直到网络收敛,这个过程需要额外的训练时间。在这里,我们对所有层使用同一个剪枝比率Pi=PP_{i}=P,这样做是为了减少网络训练时的超参数搜索,同时避免了复杂的层敏感度分析。因为我们允许剪枝掉的卷积核更新参数,所以模型有更大的网络容量且更灵活,我们可以平衡每个卷积核的贡献来做出最终预测。

Reconstruction:在剪枝之后,我们在下一个epoch会对网络进行训练来使得上次"失活"的卷积核重建,正如Figure 2所示,剪掉的卷积核经过反向传播更新之后可能会变为非零值。通过这种方法,SFP允许剪枝的模型在训练期间和原始模型具有同样的容量。相反,"hard filter pruning"会缩减卷积核的数目,这会导致网络容量的减小和性能受损。以前的剪枝方法通常需要一个预训练模型并做微调,然而,当我们将剪枝步骤整合到正常的训练方案,我们的方法可以从头训练模型,因此微调这个阶段对于SFP算法并非必须。正如我们在实验中展示的那样,通过SFP算法从头训练得到的网络可以取得与通过其他方法借助预训练模型得到的结果相媲美,通过利用与训练模型,SFP可以获得更高的性能。
在这里插入图片描述

Obtaining Compact Model:SFP交替执行"filter selection"、“filter pruning”、"reconstruction"这几个步骤,直到网络收敛,我们获得一个包含有很多"zero filters"的稀疏模型,每一个参数为零的卷积核都会导致输出feature maps的一个输出通道为0,其在后续的推理阶段中将一直没什么作用,因此将这些卷积核移除对网络性能是不会造成什么影响的。具体来讲,对于剪枝率为PiP_{i}的第i层来说,最终只会保留Ni+1(1Pi)N_{i+1}(1-P_{i})个对最终预测有影响的卷积核,考虑到前一层的剪枝,第i层的输入通道由NiN_{i}变为Ni(1Pi1)N_{i}(1-P_{i-1})个,因此重新申请的模型第i层的卷积核维度更小了,其第i层权重为WiRNi+1(1Pi)×Ni(1Pi1)×K×K,1iL{W^{i}\in R^{N_{i+1}(1-P_{i})\times N_{i}(1-P_{i-1})\times K\times K},1\leqslant i\leqslant L}

3.3 Computation Complexity Analysis

理论上的加速分析:假设第i个卷积层的卷积核剪枝比率为PiP_{i},这意味着该层有Ni+1PiN_{i+1}P_{i}个卷积核被剪枝,剩下Ni+1(1Pi)N_{i+1}(1-P_{i})个卷积核不会改变,假定原本第i层输入特征图的宽和高、输出特征图的宽和高分别为 Hi×WiH_{i} \times W_{i}Hi+1×Wi+1H_{i+1} \times W_{i+1},经过卷积核之后,第i层有用的输出特征图维度由Ni+1×Hi+1×Wi+1N_{i+1} \times H_{i+1} \times W_{i+1} 变为 Ni+1(1Pi)×Hi+1×Wi+1N_{i+1}(1-P_{i}) \times H_{i+1} \times W_{i+1} ,第i层的输出是第i+1层的输入,我们进一步考虑剪枝率为Pi+1P_{i+1}的第i+1层,其计算量由原来的Ni+2×Ni+1×K×K×Hi+2×Wi+2N_{i+2} \times N_{i+1} \times K \times K \times H_{i+2} \times W_{i+2}变为 Ni+2(1Pi+1)×Ni+1(1Pi)×K×K×Hi+2×Wi+2N_{i+2}(1-P_{i+1}) \times N_{i+1}(1-P_{i}) \times K \times K \times H_{i+2} \times W_{i+2},换句话来讲,原始计算量中1(1Pi+1)(1Pi)1-(1-P_{i+1})(1-P_{i})的比例被减少了,这将会使得神经网络在推理阶段速度加快。

实际的加速分析:在理论的加速分析中,我们没有考虑除卷积操作之外的其他操作,诸如BN层、池化层等,我们只考虑了卷积操作的FLOPs。然而,减少FLOPs不能带来相同量级上的实际加速,因为一些非张量层(如BN、pool层)在GPU上推理时也需要时间,另外,还有IO延迟、缓冲器限制和BLAS库的高效性也会使得理论和实际的加速存在较大差别。

4. Evaluation and Results

4.1 Benchmark Datasets and Experimental Setting

实验设置:

  • 我们的SFP操作是在每一个训练epoch之后;
  • 对于从头开始训练的模型剪枝,我们使用正常的训练方案;对于一个预训练模型进行剪枝时,学习率比从头训练的相比减少了10倍。

4.2 ResNet on CIFAR-10

我们在ResNet 20、32、56和100上测试了我们的SFP方法,我们使用了不同的剪枝比率,并且分析了从头开始训练和使用预训练模型的差别。
在这里插入图片描述

Result,table 1展示了实验结果,我们的SFP算法可以实现比最先进的结果更高的性能表现。举个例子, [Li et aL, 2017]中对ResNet 110使用"hard filter pruning"实现了38.6%的加速比例,精度只掉了0.61%(没有微调),但使用了预训练模型和微调后精度只掉了0.2%。然而通过SFP方法,我们可以将模型加速40.8%,且在不微调的情况下精度只掉了0.3%,在使用预训练模型之后,精度甚至上升了0.18%。

4.3 ResNet on ILSVRC-2012

我们在ILSVRC-2012数据集上对ResNet-18、34、50、101上进行了测试。对所有的模型都使用了相同的剪枝比率——30%,ResNet的所有层同时进行剪枝(为了简单化对于projection shortcuts不进行剪枝)。
在这里插入图片描述

4.4 Ablation Study

我们设计广泛的消融研究来进一步分析SFP的每一个元素。

Filter Selection Criteria:基于量级的标准(比如Lp-norm)被广泛用于卷积核选择,因为它需要的计算资源小。我们将L2-norm和L1-norm进行了比较,对于L1-norm标准,在10%、20%、30%的剪枝比率下模型的准确率分别为 93.68 ±\pm 0.60%, 93.68 ±\pm 0.76%, 93.34 ±\pm 0.12%。对于L2-norm标准,准确率为 93.89 ±\pm 0.19%, 93.93 ±\pm 0.41%, 93.38 ±\pm 0.30%。可以出来,L2-norm的结果比L1-norm好一点,这是由于L2的结果受最大元素支配,L1的结果受其他小元素影响更大,因此,对于L2标准来说拥有大权重的卷积核会被保留下来,所以相应的判别特征被保留下来导致模型性能更好。

Varing pruning rates:为了全面了解SFP,我们测试了对于ResNet-110不同的剪枝比率的影响,正如Figure 3(a)所示,当剪枝比率增加时,模型的精度先上升到基准线上再近似的线性下降。当剪枝比率在0-23%之间时,加速模型的精度比基准模型要高,这也说明了我们的模型有一个正则化的效果。可以减少过拟合。

Sensitivity of SFP interval:默认情况下,在每一个训练epoch之后我们都会进行SFP操作,然而,不同的SFP间隔也会导致不同的表现,所以我们探索了SFP间隔的敏感度,我们使用剪枝率为30%的ResNet-110作为基线,然后将SFP 间隔从1-10变化,结果如Figure 3(b)所示,它展示了模型准确率在不同的SFP间隔下没有太大的波动。而且,大多数(超过80%)的间隔准确率都比间隔为1时高,因此,通过调节这个超参数我们可以进一步提高模型的精度。

Selection of pruned layers:之前的工作总是对网络中的一部分层做剪枝,并且不同层设置不同的剪枝比率。举个例子,[Li et al., 2017] 仅仅剪枝不敏感的层,[Luo et al., 2017] 跳过ResNet的残差模块的最后一层,[Luo et al., 2017] 对于浅层的剪枝更加激进,对于深层则剪枝的少一点,类似地,我们也比较了对ResNet中所有残差块的第一层和第二层进行剪枝的性能,我们将剪枝比率设置为30%,对块中所有第一层进行剪枝后模型的精度为 93.96 ±\pm 0.13%,然而第二层剪枝之后精度只有 93.38 ±\pm 0.44%,因此,不同层的敏感度不同,更加细致的剪枝层的选择可能会导致性能上的提高,尽管这会引入更多的超参数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章