我们把Network当作Generator使用时,会在Network的输入中加上一个z(从某一个Distribution Simple出来的),这个z是不固定的,因为每一次使用这个Network是随机生成z的。这里的Distribution存在一个限制,限制是它足够简单,能够让我们知道它的式子是什么样子。因此,随着Sample出来的Z不同,得到的输出也就会不同,现在的输出不在单一,而变成一个Complex Distribution。
1. 举例说明为什么需要输出是一个Distribution?如下图所示,一个Video Prediction的例子,它要做的是预测小精灵游戏下一步的游戏画面。Network的输入是之前的游戏画面,我们希望输出与下一步的游戏画面越接近越好(我们把游戏画面用一个很长的向量表示)。现在遇到一个问题是小精灵在某一时刻会向左右两端分裂,因此我们希望输出与向左转接近的同时也与向右转接近,解决这个问题就需要Network的输出是有机率的,是一个Distribution。
2. 什么时候我们需要处理上述问题呢?当我们的任务需要创造力时,具体来说就是给一个Function,同样的输入会得到不同的输出。如下图所示,举例说明为什么需要创造力。
Unconditional generation就是输入中不添加x,所以Generator的输入是z(从Normal Distribution Sample出来的Low-dim vector,它的维度由自己决定),输出是y(Complex Distribution,输出是high-dim vector,然后把它整理成一张二次元人脸)。
Discriminator的输入是一张图片,输出是一个数值,数值越大代表输入的图片越真,反之,数值越小代表输入的图片越假(在Discriminator里面可能会有大量CNN的架构)。
如下图所示,说明了Generator与Discriminator彼此之间互动,对抗中发展的过程。
1. Generator与Discriminator的运作过程:首先要初始化Generator与Discriminator的参数,固定Generator并训练Discriminator,我们用真正的二次元头像与Generator生成的头像训练Discriminator,训练的目标是分辨真正的二次元头像与Generator生成头像的差异。
2. 固定Discriminator并训练Generator,也就是让Generator欺骗Discriminator成功,让输出的分数越来越大。
3. 现在就要反复地训练Generator与Discriminator,期待Generator与Discriminator的结果越来越好。
Progressive GAN可以产生非常高清的人脸。举例说明,GAN的输入是一个向量,输出是一张图片。现在可以把输入的向量做内差,我们可以看到两张图片之间连续地变化。
1. 我们有一个Generator,输入是从Normal Distribution中sample出来的vector,输出是P(G)(一个复杂的Distribution),现在有一堆data形成的P(data)(Distribution),希望P(G)与P(data)越接近越好。
2. 如下图所示,用一维向量和式子来说明上面的情况。图中的Divergence代表了P(G)与P(data)的差异度,Divergence越大代表P(G)与P(data)差距大,反之,Divergence越小代表P(G)与P(data)差距小。
现在有一个问题是不知道如何计算Divergence,解决这个问题的方法是我们要sample出P(G)与P(data)。
1. 现在我们要把从P(G)与P(data)中sample出来的data拿去训练一个Discriminator,训练的目标是给从P(data) 中sample出来的data较高的分数,给从P(G)中sample出来的data较低的分数。
2. 如下图所示,用式子来说明上面的情况。现在我们希望图中的Dy(从P(data) 中sample出来的y)分数越高越好,Dy(从P(G)中sample出来的y)分数越低越好,也就是对V(D,G)取最大值。因此,max V(D,G)可以看作带上负号的cross entropy,相当于minimize cross entropy。
3. 为什么max V(D,G)与Divergence有关系?当训练有较小的Divergence的data时,会很难去discriminate,也就会得到较小的max V(D,G),当训练有较大的Divergence的data时,会很容易去discriminate,也就会得到较大的max V(D,G)。
4. 通过上面步骤的说明,我们就可以得到下图所示的结果,可以把max V(D,G)代替Divergence。
在大多例子中,P(G)与P(data)重叠的部分很少。有下面两个原因:
1) Data本身的特性,重叠会被忽略掉。
2) 假设sample出来的点较少,就算P(G)与P(data)有重叠,对Discriminator来说是没有重叠的。
JS divergence有一个特性是两个没有重叠的Distribution计算出来永远是log2(不管这两个Distribution是如何分布的),这会导致generator无法提高。
在两个没有重叠的Distribution中,Wasserstein distance相比JS divergence做的更好在一直在向更好的方向发展而并非是处于一个恒定值。
1) WGAN就是用Wasserstein distance取代JS divergence的GAN,WGAN的限制条件是D必须是1-Lipschitz,目的是为了让生成数据与真实数据的差距不会太大。
2) 如下图所示,WGAN做到限制的方法。
1. GAN很难训练的原因是Generator与Discriminator相互促进,在训练的过程中,只要其中一个停止进步,另外一个也会跟着停止进步。
2. 如下图所示,GAN生成一段文字的难点在于Decoder改变参数后,得到最大的中文字没有改变,Discriminator输出的分数没有改变,因此不能去计算微分,也就不能做Gradient Descent。
现在考虑用Supervised Learning的方法,训练一个Network,输入是一堆图片,每一个图片用向量表示,输出是一张图片,希望输出与原始图片更加接近。
1. 将GAN产生的图片放入Image Classifier,输出是一个机率分布,这个机率分布越集中代表产生出来的图片质量越高。
2. 遇到的一个问题是Mode Collapse,它是指训练开始时,产生的图片质量比较不错,当训练很久后,会发现它产生的图片数目比较匮乏。产生Mode Collapse的原因是Generation产生了Discriminator分辨不了的图片后,Generation会抓住这一点,一直产生这类的图片。
3. 遇到另外一个问题是Mode Dropping,它是指产生的资料只有真实资料的一部分,虽然产生的资料分布表示不错,但是真实资料的分布比它更加丰富。
4. Diversity会参考一堆图片,输出的机率分布越平均,代表具有较高的多样性。
5. IS的问题在于它可以判断生成图像的正确类型,但不能保证生成图像的多样性和质量。Fréchet Inception Distance可以解决这个问题,它的主要思想是通过输出分类的倒二层的特征进行判断。
Conditional GAN是指额外地输入一段向量,这段向量规定生成的图像需要包含什么特征。
1. 在Image Style Transfer中,我们要训练一个Deep Network,现在的训练资料是不成对的(unpaired),因此考虑用GAN来解决问题。
2. 如下图所示,有一种想法:输入是Domain x图片的分布,输出是Domain y图片的分布。
3. 实际操作与之前的GAN不同在于Generator会无视输入,也就是生成的二次元图片与输入的真人图片没有联系,因此考虑使用Cycle GAN。Cycle GAN会训练两个Generator,这两个Generator的作用是将原来的真人图转成二次元图,再将二次元图转成真人图,目标是输入的真人图与输出的真人图越接近越好。
4. 如下图所示,StarGAN可以在多种风格间做转换。