Global Sparse Momentum SGD for Pruning Very Deep Neural Networks
Introduction
这篇论文来自NIPS19,虽然做的是非结构化的剪枝,但是可以直接迁移到结构化剪枝上去做。这篇paper的方法我觉得是非常简单奏效的,作者提出了将网络中的权重动态地进行分类,在一个batch的训练中,用一阶泰勒展开来判断对一个权重进行剪枝会对最终的输出造成多少影响,对这个影响进行排序,然后将整个网络中的权重进行分类,对第一类,即造成影响较大的权重,采用常规的SGD更新,对第二类,只对其进行weight_decay,从而动态地对网络实现剪枝,而且不需要fine-tune。
Method
Momentum SGD
首先回顾一下Momentum SGD的更新规则:
其中L是目标函数,α是学习率,β是momentum,n是权重衰减参数。
Formulation
假设N是layer的数量,全局的压缩率可以被表示为:
这个θ=[Wi],剪枝的目的就是让网络达到这个压缩率,同时不提高LOSS=L(X,Y,θ) theta
Rethinking learning-based pruning
这一部分作者主要回顾了一下learning-based 剪枝方法的缺点,即平衡稀疏率和正确率:
这个问题显然是无法求导的,然后一般的优化函数都长这样:
这里的R就是正则项,为了让权重逐渐变小,作者指出这样做的缺点有两个:
- 常规的正则项L1/L2只能让权重减小到某个程度,但是不能让权重减小到0,这个可以理解为,当权重很大的时候,正则项对权重的衰减影响很大,但是当权重变小了之后,这个weight_decay就会和目标函数产生的梯度”相当“,这样就会让权重不能真下降到0
- 超参λ不能直接控制剪枝率,只能人工控制轮数或者用其他的trick来达到目标的剪枝率。
Global sparse gradient flow via momentum SGD
提出了将网络中的权重动态地进行分类,在一个batch的训练中,用一阶泰勒展开来判断对一个权重进行剪枝会对最终的输出造成多少影响,这个metric value被定义为:
这个具体的推导过程,就是用之前nvidia那篇剪枝论文来做的一阶泰勒展开近似来做的:
然后,重写SGD的更新规则:
这个B(k)是一个遮挡矩阵,被定义为:
这个B矩阵的脚标就是前面说道的matrix-kernel的维度。
GSM enables implicit reactivation and fast continuous reduction
这里作者指出,re-activation只会发生在小部分的权重上,大部分的权重会一直被passive update,所以我们必须知道经过多少个training iteration,参数会变得足够小以至于不会增加loss,作者这里很奇怪的直接给了个公式来预测这个轮数:
这是我觉得这篇文章最大的缺点了,这个东西是非常不可控的,是靠作者的实验来得出来的,非常不具有泛化性:
Experiment
MNIST
CIFAR-10
ImageNet
Conclusion
这篇论文主要是提出稀疏化的SGD更新方法,主要做法是将要更新的参数基于其对目标函数的值的影响大小分为两类,一类是activate upadate,用的就是常规的Momentum SGD更新方法,一类是passive update,只对参数进行weight decay来让这些参数趋近于0,