本教程介绍了模型压缩的三大方法:剪枝、蒸馏、量化,最终在pc端完成部署。这些方法均采用各领域的经典思路来实现,剪枝部分(BN剪枝、直接减通道)、蒸馏部分(参考Hinton论文)、量化(MNN离线量化)。教程的目的是帮助自己快速在模型压缩领域入门,通过实验体会剪枝、蒸馏、量化的效果,并在模型调试方面积累经验。
模型压缩核心:先缩小模型尺寸,再补偿下降的精度
实验模型:VGG16,ResNet34
数据集:CIFAR10
剪枝
1. 直接减通道数
以VGG16为例,直接减通道的剪枝策略直接在每一层上将其通道数减半或减1/4,相当于按照VGG16的结构重新搭建了一个通道数更少的模型,这类模型直接初始化训练即可。该方案严格上应该不属于剪枝的范畴,只是仿照一个较好的模型结构,去减少通道数。一般来说适用于模型较大,任务相对比较简单的场景中,大模型应用在较简单的场景中往往有较多的参数冗余,因此直接采用减通道的方法保留模型结构,快速缩小模型次尺寸。
2. BN剪枝
通常来说,模型会采用Conv+BN的组合,此时BN层的权重可以看作是筛选卷积层通道的重要因子。BN层中某一通道的权重越小,相当于卷积层对应通道的作用越小(卷积层某一通道乘以BN层对应通道的小权重,其输出接近于0,相当于该通道对应的输出为0,因此可以把这些通道视为不重要的通道,通过剪枝剪掉)
核心:在BN层中找到权重较小的通道,对应的在卷积层中把这些通道剪掉,达到保留模型结构,缩小模型尺寸的目的。
问题:常规训练的模型其BN的权重往往不会太接近于0,或者说都比较大,这种情况下,直接通过把权重相对较小的通道剪掉对模型效果的影响会比较大
解决方法:稀疏化训练,在模型的常规损失函数上加上BN参数的正则化损失,强迫BN参数在训练过程中向0靠拢,训练完成后,把最接近于0的这部分BN参数对应的通道剪掉,即等价于把最不重要的通道剪掉。
1. VGG实验直接减通道
注:VGG16是原始结构,VGG16-HALF把所有的通道数减半,VGG16-QUARTER把所有的通道数减为1/4
通道数减为1/2的情况下,参数量降低了4倍,速递提升了2倍左右,精度掉了2%
通道数减为1/4的情况下,参数量降低了16倍,推理速度提升了4倍左右,精度掉了5%
对于上述两种直接减通道的方案,在模型参数量和推理速度的收益还是很明显的,对于丢掉的精度,下面会通过模型