原文链接:https://www.yuque.com/yahei/hey-yahei/knowledge_distillation
知识蒸馏(Knowledge Distillation, KD),按照字面意思,就是将某个经过训练网络的知识,蒸馏到另一个网络上去。换句话说,存在一个已经训练好的,具备知识的成熟教师网络(Teacher),用它来指导学生网络(Student)的学习过程。对学生网络而言则是一个模仿过程,模仿什么和如何模仿是知识蒸馏的两个核心问题。这个过程通常是通过复用教师网络权重,或者度量最终输出/隐含特征之间的差异作为辅助损失来实现的。
简单来说,知识蒸馏包含以下三个优势:
-
**加快训练
**直观上理解,教师网络把学习方法教给了学生,使得学生网络能更快地收敛;
-
**提高性能
**教师网络通常采用更加冗余复杂、表现更好的网络,因此可以指导学生网络得到一个恰当的输出分布或是隐含特征的分布。
直观上理解,教师网络把自己的经验作为先验知识传授给了学生,使得学生网络能够继承先辈经验,从而有更好的表现(比如选择题的“三短一长选最长”); -
**迁移学习
**对于相似任务,教师网络提取的特征(尤其是浅层特征)可能有很好的指导意义,用大数据集训练过的教师网络来指导学生网络在小数据集上训练是有很大帮助的。
直观上理解,就像是物理老师在教学生解数学题,尽管不是专门的数学老师,但由于物理中频繁使用到数学工具,因此经验丰富的物理老师依旧拥有较高的数学水平,可能就有资格教育学生解答数学问题。
知识蒸馏的初步思想最早于《Model compression (2006)》一文提出,直到《Do Deep Nets Really Need to be Deep? (NIPS2014)》才有比较成熟的知识蒸馏思路提出,次年Hinton大神终于在《Distilling the Knowledge in a Neural Network (2015)》给这类技术冠上了“知识蒸馏”这样一个名字并一直沿用至今。
早期知识蒸馏只是在模仿标签也即模型最终输出的一个分布,后来引入了隐含特征的模仿,如今两者通常是结合使用的。分类任务上标签容易模仿,但目标检测、语义分割等更高级的任务在模仿的时候就不得不多动点心思,目前通常是用教师网络来生成一些指导意义的“伪标签”,然后和真实标签分别与预测结果计算损失,然后加权求和作为总体损失来实现。作为模型压缩的一种形式,知识蒸馏也常常跟其他模型压缩手段如裁剪、量化进行“联动”,最简单的一种形式即是将压缩前、压缩后的网络分别视作教师网络、学生网络来开展恢复训练。
参考:
- 《A Survey of Model Compression and Acceleration for Deep Neural Networks (2017)》V. KNOWLEDGE DISTILLATION
- https://nervanasystems.github.io/distiller/knowledge_distillation.html
- https://github.com/dkozlov/awesome-knowledge-distillation
模仿标签
模仿标签可以分为两种,一种是学生纯粹的模仿老师,我称之为“单纯的模仿”;另一种是学生在模仿老师的同时,还在自己思考如何更好的解题,我称之为“有思考的模仿”。
用书法打个比方,前者就只是单纯的临摹,模仿名家的字体,后者则是在临摹的同时摸索出一套适合自己的书法,最终甚至自成一派。
单纯的模仿
《Do Deep Nets Really Need to be Deep? (NIPS2014)》设计了一种Mimic Learning(请记住mimic这个词,它一直被后续的知识蒸馏论文所沿用),它在不使用真实标签的情况下,用教师网络的最终输出来直接指导学生网络的学习。此时loss即为
l o s s = D i s t a n c e ( y T , y S ) loss = Distance(y_T, y_S) loss=Distance(yT,yS)
其中,
y T , y S y_T,y_S yT,yS分别是教师网络和学生网络的输出;
D i s t a n c e ( ⋅ ) Distance(\cdot) Distance(⋅)可以是任意的距离函数,比如L1、L2、KL等;
论文在实验中指出L2应该是最好的距离函数,从后续的论文中我们也可以看到,大多数情况下都默认地使用了L2这个距离函数进行度量。
这篇论文也通过实验证明了“浅网络的知识容量并不比深网络小”这样一个核心论点,作者训练了一个较深的网络作为教师网络,然后又设计了一个较浅但参数规模与教师网络相近的学生网络,用教师网络的输出作为训练用的标签指导学生网络训练(注意这里没有使用真实标签),训练出来的学生网络并不亚于教师网络的表现。
有思考的模仿
完全模仿教师网络的输出并不那么合理,Hinton大神在《Distilling the Knowledge in a Neural Network (2015)》中提出同时利用真实标签和教师网络输出的软标签进行训练的一种训练形式,并从此给这一类方法冠上了“知识蒸馏”的名字。这种方式简单有效,一直被广泛使用,常见的深度学习框架中的softmax函数也能看到相应的参数设置,因此使用起来非常方便。
具体来说,
L t o t a l = ( 1 − λ ) L h a r d + λ L s o f t = ( 1 − λ ) L c e ( y S , y G ) + λ L c e ( y S , y T ) = ( 1 − λ ) L c e ( s o f t m a x ( z S ) , y G ) + λ L c e ( s o f t m a x ( z S / T ) , s o f t m a x ( z T / T ) ) \begin{aligned} L_{total} &= (1-\lambda)L_{hard} &&+ \lambda L_{soft} \\ &= (1-\lambda)L_{ce}(y_S, y_G) &&+ \lambda L_{ce}(y_S, y_T) \\ &= (1-\lambda)L_{ce}(softmax(z_S), y_G) &&+ \lambda L_{ce}(softmax(z_S/T), softmax(z_T/T)) \end{aligned} Ltotal=(1−λ)Lhard=(1−λ)Lce(yS,yG)=(1−λ)Lce(softmax(zS),yG)+λLsoft+λLce(yS,yT)+