CVPR 2019 神经网络剪枝三篇笔记

最近看了三篇 CVPR 2019 的剪枝相关论文,记录一下各自的核心思路和实验结论,顺带附上今天自己实验的进展。

Variational Convolutional Neural Network Pruning

这篇文章的主要观点是:仅仅基于权重值来做剪枝判断是不稳定的,应该对这些值所反映的 channel saliency 估计一个概率分布,再根据分布来决定剪不剪。

具体做法是改写 BN 层,目的是让 gamma 较小时该层输出趋向于零。

然后将 gamma 作为 channel saliency 的代理指标,用变分推断来估计每个 gamma 的分布。得到各 gamma 的分布之后,设定一个基于均值与方差的阈值,把落在阈值以下的分布所对应的 channel 去掉。

实验在 VGG-16 / CIFAR 上进行,单看效果比较一般。作为参照,之前用 SNIP 做结构化剪枝,在压缩 50 倍(约 0.3M 参数)的情况下还能达到 93% 的精度,相比之下这篇文章的收益并不算突出。

Importance Estimation for Neural Network Pruning

这篇文章提出了一种新的重要性度量:移除某个 channel 所带来的 loss 变化量,也就是每个 filter 对最终 loss 的贡献。直接计算开销较大,作者用泰勒展开来近似,降低了计算成本。实验都是在 ResNet 上做的,输入是预训练好的网络,每次迭代剪掉的 channel 数量由人工设定。

文中比较有意思的一个地方:把 oracle 剪枝的结果作为上界,与自己提出的重要性度量之间计算差异性,最后表现出很高的相关性,间接验证了这种度量方式的合理性。另外文中提到了 sensitive analysis,细节还需要再回去看看。

从我自己的角度来想,如果把重要性度量换成求 BN 层上缩放系数(gamma)的梯度,理论上应该也能做,之后可以试试。

Cascaded Projection: End-to-End Network Compression and Acceleration

这篇的思路是将连续 layer 的输入与输出 low-rank 映射到统一的低维空间。在 ResNet + CIFAR 的对比实验上,精度优于 AMC。

当前实验进展(7.10)

今天尝试了基于 kernel 统计来估计 layer 间相对冗余度的方法,目前效果比较一般,不过方向还是可以做下去,需要再尝试一些别的算法。