前言:从小白入门,通过这次比赛学到很多东西。现在把文档放到这里,希望能够帮助到需要的人。 特别感谢初赛排名第一的YaHei大佬。感谢他开源的代码把我带进了比赛的大门。附上大佬的项目链接:

https://github.com/hey-yahei/ZTE_Challenge2019_MOA

摘要: 本次模型压缩几乎无法重新训练,因此无法采用许多常用的模型压缩算法。针对主办方提供的已经训练完成的模型,主要使用了包括层融合、剪枝、奇异值分解等方法进行压缩。

一、 层融合

​   在神经网络训练的过程中,BN层能够加速网络收敛,并且能够控制过拟合。不过这样也增加了一些运算和参数,因此在推理过程中,可以通过将BN层与卷积层的参数融合的方式,来减少运算,并略微地实现一些模型的压缩。【1】

​   公式:

​   卷积层计算公式:
Y = W ∗ X + b Y = W*X + b Y=W∗X+b

​   BN层计算公式:
X b n = s ( X − m ) ( σ + ϵ ) + b b n X_{bn} = \frac{s(X - m)}{\sqrt(\sigma + \epsilon)} + b_{bn} Xbn​=( ​σ+ϵ)s(X−m)​+bbn​
​   其中:m: 均值, $ \sigma$ : 方差, s: scale, $ b_{bn}$: 偏置, ϵ \epsilon ϵ : 滑动系数。

​   融合及将卷积层的输出作为BN层的输入,带入得到

​   融合公式:
X b n = X ∗ s W σ + ϵ + s ( b − m ) σ + ϵ + b b n X_{bn} = X * \frac{sW}{\sqrt{\sigma + \epsilon}} + \frac{s(b - m)}{\sqrt{\sigma + \epsilon}} + b_{bn} Xbn​=X∗σ+ϵ ​sW​+σ+ϵ ​s(b−m)​+bbn​
​   得到融合之后的权值:
W c o n v ′ = W s σ + ϵ W'_{conv} = W\frac{s}{\sqrt{\sigma + \epsilon}} Wconv′​=Wσ+ϵ ​s​

b _ c o n v = ( b c o n v − m ) s σ + ϵ + b b n b\_{conv} = (b_{conv} - m)\frac{s}{\sqrt{\sigma + \epsilon}} + b_{bn} b_conv=(bconv​−m)σ+ϵ ​s​+bbn​

​   层融合对模型压缩的效果并不明显,对比赛所提供模型,层融合之后大小仅下降3KB。对于显存大小及推理时间的提升未做详细的量化分析。

二、 模型剪枝

​   对于一些权重极小的连接,将其去除几乎不会影响模型的准确性,反而在重训练过程中有助于避免过拟合现象的发生。本次针对该模型的剪枝以阈值修剪:去除绝对值低于$ 1*e^{-10}$的连接。关于阈值的设定,刚开始由于没有经验,不敢设很大。后来测试时发现,阈值设为小于 1 ∗ e − 6 1*e^{-6} 1∗e−6以内剪枝的数量几乎一致。但是当阈值高到 1 ∗ e − 2 1*e^{-2} 1∗e−2时就会对模型产生毁灭性的影响。本轮剪枝后模型大小下降也并不明显,大约有340KB左右的下降。而且由于在修剪时需要同时对权值和prototxt文件进行修改,未能做到很好地利用代码自动修剪,因此修剪体验一般。

三、 删除卷积层

   这个想法实在太过于简单粗暴,几乎不可能成为一个通用的压缩方法。幸运的是本次比赛的模型的conv5冗余较大,直接删除后边四层的影响不大,而且赛后其他同学讨论中提到甚至可以直接删除后边五层。必须承认这个方法来自QQ群中一位同学的分享,并非自己发现。我自己在这一部分的工作主要就是修改代码和prototxt文档。这一方式虽然简单粗暴,却十分有效,直接将我从弃赛的边缘拉到了前60名。该方法的主要提升在于对显存占用和推理计算量的降低。对于模型大小的压缩效果并没有很明显,该步使模型大小减少了大约8.4MB。

四、 奇异值分解

​   奇异值分解(Singular Value Decomposition, SVD)是本次比赛所使用的最主要的压缩手段,效果也是最明显的。

