network sliming:加快模型速度同时不损失精度
作者: 晟 沚
编辑:黄俊嘉
01
压缩介绍
压缩这块可以简单分为两部分分别是Pruning和Quantization.
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主要包括:
网络的第一层和最后一层都不要量化;
网络中BN层要放在卷积层的前面;
从0开始训或者finetune都可以,finetune的初始学习率为0.0001;
考虑激活函数加上了Prelu,其他任务可以考虑加上试下;
1x1卷积是二值化网络中的一个影响精度的关键因素,因为1x1的kernel太小了,经过二值化的其表达能力更是捉襟见肘,一般处理方法是增加其输出channel的个数或者不二值化,但是这两个方法都不能根本解决问题;
二值化网络等价于取消了乘法只保留了加法,剩下的需要工程上的优化了,问题还是那个问题,无法直接在现成的深度学习框架上运行。
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
模型压缩三要素:
Model size ,模型大小
Run-time memory , 模型得小,效率也得高,不能参数少,运算却很多,还是不行滴。
Number of computing operations
模型压缩存在的不足:
低秩分解方法:对全连接层效果可以,对卷积层不怎么样;模型大小可压缩3倍,但运算速度无明显提升。
Weight Quantization: HashNet虽然可采用分组、共享权值方法来压缩所需保存的参数数量,但是在 Run-time memory上面没有任何压缩。
二值化权值: 损失精度
Weight Pruning/Sparsifying: 需要专用的硬件或者代码库;[12]训练过程中,没有一个对稀疏进行"约束""指导"(guidance)
Structured Pruning/Sparsifying: 本文方法所属类型,当然没有缺点啦。。。就算就文章中也不会提嘛~
创新点:
利用batch normalization中的缩放因子γ 作为重要性因子,即γ越小,所对应的channel不太重要,就可以裁剪(pruning)。
为约束γ的大小,在目标方程中增加一个关于γ的正则项,这样可以做到在训练中自动剪枝,这是以往模型压缩所不具备的。
来看目标函数:
第一项是模型预测所产生的损失,第二项就是用来约束γ的,λ是权衡两项的超参,后面实验会给出,一般设置为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
机器学习算法工程师
一个用心的公众号
进群,学习,得帮助
你的关注,我们的热度,
我们一定给你学习最大的帮助