深度学习模型压缩(MobileNet系列、蒸馏、量化)
模型要在边缘端计算,需要具有较小的内存、计算和带宽需求,一般通过设计轻量化的架构或者对模型进行蒸馏、剪枝和量化等来减少参数,获取高效的模型。
本文简要介绍轻量化架构(以 MobileNet V1 和 MobileNet V2 为例)、蒸馏和量化方法。
1.轻量架构(Light-weight architecture)
从卷积核、特殊层和网络结构等方面设计轻量网络
以MobileNet为例
- MobileNet V1[1]
- Depthwise Conv
- 图1. 深度可分离的滤波器:(a)中的标准卷积滤波器被两层所取代:(b)中的深度卷积和(c)中的点卷积。
- 普通卷积:
- 深度可分离卷积:
- Width Multipler:减少卷积核个数
- MobileNet V2[2]
- Inverted Residuals
- 图2. 残差块[8,30]和倒残差的区别。有对角线阴影的层不使用非线性激活函数。我们用每个块的厚度来表示它的相对通道数。注意经典的残差连接的是通道数量多的层,而倒残差则连接瓶颈层。
- Linear Bottleneck
- 作者通过实验发现ReLU激活函数对低维特征造成大量损失,由于倒残差结构是“两头细中间粗”的结构,所以输出的时候是一个低维的特征。为了避免信息的丢失我们就需要使用一个线性的激活函数替代ReLU激活函数。
- 左图:不同stride下的残差结构;右图:Bottleneck residual block ,其中,通道从 到 , stride为 , 扩张因子为
- architecture
类似的工作还有ShuffleNet V1, ShuffleNet V2, MobileNetV3以及GhostNet等
2. 蒸馏(Distillation)
知识蒸馏(Knowledge Distilling)是模型压缩的一种方法,是指利用已经训练的一个较复杂的Teacher模型,指导一个较轻量的Student模型训练,从而在减小模型大小和计算资源的同时,尽量保持原Teacher模型的准确率的方法。
这种方法受到大家的注意,主要是由于Hinton的论文Distilling the Knowledge in a Neural Network<[3]。其核心原理是利用训练好的大模型的分布而不仅仅利用one-hot编码的ground-truth来更好地指导小模型。
以对比表示蒸馏(Contrastive representation distillation,CRD)[4]为例
- CRD利用对比学习的思路最大化teacher和student之间的互信息下界。(logits之前、网络的倒数第二层)下界越高,互信息就越大,变量相关程度越高。
- CRD在训练中,将来自同一样本的教师模型和学生模型的特征表示尽可能拉近,而来自不同样本的特征尽可能地推远。它最小化了教师和学生网络的概率输出之间的KL散度。
CRD以及更多蒸馏方法可参考github仓库[5]和[7]
3. 量化(Quantization)
量化是指减少表示数字的位数的过程。在深度学习的背景下,迄今为止用于研究和部署的主要数字格式是 32 位浮点数(FP32)。然而,降低深度学习模型的带宽和计算要求的愿望推动了对使用低精度数字格式的研究。已经广泛证明,权重和激活可以使用 8 位整数(INT8)表示,而不会导致准确性的显着损失。使用更低的位宽是一个活跃的研究领域,目前也有巨大进步,例如 4/2/1 位。
- Motivation: Overall Efficiency
量化带来的更明显的好处是显着减少了带宽和存储空间。例如,与 FP32 相比,使用 INT8 进行权重和激活消耗的总带宽减少了 4 倍。
此外,整数计算比浮点计算更快。它的面积和能源效率也更高。 - “Conservative” Quantization: INT8
在许多情况下,采用 FP32 训练的模型可以将其直接量化为 INT8,而不进行任何重新训练,这可能会导致相对较低的精度损失(这可能会或可能不会被接受,具体取决于用例)。一些微调方法可以进一步提高准确性[7]。 - 一些成熟的量化库 [6] [8]