​   由于全连接层占据了模型中最大一部分的参数,对全连接层作奇异值分解可以得到极大的压缩收益。因此本次将SVD作为了模型压缩的重点。有几天的工作都花在了测试不同的r值对模型准确率的影响上。并且希望能够找到合适的r使得z恰好处于临界点(0.950或0.900)。最终,本次最好成绩对应的r值为136, 对应的z值为0.958。也许是由于服务器波动等因素,在r=130时,z取值为0.951,却并未得到更加理想的成绩。而使z接近0.9的r值为108,此时z值为0.901,但权值的下降并没能换来足够的显存使用及计算量的改善。这一部分对于运算速度和显存占用有着显著的优化,同时对模型的大小有着更为显著的压缩。在r=130时,模型大小下降了大约190MB, 比原来压缩了大约63%。

五、 其他未成功应用方法

(1)无需数据的卷积网络自动加速

​   无需数据的卷积网络数据加速(Data-free Automatic Acceleration of Convolutional Networks, DAC)是由Xin Li 等人与2018年提出的一种无需重新训练模型的压缩方式【2】。将卷积核分解为Depthwise 及 Pointwise两种,分解运算的核心其实还是奇异值分解。最终可以实现对已训练完成的模型的卷积核分解与替换,以及权值的迁移,而无需重新训练。原文作者在CIFAR-VGG模型上测试,发现替换靠后的卷积层可以在减少较多参数的同时只造成很小的精度损失,而处理较为靠前的卷积层则代价较大。
附上自己实现DAC的代码

https://github.com/baizhenmao95/2019-ZTE-Algorithm-Competition/blob/master/DAC_AGAIN.py

​   由于论文中给出了该算法的详细步骤,因此我尝试用代码复现了该算法,并对卷积层conv4_5_2进行了替换。虽然最终确实可以得到压缩后的模型,将r取为5时大约能够减少该层一半的参数。但是也许是我的程序实现有误,也许是该算法并不适用于该类模型的压缩,甚至也许是所选的用于替换的卷积层并不合适,总之最终得到的模型与原模型相比,所提取的特征图的余弦距离出现了负数。最后一天我压宝压在了这一算法上,却最终没能实现突破,也是一大遗憾。

(2) Octave Conv

​   OctaveConv是前几天刚出现的一个新的方法。一出现就得到了许多深度学习相关的学者和媒体的大力推荐。而其简单有效的思想也让我印象深刻。因此十分希望能够复现其中的结果,并在此次比赛中为我所用。作为一个新的方法,使用它的优势在于我可能会是比赛中为数不多的使用者,也就有可能得到几乎独一无二的改善。但是劣势在于,过于新鲜的方法意味着对其的解读与代码的实现方面可能很有限。因此在将近一周的时间内我只能对照着论文原文【3】和某个MXnet版本的第三方复现代码【4】学习。它即插即用、无需更改网络结构的特性非常吸引人,而其通俗易懂的比喻也降低了对算法的原理及其效果的理解难度。可惜最终我还是意识到它似乎是一个需要重新训练的算法,最终只能遗憾放弃。但是在之后的科研工作中也许能够真正地用到。因此也算是一项不错的收获。

(3)DEEP COMPRESSION

​   这一压缩操作来自于一篇很经典的模型压缩论文【5】以及一个caffe版本的第三方复现代码。主要做了基于Kmeans聚类的量化来压缩卷积和全连接层的权重。经过压缩后得到了一个大约只有8MB的numpy模型文件。这对于嵌入式设备的使用非常友好。但是也许由于参数选取不合适等原因造成了z值的大幅下降,最终只能弃用。但该算法的实用意义也许要大于比赛意义。

附参考资料:
【1】 https://blog.csdn.net/u013597931/article/details/85697008
【2】https://arxiv.org/pdf/1812.08374.pdf
【3】https://export.arxiv.org/pdf/1904.05049
【4】https://github.com/terrychenism/OctaveConv
【5】https://arxiv.org/pdf/1510.00149v5.pdf

