查看原文
其他

network sliming:加快模型速度同时不损失精度

晟沚 机器学习算法工程师 2021-12-31

   

作者: 晟   沚

编辑:黄俊嘉

01

压缩介绍

压缩这块可以简单分为两部分分别是PruningQuantization.


Pruning

思想是将卷积层和全连接层中的权重较小的值去掉,然后finetune恢复精度。


Deep Compression:

S. Han, H. Mao, and W. J. Dally. Deep compression: Compressing deep

neural network with pruning, trained quantization and huffman coding.

CoRR, abs/1510.00149, 2, 2015


Pruning很简单,计算每个卷积层中所有权重的L1 norn,然后排序,根据预先设置的稀疏度将L1 norm 较小的值去掉,然后finetune回复精度。


Dynamic network surgery 上一篇的改进:

Y. Guo, A. Yao, and Y. Chen. Dynamic network surgery for efficient

dnns. In Advances In Neural Information Processing Systems, pages

1379-1387, 2016


Pruning,对Deep Compression的改进,其思想是在finetune的初始阶段不断的改变mask中的值,Deep Compression中mask的值在最开始的时候就确定下来了,finetune的整个过程是不会变的,而DNS中mask在finetune的初期是不断变化的,通过 splicing 操作来回复上一次Pruning中删除的重要的连接,就是把已经删除的重要连接恢复回来,随着迭代次数的增加,网络会变的稳定,splicing 操作相应的减少,最后通过finetune来恢复精度,这种操作可以达到加速finetune的目的,但是缺点和Deep Compression一样,无法实现明显加速。


structured sparsity learning:

W. Wen, C. Wu, Y. Wang, Y. Chen, and H. Li. Learning structured

sparsity in deep neural networks. In Advances In Neural Information

Processing Systems, pages 2074-2082, 2016


Quantization


将32位的浮点数量化成低比特的整数从而达到压缩和加速的目的Quantization这块主要包括激活函数,权重以及梯度的量化。实际试验中比特位数是激活函数>权重>梯度,并且梯度量化主要是起到了加速训练的目的,此外如果想要达到加速的目的,需要硬件优化,定点化等操作,无法直接在现有的深度学习框架中达到加速的目的。二值化网络主要包括BNN和XNORNet,用到的一些trick主要包括:

  1. 网络的第一层和最后一层都不要量化;

  2. 网络中BN层要放在卷积层的前面;

  3. 从0开始训或者finetune都可以,finetune的初始学习率为0.0001;

  4. 考虑激活函数加上了Prelu,其他任务可以考虑加上试下;

  5. 1x1卷积是二值化网络中的一个影响精度的关键因素,因为1x1的kernel太小了,经过二值化的其表达能力更是捉襟见肘,一般处理方法是增加其输出channel的个数或者不二值化,但是这两个方法都不能根本解决问题;

  6. 二值化网络等价于取消了乘法只保留了加法,剩下的需要工程上的优化了,问题还是那个问题,无法直接在现成的深度学习框架上运行。


BNN

M. Courbariaux and Y. Bengio. Binarynet: Training deep neural networks

with weights and activations constrained to+1 or-1. arXiv preprint

arXiv:1602.02830, 2016


BWN的思想是将每个权重量化成1或者-1,然后乘上一个scale factor,这个参数是通过训练学习得到的。


XNORNet

M. Rastegari, V. Ordonez, J. Redmon, and A. Farhadi. Xnornet: Imagenet

classification using binary convolutional neural networks. In European

Conference on Computer Vision, pages 525-542. Springer, 2016


XNORNet中包含只对权重二值化和权重,激活函数都二值化两种,对权重和激活函数都二值化的精度下降十分明显,


压缩目前face++被去年的iccv收录的:

He, Yihui , Zhang, Xiangyu , Sun, Jian. Channel Pruning for

Accelerating Very Deep Neural Networks arXiv:1707.06168


这个做的挺不错的

knowledge distilling:

Junho Yim, Donggyu Joo, Ji-Hoon Bae, Junmo Kim. A Gift from Knowledge

Distillation: Fast Optimization, Network Minimization and Transfer

Learning


将复杂模型(teacher)的知识迁移到简单模型(student)中去,这样相当于在保持精度的同时减少了模型的复杂度,然后简单模型可以直接开跑,不需要像之前做量化那样做定点化了。


02

论文

Learning Efficient Convolutional Networks through Network Slimming


模型压缩三要素:

  1. Model size ,模型大小 

  2. Run-time memory , 模型得小,效率也得高,不能参数少,运算却很多,还是不行滴。 

  3. Number of computing operations


