Channel Pruning for Accelerating Very Deep Neural Networks
Introduction
-
本文的方法针对一个已训练好的CNN,交替地运行两步完成对每个卷积层进行剪枝,具体为L1正则化+最小平方重构(本质为线性回归)
-
对网络结构精简主要有三种方法,如图1所示:
- 张量因式分解(如SVD)。将一个卷积层分解成多个。缺点:无法减少特征图宽度(通道数)。并且无法对卷积核尺寸为1X1的卷积层分解。
- 稀疏连接(非结构化剪枝),具体为筛去绝对值较小的权重。缺点:代码难实现。
- channel pruning:把网络结构变瘦,即宽度变窄。可能存在的问题:移除某些通道可能会对更深层的卷积层的输入产生较大影响。这也是本文提到要计算accumulated error的原因。

-
本文方法:不去分析卷积核权重的重要性,而是利用特征图之间的冗余性进行通道剪枝。
3. Approach
- 假设对宽度为c的特征图进行通道剪枝,设batch_size为N,kh×kwk_h \times k_wkh×kw为卷积核尺寸,c为输入通道数,n为输出通道数。从输入特征图采样(如图2所示,截取蓝色的一小块正方形),得到X,其尺寸为N×c×kh×kwN \times c\times k_h\times k_wN×c×kh×kw, 卷积层对应的权重矩阵为WWW,尺寸为n×c×kh×kwn \times c\times k_h\times k_wn×c×kh×kw,因此X经过卷积层卷积后,得到输出Y,尺寸为N×n×1N \times n \times 1N×n×1(1可以省略)。
现在网络经过了修剪,我们需要将该层的输出和修剪之前的输出保持一致,通过优化以下重建损失函数,假设我们现在需要将通道数减少至c′c'c′:
argminβ,w12N∣∣Y−∑i=1cβiXiWiT∣∣F2 \begin{equation} \mathop{argmin} \limits_{\beta, w} \frac{1}{2N} \Bigg|\Bigg| Y- \sum\limits_{i=1}^c{\beta_i X_i W_i^T} \Bigg|\Bigg|_F^2 \end{equation} β,wargmin2N1Y−i=1∑cβiXiWiTF2
此时限制条件为∣∣β∣∣0≤c′||\beta||_0 \le c'∣∣β∣∣0≤c′。其中∣∣⋅∣∣F||·||_F∣∣⋅∣∣F为F范数,表示矩阵所有元素的平方和的平方根。∣∣⋅∣∣0||·||_0∣∣⋅∣∣0表示第0范数。XiX_iXi为输入XXX在第i个通道的分量,shape为N×kh×kwN \times k_h \times k_wN×kh×kw。β\betaβ为系数向量,βi\beta_iβi为对应通道的系数。βi=0\beta_i = 0βi=0 表示改通道被修剪。WiW_iWi尺寸为n×kh×kwn \times k_h \times k_wn×kh×kw。c′c'c′由人为设定,可以根据需要的加速比计算。

