什么是generator?
有一个从一个简单分布(这种分布的表达式我们可以写出来)这个网络以这个分布中采样得到的向量作为输入,输出另一个复杂的分布。能够做到这种事情的网络就是生成式网络。
为什么要是一个“分布”?
视频预测:
如果不是分布的话,可能在遇到某一情况下时,向左转和右转的情况同时存在资料库中,精灵就会分裂成两个。
如果我们在输入中加入一个分布中的采样,他的输出也就是有概率的一个分布。
当下最有名的生成器:generative adversarial network (GAN)
unconditional GAN:输入只有采样的分布,没有x
在GAN中,除了Generator还要训练一个Discriminator,它输入Gen生成的分布,给这个结果打分(输出一个标量)
要指出的是GAN的generator和discriminator都是自己设计的,可以是CNN也可以是transformer。
算法步骤:
GAN的理论介绍
pg是生成的分布,pdata是真实的分布,目标:Pg和Pdata越接近越好。
我们衡量两个分布之间的差别,用到Div函数,我们要做的就是找一组generator的参数,使得两个分布相近。
问题:实际操作中Div函数很难计算,因为实际上要知道pg和pdata的表达形式几乎是不可能的。但是GAN在训练的时候,只需要能够从两个分布中采样出数据来就可以计算散度。
计算散度依靠的是discriminator
我们要训练D,使得真实分布中采样的数据得分高,虚假数据得分低。在训练D使得其目标函数最大化的时候,红框框部分可以通过推导证明和JS divergence是有关的。
所以D的目标函数,就可以反映出两个分布的散度。
所以我们就用红框框的式子代替G的目标函数
通过改变D的目标函数,可以用不同的Divergence来度量两个分布的散度。
GAN的训练技巧
优化JS divergence的问题:
在大部分情况下,Pg和Pdata重叠的部分很少
问题:只要两个分布没有重叠,JS divergence算出来的值永远是log2
尝试用其他的度量分布之间差异的方法:Wasserstein distance。想象P分布是一个土堆、要将P移动到Q的平均距离就是Wasserstein distance
这就出现另一个问题,要将分布p转换为分布q的样子,是有多种方案的。算的时候,穷举所有的Wasserstein distance,取最小的一个作为结果。
如果能够算出W,可以从discriminator的目标函数中看出来损失是越来越小的,因为生成分布pg和目标分布pdata之间的距离可以量化地显示出来了。
计算Wasserstein distance的方法:这里的x是network的输入换成y更贴切,E代表期望
可以保持D符合1-Lispschitz的方法:
理论和实操上的一个差异:
虽然理论中要优化Discriminator,但是在实际中D每次只更新一次,然后就又轮到了G更新参数,D的下一次更新继承了上一次更新的参数。也就是说并不是像理论上的D的loss function收敛之后再更新G的参数。
即便如此GAN还是比较难train的、因为D和G的进步要依赖对方,只要其中一个不再进步了,另一个也会随之停滞下来了。
要调超参数使得D的loss下降,但是只能调一次,如果中间训练的时候有某一次loss没有下降,就很危险了。
更多的训练技巧:
其他generator:
GAN的评价
在早期,是直接用人看的。但是显然这样有问题。
针对特定的任务,存在一些评估方法。可以训练一个图片分类器,将生成的图片作为输入,查看分类情况。
gen可能会产生多张重复图片
评判生成图片的多样性:
多样性低:
多样性高:
多样性和quality的同时考虑:inception score
当生成某个特定种类的时候,多样性肯定是很低的,inception score不适用。
FID:在softmax之前,将向量拿出来,所有生成的图片产生的softmax之前的向量在高维中代表一系列的点,假设真实的图片和产生的图片分布都是高斯分布,计算这两个高斯分布的Frechet distance
还有一种情况,GAN可能只是背下来了图片资料,而且是不好去比对发现的。
Conditional generation
除了z作为输入之外,我们还想输入一个x作为控制输出结果的变量。比如text-to-image就是一个cgan问题
在设计D的时候,打分除了关心图片是否真实,还要判断图片和x是否匹配
除了用文字作为condition,还可以用图片作为condition。
出现模糊的情况是因为会有多种可能,用GAN之后可能会出现额外的东西,效果最好的是GAN+supervised