network作为generator生成更加复杂的distribution,应该怎么做?这是我们这节课要讨论的问题



generative model适用于哪些场景呢?
简单来说,就是输出需要一些"创造力"的时候,例如绘画,聊天机器人等


在normal distribution中vector的数量并不多,可能50-100左右,但是可以生成具有相当大维度的图片
discriminator可以用来判断输出的图片的好坏,对GAN的输出结果进行评价

generator会根据discriminator不断修改自己的输出能力,但是discriminator也会不断提升自己的判断能力,最终形成了对抗的样子,也就是adversarial

下面详细介绍这两个network的训练过程
首先对两个模型进行初始化,先用一些简单的vector作为generator,然后用一些正确的图片输入用于discriminator,**discriminator就是训练用来判断正确图片与生成图片的不同(**可以使用分类方法:好的作为1不好的作为0,也可以作为回归问题来做),该步骤是固定G更新D

第二部:固定D,更新G,让生成器去欺骗已经学好的D


之后重复以上两个步骤:

我们的目标是尽量减少PG和Pdata之间的差异,可以用Div实现



我们在进行divergence需要先获得生成器生成的sample和真实数据的sample

下面就是discriminator的任务,将真实值Pdata的得分改成越大越好,将生成器生成的值PG得分越小越好 ,下面的V函数就相当于cross entropy前面加了负号,那么cross entropy越小,V函数的值越大,所以也要尽量缩小cross entropy的值,计算交叉熵时,真样本靠近1,假样本靠近0,得出的值越小,而计算图中的V时,真样本靠近1假样本靠近0,计算得出的值反而越大

详细解析:为什么要采用这样的写法来计算V




下图可以直观的展示divergence和discriminator生成之间的关系:


之前我们总是想找到divergence的表示方法,现在发现maxV(D,G)就和divergence有关,所以可以直接替换

不同的divergence如何设计他们对应的objective function?但是一般来说即使把divergence训练的很好了,但是GAN的总体模型效果可能还是不行

训练GAN的一些小tips:
一,JS divergence可能带来什么问题?
有两个局限:1,真实值和生成值可能都是高纬度中的很小的一部分,重叠部分可能被忽略不计 2,我们在sample的时候如果数量不够也可能导致重叠的部分很少

两个分布如果没有重叠算出的结果永远是log2,如果没有重叠,分类器的训练结果正确率总是得到100%,没有任何意义



由此我们换一个计算divergence的方式,引入wasserstein distance
这个概念类似于推土机,P是我们生产的,Q 是我们需要靠拢的真实值,wasserstein distance就是这两个中间相差的距离

有时候P和Q会变得更加复杂,所以我们需要穷举所有情况来找到最好的

回到之前的例子:

WGAN:用wasserstein distance代替JS divergence
计算公式如下,注意其中的D不可以是很复杂的function,需要是一个比较平滑的function,因此我们对Dfunction做了限制

那么使得D function函数更平滑的方法有哪些呢?
WGAN要求判别器(critic)满足 1-Lipschitz连续:梯度的范数不能超过1,保证Wasserstein距离可以被正确估计。下面三个都是用来强制满足这个约束的方案:




SN方法目前看训练效果最好,但是不是有WGAN就一定特别好train
GAN为什么这么难训练?
因为只要其中一者不再进步,训练结果没有改善,另外一者也跟着停下来无法改善,generator 和 discriminator需要相互匹配

GAN在处理Sequence问题会遇到的问题:

如果Decoder发生了微小的变化,但是由于generator每次是选择最大值,产生的微小参数变化可能并不会影响最终的输出,所以最后discriminator的得分也就无变化,这样无法去微分,和我们之前所说的梯度消失的问题类似
所以很长一段时间用GAN来生成Sequence文字是非常困难的
更多的生成模型:

但是一般还是GAN产生的结果最好
其他可能的解决办法:直接输入图片向量,但是向量顺序要按照特殊的方式排列,进行训练,最终直接输出图片,相关的文章如下:

那么我们如何来评定一个generator的好坏呢?
方法一:对于人脸
可以用生成generator去辨识人脸,例如对于有一千张人脸的数据集,一个辨识出九百张,一个辨识出三百张,可以看到辨识出九百张的效果更好
方法二:对于多张图像内容的图片
可以使用图像分类器对结果进行分类,**如果分类的结果越陡峭不平坦(**说明生成图像特征明显很好分类),说明生成图片的效果越好

但是方法二需要警惕一种Mode Collapse现象的发生:
这种现象是指生成图像开始围绕一个图像打转,多样化越来越弱,目前还没有特别好的方法,一般出现mode collapse现象就会停下来使用之前训练好的model

还有一个可能的问题被称作------Mode Dropping



那么如何来查看生成图片的多样性呢?
同样可以借助imager classifier来进行统计,对生成的图片进行分类然后取均值,如果结果平坦则是正常,如果出现陡峭的结果则是不正常,某一类别出现很多次说明生成图片结果相似


我们可以用IS来判断生成图片的质量,但是人脸由于只有一个类别,并不适合哟用这个方法来判断

但是quality我们一般是针对一张图片进行CNN分类判断,生成的组别越陡峭说明效果越好,diversity是所有图片分类取均值,结果越平坦效果越好
FID可以弥补上面所说无法辨识人脸的情况,它的特点在于把输入到softmax之前的向量进行判别




我们在生成人脸时可以同时看辨识人脸的数量和FID值,这样可以使结果更准确

有时候FID很低,人脸分数也不错,但是GAN的效果还是不行,因为和真实数据的人脸一摸一样,我们需要的是新生成的人脸,这时候我们就需要计算两者的相似度

conditional generator GAN
例如文本生成图片,我们要输入文字,和sample的Z一起输入,当然它本身也要有相关的标签库

在conditional GAN中generator和discriminator两者应该如何设计?
generator的输入会增加附属条件x,那么discriminator就不能把图片质量作为判断生成好坏的单一指标,还要看是否满足x条件,如果两者都满足才能得到高分,所以如果出现文字和图片成对的资料就给1分,如果不匹配就给0分
还有一种情况就是生成的图片很好但是文字不匹配,这种情况也不能打高分,我们在一开始训练discriminator时就要告知这一细节

其他应用:
图片生成图片

图像产生图像的处理流程:




GAN在unsupervised(无监督)数据上的应用------Cycle GAN
我们想要将显示的人脸转化为二次元的人脸,但是没有成对的训练数据,那么应该怎么做呢?
前面的模型都是在成对的数据的条件下完成的、

如果只是使用一个generator,生成一个二次元图像我们无法验证准确率有多高,因为没有成对的数据给我们检验,这种情况在使用一个generator,将生成的二次元图像恢复成现实图片,这样可以实现检验,形成cycle,同样y也要进行类似的检验处理


类似的模型:

多种不同形式的数据相互转化:StarGAN

其他的示例模型:文字循环转换

不同形式数据转换的其他应用:
