论文笔记:ThiNet——一种filter级的模型裁剪算法

论文地址:ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression
本文地址:http://blog.csdn.net/wspba/article/details/77427960

前言

近两年来,有关模型压缩的论文越来越多,人们不再一昧的只追求强大的性能,而是开始慢慢的将模型的大小、运算量以及效率考虑进来,人们做的越来越多的是,在性能可接受的范围内,模型越小越好。这也说明了一点,深度学习模型已经开始被广泛的运用在了平常的生活当中,可以理解为现在的手机和以前的大哥大之间的关系。今天分享的一篇文章是今年ICCV的一篇入选论文,是南京大学的作品:ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression,所提出的一种与以往方式不同的模型裁剪方案。

动机

Pruning Filters for Efficient ConvnetsAPoZ,这两篇文章可以作为之前公认效果很好的模型压缩的代表,他们分别从每一层的weight以及输出的feature map出发,通过评价weight或者feature map的重要性,将对应的filter给裁掉,来达到模型压缩的效果。
论文笔记:ThiNet——一种filter级的模型裁剪算法
可以这么说,这两种所代表的方法,都是根据这一层的weight或者feature map,来决定当层所需要被裁掉的参数,但是本文的作者认为,这两种方法,都没有考虑到由于这样的裁剪给下一层会带来什么样的影响,因此作者提出了一个这样的想法,如果能够利用第i+1层的输入的一个子集,就能够产生和原始输出近似的结果,那么我们就可以将剩下没有用到的输入给剔除掉,那么上一层对应的输出以及相应的filter也被提出,这样既可以兼顾到由于裁剪所带来的影响,也可以达到模型压缩的效果,见下图。
论文笔记:ThiNet——一种filter级的模型裁剪算法

方案

由于涉及到feature map,因此本文也是数据驱动的方法。在卷积层中,一个卷积操作可以看成以下方式:
论文笔记:ThiNet——一种filter级的模型裁剪算法其中论文笔记:ThiNet——一种filter级的模型裁剪算法 每一个input channel的卷积结果,而输出为这些结果在所有input channel的求和,如果我们能够找到一个input channel的子集论文笔记:ThiNet——一种filter级的模型裁剪算法,可以满足论文笔记:ThiNet——一种filter级的模型裁剪算法,也就是说,如果我只用原始输入的一部分就能够达到和原始输入一样的效果,那我也就没有要其他剩下输入的必要了。于是就变成了以下优化问题:
论文笔记:ThiNet——一种filter级的模型裁剪算法
为了方便求解,可以看成:
论文笔记:ThiNet——一种filter级的模型裁剪算法
其中T为S在C上的补集,也就是说这些输入在经过卷积之后的得到的输出最小。

关于实现,作者是通过一种greedy的方式,在输入通道中不断遍历得到的:
论文笔记:ThiNet——一种filter级的模型裁剪算法

在得到了裁剪目标之后,就可以将这些对应的filter给裁剪掉,因为是filter级别的,因此可以适用在各种计算平台上,实现起来也较简单。在裁剪完毕之后,作者还另外做了一步,减少重构误差:
论文笔记:ThiNet——一种filter级的模型裁剪算法
其中论文笔记:ThiNet——一种filter级的模型裁剪算法 为剩余输入所产生的卷积结果,在这里w可以看成在剩余通道上的一个权重,可以这么理解,剩余的输入可以看成一个具有很强表达能力的字典,而w就是这个字典用来表达原始输出的系数,这样就能用来进一步减少输出与原始输出之间的误差。

最后一步就是finetuning,作者提出,在每一步裁剪之后,仅通过一个较小的学习步长来略微提升模型性能,这样可以避免模型进入到局部最优中,而在最后一步裁剪之后,再通过一个较大的学习步长来恢复模型的性能。

实验结果

作者在ImageNet数据集上,使用VGG16和ResNet-50上得到的实验结果如下:
论文笔记:ThiNet——一种filter级的模型裁剪算法
论文笔记:ThiNet——一种filter级的模型裁剪算法
总的来说,这种压缩方法的性能还是不错的。

总结

虽然目前的深度神经网络都具有非常强大的性能,具有非常好的表达能力,但是它的参数一定是存在冗余的,如何能够找到一种好的评价手段,来找到模型中这些冗余的部分,并将它们剔除掉,也就是模型压缩所做的事情。