知识蒸馏是什么?一份入门随笔__摘要

目录

一、模型压缩背景

二、 为什么叫蒸馏?

三、与直接优化logits相比

四、实验与结论


一、模型压缩背景

在实际应用中一般希望部署到应用中的模型使用较少的计算资源(存储空间,计算单元),产生较低的时延。然而深度学习的背景下,效果极好的方法一般会有两种方案:1. 使用过参数化的深度神经网络,再加一定正则化策略(dropout) 2. 集成模型(ensemble)将许多弱的模型集成起来;    然而部署时 我们希望的小模型,能达到和大模型一样或相当的结果; 

* 下文统一将要训练的小模型称为新模型,将已经训练的大模型称为原模型。

在机器学习中,假定输入和输出是有一个潜在的函数关系,这个函数是未知的; 从头学习新模型是从有限的数据中近似一个未知的函数。 当让新模型近似原模型时,因为新模型是已知的,我们可以使用很多非数据集内的伪数据来训练新模型;

 

训练原模型时是让softmax分布与真实标签匹配,现在只需要让新模型与原模型在给定输入的softmax分布匹配。

直观来看,后者比前者具有这样一个优势:经过训练后的原模型,其softmax分布包含有一定的知识——真实标签只能告诉我们,某个图像样本是一辆宝马,不是一辆垃圾车,也不是一颗萝卜;而经过训练的softmax可能会告诉我们,它最可能是一辆宝马,不大可能是一辆垃圾车,但绝不可能是一颗萝卜。

 

二、 为什么叫蒸馏?

如前面所说目标是给定同样的输入后,让新模型与原模型的softmax输出的分布充分接近。  但是一般的softmax 自然指数e拉大了logits之间的差距,然后再做归一化最终得到一个arg max的近似,输出是一个接近one-hot的向量,其中一个值很大其他很小;  相较于onehot这样硬性的输出,更希望输出更软一点:

方法1. 有直接比较logits;具体的对于每一条数据,记原模型产生的某个logits是 v,新模型产生的logits是 z ,我们需要最小化1/2(z-v)^2

方法2. 考虑一个广义的softmax函数是一种更通用的做法

T是温度,T趋近于0则softmax收敛成一个one-hot向量,T趋于无穷时,softmax输出更软一点。 

因此在训练新模型时,可以使用较高的T使得softmax产生的分布足够软,让新模型softmax接近原始模型,在测试时使用正常的问题T=1 具体的在训练需要最小化两个分布的交叉熵,原模型产生的分布是P,新模型产生分布是q,

 

如果转移时使用的是有标签的数据,那么可以将标签与新模型的softmax分布发交叉熵加入到损失函数中去,需要将式 (3)乘上一个 T平方

 ,这是为了让损失函数的两项的梯度大致在一个数量级上(参考公式 9 ),实验表明这将大大改善新模型的表现(考虑到加入了更多的监督信号)。

 

三、与直接优化logits相比

所以,如果:1. T非常大,2. logits对所有样本都是零均值化的,则知识蒸馏和最小化logits的平方差是等价的(因为梯度大致是同一个形式)。实验表明,温度不能取太大,而应该使用某个适中的值,这表明忽略极负的logits对新模型的表现很有帮助(较低的温度产生的分布比较「硬」,倾向于忽略logits中极小的负值)

 

四、实验与结论

Hinton做了三组实验,在图像和语音任务上,新模型表现的都很不错;

在语音任务的实验也表明,蒸馏得到的模型比从头训练的模型捕捉了更多数据集中的有效信息,表现仅比集成模型低了0.3个百分点。

总体来说知识蒸馏是一个简单而有效的模型压缩/训练方法。这大体上是因为原模型的softmax提供了比one-hot标签更多的监督信号。

 

 

原文链接: https://mp.weixin.qq.com/s/CKTxhrWf_WsGJk5cnVfhL

猜你喜欢

转载自blog.csdn.net/qq_36533552/article/details/116382632