背景引入
知识蒸馏最初的动机就是,想要将一个大模型“轻量化”,因为大模型无论是训练成本还是实际投入使用效率亦或是部署在移动端都十分不便。试想你手机里可怜的内存,每个月都会被QQ微信侵蚀一些,如果那些APP每个下载安装包都要4、5个G(游戏除外),想必手机用不了几个月就需要大清一次内存或者更换了(商家狂喜),而如果APP只有1、2G,你手机里就能多容纳3、4倍的软件。
那么为什么不直接使用轻量化的模型呢?
一般而言,轻量化的模型参数更少,其速率虽然提高,但是检测精度会大大降低,很可能不符合实际应用的标准。这就陷入了一个两难的问题,大模型小模型都部署不了。那么是否可以用大模型向小模型“传授”其强大的能力。对此,我们可以类比老师与学生,老师拥有大量知识,而学生只拥有很少量的知识,老师可以将其知识通过自己的提炼传授给学生,这样学生可以大大降低学习的成本。
类比于此,我们可以让大模型(教师模型)学习到的内容(知识)“传授”(蒸馏)给小模型(学生模型)。事实证明,这样能使小模型达到更好的效果。
前置知识
1、Softmax函数
softmax函数通常作为多分类以及归一化函数使用,其公式如下:
s o f t m a x ( x ) = e x i ∑ i = 1 e x i softmax(x)=\frac{e^{x_i}}{\sum_{i=1} e^{x_i}} softmax(x)=∑i=1exiexi
softmax函数有些重点的特点:
- 所有经过softmax输出数值总和为1且大于0,这满足一个概率分布。这点很好理解,因为分母是个求和,所有分式分子加起来就会得到分母
- 扩大化大小差距。这是由指数函数 e x e^x ex造成的,根据指数函数图像,自变量值 x x x越大,其因变量 y y y值增长的越快。可以看下面这个例子
x | 1 | 2 | 3 | 4 |
---|---|---|---|---|
softmax(x) | 0.032 | 0.087 | 0.237 | 0.644 |
这就进一步带来一个问题,是否可以通过一个方法,使数之间差距没有那么大呢?这里我们使用了一个超参数温度T,来控制差距,公式如下:
s o f t m a x ( x , T ) = e x i t ∑ i = 1 e x