译:《用于资源高效推理的卷积神经网络剪枝》
论文地址:PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE
Motivation
神经网络剪枝最早的是工作是OBD和OBS,利用二阶泰勒展开选择要删除的参数,使用剪枝作为正则化来提升训练和泛化,但这种方法需要额外地计算海森矩阵,这样会给标准微调增加内存和计算花费。
与本文类似的工作有一个是在特征图和核级别的卷积层进行结构化剪枝的,以及在核函数内用规则的步长稀疏性进行剪枝。剪枝是通过粒子滤波完成,其中的配置通过误分类率来加权,这种方法在小的CNNs上表现良好,但无法解决大的CNNs
Han等人引入使用更强的\(\ell_2\)正则项微调和删除低于预定义阈值的参数这一更简单的方法。这样非结构化剪枝方法对于模型压缩非常有效,但这种压缩由于现代硬件限制并不能直接转换成更快的推理
因此,有人设计了专门的硬件来有效地推理具有内核稀疏性的网络,但这种方法需要很长的微调时间,可能会超过原始网络的训练时间的3倍或更多。
之后还有人提出了一种基于组稀疏性的网络参数正则化方法,对不重要的参数进行惩罚,但基于正则化的剪枝技术需要对每一层进行敏感性分析,这又增加了额外的计算。
基于以上工作,作者提出了他们的方法,作者结合基于贪心标准剪枝与通过反向传播微调的方法,该方法依赖于所有层的标准的全局重新缩放,并且不需要敏感性估计。此外,该方法速度更快,因为是直接剪枝不重要的参数,而不是等待正则化的优化使得它们的值足够小。
方法简介
本文剪枝方法对应的由三步组成:
- 微调网络,直到在目标任务上收敛
- 剪枝与进一步微调交替迭代
- 在达到正确率与剪枝目标的权衡后停止
过程很简单,但它的成功取决于正确的修剪标准
假设训练集样本:\(\mathcal D = \{\mathcal X = \{X_0,X_1,\cdots,X_N\},\mathcal Y=\{y_0,y_1,\cdots,y_N\}\}\),网络的参数\(\mathcal W = \{(W_1^1,b_1^1),(W_2^2,b_2^2),\cdots,(W_L^{C_\ell},b_L^{C_\ell})\}\)被优化到最小代价值\(\mathcal C(\mathcal D|\mathcal W)\),代价函数\(\mathcal C(.)\)使用最多的是负对数似然函数,代价函数的选择与剪枝无关,并且仅取决于原始网络要解决的任务。在迁移学习的情况下,作者采用在相关但不同的数据集上用参数\(\mathcal W_0\)预训练大型网络。
在剪枝过程中,细化参数的子集以保持调整后的网络的精度,即\(\mathcal C(\mathcal D|\mathcal W')\approx \mathcal C(\mathcal D|\mathcal W)\),对应的就是优化: \[ \min_{\mathcal W'}|\mathcal C(\mathcal D|\mathcal W')-\mathcal C(\mathcal D|\mathcal W)|\quad s.t. \quad ||\mathcal W'||_0 \le B \] 其中,\(||\mathcal W'||_0\)中的\(\ell_0\)范数限定了\(\mathcal W'\)中非零参数B的个数,直观地,当\(\mathcal W' = \mathcal W\)时会达到误差函数的全局最小值,但\(||\mathcal W'||_0\)也会有它的最大值
找到一个好的参数子集,同时保持一个尽可能接近原始的代价值是一个组合问题,它需要对选择数据子集的代价函数进行\(2^{|\mathcal W|}\)次评估,这么大的计算量几乎不可能实现。但作者研究了一种贪心方法去不完全精确地解决这一优化问题。
最开始是所有参数\(\mathcal W\),迭代地识别并移除最不重要的参数,通过在每次迭代中移除参数,确保满足\(\mathcal W'\)上的\(\ell_0\)的限制
用\(Z_\ell \in \mathbb R^{H_\ell \times W_\ell \times C_ell}\)表示一级图像特征图,特征图也可以表示为网络的输入\(Z_0\),或卷积层的输出\(Z_\ell,\ell\in [1,2,\cdots,L]\),单个特征图可以表示为\(Z_\ell^{(k)},k\in[1,2,\cdots,C_\ell]\),一个卷积层\(\ell\)上进行输入特征图为\(Z_{\ell-1}\),核参数为\(W_\ell^{(k)}\in\mathbb R^{\mathcal C_{\ell-1}\times p\times p}\)的卷积操作(\(*\)): \[ Z_\ell^{(k)}=g_\ell^{(k)}\mathcal R(Z_{\ell-1}*W_\ell^{(k)}+b_\ell^{(k)}) \] 其中\(Z_\ell^{(k)}\in \mathbb R^{H_\ell \times W_\ell}\)是卷积结果,\(b_\ell^{(k)}\)表示偏置,这里\(g_\ell \in \{0, 1\}^{C_\ell}\)是作者引入的剪枝率,是确定在前向传播期间是否包括或删除特定特征图的外部开关,这样当\(g\)被矢量化时:\(\mathcal W' = g\mathcal W\)
Oracle剪枝
最小化完整模型和剪枝模型的准确率的不同取决于区分“最不重要参数”的标准,也被称为"显著程度(saliency)",最好的标准就是对每个参数都进行精确的经验评估,作者称之为oracle标准,是通过轮流对非零参数\(w\in \mathcal W'\)进行消融,然后记录不同的"代价(cost)"
作者将这种oracle重要性估计分为两种:
- oracle-loss,将重要性量化为损失的变化:\(\mathcal C(\mathcal D|\mathcal W')-\mathcal C(\mathcal D|\mathcal W)\)
- oracle-abs,采用差的绝对值,\(|\mathcal C(\mathcal D|\mathcal W')-\mathcal C(\mathcal D|\mathcal W)|\)
这两种都不鼓励剪枝会增加损失,但oracle-loss鼓励会减少损失的剪枝,而oracle-abs则是根据损失变化的比例对剪枝进行惩罚,而不考虑其变化的方向
虽然oracle对于贪心的过程是最优的,但它的计算成本太高,需要对训练数据集进行\(||\mathcal W'||_0\)次评估,对其余每个非零参数进行一次评估
剪枝标准
还有很多比oracle更高效的启发式标准,对于评估特征图的重要性的情况合理的标准包括:核权重的\(\ell_2\)范数、均值、标准差或特征图激活的百分比的组合,以及激活值和预测值之间的互信息,下面将对这些标准进行描述,还有作者提出的基于泰勒展开的新的标准
最小权重
根据核权重大小进行剪枝可能是最简单的标准, 并且在微调时不需要任何额外的计算。该标准评估可表示为:\(\Theta_{MV}:\mathbb R^{\mathcal C_{\ell-1}\times p\times p} \rightarrow \mathbb R\),\(\Theta_{MW}(w)=\frac{1}{|w|}\sum_iw_i^2\),其中\(|w|\)是矢量化后权重集的维度,这么做的原因是:具有低的\(\ell_2\)范数可以比具有高范数检测更不重要的特征
激活
ReLU激活函数的流行的原因之一就是诱导激活中的稀疏性,允许卷积层充当特征检测器。因此可以假设如果激活值(输出特征图)较小,则该特征检测器对于当前预测任务不重要,可以通过平均激活进行评估:\(\Theta_{MA}:\mathbb R^{H_\ell \times W_\ell \times C_\ell}\rightarrow \mathbb R\),\(\Theta_{MA}(a)=\frac{1}{|a|}\sum_i a_i\),激活\(a=Z_l^{(k)}\),或者通过激活标准差\(\Theta_{MA_{std}}(a)=\sqrt{\frac{1}{|a|}\sum_i(a_i-\mu_a)^2}\)
互信息
互信息是对一个变量中有关另一个变量的信息量的一种度量,将互信息作为剪枝标准:\(\Theta_{MI}:\mathbb R^{H_\ell}\times W_\ell \times C_\ell \rightarrow \mathbb R\),\(\Theta_{MI}(a)=MI(a, y)\),其中\(y\)是神经网络目标值,MI是为连续值定义的,因此为了简化计算,作者将其换成为量化变量定义的信息增益(IG):\(IG(y|x)=H(x)+H(y)-H(x,y)\),其中\(H(x)\)是变量\(x\)的熵,通过积累大量更新的激活值和真实值,然后量化这些值并计算IG
泰勒展开
作者将剪枝看成优化问题,尝试找到具有有限数量的非零元素的\(\mathcal W'\)来最小化\(|\Delta \mathcal C(h_i)|=|\mathcal C(\mathcal D|\mathcal W')-\mathcal C(\mathcal D|\mathcal W)|\),然后基于泰勒展开方法直接估计移除特定参数后损失函数的改变,假设\(h_i\)是参数\(i\)产生的输出,\(h=\{z_0^{(1)},z_0^{(2)},\cdots,z_L^{(C_\ell)}\}\),为了符号方便,代价函数同样依赖于参数和参数计算的输出:\(\mathcal C(\mathcal D|h_i)=\mathcal C(\mathcal D|(w,b)_i)\),假设参数独立则有: \[ |\Delta \mathcal C(h_i)|=|\mathcal C(\mathcal D,h_i=0)-\mathcal C(\mathcal D,h_i)| \] 其中\(\mathcal C(\mathcal D,h_i=0)\)是如果输出\(h_i\)被剪枝的代价值,\(\mathcal C(\mathcal D,h_i)\)是如果它没有被剪枝的代价值,虽然参数实际上是相互依赖的,但在训练过程中的每个梯度步骤都做了独立假设
为了估计\(\Delta \mathcal C(h_i)\),使用一次泰勒多项式,对于函数\(f(x)\),在\(x=a\)处的泰勒展开为: \[ f(x)=\sum_{p=0}^P\frac{f(^{(p)}(a)}{p!}(x-a)^p+R_p(x) \] 其中\(f^{(p)}(a)\)是\(f\)在a点的\(p\)阶导数,\(R_p(x)\)是\(p\)阶余项,因此,使用一阶泰勒展开估计\(\mathcal C(\mathcal D,h_i=0)\): \[ \mathcal C(\mathcal D,h_i=0)=\mathcal C(\mathcal D,h_i)-\frac{\delta \mathcal C}{\delta h_i}h_i+R_1(h_i=0) \] 余项可以用拉格朗日计算: \[ R_1(h_i=0)=\frac{\delta^2\mathcal C}{\delta(h_i^2=\xi)}\frac{h_i^2}{2} \] 其中\(\xi\)是介于\(0\)到\(h_i\)之间的实数,但作者这里忽略了一阶余项,因为其需要大量计算,也部分因为广泛使用ReLU激活函数可以使得这一项很小
最后,通过整合上述可以推出:\(\Theta_{TE}:\mathbb R^{H_l\times W_l\times C_l}\rightarrow \mathbb R^+\) \[ \Theta_{TE}(h_i)=|\Delta \mathcal C(h_i)|=|\mathcal C(\mathcal D,h_i)-\frac{\delta \mathcal C}{\delta h_i}h_i-\mathcal C(\mathcal D,h_i)|=|\frac{\delta \mathcal C}{\delta h_i}h_i| \] 这一标准可以剪去代价函数梯度几乎平坦的参数,该方法需要激活值与代价函数梯度的累计,这很容易从反向传播的相同计算中计算。
对于多变量输出如特征图: \[ \Theta_{TE}(z_l^{(k)})=|\frac{1}{M}\sum_m\frac{\delta \mathcal C}{\delta z_{l,m}^{(k)}}z_{l,m}^{(k)}| \] 其中M是特征图向量长度,对于T>1个样本的小批量,分别计算每个样本的标准,并在T上求平均值
与OBD(Optimal Brain Damage)的关系
上面提出的泰勒标准依赖于通过移除特征图造成的损失的变化估计。其核心思想与OBD相同。而泰勒标准只是更仔细地考虑这些差异。
零点的平均百分比(APoZ)
前面有人提出过利用激活稀疏性进行网络修剪,REU激活函数在推理过程中施加稀疏性,输出端正向激活的平均百分比可以确定神经元的重要性。直观来说,这是一个好的标准,然而无论网络的目标是什么,第一层的特征地图都有类似的APoZ,因为它们学习成为类似Gabor的滤波器。我们将使用APoZ来评估功能地图的显著程度
标准化
一些标准返回的原始值,其大小随网络中的参数所在层的深度而变化 ,简单的基于层的\(\ell_2\)标准化可以实现跨层适当重新缩放: \[ \hat \Theta(Z_l^{(k)}) = \frac{\Theta(Z_l^{(k)})}{\sqrt{\sum_j(\Theta(Z_l^{(j)}))^2}} \]
FLOPs正则化剪枝
使用剪枝的主要原因之一就是为了降低网络操作数,为了将这考虑进去,作者引入FLOPs正则化: \[ \Theta(z_l^{(k)}) = \Theta(z_l^{(k)})-\lambda\Theta_l^{flops} \] 其中\(\lambda\)控制正则化的量,在实验中作者设置\(\lambda=10^{-3}\),\(\Theta_l^{flops}\)则是在卷积被实现为滑动窗口的假设下计算的,还可以使用其它正则化条件如:存储大小、核大小或内存占用等