网络模型剪枝-论文阅读《Pruning Filters For Efficient Convnets》

之前的两篇分别讲了剪枝的权重剪枝和神经元剪枝,这篇是专门针对CNN卷积核进行剪枝的,还是挺有针对性和有效的,建议大家去看下原文。

Introduction

论文首先指出了现有剪枝网络的两个主要问题:一个是有些剪枝方法在剪枝后并不能减少计算时间,因为大多数的剪枝操作是在计算量不大的FC层完成的;另一个问题是,有些能剪枝CNN的方法在剪枝后需要使用单独的稀疏网络框架(BLAS)甚至专门的硬件上才能运行。

所以本文专注于对卷积核剪枝,与权重剪枝相比,卷积核剪枝对于剪枝操作更自然,不会引入稀疏连接,所以不需要使用专门的框架或者硬件。

剪枝卷积核和特征图

在叙述剪枝卷积核操作之前,需要回顾一下CNN中卷积是如何操作的。

对于一个维度为 [ n i × h i × w i ] [{n}_i \times {h}_i \times {w}_i] [ni×hi×wi]的输入特征xi,其中ni、hi、wi分别是第i层卷积层的输入特征通道数、高和宽。单个卷积操作是将一个大小为 [ n i × k i × k i ] [{n}_i \times {k}_i \times {k}_i] [ni×ki×ki]的3D卷积核Fi,j在xi上卷积得到维度为 [ 1 × h i + 1 × w i + 1 ] [1 \times {h}_{i+1} \times {w}_{i+1}] [1×hi+1×wi+1]的单个通道的特征图;正常卷积是有ni+1个大小为 [ n i × k i × k i ] [{n}_i \times {k}_i \times {k}_i] [ni×ki×ki]卷积核组组成的 [ n i × n i + 1 × k i × k i ] [{n}_i \times {n}_{i+1}\times {k}_i \times {k}_i] [ni×ni+1×ki×ki]大小的4D卷积核组Fi在xi上进行卷积,得到维度为 [ n i + 1 × h i + 1 × w i + 1 ] [{n}_{i+1} \times {h}_{i+1} \times {w}_{i+1}] [ni+1×hi+1×wi+1]的输出特征图xi+1

如图所示,

网络模型剪枝-论文阅读《Pruning Filters For Efficient Convnets》_第1张图片

当其中一个卷积核Fi,j被剪枝后,根据卷积操作方式,它所对应的特征通道Xi+1,j也会被移除,就减少了一个卷积核的计算量(nik2hi+1wi+1)。同时,由于特征通道Xi+1,j的移除,对其进行的下一层卷积操作计算量也会相应减少(ni+2k2hi+2wi+2)。所以,剪枝第i层的m个卷积核会减少第i层和i+1层的共计m/ni+1的计算量。

决定单个卷积层中哪些卷积核被剪枝

文中声明所提出来的剪枝方法可以在对已训练好的模型剪枝用处较小的卷积核的同时尽可能地不损失精度。该方法通过计算当前卷积层的每个卷积核的F1-norm来确定各个卷积核的相对重要性,它也同样代表着卷积核的平均权重大小:F1-norm值低(权重小)的卷积核相对于其他卷积核一般会产生较弱激活的特征图。

这里之所以用F1-norm而不是F2-norm,是因为这是经过实验测试后的,如下图:

网络模型剪枝-论文阅读《Pruning Filters For Efficient Convnets》_第2张图片

虽然从图中可以看出:F1-norm和F2-norm并没有明显的区别,但是F1-norm效果还是要稍微好一点,所以文中选择了F1-norm。

对第i层卷积层剪枝m个卷积核的步骤如下:

  1. 对每个卷积核Fi,j,计算其F1-norm记为 s j = ∑ l = 1 n i ∑ ∣ K l ∣ {s}_j = \sum^{{n}_i}_{l=1}{\sum|{K}_l|} sj=l=1niKl;
  2. 对sj进行排序;
  3. 对m个最小的s值的卷积核和相应输出特征图进行剪枝,下一层卷积层的对应卷积核通道也删除;
  4. 创建第i层和第i+1层的新的卷积核矩阵,同时保留其原来的权重并拷贝到新模型中。
与权重剪枝的区别

卷积核剪枝利用F1-norm的作为依据进行剪枝这种方式很像之前论文中提出的权重剪枝方法,但是也有一些不同:首先是权重剪枝方法是根据设定的权重阈值进行剪枝(低于阈值的权重被剪枝),这样的话阈值需要非常小心地进行设定,并且很难准确地预测具体要剪枝多少个神经元;然后就是权重剪枝产生的稀疏模型需要使用专门的稀疏框架进行运算才能达到剪枝压缩、加速的效果,而卷积核剪枝则不会产生稀疏模型。

确定单层卷积层对剪枝的敏感度

为了确定模型每一层的敏感度,论文对每一层都进行了单独的剪枝实验并且在validation集上进行验证。结果如下图b所示:

网络模型剪枝-论文阅读《Pruning Filters For Efficient Convnets》_第3张图片

图1

