via:《Pruning Convolutional Neural Networks for Resource Efficient Inference》-https://arxiv.org/abs/1611.06440
剪枝的方法是不是听起来很棒?那为什么这种方法似乎并不那么为人所知呢?
实际上,目前已经有大量论文在研究神经网络模型的剪枝方法,然而在工业界我们至今没有听说有实际项目采用了这些剪枝方法,这或许会让人感到惊讶。我猜测主要的原因可能有以下几点:
因此,我决定自己来实现神经网络的剪枝技术,并实验一下结果如何。
本篇博文将首先回顾一下之前的几种剪枝技术,然后对近期提出的一种方法的实现细节做深入的解析。这之后我们将对一个VGG模型进行调优 (fine tune),以用于猫狗图片分类(数据集为Kaggle Dogs vs Cats dataset-https://www.kaggle.com/c/dogs-vs-cats),这是迁移学习的一种,在实际应用中也十分常见。
接下来我们将对模型进行剪枝,这将使其运行速度提升至原来的3倍,模型大小却只有原来的1/4左右。
剪枝的目的:提升运行速度 vs 减小模型文件大小
在VGG16模型中,90%的权重参数都在全连接层中,但这些权重参数对模型的最终结果的提升仅为1%。
直到最近为止,大多数的工作都在研究如何对全连接层进行剪枝。对全连接层进行剪枝,这对于减小模型文件的大小非常有效。
接下来我们将重点研究在卷积神经网络中如何对卷积窗口进行剪枝。
剪枝其实还有个好处就是能够减小内存开销。
同时,《Pruning Convolutional Neural Networks for Resource Efficient Inference》(https://arxiv.org/abs/1611.06440)这篇论文指出,随着网络层越深,其剪枝的程度越高。这意味着最后的卷积层被剪枝得最多,导致后面的全连接层的神经元数量大大减少。
对卷积窗口进行剪枝的方式,也可以是减小卷积窗口中的权重参数,或是舍弃卷积窗口的某一维。你也可以丢弃那些稀疏的卷积窗口,但这并不会使模型运行速度有数量级的提升。近期的研究工作提出了对稀疏的卷积窗口“结构化”处理,而不是单纯地完全丢弃。
许多研究工作共同表明了一个重要的结论:尤其在迁移学习领域,通过训练一个更大的神经网络模型,再逐步剪枝得到的小模型取得的结果要比直接训练这样一个小模型的结果好得多。
下面让我们简单了解一下几种剪枝技术。
几种剪枝技术
论文1:《Pruning filters for efficient convnets》
https://arxiv.org/abs/1608.08710
这篇论文中,作者提出对卷积层进行完全的剪枝。对第k个卷积输出层进行剪枝,不仅影响当前的卷积层输出,也会影响接下来的网络层,也就是对于之后的网络层没有了原始输入中的第k个。