深度神经网络一般有较多的参数冗余,目前有几种主要的方法对模型进行压缩,减小其参数量。如裁剪、量化、知识蒸馏等,其中知识蒸馏是指使用教师模型(teacher model)去指导学生模型(student model)学习特定任务,保证小模型在参数量不变的情况下,得到比较大的性能提升。

知识蒸馏的方法在部署中非常常用,通过使用大模型指导小模型学习的方式,在通常情况下可以使得小模型在预测耗时不变的情况下,精度得到进一步的提升,从而进一步提升实际部署的体验。

无论是大模型蒸馏小模型,还是小模型之间互相学习,更新参数,他们本质上是都是不同模型之间输出或者特征图(feature map)之间的相互监督,区别仅在于:

(1) 模型是否需要固定参数。

(2) 模型是否需要加载预训练模型。

对于大模型蒸馏小模型的情况,大模型一般需要加载预训练模型并固定参数;对于小模型之间互相蒸馏的情况,小模型一般都不加载预训练模型,参数也都是可学习的状态。在知识蒸馏任务中,不只有2个模型之间进行蒸馏的情况,多个模型之间互相学习的情况也非常普遍

参考文档:

现有的知识蒸馏方法主要有以下4种,

  • 标准蒸馏
  • DML蒸馏(互学习蒸馏)
  • CML蒸馏(协同互学习蒸馏)
  • U-DML蒸馏(统一互学习蒸馏)

1、标准蒸馏

标准的蒸馏方法是通过一个大模型作为 Teacher 模型来指导 Student 模型提升效果,

知识蒸馏方法汇总-LMLPHP

 知识蒸馏方法汇总-LMLPHP

大模型在训练过程中权重不更新。

2、DML蒸馏

而后来又发展出 DML 互学习蒸馏方法,即通过两个结构相同的模型互相学习,相比于前者,DML 脱离了对大的 Teacher 模型的依赖,蒸馏训练的流程更加简单,模型产出效率也要更高一些。

  • 支持任意网络的互相学习,不要求子网络结构完全一致或者具有预训练模型;同时子网络数量也没有任何限制,只需要在配置文件中添加即可。(下图中为完全相同的两个模型互相学习)

知识蒸馏方法汇总-LMLPHP

3、U-DML蒸馏

对于标准的 DML 策略,蒸馏的损失函数仅包括最后输出层监督,然而对于 2 个结构完全相同的模型来说,对于完全相同的输入,它们的中间特征输出期望也完全相同,

因此在最后输出层监督的监督上,可以进一步添加中间输出的特征图的监督信号,作为损失函数,即 PP-OCRv2 中的 U-DML (Unified-Deep Mutual Learning) 知识蒸馏方法。

知识蒸馏方法汇总-LMLPHP

4、CML蒸馏

PP-OCRv2 文字检测模型中使用的是三个模型之间的 CML (Collaborative Mutual Learning) 协同互蒸馏方法,既包含两个相同结构的 Student 模型之间互学习,同时还引入了较大模型结构的 Teacher 模型。CML与其他蒸馏算法的对比如下所示。

知识蒸馏方法汇总-LMLPHP

知识蒸馏方法汇总-LMLPHP

 这里Teacher模型是大模型,加载预训练权重,且固定参数不学习,两个student为结构完全相同的小模型,不需要加载预训练权重,参数需要学习。

11-11 10:18