为了看懂图b,首先需要解释一下图a:图a表示VGG网络在cifar-10数据集根据sj值排序后的每层卷积核,由于每一层卷积层的卷积核个数不同,所以将卷积核其归一化到1(100%)放在x轴,将相应归一化后的sj值放在y轴。可以看出,曲线开始越陡峭的卷积层(如conv1、conv11)表示其sj值较小的卷积核越多(如conv1的60%左右的卷积核的sj值在0.2以下),而曲线开始越平坦的曲线(如conv2、conv5)表示其sj值越小的卷积核越少(如conv5的90%以上的卷积核都大于0.6)。

看懂了图a就能很好的理解图b了,从图b中可以看出,在图a中曲线越陡峭的卷积层(sj值较小的卷积核多)在剪枝过后更能保持其原精度;相反,曲线越平坦的卷积层(sj值较小的卷积核少)会对剪枝更加敏感。所以,论文倾向于剪枝sj值较小的卷积核以维持模型精度

根据上述分析,在剪枝过程中,需要根据每一层对剪枝的敏感度来确定具体剪枝的比例。但是,如果一层一层的进行测试不仅费时且会出现层级的超参数设置问题。文中观察到VGG和ResNet网络相同stage的敏感度相似,所以文中对同一个stage的所有卷积层使用了相同的剪枝比例以避免超参设置问题。而对于敏感度很高的卷积层,设置很小的剪枝比例,或者甚至不进行剪枝。

多层卷积层的剪枝

对于连续多层的卷积层剪枝,文中提出了两种策略:

  1. 独立剪枝,每一层剪枝都与其他层独立。如下图中,在剪枝计算F1-norm时(绿色)并没有去处前一层剪枝后的移除的特征图(蓝色),所以卷积核中黄色位置的权重依然被计算;
  2. 贪心剪枝,不考虑已经被上一层剪枝后移除的特征图,即不计算下图中蓝色的特征图。

网络模型剪枝-论文阅读《Pruning Filters For Efficient Convnets》_第4张图片

贪心剪枝虽然不是全局最优的方法,但是当较多卷积核被剪枝时,它能保留更高的精度。

接下来文中讲述了如何进行残差层的剪枝,在叙述之前首先要说明一下,文中提供的剪枝方法是在ResNet-34、ResNet-56、ResNet-110这三个网络上剪枝的,它们使用的残差块是两个3x3卷积连接的basicblock,即下图:

网络模型剪枝-论文阅读《Pruning Filters For Efficient Convnets》_第5张图片

图2

由于残差块中有横向连接(shortcut),所以剪枝比较复杂,如下图:

网络模型剪枝-论文阅读《Pruning Filters For Efficient Convnets》_第6张图片

这里第一层卷积A因为剪枝后不影响残差块特征图的输出,所以可以按之前的规则随意剪枝。但是,由于第二层卷积B输出的特征图需要跟横向连接的P(Xi)层进行相加,所以B的剪枝比较复杂。因此,为了剪枝B,其对应的特征图Xi+2以及横向连接的特征图P(Xi)的对应特征图要同时进行剪枝。由于横向连接的特征图比残差块的特征图更加重要,B中哪个卷积核被剪枝是由C的剪枝结果决定的(即图中C中的绿色卷积核先被剪枝,然后移除相应特征图P(Xi)的特征通道,接着Xi+2对应P的通道也被剪枝,最后根据特征通道被移除的位置剪枝B中绿色卷积核)。这里需要特别注意一下,由于在原有的basicblock残差块中,只有在下采样的时候横向连接才进行卷积,即图2的Downsample,所以文中仅在网络中存在downsample的时候进行剪枝,即resnet中每个stage的开始。

重训练剪枝后的网络

有两种重训练的策略:

  1. 剪枝一次然后重训练:对网络的多层卷积层只进行一次剪枝,然后进行重训练知道得到原有的精度;
  2. 迭代式剪枝和重训练:一层一层地剪枝然后进行重训练,在下一层被剪枝之前,模型进行重训练以适应前一层被剪枝后的变化。

论文中通过实验发现,对于不敏感的卷积层,使用第一种方法能剪枝掉高比例的卷积核并且能在少量epoch的重训练中恢复精度;但是,若是敏感的卷积层的大比例卷积核被剪枝,则很难恢复到原有精度。第二种方法虽然可能获取更好的结果,但是需要更多的epoch进行重训练。

实验

这里实验只展示一些重要的结果。

整体结果如下表:

网络模型剪枝-论文阅读《Pruning Filters For Efficient Convnets》_第7张图片

对于VGG-16、ResNet-56、ResNet-110在cifar10数据集来说,可以在剪枝64.0%、13.7%和2.3%的参数后,甚至得到更高分类精度,这一点在图1c中也有提现,这是因为冗余的卷积核被剪枝。

在剪枝Resnet时,实验发现敏感层都位于接近特征通道数变化的残差块,即每个stage中的第一个和最后一个残差块。所以在上述的结果中,这些敏感层都被跳过剪枝。

对于ResNet-34在ImageNet数据集中的剪枝,最好的结果是剪枝7.6%的同时损失了0.67%的精度。

以上就是本文的全部内容了。

你可能感兴趣的:(网络模型加速和压缩,剪枝,论文笔记,深度学习,网络压缩,剪枝,神经网络)