原文链接:https://www.ijcai.org/proceedings/2022/0667.pdf 发表:IJCAI 2022
code:无
编辑:牛涛
filter pruning这件事本身是一个从网络中寻找子网络的优化问题。但是由于filter数量太多了,这个优化问题很难解。之前用EA算法去求解的受限于复杂度,只能在给定剪枝标准下求解每层稀疏度,但是会带来性能下降。因此本文提出了一种缩小优化空间的方法,核心是利用了分而治之的思想,把对于网络的searching转化成每层独立去做搜索。之所以把整个网络拆分成每层独立剪枝吗,是基于每层会有提取到同样特征的filter,删除某个filter所带来的影响主要要看有没有其他可以替代他的(这理由...似乎有点牵强,可以看论文也许是我理解表述错误?)
本文的方法很直观,也没啥公式,用原文给的两个伪代码来展开。
算法1:关于整个剪枝算法

在T个iteration中:每次将网络分成每一层,并对每层独立利用算法2剪枝。将剪枝后的每层重新拼接成新的网络并finetune。将finetune后的新网络加入集合A,并取代这个iteration开始时要剪枝的网络。 执行下一个iteration。
接下来讲解算法2。算法2利用EA算法对每一层独立地进行剪枝。
首先需要说明的是,作者为了利用EA算法,把每层剪枝情况编码成了一个二进制向量,向量元素数量等于filter数量。数值为1表示保留该filter,为0表示剪掉。

在循环开始前,先初始化m个结构作为parent。初始化是从全1向量出发,在给定概率p1的情况下,对全1向量变异r次。(变异指的就是对每一个元素,依次以概率p1决定是否变为0,当变异到达r次就停止,没到就算没到).以这样的方式对全1向量变异m-1次,和全1向量一起共同作为大小为m的集合P。
在G个iteration中:从P中随机选择m个结构,并以概率p2和r为参数进行变异。 将这新得到的m个结构进行验证性能。(性能的验证方式是,由于我们独立的剪枝每层,那么我们只将未剪枝网络中对应的层以新的结构替换掉,其它层维持不变,并在一个随机抽样的数据集上验证精度。随机抽样一个小集合是为了提升验证的效率,文章是从训练集抽样的。这个验证过程其实就是测量这一层以某种方式剪枝后对于最终精度造成的影响)
将新的m个结构和P合并,并根据精度和FLOPs排序,保留top-k个作为新的P。进行下一个iteration。
当G个iteration执行完毕后,1)根据排序选择最优的解构 2)在排除全1(该层不剪枝)的情况下选最优的。以上两种策略本文都做了实验,第二种是为了加快剪枝流程。
用图的方式说明可以看下图:
