一直以来,网络剪枝都是模型压缩中的重要方法。按照被剪对象的粒度来分,大致可以分为三类:
- 针对权重剪枝,最具代表性的工作是韩松发表在NIP'15上的文章 “Learning both Weights and Connections”,idea简单直接,通过对滤波器设定阈值的方式剪掉冗余的连接,每剪完一层就重新fine-tuning网络,然后用逐层迭代的方式对整个网络执行剪枝操作。Nip'16上的一篇文章 “Dynamic Network Surgery for Efficient DNNs” 也是采用类似的方法,但是它是在梯度反传的时候每个迭代步就剪枝一次,剪枝之后的权重仍然可以参与后续的梯度更新。也就是说被剪掉的权重如果发现剪错了还可以重新恢复。以上两种剪枝的方式的弊端也是十分明显的,那就是造成了稀疏连接,虽然减少了网络参数,但是在GPU上并没有任何加速的效果,反而有可能更慢。
- 针对滤波器剪枝,这样做可以有效避免对权重剪枝的缺陷。针对滤波器的剪枝方法也分为两大类,一类主要定义用于衡量滤波器对于网络的重要性的规则,另一类则基于最小重建误差来做剪枝。
- 衡量滤波器重要性的通常做法是根据滤波器权重的绝对值和,“Pruning CNN for resource efficient inference” 就是这样来做的。或者通过权重的有无对网络的损失函数的影响,神经元激活值的大小等作为判断标准。论文 “Pruning CNN for resource efficient inference” 给出了较为详细的归纳和总结。
- ICCV'17上的Thinet的做法是最小化滤波器删除后对下一层的影响,这是个NP难的问题所以没办法直接求解,文中的做法是采用贪心的策略寻找对网络影响最小的滤波器。而另一篇文章 “Channel Pruning for Accelerating DNN” 则是采用LASSO回归的方式来求解的,然后求剩下滤波器的最小二乘估计。
- 共享网络权重
权重共享有点类似于剪枝,原来多个权重共享一个权重的方式能很好的压缩网络。其中,hashedNet将同一个hash bucket的参数共享同一个权重;Deep Compression通过聚类的方式决定哪些权重共享同一个参数;"Soft weight-sharing for DNN"通过概率的方式决定如何共享权重。