deep_compress ICLR2016 BEST PAPER

最近中了ICME2017的会议,抽空扫了一下有趣的论文。这篇是ICLR2016的best paper,作者是standford的song han。看了在微软的讲座,主要讲了Deep compress和Dense Sparse Dense training,最后是efficient inference engine的设计。

Deep Compress

摘要:该文章的压缩思路很清晰也简单,实验做得很充分。主要用了三个技巧:1.weights pruning,对网络的系数进行thresholding的截断,导致接近0的系数为0,从而增加网络的稀疏性,减少网络的连接和系数。(reduce ~10X) 2.Quantization,用更少的bits(32bits to 5bits)来表示系数,这里面用到了聚类方法来建立code book的技巧。 3.对code book进行哈夫曼编码,进一步压缩存储空间。
VGG从5MB 到11.3MB。

整个pipeline

Three stage compression
关于weights pruning:这是网络压缩的常用技巧,对于原始网络首先正常训练得到最终weights,然后将少于某个阈值的weights从网络移除,最后再retrain稀疏网络的参数

关于Quantization:在上一步pruning之后,用compressed sparse row & compressed sparse column的数据结构来存储网络,然后用code bokk 压缩8bits来存conv参数,5bits代表FC参数。以下用inNeurons=4,outNeurons=4的一层作为例子,而对于网络是针对整个网络做的。
training codebooks
首先对参数聚类,得到k个聚类中心(k根据压缩的比特来选择,比如5bits就是2^5=32),然后在每次更新的gradients中做group by and reduce操作得到code gradient,用当前网络的学习率更新code book.
最后再用huffman对code book编码。

在用了以上strategy以后,不损失精度情况下,AlexNet from 240MB to 6.9MB

Dense Sparse Dense Training

思想跟dropout有点像,也是需要保持网络结构的稀疏性,但是这篇文章的正则项在training procedure上起作用,可以看做training regularization. 只是简单地在中间添加sparse connection(将较少的weights直接移除)的training,然后交替做training,而不是整个training procedure都用dropout来做,在不调整网络结构的基础下,DSD的训练模式使得效果提升。(但没有正面跟dropout比较)。但可以与dropout technique一起使用
DSD Training

最后分析了一下DSD过程中的weights的变化,retrain会令pruning的weigths恢复,获得一种dense的weights分布。
training codebooks

总结展望

ICLR2016 BEST PAPER介绍了一种通用的压缩技巧:1.weights pruning 2.quantization 3.huffman coding. 而Dense sparse dense training则对训练过程加入regularizer使用更robusted.
Pruning和DSD的成功,主要还是sparse(L1)结构在起作用,在描述图像先验的时候,sparse prior确实是一种通用而且有效的先验。针对CDM或者JDD甚至V-CDM来说,这样的sparse tricks其实也是可用的。

坚持分享,支持原创