原文链接:http://arxiv.org/pdf/2009.08169 发表:WACV2021
code:无
编辑:牛涛
文章在introduction部分描述了一堆剪枝方法,然后给出他们存在的几个问题,一个是重要性评判需要人为设定并且很直觉;另一个是layer-by-layer的迭代剪枝是不合理的,因为所有不同层的filter是联合贡献出结果的,独立的剪一层并不合理(个人认为有待商榷)。此外,迭代剪枝也可能剪掉下个iteration重要的filter(就是别用硬剪枝呗)
卷积操作定义如下:

BN层定义如下:

卷积层和BN层可以合并成如下:

咱也不知道这段是想说明啥,反正下一段作者就开始说bn层的系数逐渐趋于零可以用来减掉filter。
由于当bn层的lambda小于一定阈值时,直接将其置零将几乎不给网络带来损失,所以用下式的方式做了个截断

但是上式在几乎所有位置导数都是0,那你没法反向传播不完犊子吗,所以利用直通估计(STE)来做个修正,这个STE被广泛利用在参数量化里,比如二值网络。求导变成如下:

有了这个就可以利用SGD对网络稀疏训练了,还缺一个东西就是损失函数的设计。

其中第二项为

说白了,就是距离目标参数量P*和目标Flops M*的差距。
那么P~和M~咋计算呢?按常规想法肯定是用个什么工具测量,但那样不是数学公式的话就也没法作为反向传播的一部分更新网络了,所以下面这个我觉得才是本文精髓。

简要地说,上式就是每层参数乘以当前的剪枝率,只是剪枝率这东西是利用φ函数得出的,妙哇。M的话也同理。
文章伪代码如下:

实验结果:
有一个地方比较有意思

文章可视化了ResNet56的每层剪枝率,发现越往后剪枝率越高,同时每个stage是差不多的,这可能对以后设置剪枝率是一种指导。