GAN为什么是“生成器+判别器”
GAN全称是生成式对抗网络。包含一个生成器和一个判别器。
下面我们以两个问题作为引导,分析生成器和判别器各自的优缺点,然后阐述将判别器和生成器结合在一起的好处,从而解释为什么GAN是“生成器+判别器”。
Question 1 :Can Generator learn by itself?
要训练Generator,我们可以采用有监督学习的方式,随机生成一些向量,并且为每个图片assign一个向量,之后便可以进行训练。
这样训练的效果是不好的,因为我们assign给每个图片的向量是随机的,这些向量其实本身并不能很好的表征图像。那么怎么使得向量可以表示图像的特征呢?这就可以用到Auto-Encoder。我们可以训练一个Auto-Encoder,然后把他的解码器部分拿出来,就是一个Generator。
但是这样仍然有一个问题,就是对于不是从Auto-Encoder学到的code,Generator生成的效果并不好。
解决这个问题,可以使用VAE(Variational Auto-Encoder),加噪声后进行训练。
这样训练出来的生成器已经很好了,但是我们又有了新的问题:
这样进行训练,机器会以有多少个pixel不同来计算loss,这和我们人的观点是不同的。如上图所示,对于图1和图2,只有一个pixel的不同,我们会认为这样的结果是不ok的,但机器会觉得ok,对于图3和图4,即时有6个pixel的不同,我们也觉得ok。
从上面的训练过程我们可以观察到生成器的优缺点:
优点:
- Easy to generate even with deep model。
缺点:
- Imitate the appearance
- Hard to learn the correlation between components
Question 2 :Can Discriminator generate?
首先我们给定positive examples(with labels)和negative examples(with labels),然后利用这些数据训练一个判别器,positive examples 就给他高分,negative examples就给他低分。这是很好训练的,就是训练一个做分类的神经网络。
之后,我们假设存在这样一个算法,他可以产生使得分类器产生分数最高得图像(比如说,穷举法,穷举所有得图像,丢到判别器中,如果产生得分数最高,就把图片选出来)。$ \widetilde{x}=arg maxD(x)$
然后,我们把这个算法得到得图片标记为negative,再次去训练判别器。
- 如此循环
可以看到判别器是可以做生成的,只是在training中要产生使得判别器分数最高的图像比较困难。
判别器还有一个性质:
因此我们可以总结判别器的优缺点
优点:
- considering the big picture
缺点:
- Generation is hard
Generator+ Discriminator
从上面的分析我们可以看出,判别器是可以做生成的,但是在training中要设计一个可以产生使得判别器分数最高的图像的算法。惊喜的是,Generator可以充当这个算法
Benefit of GAN
从判别器的角度来看,生成器充当了判别器做生成时的最难的算法部分。
从生成器的角度来看,判别器解决了生成器做生成时没有大局观的痛点。
Theory behind GAN
- 现在我们有一个假的分布和一个真的分布,我们的目标是最小化两个分布之间的差异。我们可以用KL散度来衡量二者之间的差异,或者其他的散度。
- 或者,我们可以用一个函数。理想中这个函数应该可以极大的区分样本之间的差异,才能被当作我们的衡量函数。判别器是这个函数的一部分,是一个需要训练的神经网络,只有判别器训练的足够好,使得这个函数足够好,才能更好的衡量这个差异。
在最原始的GAN中,这个函数是与JS散度相关的,后续还有其他的(如推土机距离)相关的判别器。
解释为何JS散度相关:
GAN的训练:
理论上,
实际上,我们无法得到$E{x~P{data}}$ 和$E_{x~P_G}$ ,我们采用如下的方式:
这样的话,就可以看作二分类器。
所以整个算法流程如下:
在训练判别器的时候,我们要repeat多次,使得整个判别器足够好。
而在训练生成器的时候,我们通常是训练一次就够了。
解释如下:
$V(G0,D_0^*)$ is the JS divergence between $P{data}(x)$ and $P_{G_0}(x)$
当我们训练一次生成器,就得到了$G_1$
此时,要衡量的应该是 $P{data}(x)$ 和 $P{G_1}(x)$之间的 JS divergence ,但此时使用的损失函数依然是$V(G_0,D_0^*)$ ,所以在$G_0$和$G_1$差别不大的情况下可以多训练几次,一般只训练一次。
补充知识: