浅读知识蒸馏 p1 自用笔记
学习两篇知识蒸馏有关文章,作涉猎。
借用博文底下一位答者的回复,很不错:

迁移学习与知识蒸馏的差异:

迁移学习与知识蒸馏的差
Distilling the Knowledge in a Neural Network
原文:1503.02531.pdf (arxiv.org)
知识蒸馏开山作,压缩网络模型,做迁移学习。
主要工作:
我们对于特别的问题,应该愿意训练非常大而准确的模型。而这样的模型可以是单独训练的很多模型的集合,也可以是用非常强的正则化子(如dropout)训练的单个非常大的模型。一旦对繁琐的模型进行了训练,我们就可以使用另一种训练,我们称之为“蒸馏”,将知识从繁琐的模型(teacher模型)转移到更适合部署的小模型(student模型)。
知识的一个更抽象的观点是,它是从输入向量到输出向量的学习映射,这将它从任何特定的实例化中解放出来。 —— A more abstract view of the knowledge, that frees it from any particular instantiation, is that it is a learned mapping from input vectors to output vectors.
因为这样的观念,作者摈弃了研究与探究大型网络内部参数的意义的研究思路,直接将teacher模型视作黑盒,只取其输出结果,作为student模型的学习目标。这里出现了一个问题,那就是教师模型往往都是训练的非常好的,他对于能够正确预测的结果有一个非常高的置信度,常常能达到99%,而其实教师网络是在学习到了对应表征后才做的判断,如原文 —— An image of a BMW, for example, may only have a very small chance of being mistaken for a garbage truck, but that mistake is still many times more probable than mistaking it for a carrot. 可以看到正确分类为宝马车的概率如果是99%,那该网络将其分类成垃圾车的概率也一定比把车分类为胡萝卜的概率要高得多(虽然都很小,但也一定不是一个数量级的)。这就导致若我们直接用极高置信度的输出结果作为student网络的对应的学习目标,将使得小网络难以学到大模型所学到的表征信息。
那怎么去改善上述的高置信度的情况呢,这里在softmax的输出上使用温度系数去调整分布的平滑度,这里在原文中被解释为 —— 软化(和标签平滑的感觉有一点点像)。这里当T越大,则会将输出的分布图像拉的越“平”,当T趋于无穷大时,分布为均匀分布。

借用 知乎用户-清川《深度学习高温蒸馏:Softmax With Temperature》的里的一张可视化图来理解:

个人理解:一种解读方式就是,student模型一般不会训练的很好,他可能学不到垃圾场和宝马车“很像”这个概念,但是教师模型直接告诉了你这个事情,让student对着这个思路去“改善”你的参数。而为了充分利用教师模型负类的信息,就可以选用一个较高的温度系数,让负样本带来的信息被放大,表现出来的就是小模型更“关注”(W中对应的权值改变)与正确类更近似的类别了,来使得小的student模型能具备更好的泛化能力。
训练方法比较简单:

首先是单独训练繁杂Teacher网络,然后冻住Teacher网络的参数,只做forward推理,使用下图的损失函数对student网络进行训练:

再简单点就是:

注意:学生网络训练完毕后,做推理使用时其softmax的温度系数T要恢复到1。
参考链接:
1503.02531.pdf (arxiv.org)
[论文阅读]知识蒸馏(Distilling the Knowledge in a Neural Network)_XMU_MIAO的博客-CSDN博客
《Distilling the Knowledge in a Neural Network》阅读笔记 - 知乎 (zhihu.com)
知识蒸馏(Knowledge Distillation)简述(一) - 知乎 (zhihu.com)
深度学习高温蒸馏:Softmax With Temperature - 知乎 (zhihu.com)
【经典简读】知识蒸馏(Knowledge Distillation) 经典之作 - 知乎 (zhihu.com)
Knowledge Distillation - Neural Network Distiller (intellabs.github.io)