Learning both Weights and Connections for Efficient Neural Networks
image.pngSong Han在NIPS15的论文。我把它简称为WCENN。一篇比较经典的CNN pruning的文章,NIPS15.
CNN模型参数太多了。
前人尝试过的方法(来减少CNN模型参数数量):
- fixed-point, 8bit替代32bit, 2011NIPS workshop
- 通过low-rank来利用CNN线性结构
- vector quantization
另外一些方法(来减少CNN模型参数):
- GAP替换全连接层
- googlenet结构
存在的问题:这类方法上,再使用transfer learinng(fine tune全连接层),变得更难了。
已经有的pruning方法:
- biased weight decay
- Optimal Brain Damage & Optimal Brain Surgeon: 比biased weight decay准,但是计算二阶导数,慢
HashedNets:
一种减小模型容量的方法,可以和pruning一起使用
提出的方法:
- initial training
- 先找出“重要的连接”(权值)(低于阈值的权值被舍弃,则网络连接变得稀疏)
- 剪裁掉“不重要的权值连接”
- finetune经过剪裁的模型
- 1+2+3视作一个iteration,通过执行多次iteration,来找到最少的连接(最佳pruning?)
灵感的来源(讲故事):CNN的参数太多,存在冗余;也可以从正则化角度解释。
几点说明:
- 1+2+3视作一个iteration,通过执行多次iteration,来找到最少的连接(最佳pruning?)
-
L2正则:初始训练阶段使用到了L2正则。L1正则在re-training之前还不错,但是retrain后性能低。
regularization_trade_off.png
-
DropOut Ratio: re-train阶段应当使用更小的dropout-ratio,因为pruning过后的模型已经sparse了,inference variance变小了,所以dropout少一点才比较对路。
-
不同layer对pruning的敏感度:靠前的卷积层更加敏感,因而需要较低的pruning thresh
效果:模型缩小了9~13倍,而精度几乎没有损失。
缺点
估计速度会很慢。训练速度在文章中提到了,AlexNet要搞一个礼拜。。
测试速度都没有提到过,估计很慢。
具体实现是借助了mask layer,这样看来模型容量没有变小?似乎需要依赖于sparse convolution library?
reference
https://blog.csdn.net/jason19966/article/details/78922695
https://github.com/LuoManGit/cut_weight_cnn
官方代码:https://github.com/songhan/Deep-Compression-AlexNet (好几篇文章代码都在这个repo)
网友评论