模型压缩存在的不足:

  1. 低秩分解方法:对全连接层效果可以,对卷积层不怎么样;模型大小可压缩3倍,但运算速度无明显提升。 

  2.  Weight Quantization: HashNet虽然可采用分组、共享权值方法来压缩所需保存的参数数量,但是在 Run-time memory上面没有任何压缩。 

  3.  二值化权值: 损失精度 

  4.  Weight Pruning/Sparsifying: 需要专用的硬件或者代码库;[12]训练过程中,没有一个对稀疏进行"约束""指导"(guidance) 

  5.  Structured Pruning/Sparsifying: 本文方法所属类型,当然没有缺点啦。。。就算就文章中也不会提嘛~


创新点:

  1. 利用batch normalization中的缩放因子γ 作为重要性因子,即γ越小,所对应的channel不太重要,就可以裁剪(pruning)。 

  2. 为约束γ的大小,在目标方程中增加一个关于γ的正则项,这样可以做到在训练中自动剪枝,这是以往模型压缩所不具备的。 


来看目标函数: 

第一项是模型预测所产生的损失,第二项就是用来约束γ的,λ是权衡两项的超参,后面实验会给出,一般设置为1e-4 或者 1e-5。g(*)采用的是g(s)=|s|, 就是L1范,可达到稀疏的作用。原理就讲完了~


Network slimming

利用BN层中的缩放因子γ,在训练过程当中来衡量channel的重要性,将不重要的channel进行删减,达到压缩模型大小,提升运算速度的效果。 

看一下模型图,左边为训练当中的模型,中间一列是scaling factors,也就是BN层当中的缩放因子γ,当γ较小时(如图中0.001,0.003),所对应的channel就会被删减,得到右边所示的模型。 道理是不是非常简单,而且巧妙的将γ增加到目标函数中去,达到了一边训练一边剪枝的奇效。


接下来看看,整体是如何运行的,如何剪枝再训练,再剪枝。 整体流程框图如下图所示:

分为三部分,第一步,训练;第二步,剪枝;第三步,微调剪枝后的模型,循环执行。


具体操作细节: 

γ通常取 1e-4或者1e-5,具体情况具体分析, 

γ得出后,应该怎么剪,γ多小才算小? 这里采用与类似PCA里的能量占比差不多,将当前层的γ全都加起来,然后按从大到小的顺序排列,选取较大的那一部分,通常选取70%左右(具体情况具体分析)。

λ的选取对γ的影响如图所示:

λ为0的时候,目标函数不会对γ进行惩罚,λ等于1e-5时,可以发现,γ=0.0+的有450多个,整体都向0靠近。当λ=1e-4时,对γ有了更大的稀疏约束了,可以看到有接近2000个γ是在0.0x附近。

剪枝百分比: 剪得越多,模型越小;剪得太多,精度损失。这是矛盾的,所以作者做了实验对比,看看剪多少合适。实验发现,当剪枝超过80%,精度会下降。 


优点:

Network Slimming为一种神经网络训练方法,其可以减小模型大小,运行内存,计算量,同时没有精度损失,并最小化训练过程.得到的模型不需要专门的库或者软件来运行.


具体实现:

在卷积层的每个通道引入一个尺度因子γ,具体操作为将尺度因子γ与该通道的输出相乘. 在训练的过程中,对这些尺度因子采用sparsity regularization操作,以自动鉴定不重要的通道.这样需要训练的参数包括网络本身的参数,以及每个通道的尺度因子γ,训练目标函数为:

式中,(x,y)表示训练输入,目标输出.W为网络的各层的权重参数.l(f(x,W),y)表示网络本身的目标函数,λ∑γ∈Tg(γ)表示尺度因子γ参数的目标函数.


batch normalization:

在CNN中,通常会引入batch normalization(BN),以加快模型收敛,优化模型生成效果.文献提出,同时将通道中的尺度因子γ重新应用于BN层.另zin,zout分别为BN层的输入,输出.B为当前的mini-batch,则BN层的计算公式为:

式中,μB,σB为输入激活函数对B的均值和方差.γ,β为需要训练的仿射变换参数.

对于含有小的尺度因子的通道,如图中橙色标记通道,将其剪去.剪枝后,我们获得了紧凑的模型,如图中有半部分所示.将剪枝后的模型进行fine-tuned,以达到与完整的网络模型相等甚至更高的精度.

完整的网络训练过程图如下:





 

END




往期回顾之作者晟沚

【1】实时语义分割Real-time Semantic Image Segmentation via Spatial Sparsity





机器学习算法工程师


                            一个用心的公众号

长按,识别,加关注

进群,学习,得帮助

你的关注,我们的热度,

我们一定给你学习最大的帮助





: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存