3.1 Formulation
3.1.1 Optimization
- 解决eq.1中的L0范数约束是一个NP-hard问题,可以将其放宽至L1约束,可以分为两步,通道选择和特征图重建:
- 基于L1正则化,选出重要的channel,去除冗余的通道。
- 使用剩下的channels,根据线性最小平方误差重建输出。
argminβ,w12N∣∣Y−∑i=1cβiXiWiT∣∣F2+λ∣∣β∣∣1 \begin{equation} \mathop{argmin} \limits_{\beta, w} \frac{1}{2N} \Bigg|\Bigg| Y- \sum\limits_{i=1}^c{\beta_i X_i W_i^T} \Bigg|\Bigg|_F^2 + \lambda||\beta||_1 \end{equation} β,wargmin2N1Y−i=1∑cβiXiWiTF2+λ∣∣β∣∣1
其中∣∣β∣∣0≤c′,∀i∣∣Wi∣∣F=1||\beta||_0 \le c', \forall_i\big|\big|W_i\big|\big|_F = 1∣∣β∣∣0≤c′,∀iWiF=1。λ\lambdaλ为惩罚系数,引入L1正则化会导致更多的βi\beta_iβi为0,同时限制∣∣Wi∣∣F=1\big|\big|W_i\big|\big|_F = 1WiF=1防止出现trivial solution。
- 实际操作过程:交替地执行如下两步。
- 第一步。固定WWW,求β\betaβ,选择重要的channel。WiW_iWi相当于卷积核的权重, 此时基于L1正则化,求出β\betaβ。
β^LASSO(λ)=argminβ12N∣∣Y−∑i=1cβiZi∣∣F2+λ∣∣β∣∣1 \hat{\beta}^{LASSO}(\lambda) = \mathop{argmin} \limits_{\beta} \frac{1}{2N} \Bigg|\Bigg| Y- \sum\limits_{i=1}^c{\beta_i Z_i} \Bigg|\Bigg|_F^2 + \lambda||\beta||_1 β^LASSO(λ)=βargmin2N1Y−i=1∑cβiZiF2+λ∣∣β∣∣1
此处的Zi=XiWiTZ_i=X_iW_i^TZi=XiWiT,尺寸为N×nN \times nN×n,当βi=0\beta_i=0βi=0时,第i个通道被忽略。 - 第二步,固定β\betaβ,求WWW。相当于对模型修建后的微调过程:
argminW′∣∣Y−X′(W′)T∣∣F2 \mathop{argmin} \limits_{W'} \Big|\Big| Y- {X'(W')^T} \Big|\Big|_F^2 W′argminY−X′(W′)TF2
其中X′=[β1X1,β2X2,...,βcXc],W′=[β1W1,β2W2,...,βcWc]。X'=[\beta_1X_1, \beta_2X_2, ...,\beta_cX_c],W'=[\beta_1W_1, \beta_2W_2, ...,\beta_cW_c]。X′=[β1X1,β2X2,...,βcXc],W′=[β1W1,β2W2,...,βcWc]。获得W′W'W′后,令βi=βi∣∣Wi∣∣F,Wi=Wi÷∣∣Wi∣∣F\beta_i=\beta_i||W_i||_F,W_i = W_i \div ||W_i||_Fβi=βi∣∣Wi∣∣F,Wi=Wi÷∣∣Wi∣∣F,以满足约束条件∀i∣∣Wi∣∣F=1\forall_i\big|\big|W_i\big|\big|_F = 1∀iWiF=1
- 初始输入为λ=0\lambda = 0λ=0,随后逐渐增加λ\lambdaλ值,直至∣∣β∣∣0||\beta||_0∣∣β∣∣0趋于稳定,得到最终的W=[β1W1,β2W2,...,βcWc]W = [\beta_1W_1,\beta_2W_2,...,\beta_cW_c]W=[β1W1,β2W2,...,βcWc]。
- 实际过程中发现,交替地执行算法非常耗时,可以将第一步执行多次,当∣∣β0≤c′∣∣||\beta_0 \le c'||∣∣β0≤c′∣∣,然后仅执行第二步一次,结果显示该方式与2-step iteration方法的结果近似。
3.2 Whole Model Pruning
- 从浅到深,依次对每一层裁剪通道数,在顺序剪枝地过程当中可以计算累计error。具体后文会介绍。
3.3 修剪多分支的网络。以resnet为例。
- 以上方法无法对多分支网络使用,因为对一个分支的输入feature map修剪之后,会影响另一个分支(因为共用同一个输入,修剪了一个会影响另一个)。
- 我们以resnet网络为例。一个resnet block当中的第一层和输出层(最后一层)无法通过以上方法修剪,如下图所示。第一层是因为residual branch和shortcut branch共用了一个输入c0c_0c0;而最后一层是因为shortcut branch是没有参数的,无法通过eq1给出的方式来做剪枝,并且有shortcut的存在,经过residual block内部每一层的剪枝会产生累计error,很难恢复。因此作者针对两种情况做了相应调整。

3.3.1 针对residual block的最后一层
- 如图三右侧所示,Y2,Y1Y_2, Y_1Y2,Y1分别为剪枝前residual branch,shortcut branch输出的特征图,Y′Y'Y′表示为剪枝后的特征图,因为shortcut没有参数,不能根据eq1重建输出特征图,因此将优化目标从Y2Y_2Y2改为Y2+Y1−Y1′Y_2 + Y_1 - Y'_1Y2+Y1−Y1′,相当于额外弥补了剪枝后shortcut branch损失的通道信息。
3.3.2 针对residual block的第一层
- 不能直接对输入的特征图剪枝,因为被shortcut branch共享。
- 可以在经过第一个卷积层之前,加一个sampling层,相当于筛选重要的channels。然后再根据eq1做剪枝。
- 作者提出,也可以采用卷积核相关的剪枝方式解决该问题。直接对每个卷积核应用Eq1, 每个卷积层会选择更具有代表意义的通道。经过fine tuning后,结果与原始的channel pruning类似,但是得到的卷积层"irregular"(正常情况下每个卷积核是对输入的每个通道都做卷积操作),需要特殊的函数库支持。
问题:
- 什么是Inference-time approach for channel pruning?
- “Because of these differences, our approach could be applied at inference time.” 这句话什么意思?
- 为什么该方法能统计accumulated error?因为剪枝是从浅到深进行,修剪深层的feature map时,浅层的已经修建完毕,因此浅层剪枝产生的error会传递到深层当中去。
词语释义
bifurcate 分支,形成两条分支
formulation 规划,制定
trivial solution:指解为0或者空集
L0范数:非零元素的个数
L1范数:元素绝对值之和
L2范数:元素平方和的平方根
符号释义
参考连接
https://owen-liuyuxuan.github.io/papers_reading_sharing.github.io/The_theory/Channel_Pruning_for_Accelerating_Very_Deep_Neural_Networks/
https://blog.csdn.net/qq_30615903/article/details/102924356
文献标注
ry_Deep_Neural_Networks/
https://blog.csdn.net/qq_30615903/article/details/102924356

6509

被折叠的 条评论
为什么被折叠?



