参考《Learning Efficient Convolutional Networks through Network Slimming》进行模型剪枝探讨

最近工作需要对于原有模型进行优化加速,此前尝试使用MobileNet,但发现Pytorch对其优化不理想,分组卷积并没有真正有效地提高模型效率。又尝试使用Octave Convolution,作者提到Octave Conv模块可以将特征图分为低频和高频,分别存储信息和特征,认为可以对低频信息减半,最终达到加速卷积运算效果。
贡献:

  1. 将卷积特征图分成了两组,一组低频,一组高频,低频特征图的大小会减半,从而可以有效减少存储以及计算量,另外,由于特征图大小减小,卷积核大小不变,感受野就变大了,可以抓取更多的上下文信息;
  2. OctConv是一种即插即用的卷积块,可以直接替换传统的conv(也替换分组卷积以及深度可分离卷积等),减小内存和计算量;

当然,作者做了大量实验,使用OctConv可以得到更高性能,甚至可以媲美best Auto ML。Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution

总的来说,OctConv是占用内存小,速度快,性能高,即插即用的conv块。一通花里胡哨操作,但用于实际收效甚微,论文中直接采用avgpooling区分低频高频信息,这样区分太牵强。
—————————————————————————
在研究关于模型剪枝相关的问题,参考文章:Learning Efficient Convolutional Networks through Network Slimming。这篇论文指出CNN模型在部署过程中需要面对三个难点:

  1. 模型大小;
  2. 运行占用内存;
  3. 计算效率;

目前,在结构剪枝以及稀疏化这个方向一共有4个层级,包括weight、kernel、channel以及layer。其中weight层级具有最高的灵活性、泛化性能以及压缩比,但需要特定的软硬件加速器才可以实现快速推理。而layer层级则过于粗暴,只有在层数较深的模型中才会有很好的效果。而channel层级则间距泛化性能以及部署效率,它可以被应用到任何典型的网络结构。

该论文在每个通道引入缩放因子γ,认为γ的值可以代表对用的channel的重要程度,γ越小,则代表所对应的channel越不重要,可以对其进行裁剪。利用缩放因子γ,在训练过程中衡量channel的重要性,将不重要的channel进行裁剪,以达到压缩模型,提升模型效率的作用,如下图所示。
参考《Learning Efficient Convolutional Networks through Network Slimming》进行模型剪枝探讨_第1张图片

目标函数,第一项就是常规的预测损失,第二项是用来约束γ的超参,通常被设为1e-4或者1e-5,g(γ)采用l1范式,会将γ稀疏到0和1附近。
参考《Learning Efficient Convolutional Networks through Network Slimming》进行模型剪枝探讨_第2张图片
整体流程图如下所示,首先初始化网络,其次训练带有稀疏正则的channel,之后利用缩放因子进行剪枝,微调剪枝后的网络,循环进行,最终得到优化后的网络模型。
参考《Learning Efficient Convolutional Networks through Network Slimming》进行模型剪枝探讨_第3张图片
实测,基于这种模型剪枝的方式优化模型确实可以对最终的模型有一定的优化加速功能, 在不断训练的过程中BN层的γ被分化到0与1附近,最后通过删除在0附近的γ对应的channel,可以达到优化15%的效果。

你可能感兴趣的:(参考《Learning Efficient Convolutional Networks through Network Slimming》进行模型剪枝探讨)