1.原理介绍
Hinton的文章《Distilling the Knowledge in a Neural Network》首次提出了知识蒸馏的概念,通过引入教师网络用以诱导学生网络的训练,实现知识迁移。所以其本质上和迁移学习有点像,但实现方式是不一样的。用“蒸馏”这个词来形容这个过程是相当形象的。用下图来解释这个过程。
教师网络:大规模,参数量大的复杂网络模型。难以应用到设备端的模型。
学生网络:小规模,参数量小的精简网络模型。可应用到设备端的模型,俗称可落地模型。
我们可以认为教师网络是一个混合物,网络复杂的结构就是杂质,是我们不需要用到的东西,而网络学到的概率分布就是精华,是我们需要的。如上图所示,对于教师网络的蒸馏过程,我们可以形象的认为是通过温度系数T,将复杂网络结构中的概率分布蒸馏出来,并用该概率分布来指导精简网络进行训练。整个通过温度系数T的蒸馏过程由如下公式实现:
从上述公式中可以看出,T值越大,概率分布越软(很多网上的博客都这么说)。
其实我个人认为这就是在迁移学习的过程中添加了扰动,从而使得精简网络在借鉴学习的时候更有效,泛化能力更强,这其实就是一种抑制过拟合的策略,和其他抑制过拟合策略在原理上是一致的。
2.蒸馏后学习策略
在第一部分中我们介绍了蒸馏的整个过程,那么在蒸馏结束后,精简网络就要开始跟着负责网络的概率分布进行学习了,在这个过程中是使用KL散度来监督这个学习过程的。接下来简单介绍下KL散度的原理。
上述公式为KL散度的定义式,我们最终的学习目标是学生网络能够学习到教师网络的概率分布,也就是两者的概率分布能够尽可能的相同。而根据KL散度的原理为T_Prob和S_Prob越接近,KL散度值越小。基于KL散度的这个原理,我们才可以利用这个指标来作为损失函数的计算策略。
问题引入:虽然是同一个个体,但是在面对不同环境以及不同任务时,个体的形态却是非常不同。不同的形态是为了完成特异性的任务而产生的变化,从而使个体能够更好的适应新的环境。
比如毛毛虫的形态是为了更方便的吃树叶,积攒能量,但是为了增大活动范围提高繁殖几率,毛毛虫要变成蝴蝶来完成这样的繁殖任务。
蒸馏神经网络,其本质上就是要完成一个从毛毛虫到蝴蝶的转变。
问题发现:在使用神经网络时,训练时候的模型和实际应用的模型往往是相同的,就好像一直是一个毛毛虫,既做了吃树叶积累能量的事情,又去做繁殖这项任务,既臃肿又效率低下。
类似地,大规模机器学习应用可以分为训练阶段和部署阶段,训练阶段不要求实时操作,允许训练一个复杂缓慢的模型,这个模型可以是分别训练多个模型的集成,也可以是单独的一个很大的带有强正则比如dropout的模型。