DeiT 的两种蒸馏方式#

DeiT 出自 ViT 的同年论文: Training data-efficient image transformers & distillation through attention.
它并不是简单地套用标准蒸馏,而是针对 Transformer 的结构,设计了两种蒸馏策略:

1.1 硬蒸馏 Hard Distillation#

这种方式非常直接: 把 Teacher 的预测类别,当作额外的监督信号。
也就是说,Student 同时学习两个标签:数据的真实标签  和 Teacher 给出的预测标签 。
其损失函数可以写为:

要提前强调的是,这里的公式只是通用形式,实际上在 DeiT 中使用的不是同一个 ,下一部分就会展开。

回到这里,其实对比我们在上一篇展开的蒸馏过程,这种方法看起来有些没必要:

只是多加一个标签,预测正确没有更多信息,预测错误反而影响拟合,为什么要这么做?

要理解来说,其实还是和 Teacher 本身的蒸馏意义相关:而在于通过 Teacher 的预测结果,引导 Student 在优化过程中靠近一个“更合理的决策边界”,从而提升训练稳定性。

比如真实标签是“狼”,但 Teacher 预测结果是“狐狸”,这样就可以让模型在“语义接近类别”之间间接引导模型学习更合理的决策边界。

不过,对比现代的蒸馏方法,这种方法已经很少单独使用了,我们知道就好。

1.2 软蒸馏 Soft Distillation#

第二种方式就是我们前面介绍的标准蒸馏:让 Student 去拟合 Teacher 的概率分布。
其损失函数为:

显然,相比硬蒸馏,这种方式包含更多信息,在现代使用中也更主流。

不过,在 Transformer 之前,蒸馏技术就已经出现,如果只是在 ViT 中加入蒸馏技术,本质上只是 A+B 的工作罢了。
DeiT 的关键创新点在于:

把“蒸馏过程”也做成了 Transformer 结构的一部分。

我们下面来详细展开这部分逻辑:

2. DeiT 的核心改进#

2.1 输入处理#

DeiT 实现蒸馏逻辑的具体做法是:

在输入序列中,再额外引入一个 distillation token。

我们来理顺一遍,首先,是原始图像切分出的 patch token :

在此基础上,我们为了整合全局信息用于 CV 任务,又加入了 [CLS] token :

而现在,在 DeiT 的设计中,我们再加入一个 Distillation token,即蒸馏 token :

这个  就专门用于学习 Teacher 的信息。

2.2 传播逻辑#

知道又加了一个 distillation token 后,和 [CLS] token 一样的问题是:

我们如何实现 distillation token 专门学习 Teacher 信息的语义?

答案的关键词是:双输出结构。
我们从原本的 ViT 来展开改进过程:

image.png

更多推荐