[论文解读] DSD -- Dense-Sparse-Dense Training for Neural Network

《DSD: Dense-Sparse-Dense Training for Neural Network》发表在ICLR17, 这是一篇关注于提升模型训练得到的准确率的文章,而不是一作传统的研究领域:模型压缩。


DSD是一种新的训练模型的方式,可以提高预训练模型的准确率。DSD和dropout不一样,虽然都是在训练过程中有prune(剪枝)操作,但是DSD是有一定依据来选择去掉哪些connection,而dropout是随机去掉。另外DSD也不是模型压缩算法,DSD算法训练模型目的是提高准确率,而不是模型压缩。


那么DSD的效果怎么样呢?On ImageNet, DSD improved the Top1 accuracy of GoogLeNet by 1.1%, VGG-16 by 4.3%, ResNet-18 by 1.2% and ResNet-50 by 1.1%, respectively.


DSD算法的训练过程主要分3步,大致过程可以看这段话:In the first D (Dense) step, we train a dense network to learn connection weights and importance. In the S (Sparse) step, we regularize the network by pruning the unimportant connections with small weights and retraining the network given the sparsity constraint. In the final D (re-Dense) step, we increase the model capacity by removing the sparsity constraint, re-initialize the pruned parameters from zero and retrain the whole dense network. 这基本概括了本文的方法,可以参看Figure1。


[论文解读] DSD -- Dense-Sparse-Dense Training for Neural Network


想要更详细地了解这三步是怎么做的,可以看下面的Algorithm1。第一步是Initial Dense Training,这一步和正常的网络训练一样,只不过多计算了哪些connection是更重要的连接,而计算的依据就是权重的绝对值(后面会介绍原因)。第二步是Sparse Training,先将前面一步计算得到的不重要的connection去掉,然后再训练这个sparse network。这一步只有一个参数:sparsity,表示要去掉多少比例的connection,根据这个sparsity以及总的connection数量可以计算出阈值|Wi|,这样就可以进行prune了,而且网络每一层的sparsity都是一样的。作者通过实验得出当sparsity在25%到50%范围内的效果比较好。第三步是Final Dense Training,先将第二步prune的connection重新连接并初始化为0,然后再继续训练整个网络得到最后的结果,这一步的学习率采用第二步的1/10。


[论文解读] DSD -- Dense-Sparse-Dense Training for Neural Network


接下来两个式子是用来解释为什么用权重的绝对值来衡量该connection该不该去掉,也就是prune的依据。式子1是模型的loss function,那么我们希望网络稀疏后损失的增加要尽可能小,就是式子2要尽可能小,因为式子2中的第一项约等于0,第二项的二次求导计算比较复杂,Wi又有个平方计算,因此采用|Wi|作为prune的依据。


[论文解读] DSD -- Dense-Sparse-Dense Training for Neural Network


Figure2是DSD算法训练模型时候权重值的分布变化情况。首先(a)是第一步训练完后的权重分布,可以看到大部分值等于0或接近0;在进行prune后的(b),等于0或接近0的那部分都去掉了,这是因为DSD采用的prune的依据是权重的绝对值小的connection需要去掉。(c)表示prune之后对sparsity网络进行训练,得到的权重分布比(b)要平滑。(d)表示进行第三步的Dense Training时先将之前prune的权重用0初始化。(e)表示最后一步Dense Training。


[论文解读] DSD -- Dense-Sparse-Dense Training for Neural Network


实验结果:
作者将DSD算法应用在CNN,RNN和LSTMs等类型的网络,数据集包括图像分类,speech recognition和caption generation等,发现效果都比原来的要好。

Table1是采用DSD算法在各个数据集上训练模型的Top-1 error对比。baseline就是原来模型的效果。


[论文解读] DSD -- Dense-Sparse-Dense Training for Neural Network


Table4是用DSD训练ResNet网络的结果。Sparse表示只进行DSD算法的前面两步,也就是最后得到的是个稀疏的模型(类似常见的模型压缩方法中的prune),sparse的效果也还不错。


[论文解读] DSD -- Dense-Sparse-Dense Training for Neural Network


另外discussion部分很有意思。
escape saddle point。作者认为DSD算法效果较好的一个可能原因是escape saddle point,也就是在训练过程中跳过了鞍点。如果你了解优化算法,应该知道在优化过程中鞍点和局部最优点是容易影响模型的表现,这些点的梯度接近于0,模型接近收敛。而通过在训练过程中的prune操作得到sparse network并继续训练,有可能跳过这样的点,从而再Dense Training的时候可以收敛到更好的结果。作者也提到这有点simulated annealing(模拟退火)的味道,也就是在优化过程中跳过了一些局部最优值。
robust re-initializaiton。确实现在网络初始化一般就做一次,而DSD却在训练网络的过程中初始化了两次,挺有新意的做法。


辩证性来看,这篇文章开放了源代码,同时相关工作也被ICLR认可,但是截止到今天论文引用数仅仅只有6次,因此关于其实际的可用性存疑,上述文章的总体思想可以在之后的研究实践中具体进行分析并进行效果验证。