0%

《PRUNING FILTERS FOR EFFICIENT CONVNETS》

译:《高效卷积网络的剪枝滤波器》

论文地址:PRUNING FILTERS FOR EFFICIENT CONVNETS

Motivation

大型神经网络在各种图像应用上表现越来越好,但对应的推理代价也非常高,特别是在一些资源受限的嵌入式传感器或移动设备上,就更加难以使用了。

已有的模型压缩方法通过剪枝影响较小的权重,然后再重新训练以达到不损失精度的情况下压缩模型。但这种剪枝参数的方法并并不一定会减少计算时间,因为被移除的参数主要是来自全连接层,而这些全连接层的计算代价相对较小。但之后又有人证明了卷积层也可以被压缩和加速,只是需要额外的BLAS库甚至需要特殊硬件。

因此,作者提出通过剪枝滤波器来降低训练好的CNNs的计算代价,与横跨整个网络的权重剪枝方法相比,剪枝滤波器是一种自然的结构化剪枝方法,不需要引入稀疏性,因此也不需要使用对应的库或特殊硬件设备。

修剪过后的滤波器数量通过减少矩阵乘法的数量直接与加速相关,这很容易针对目标加速比进行调整。此外,作者还采用一次修剪和重训练策略来替代分层迭代微调(再训练)以节省训练时间,这对于剪枝深层网络非常重要。

方法简介

使用\(n_i\)表示第\(i\)个卷积层的输入通道数,\(h_i/w_i\)表示输入特征图的高/宽,卷积层将输入特征图\(X_i \in \mathbb R^{n_i\times h_i \times w_i}\)转变为输出特征图\(X_{i+1} \in \mathbb R^{n_{i+1}\times h_{i+1}\times w_{i+1}}\),这个过程通过在第\(n_i\)个输入通道上使用\(n_{i+1}\)三维滤波器\(\mathcal F_{i,j} \in \mathbb R^{n_i\times k \times k}\),每个滤波器由\(n_i\)个二维滤波器\(\mathcal K \in \mathbb R^{k\times k}\)组成,所有滤波器一起组成核矩阵\(\mathcal F_i \in \mathbb R^{n_i\times n_{i+1} \times k\times k}\),卷积层的操作数量即:\(n_{i+1}n_ik^2h_{i+1}w_{i+1}\),如下图,当滤波器\(\mathcal F_{i,j}\)被剪枝,它对应的特征图\(X_{i+1},j\)被移除,这样就降低了\(n_ik^2h_{i+1}w_{i+1}\)个操作,同时应用在下一层滤波器的被移除的特征图上的核也会被移除,这样就节省了额外的\(n_{i+2}k^2h_{i+2}w_{i+2}\)个操作。剪枝第i层的m个滤波器就会降低第i层和第i+1层的计算成本的\(m/n_{i+1}\)

确定要在单层中剪去哪些滤波器

从第\(i\)个卷积层前去\(m\)个滤波器的流程如下:

  1. 为每个滤波器\(\mathcal F_{i,j}\)计算核权重绝对值之和:\(s_j=\sum_{l=1}^{n_i}\sum |\mathcal K_l|\)
  2. 通过\(s_j\)对滤波器排序
  3. 前去最小的\(m\)个滤波器和他们对应的特征图,以及修剪的特征图对应的下一卷积层中的核
  4. 为第\(i\)层和第\(i+1\)层创建新的核矩阵,并将剩余核权值复制到新的模型

与权重剪枝的关系

剪枝具有低绝对权重和的过滤器和权重剪枝类似,在整个滤波器所有权重都小于阈值的情况下,权重剪枝也会剪去整个滤波器,但是权重剪枝需要调整对应的阈值,并且很难预测最终将剪枝的滤波器的具体数量,此外,其生成的稀疏卷积核也会很难加速。

与滤波器上group-sparse正则化的关系

作者通过实验并没有观察到在选择滤波器时使用\(\ell_2\)正则化和使用\(\ell_1\)正则化有显著不同,并且证明了在训练期间零值化多个滤波器的权重和使用迭代剪枝再重训练策略修剪滤波器的效果相似。

测定单层对剪枝的敏感性

通过实验,作者发现坡度相对平坦(flat slopes)的层对剪枝更敏感;而对于深层网络而言,同一阶段中的层(具有相同的特征图大小)对剪枝具有类似的敏感度。

跨多层剪枝滤波器

了解如何一次剪枝多个层的滤波器非常有用:

  1. 对于深度网络,一层接一层的剪枝和重训练非常耗时
  2. 通过剪枝网络中的各层,可以全面了解形成的较小网络的健壮性
  3. 对于复杂的网络,可能需要一种整体方法

作者考虑了两种按层选择滤波器的策略:

  • 独立剪枝,即在计算(求权重绝对值之和)时不考虑上一层的剪枝情况,对应下图中在计算时黄色点权重参与计算
  • 贪心剪枝策略,计算时不计算已经剪枝过的,对应下图在计算时黄色点权重不参与计算

上图解释了两种方法在计算绝对权重和时的不同,贪婪方法尽管不是全局最优的,但它是整体地并能使得剪枝网络具有更高精度 ,特别是在需要剪枝很多滤波器的情况下。

对于简单网络可以很容易地剪枝任何卷积层中的任何滤波器,而对于复杂网络如ResNet则需要谨慎考虑了。如下图是基于投影映射的残差块滤波器剪枝,其中残差块中的第一层的滤波器可以任意修剪,因为它不改变块的输出特征图的数量;而第二卷积层的输出特征图与identity特征图之间的对应关系使得剪枝变得非常困难,因此为了剪枝残差块中的第二卷积层,还需要剪枝相应的投影特征图,由于identical特征图比加入的残差图更重要,因此需要剪枝的特征图应该根据shortcut层的剪枝结果来确定。为了确定要剪枝哪些identity特征图,即residual block 中第二层修剪的 Filter index 与shortcut layer 所选择的 Filter index 相同。

重新训练剪枝网络以恢复精度

在滤波器剪枝后,模型表现下降需要通过重训练进行恢复,有两种跨多层剪枝滤波器策略:

  1. 一次性剪枝并重训练:一次修剪多个层的滤波器,并重新训练,直到恢复原始精度
  2. 迭代剪枝和重训练:逐层迭代剪枝滤波然后重新训练。模型会在修剪下一层之前被重新训练,以使得权重适应修剪过滤中的变化

作者发现对弹性层剪枝,可以使用一次性剪枝后重新训练策略来剪去网络的很大部分,并且可以通过短时间(少于原始训练时间)的重新训练来恢复精度的任何损失。然而,如果修剪一些来自对剪枝敏感的层的滤波器,或者是修剪网络的大部分滤波器,则可能无法恢复原始的精度。

而迭代剪枝和再训练则可能会产生更好的结果,但迭代过程需要更多的epochs,特别是对于非常深的网络。