最近在做知识蒸馏的时候了解到了一些无数据蒸馏算法,在无法获取到原始训练数据(机密数据、隐私数据、数据集太大或者是没有百度云会员下不动数据)的情况下,可以尝试一下这种类型的蒸馏算法,也许有奇效呢。
这里介绍其中两篇论文,分别是Data-Free Learning of Student Networks arXiv:1904.01186v4和Data-Free Adversarial Distillation arXiv:1912.11006v3. 两篇论文都是以GAN为基础结构的知识蒸馏算法。
模型结构中包含了三个模型,一个生成器、一个Teacher模型和一个Student模型。在训练过程中,Teacher模型相当于一个固定参数的判别器,我们需要训练的是生成器和Student模型。
训练GAN的过程用到了三个loss函数,分别是:
作者认为如果生成器生成的样本非常接近于真实样本,那么输入到Teacher模型之后,得到的输出概率应该会呈现出很好的分类结果,即某个类别的概率会非常高。
作者认为真实图片的输出特征图通常不会是一些随机的向量,而应该有比较高的激活值
类别分布越平均,信息熵越大,所以这个loss用于控制样本类别数量的平衡。
注意这个因为这个信息熵的设计,训练这个模型的时候,batchsize不能太小,具体数值可以参考作者的github仓库()中的建议。
有了这三个loss函数、再加上Teacher和Student之间的交叉熵,就可以在无任何真实数据的情况下对模型进行知识蒸馏了。
这篇文章中的算法更接近传统的GAN,并且声称在图像分割任务中也得到了与data-driven方法接近的效果。
训练过程也基本与传统的GAN一致,因为这个模型中的判别器由Teacher和Student共同组成,即判别器的参数不是固定的,下面简述一下训练过程:
固定Generator, 只更新Discriminator(其实只是更新Student部分)
使用Teacher和Student之间的MAE误差作为损失函数。
这一阶段与常规的知识蒸馏方法类似,作者认为这一步的意义除了向Teacher学习之外,还有一个意义就是构建更好的搜索空间,迫使生成器去寻找新的困难样本。
固定Discriminator, 只更新Generator
这一步需要让Generator去学习如何生成更难分辨的样本,也就是需要提高Teacher和Student的输出结果的差异性,损失函数仍然选择了两个模型之间的MAE,只是加了个负号。
后来作者发现使用这个loss函数训练得到的生成样本都很奇怪,对这个MAE损失做了负对数处理,得到了比较好的效果。
除了利用GAN做无数据蒸馏的方法外,还有一些利用反向传播更新输入数据的方式来获取与训练数据相似的样本的算法(方法类似于图片风格化算法),这方面的算法也有两篇比较典型的论文,分别是利用训练数据产生的激活值以及Batchnorm参数来进行反向传播更新输入噪声:
Data-Free knowledge distillation for Deep Neural Networks
Dreaming to Distill: Data-free Knowledge Transfer via DeepInversion