中兴算法大赛深度学习模型优化加速解决方案总结相关推荐

  1. 【小结】除了网络搜索(NAS),AutoML对深度学习模型优化还有哪些贡献?

    文/编辑 | 言有三 自从Google提出AutoML技术以来,已经过去了好几年了,如今在学术界和工业界都是热点.AutoML在网络结构的搜索上已经取得了非常多的突破,相关的文章,技术博客都已经广为流 ...

  2. 收藏 | PyTorch深度学习模型训练加速指南2021

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者:LORENZ KUHN 编译:ronghuaiyang ...

  3. 【滴滴专场】深度学习模型优化技术揭秘

    滴滴拥有海量数据以及 AI 推理需求,GPU 在人脸识别.自动驾驶.地图导航等场景大量使用,滴滴云IFX团队针对斯坦福 DAWNBench 榜单的 ImageNet 模型也进行了深入优化,在 NVID ...

  4. 除了网络搜索(NAS),AutoML对深度学习模型优化还有哪些贡献?

    文/编辑 | 言有三 自从Google提出AutoML技术以来,已经过去了好几年了,如今在学术界和工业界都是热点.AutoML在网络结构的搜索上已经取得了非常多的突破,相关的文章,技术博客都已经广为流 ...

  5. 深度学习模型压缩与加速

    深度神经网络在人工智能的应用中,包括语音识别.计算机视觉.自然语言处理等各方面,在取得巨大成功的同时,这些深度神经网络需要巨大的计算开销和内存开销,严重阻碍了资源受限下的使用.模型压缩是对已经训练好的 ...

  6. 调参:深度学习模型24种优化策略

    [时间序列预测/分类] 全系列60篇由浅入深的博文汇总:传送门 文章目录 1. 深度学习模型面临的挑战 1.1 神经网络学习映射功能 1.2 学习网络权重很困难 1.3 求解非凸误差面 1.4 学习算 ...

  7. 深度学习 模型 剪枝

    参考文章: Pruning Filters for Efficient Convnets Compressing deep neural nets 压缩神经网络 实验记录(剪枝 + rebirth + ...

  8. 深度学习模型压缩与优化加速

    1. 简介 深度学习(Deep Learning)因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩.优化加速.异构计算等方法突破瓶颈. 模型压缩算法能够有效降低参数冗 ...

  9. 深度学习模型压缩与优化加速(Model Compression and Acceleration Overview)

    1. 简介 深度学习(Deep Learning)因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩.系统优化加速.异构计算等方法突破瓶颈,即分别在算法模型.计算图或算 ...

最新文章

  1. 刚上线就报名2000人!8位大牛免费讲座,再不报名就满额了!
  2. RxJava 从源码到使用
  3. springboot项目中session和cookie
  4. 黑盒测试的用例设计方法
  5. 隐马尔科夫模型C#类库调用示例
  6. 操作系统学习笔记-02-1.2-什么是操作系统
  7. 论MS-Ajax导致的大对象堆碎片化问题
  8. 5G 之战让运营商备受冷落?! | 极客头条
  9. python编程函数_python函数式编程
  10. paip.java 注解的详细使用代码
  11. 图数据库_多款业界流行图数据库对比
  12. fork函数_Linux中子进程回收函数:wait和waitpid
  13. 网络诊断 网络连接配置
  14. Java程序员未来职业应如何规划?
  15. 【教程】关于打开一些exe文件时,打开方式为microsoft store的解决办法
  16. AJAX设计模式之Lightbox---图片和网页外、连 flash、影片都可以显示在 Lightbox 弹出的方框里面
  17. ICC2里面多进程任务
  18. 数据分析与挖掘实战-电子商务网站用户行为分析及服务推荐
  19. 用心做事,踏实做人,乐观面对,积极应对
  20. c语言怎样统计数组的长度,C语言指针难吗?纸老虎而已,纯干货讲解

热门文章

  1. 关于一些繁体字体显示乱码的问题
  2. 一键重装系统win8图文教程
  3. 本周最新文献速递20220123
  4. 杯具的无线鼠标安装记
  5. Oracle表空间查询
  6. intel英特尔无线适配器高级设置
  7. py-02-DATABASE
  8. 建立自己的STM32项目库(库函数,Kile)
  9. Chrome插件-图片批量下载
  10. VC中常见的108个问题