原文链接:https://arxiv.org/pdf/2009.14410.pdf 发表:NIPS2020
code:https://github.com/fxmeng/Pruning-Filter-in-Filter
编辑:牛涛
如下图所示,在网络中残差块要比VGG这种plain structure效果好,但是作者还注意到了另一种结构,即卷积核的形状,右图表示了每一个stripe的范数大小,并不是所有stripe都equally contribute。
那么如何学习filter的shape呢?具体做法是对每个filter1加一个mask,如下图
这个mask是个可学习参数的矩阵,在训练网络时同步更新,利用下列损失函数
其中第二项为关于mask的正则化,目的是为了其更加稀疏。训练收敛后mask中小于一个给定阈值的会被置成零,对应的stripe也会被剪掉。由于剪枝后filter变得不规整了,因此在inference时要对其做下列处理
将filter与mask乘积后的矩阵按照非零stripe展开成1*1的filter,再挨个去和输入做卷积,同filter的特征图叠加成一个,即输出的一个通道。
问题:这样对每个filter都保留索引确实会更精细,但是在inference的阶段真的能加速吗?本身卷积核是并行处理的,你现在认为变成1*1,每个1*1卷积的位置还不一样,感觉会增加很多额外的开销。同时这种阈值稀疏化的方式能不能优化?
实验结果:
可视化出来shape的频率后,大部分filter是直接被删掉了,剩下的呈现出网络首尾不稀疏,中间保留比较少的趋势,类似于bottleneck。