博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度压缩技术总结
阅读量:3519 次
发布时间:2019-05-20

本文共 2049 字,大约阅读时间需要 6 分钟。

http://blog.csdn.net/sinat_35188997/article/details/78180131?locationNum=7&fps=1

深度压缩主要技术: 

① 2016 ICLR best paper三步走策略 : 

技术路线:1)剪枝(剪掉多余的连接,将网络结构变稀疏) 

具体步骤: 
Step1:正常训练得到网络权值 
Step2:将所有小于阈值的权值设为0 
Step3:重新训练剩下的非0值 
Step2,step3不断迭代,直到满足条件为止。 
2)量化(通过k均值聚类,用索引代表聚类中心,从而减少权值的存储) 
3)霍夫曼编码(解决编码长短不一带来的冗余问题,不需要训练,在所有微调之后离线实施) 
实现效果:主流网络上都达到了40倍左右的压缩率,而且精度完全没有降低,甚至还提高了一点点。

② SqueezeNet 
主要思想:从网络结构的设计入手,通过设计更小的卷积核来减少模型的参数个数。 
技术路线: 1)采用1*1的卷积核部分替换3*3的卷积核。 
2)减少输入3*3卷积核图像的通道数量。 
3)延后降采样操作(包括pooling stride)。因为过早降采样会丢掉一些信息,后面的输出特征值会变小,通过延后降采样来提高网络精度。 
实现效果:不损失精度的情况下,文章将AlexNet原先240M的参数压缩到了4.8M,压缩了50倍。 
提升空间:如果再加上①的方法对权值进行压缩,理论上可以压缩510倍。Amazing!

③简化网络设计 
这里写图片描述

④低秩分解:奇异值分解、tucker分解、块分解。

⑤量化 
这里写图片描述 
⑥用定点来代替浮点数计算。

⑦设计更精巧的算法来降低模型大小(自然语言的相关应用) 
主要思想:不是用一个向量来表达一个词,而是用两个向量表达一个词,一个行向量+一个列向量,不同的词之间共享行或列向量。 
实现效果:提出的LightRNN算法极大的减小了模型的尺寸,可以把原来语言模型的大小从4G降到40M左右

⑧剪枝+嫁接(动态外科手术): 
主要思想:采取了剪枝与嫁接相结合、训练与压缩相同步的策略完成网络压缩任务。通过网络嫁接操作的引入,避免了错误剪枝所造成的性能损失,从而在实际操作中更好地逼近网络压缩的理论极限。极其有效地解决了处理大型网络时重训练时间长,误剪枝率高的问题。 
实现效果:将LeNet和AlexNet这两个经典网络的参数总量分别压缩108倍和17.7倍。

⑨knowledge distillation 
主要思想:使用一个深度网络或对不同模型(即ensemble)的预测结果进行平均,比使用单个较浅网络的准确性更高。当然计算复杂度也更高。knowledge distillation可以将复杂模型(teacher)学到的知识转移到更简单的模型(student)。通过这种方法,学生网络可以实现直接使用相同的数据集进行训练而无法实现的准确性。 
就是用teacher DNN(或多个teacher DNNs的ensemble)的class score作为soft target。目标是最小化soft target与student DNN class score之间的平方差。knowledge distillation看起来也是一个简化DNN网络的有效方法。

总结近年深度压缩技术热点: 
1)1*1卷积的使用:在GoogLeNet Inception v1以及后续版本,ResNet中都大量得到应用,有减少模型参数的作用。 
2)卷积拆分: 
eg1: VGG模型压缩trick:对于5×5的卷积,使用两个3×3的卷积串联,但参数量却有所降低,为3×3×2/(5×5)=0.72,同样的道理3个3×3卷积代替一个7×7,则参数压缩比3×3×3/(7×7)=0.55,降低一倍的参数量,也是很可观的。 
eg2:GoogleLet Inception v2就借鉴了VGG上面的思想。而到了Inception V3网络,则更进一步,将大卷积分解为小卷积。比如7×7的卷积,拆分成1×7和7×1的卷积后。参数量压缩比为1×7×2/(7×7)=0.29,比上面拆分成3个3×3的卷积,更加节省参数了。 
后来的Resnet也是上面这些trick。到现在,基本上网络中都是3×3卷积和1×1卷积,5×5很少见,7×7几乎不可见。 
eg3:SqueezeNet,squeezenet将上面1×1降维的思想进一步拓展。通过减少3×3的filter数量,将其一部分替换为1×1来实现压缩。 
3)硬件方面的加速。

二:训练方法改进: 
DSD(密集-稀疏-密集)方法 
训练流程: 
1)初始的密集训练(学习哪些权重重要,那些不重要) 
2)稀疏训练(剪枝并且重新训练稀疏网络,参数:稀疏度) 
3)最终的密集训练(恢复已剪枝的连接,使网络再次变的密集。这些之前剪枝的连接会初始化为零并重新训练。恢复被剪枝的连接增加了网络的维度,并且更多的参数更容易使网络的鞍点向下滑动以获得更好的局部最小值)

你可能感兴趣的文章
[LeetCode javaScript] 14. 最长公共前缀
查看>>
[LeetCode javaScript] 26. 删除排序数组中的重复项
查看>>
[LeetCode javaScript] 8. 字符串转换整数 (atoi)
查看>>
[LeetCode javaScript] 28. 实现strStr()
查看>>
cv2.error: OpenCV(3.4.2) c:\projects\opencv-python\opencv\modules\imgproc\src\color.hpp:25
查看>>
前端网页学习7(css背景属性)
查看>>
前端网页学习8(css三大特性:层叠性,继承性,优先级)
查看>>
前端网页学习9(css盒子)
查看>>
python学习8(列表)
查看>>
JavaScript学习(new1)
查看>>
http GET 和 POST 请求的优缺点、区别以及误区
查看>>
JVM的4种垃圾回收算法、垃圾回收机制
查看>>
什么是分布式事务
查看>>
常用的分布式事务解决方案
查看>>
设计模式:单例模式 (关于饿汉式和懒汉式)
查看>>
一致性Hash算法
查看>>
更新Navicat Premium 后打开数据库出现1146 - Table 'performance_schema.session_variables' doesn't exist
查看>>
安装rabbitmq时踩的坑
查看>>
Eclipse如何设置自动提示?
查看>>
2021-06-09数据库添加多条数据
查看>>