目录
原文链接:https://arxiv.org/pdf/1802.03494.pdf
源码链接:https://github.com/mit-han-lab/amc
其他代码实现:https://github.com/zzzxxxttt/pytorch_AMC
一、核心思想
这篇文章是MIT韩松老师组提出的一种模型压缩方法,其核心思想是使用强化学习方法自动得到神经网络各层的剪枝率,然后对神经网络进行剪枝,从而压缩模型,使其能在移动设备上运行。
里面涉及到了卷积神经网络剪枝和强化学习的知识。如果没有基础的同学可能需要去了解一下:
- Pruning filters for efficient convnets
- Channel pruning for accelerating very deep neural networks
- 还有强化学习里面的DDPG,这个是这篇文章的重点。
- 还有剪枝里面的细粒度剪枝和粗粒度剪枝等。
- 补充:还有soft pruning的知识也需要。看代码的时候需要用到。
二、问题分析
前面基础那里给了几个经典的网络剪枝方法,filter prune、channel pruning ,这些方法在网络模型压缩方面都得到了不错的效果。
但是这些方法都存在一个问题就是,需要人工去设定好每层的剪枝率,或者直接就设定每层的剪枝率是一样的。
然而,我们可以从这张图看出。这张图是fliter pruned 文章里的图。可以看出, 不同的层对不同的的剪枝率的敏感性是不一样的。虚线那些,冗余多,剪枝率达到60% 时性能也没下降多少。而实线这些,剪一点点,性能也下降很严重。所以说,每层应该要设置不一样的剪枝率。
在那篇论文里,作者虽然设置了每层不一样的剪枝率的。但是他是通过这样一层一层的试验得到的结果。这样显然是很耗费时间的。特别是对于现在越来越深的网络,动不动就上百层的,每一层不同剪枝率一个一个设,那是相当耗费时间的且不合理的。
所以我们希望找到一种方法来自动的确定每一层的剪枝率。
而且,还有个问题就是,网络不同层之间并不是完全独立的,他们是相互依赖的。每层单独剪的好,但是组合在一起并不一定是最好的。我们要得到的应该是一个最优的组合。
所以,如何解决以上问题,自动的得到每一层的剪枝率,并考虑整体的关系,就是这篇文章的出发点了。
三、方法框架
这篇文章使用的自动搜索方法就是强化学习中的DDPG。文章将要剪枝的网络建模成环境,网络的结构数据就是环境的状态,然后DDPG训练Agent与环境进行交互,根据网络的状态输出每一层的剪枝率。网络在