文章链接:https://arxiv.org/abs/1912.08795
CVPR2020上做data-free蒸馏的。
什么是Data-free=》就是没有数据,只能自己生成数据
一提到生成数据,就想到GAN:
输入噪声,过GAN生成数据,数据过Teacher得到结果,求损失来训练GAN,使得GAN能生成和原数据集分布一致的数据,然后就可以去训student了。
什么样的loss能使得GAN生成和原数据集分布一致的数据呢?经过观察发现:
(图像先验)
1、生成图的方差小
2、生成图的L2范数小
因此把方差和2范数作为损失
不过这样生成的数据虽然可能复合原数据集的分布,但不一定好看
比如从噪声生成右图的样子
为了约束图像使其更好看,在这篇文章中作者加入了对特征的监督
作者认为图像的特征的均值、方差应和原数据集的均值、方差一致,因此用原数据集的均值、方差监督噪声输入特征的均值、方差
原数据集的均值、方差都在BN层里存着的
因此最终的损失为图像先验损失与特征的均值、方差损失:
图像生成任务到这里就可以基本完成了
但是上面的方法存在一个问题,就是依靠均值、方差还原出的数据可能只占原始数据集较为集中的一部分,
其他的数据怎么获得呢?=》使生成数据均匀地分布在超球面上
假设已经用之前生成的数据训好了一个Student网络:
把它fix起来,再同时过Student与Teacher网络,使得两条流的logits分布差异越大越好,用这个loss来优化输入Noise(或者是GAN),就能得到在之前的分布之外的数据
把新生成的数据加入之前生成的数据,就又能训Student;以此类推,不断迭代
最终生成的图像说实话还是不太好看
e是加了student和teacher的loss之后的
而且这样还原的是原数据集中的一部分图片,不能知道还原的是哪张图片,所以也没有gt。如果能知道图片输入得到的梯度就好了,那就是下一篇:
deep leakage from Gradients