如何评价CVPR17中A Gift from Knowledge Distillation一文?

Junho Yim, Donggyu Joo, Ji-Hoon Bae, Junmo Kim, “A Gift from Knowledge Dist…
关注者
443
被浏览
20,478

3 个回答

扫了一眼,抛砖引玉。本人不做 CV,说得不对的地方还请指正。


大致历史是这样的:

1、Knowledge Distillation 先是 Hinton 搞出来的,大意是说:小模型在分类的时候,光用训练集里的 one-hot label 不好,因为这种标注把类别间的关系割裂开了。而如果让小模型跟着大模型输出的概率分布去学的话,就相当于给出了类别之间的相似性信息,提供了额外的监督信号,因此学起来更容易。比如说识别手写数字,同时标签为 3 的图片,可能有的比较像 8,有的比较像 2,one-hot labels 区分不出来这个信息,但是一个 well-trained 大模型可以给出。因此,修改一下损失函数,让小模型在拟合训练数据的 ground truth labels 的同时,也要拟合大模型输出的概率分布。这个方法叫做 KD Training (Knowledge Distillation Training)。

2、然后 Romero 又搞出了 FitNet,大意是说:直接让小模型在输出端模仿大模型,这个对于小模型来说太难了(模型越深越难训,最后一层的监督信号要传到前面去还是挺累的)。解决方案就是说,不如在中间加一些监督信号。于是训练的方法就是所谓的 hint training,把网络中间的输出也拿出来,让大模型和小模型中间层的输出也要尽量接近,让小模型去学习大模型做预测时的中间步骤。

实际做的时候是用两阶段法:先用 hint training 去 pretrain 小模型前半部分的参数,再用 KD Training 去训练全体参数。这感觉就好像是,我们的目的是让学生做高考题,那么就先把初中的题目给他教会了(先让小模型用前半个模型学会提取图像底层特征),然后再回到本来的目的、去学高考题(用 KD 调整小模型的全部参数)。

3、终于进入正题了。之前的文章都是把大模型的输出当成小模型要去拟合的目标,而这篇文章画风清奇地说,不用啊,我不拟合大模型的输出,而是去拟合大模型层与层之间的关系,这才是我要转移和蒸馏的知识!这个关系是用层与层之间的内积来定义的:假如说甲层有 M 个输出通道,乙层有 N 个输出通道,就构建一个 M*N 的矩阵来表示这两层间的关系,其中 (i, j) 元是甲层第 i 个通道 和 乙层第 j 个通道的内积(因此此方法需要甲乙两层 feature map 的形状相同)。

文中把这个矩阵叫 FSP (flow of solution procedure) 矩阵,其实这也是一种 Gram 矩阵,之前一篇很有名的文章 Neural Style 里也有成功的应用:用 Gram 矩阵来描述图像纹理,从而实现风格转换。

如果要打比方的话,我的感觉是这样的:如果做一道平面几何题,题目要证两线段相等,做法是先要做一条辅助线,再证三角形 X 和 Y 全等,最后证明原题结论。那么前面 Romero 的方法就是,中间每一步都盯着你做,你必须和我做的一样,我教你这道题的辅助线该怎么连,然后证哪两个三角形全等;而本文的方法是说,你要先学会『辅助线->三角形全等->线段相等』这种做题的套路,而不是去学一个具体的题目里辅助线到底怎么连,我把一般的解题方法教给你,具体每一题每一步到底怎么证你自己琢磨琢磨就会了。最后训练的时候同样也是用二阶段法:先根据大模型的 FSP 矩阵调整小模型参数,使得小模型层间关系也和大模型的层间关系类似;然后直接用原损失函数(如交叉熵)继续精调小模型参数。感觉这种学习方法比较高屋建瓴,用人类学知识的过程来比喻的话,就是先学抽象的道,培养对于问题的宏观认识,培养整体观念,了解这个问题分为需要几大块,各个块之间的关系是什么样的;然后再学具体的术,填充完善知识细节。

按照论文,写了一个Python layer,输入都正常,但是输出loss 只有10-4及以下,很纠结!

为什么?