这篇文章是对自己关于模型压缩进行学习的总结与归纳。在研究模型压缩这一块的内容这么长时间,发现自己不够深入,有些混乱,因此希望这篇文章可以让自己的思路更加清晰。
模型压缩的方法中,包括剪枝,量化,多值网络,模型蒸馏等。其中剪枝的方法,应用的更多,此篇文章主要就说剪枝。剪枝最初是在决策树学习算法中,用于对付“过拟合”的主要手段。因为在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,从而使模型过拟合。因此,可通过主动去除一些分支来降低过拟合的风险。
在模型压缩的过程中,也是借助于这样的思想。因为在大型模型中,总是不可避免的存在大量的权重冗余,这种冗余,有时甚至会导致模型的准确率降低。因此借助剪枝的方法压缩模型,在压缩率合适的情况下,会提高模型准确率同时减少模型大小。也有一些网络为了向移动终端部署,也会考虑损失一部分的准确率,来节省时间和空间。
由我查看论文来看,剪枝分为两种。第一种,基于幅值的剪枝;第二种,基于通道的剪枝。下面分析一下这两种剪枝方法:
一、基于幅值的剪枝
可参考论文: (1)Song Han 的文章 Deep Compression: Compressing Deep Neural Network with Pruning, Trained Quantization and Huffman Coding.
(2)Michael Zhu and Suyog Gupta的文章:To prune, or not to prune: exploring the efficacy of pruning for model compression
1、主要思想:将小于一定阈值的权重抛弃。该阈值可根据剪枝率确定。
2、方法:设置一个跟权重形状相同的mask(其值为二值张量,0或者1),用来与权重相乘,从而决定哪些权重要被剪掉(剪枝掉的权重不会再接收梯度,不可逆)。而mask中值的设置,可将权重排序,将低于阈值的权重对应的掩码设置为0.
3、实现:tensorflow库中有对文章(2)的实现,经过实验该方法还是挺有效果的。
实验过程包括三步:第一,训练原始模型;第二,对训练得到的模型,进行剪枝;第三,删除训练图中的剪枝结点(这一步必须要做,否则的话会导致模型变大)
二、基于通道的剪枝
参考论文:(1)Channel Pruning for Accelerating Very Deep Neural Networks;
(2)Zhuang Liu等人的文章:Learning Efficient Convolutional Networks through Network Slimming
(3)Hao Li等人的文章:Pruning filters for efficient convnets
1、主要思想:该方法是将不重要的整个权重通道剪掉,从而将模型变小
2、方法:对已经训练好的模型,选择要剪枝的不重要(或不太重要)的通道,删除这些通道,构造新的模型图;重新训练,恢复准确率
3、实现:复现过第三篇文章,效果还不错;
最近腾讯新出的PocketFlow框架,有些参考第二篇文章,又加入了新的内容。在尝试利用其给出的example,进行训练,结果还可以;