文章目录 Introduction Related Work 网络稀疏化(Network Slimming) why choose chennel-level sparsify how to implement 在模型中加入BN(Batch Normalization)层 本文中的方法来自于论文《Learning Effcient Convolutional Network through Network Sliming》 论文:Learning Effcient Convolutional Network through Network Sliming
Introduction
CNN模型压缩最主要的是下面三个方面:
模型大小(model size),其中包含训练参数和关联的网络结构。 运行内存(run-time memory),包括加载训练参数等。 计算操作数量(numbers of computing operation)。 相比于CNN网络,该方法做了以下修改:
训练的时候,在第ii i 层和第i+1i+1 i + 1 层加入了一层chennel scaling factors的训练层,他们与前一层的卷积层意一一对应,与后一层卷积层使用全连接。 在训练完成之后,检查scaling层的参数,如果参数低于某一阈值就删除该chnnel,并且还要对其他channel进行微调。 Related Work
其他CNN模型压缩的方法还有:
Low-rank Decomposition ,该方法对全连接层有奇效。Weight Quantuzation ,该方法通过hash将权重由一个较大的范围转变到一个较小的范围。例如,在MNIST中,将像素的值由[0,255]转变为[0,1][0,255]转变为[0,1] [ 0 , 2 5 5 ] 转 变 为 [ 0 , 1 ] 。weight pruning/Sparsify ,权重剪枝,将一些值较小的一些权重删去,从而达到压缩的目的。structured pruning/sparsify ,t通过随机停用一些channel来达到压缩的目的,类似于TensorFlow中的Dropout层通过将一定数量的channel变为0类似。neural architecture learning ,这个类似于CNN中的Inception模型,让网络在预先的几个模型中进行学习,选择最好的。 网络稀疏化(Network Slimming)
稀疏化:按照我的理解即是淘汰部分对结果影响较低的权重、或者通道等。
why choose chennel-level sparsify 稀疏化可以用于不同维度。我们可以在weight-level、kernel-level、channel-level、layer-level进行稀疏化。
在weight-level、kernel-level进行处理,能够具有较高的压缩效率,同时还兼具灵活性和普遍性,但是往往需要软件以及硬件支持才能在准确度兼具的情况下进行。
相反,在layer-level层面上进行,就缺乏灵活性和普遍性,事实上只有在层数>50时,对layer进行稀疏化才能获得较好的效果。
在chennel层面进行稀疏化,能够在一定程度上兼具上述优点,同时不需要软件和硬件支持。
how to implement 在scaling层,如果仅仅只将factor较小的channel删除,那么仅仅只能压缩十分之一。因此,还需要对其他channel进行微调(fine-tune),在这里映入了L1-pealty loss即在最终的loss函数中加入正则化。 lossfunctiong:L=∑(x,y)l(f(x,W),y)+λ∑γ∈Tg(γ)loss functiong: \\ L = \sum_{(x,y)}l(f(x,W),y)+\lambda\sum_{\gamma\in \Tau}g(\gamma) l o s s f u n c t i o n g : L = ( x , y ) ∑ l ( f ( x , W ) , y ) + λ γ ∈ T ∑ g ( γ ) 其中,(x,y)代表input,output,W表示训练权重,λ表示平衡前后loss的超参数,T表示scaling层的参数,一般g函数选择L1或者是smooth−L1(x,y)代表input,output,\\W表示训练权重,\\ \lambda表示平衡前后loss的超参数,\\ \Tau 表示scaling层的参数,\\一般g函数选择L1或者是smooth-L1 ( x , y ) 代 表 i n p u t , o u t p u t , W 表 示 训 练 权 重 , λ 表 示 平 衡 前 后 l o s s 的 超 参 数 , T 表 示 s c a l i n g 层 的 参 数 , 一 般 g 函 数 选 择 L 1 或 者 是 s m o o t h − L 1 下面是关于smooth-L1的解释:
L1;smooth={∣x∣if ∣x∣>α;1∣α∣x2if ∣x∣≤αL_{1;smooth} = \begin{cases}|x| & \text{if $|x|>\alpha$;} \\ \frac{1}{|\alpha|}x^2 & \text{if $|x| \leq \alpha$}\end{cases} L 1 ; s m o o t h = { ∣ x ∣ ∣ α ∣ 1 x 2 if ∣ x ∣ > α ; if ∣ x ∣ ≤ α
α\alpha α is a hyper-parameter here and is usually taken as 1. 1α\frac{1}{\alpha} α 1 appears near x2x^2 x 2 term to make it continuous.
Smooth L1-loss combines the advantages of L1-loss (steady gradients for large values of xx x ) and L2-loss (less oscillations(振荡,因为L1正则化当x在0附近时,会在-1,1振荡) during updates when xx x is small).
Another form of smooth L1-loss is Huber loss. They achieve the same thing. Taken from Wikipedia, Huber loss is Lδ(a)={12a2for ∣a∣≤δ,δ(∣a∣−12δ),otherwise.L_\delta (a) = \begin{cases} \frac{1}{2}{a^2} & \text{for } |a| \le \delta, \\ \delta (|a| - \frac{1}{2}\delta), & \text{otherwise.} \end{cases} L δ ( a ) = { 2 1 a 2 δ ( ∣ a ∣ − 2 1 δ ) , for ∣ a ∣ ≤ δ , otherwise. ——引用自StackExchange
在模型中加入BN(Batch Normalization)层
在BN层中对数据进行下列变化: z^=zin−μβσ2+ϵ;zout=γz^+β{\widehat{z}=\frac{z_{in} - \mu_{\beta}}{\sqrt{\sigma^2+\epsilon}}}; {z_{out} = \gamma \widehat{z}+\beta} z
= σ 2 + ϵ
z i n − μ β ; z o u t = γ z
+ β 其中μβ为样本中位数,σ为方差,γ,β是可训练的参数其中\mu_{\beta}为样本中位数,\sigma为方差,\\\gamma,\beta 是可训练的参数 其 中 μ β 为 样 本 中 位 数 , σ 为 方 差 , γ , β 是 可 训 练 的 参 数 事实上,如果我们不加入BN层,scaling层的factor值就无法代表重要性(虽然我们依然可以通过参数来选择channel),因为我们可以将权重的值扩大n倍,将factor的值缩小n倍,而不会影响输出结果。 (待续)