GAN(生成式对抗网络)

简介

8dRXq.png
加入一个简单的分布样本,这个z就是我们在原始的神经网络上加入的简单的分布。
怎么同时将z和x输入:
1.可以说x是一个向量,z也是一个向量,两者拼接成一个长向量当作输入。
2.在长度相同时,可以让他们相加,当作输入。
z不是固定的,他也是在一个分布中去选出来的,这个分布必须足够简单。
8d3Cb.png
我们输入这个分布z那么我们经过我们的神经网络得到的输出y也是一个分布。

为什么输入需要是一个分布呢?

当我们让机器去看视频时,机器会预测接下会发生什么
8d7bL.png
机器在此过程中科能会出先小人分裂这种画面,而这不是我们想要的,这是一个错误的结果,
所以我们需要加入一个分布,让结果并不唯一,让机器知道让左向右是两种可能。
而我们需要这种模型是因为我们要让机器需要一点创造力的时候。
我们这就需要让机器的输出是有机率的,而不是单一的输出,这杨让他的输出是一个分布。
8KAS3.png
我们给这个网络加上一个z,他的输出就变成一个分布。

Generator(生成器)

生成模型其中最知名的就是generative adversarial network,他的缩写为GAN
8KCgH.png
这个z是从一个分布中随机取样出来的,这个维度是自己自定的,生成一个图片就是让这个模型生成一个高纬度向量。一般来说,现阶段笔者的程度,z用正态分布就可以了,不同的分布之间的差距并不大。

Discriminator(鉴别器)

在训练GAN的时候,我们除了要训练generator
8KI6J.png
这个鉴别器的作用时那一张图片作为输入,输出一个数值,它本身也还是一个神经网络,是一个函数。
8KRgo.png
输入一张图片,输出的是一个数字,是一个标量,这个标量的分数越大,证明越像时二次元头像,这里面的架构是由自己决定,比如现在对图像操作,那我们在这里面就得用很多的cnn。

GNN的基本想法

8KBRd.png
就类似于生物的进化一样,generator去生成图片,而discriminator做的就是判断生成的图片与我们的训练资料有什么差别,进行相当于打分的操作,从而使generator进化,之后他就可以骗过第一代discrimination,discrimination也会进步,这两个之间在不断的互动。
就类似于啊generator是假钞的啊,然后discriminator是警察啊,警察要抓做假钞的人啊,假钞就会越来越像,警察就会越来越厉害等等。他们俩就像实在对抗一样,亦敌亦友,像是鸣人跟佐助一样。
8KLwZ.png

算法

generator跟discrimination他们就是两个神经网络,在训练之前我们要先初始化参数。

Step1 固定generator G,更新discriminator D

一开始G的参数是随机的,固定住G很产生很乱的图片,在正态分布中去丢进一些向量,他就会吐出一些图片,刚开始会和二次元任务非常不像,接下来我们就可以拿这些产生的托i按和真正的二次元头像,去训练D,他的任务就是分辨产生的图像和真正的二次元任务的差别。
实际上操作就是把真正的人物都标1,G产生的标0。
8Lfwc.png
接下来对discriminator就是一个分类问题,也可以说是回归问题

  • 如果是分类问题,就把真正的看作为1,生成的当作类别2,训练一个分类器就好。
  • 如果是回归就让discrimination看到真正的输出1,生成的输出2。

这两个都可以选择

Step2 固定D,更新G

拟人化讲法就是让generator去骗过discriminator。
在generator输入一个向量,在高斯分布中出来的向量作为输入,然后产生一个图片,出来的向量作为输入,然后产生一个图片。接着丢入discriminator,他会给图片一个分数,discrimination是固定的,我们只会更新generator的参数。
generator的目标是让discriminator的输出越大越好,分数越高证明输出是约真实的.
8LpEZ.png
Generator是一个network裡面有好几层,Discriminator也是一个,network裡面有好几层,我们generator跟Discriminator直接接起来,当做一个比较大的network来看。我们希望这个神经网络输出越大越好,但是不会去调整discriminator的参数
为什么呢?是因为我们如果要调整最后的参数的话,那我们直接调整最后的参数就可以的,让输出变得很大,就没有generator的事情了。
这和训练一般的神经网络现在就没有什么不同了,现在就只需要用梯度上升就行训练,因为输出的值我们是希望越大越好。
所以现在讲了两个步骤

  • 第一个步骤 固定generator,训练discriminator
  • 第二个步骤,固定discriminator训练generator

接下来就是反复的训练,训练g和d交替进行,

GAN 理论介绍

训练目标

在generator问题中我们是想要minimize和maximize什么东西
我们想要minimize的是:
丢进generator的向量和正态分布,会产生一个复杂的分布,我们叫他PG,我们有一组真正的data,这个真正data也是一个分布,叫做Pdata,我们要的是这两个越接近越好。

遇到的问题

我们是想这两个分布越接近越好,但是怎么去计算这两个分布的差异
8MiAU.png
我们可以通过discriminator去直接跳过差异的计算。
我们可以对真实分布和虚假分布做抽样,例如,用生成器随机生成虚假图片就是对虚假分布做抽样
Alt text
在有了来自真实分布和虚假分布的数据之后,我们可以对生成器和判别器分别进行训练。

下面是对判别器进行训练,判别器的训练目标是,尽可能使得判别网络对输入真实图片时的期望输出较大,而输入虚假图片时的期望输出较小,由于一个要求较小,一个要求较大,不好统一,所以用1减去虚假图片输出,使得这个值较大,这样两个值就可以相加,使得他们相加的值较大即可。
Alt text

但是生成网络的训练目标就有点复杂了,他的目标是希望判别器的误差较大,即判别器的目标函数较小(判别器目标是极大化的),总的来说,生成器希望最小化判别器的最大化目标值,这样生成器才可以很好地骗过判别器。

这个最小最大化问题就是复杂的地方,在GAN中,为了处理MinMax问题,采取了之前的”轮着训练“的方式,即先固定生成器,训练判别器,再固定判别器,训练生成器,如此循环的方式进行训练。
Alt text

训练的技巧

Wasserstein Distance

Wasserstein Distance的想法是假设有两个分布一个叫做p一个叫做q。
8MI0A.png
他的计算方法就是相当于在开一个推土机,将p挪动到q的平均距离就叫做Wasserstein Distance。
8MNBo.png
但是遇见这种情况就很麻烦了,这样有很多种做法,我们只能穷举所有的移动办法,选取最小的那个值。
为什么要使用Wasserstein距离?因为如果使用JS散度,其有一个特性,当两个分布没有重叠时,JS散度求出的就是Log2,所以如果两分布没有重叠,无论他们距离多远或者多近,使用JS散度得出来的损失都是Log2,这样我们就无法知道两分布得真实距离了。
对 JS Divergence 而言,它需要做到直接从这一步跳到这一步,它的 JS Divergence 的 Loss 才会有差异,但是对 W Distance 而言,你只要每次有稍微把 PG 往 Pdata 挪近一点,W Distance 就会有变化,WDistance 有变化,你才有办法 Train 你的 Generator,去 Minimize W Distance,所以这就是為什麼,当我们从 JS Divergence,换成 Wasserstein Distance 的时候,可以带来的好处。

WGAN

WGAN就是我们把js 分歧用Wasserstein Distance代替。
IVCuH.png
这个式子就是计算Wasserstein Distance,

  • y 如果是从 Pdata 来的,那我们要计算它的 D(y) 的期望值
  • y 如果是从 PG 来的,我们计算它的 D(y) 的期望值,但是前面乘上一个负号

如果y是在pdata中选取的,Discriminator输出就越大越好。
如果实在pf是选区的那就要越小越好
为了使函式变得平滑,D必须要是一个 1-Lipschitz 的 Function。

GAN 的评估

可以把GAN生成出来的一个图片放到一个影像分类系统中,看他生成什么结果。
IH5fo.png
影像分类系统的输入是图片,输出是一个分布,如果这个分布越集中,那就代表这个生成的图片科能越好。如果产生的的分布越集中的话,就越证明分类系统肯定看到什么东西,而如果机器产生的图片越是四不像,那么他的分布就越平坦,分类系统也不确定他看到了什么东西。

Mode Collapse

但是用这种方法就会产生Mode Collapse的问题
IHsYd.png
蓝色星星是真正的数据资料分布,红色的就是GAN产生图片的分布
他就是会产生很多相同的图片。相当于这个地方就是Discriminator的盲点,而Generator就抓住这个盲点硬打一发。
目前没有很好的办法解决这个问题。

Mode Dropping

IHTsx.png
资料分布于生成的接近,但是他的多样性达不到。
IHQ8L.png
Ic7Nq.png
这两个脸像是相同的,但是他的肤色不同这说明这个GAN的多样性不好,而且Mode Dropping不太容易被侦测出来 ,今天训练很好的GAN都不一定不会有这个问题。
Diversity:过去就是用我们的分类器,去观察GAN的输出,看他的分布是否均匀,如果均匀则代表他的多样性好,但是如果不均匀的话就证明多样性不好。

  • diversity这个是看到一堆图片,他的分布越平坦,就带表Diversity越大
  • 而quality(质量)看到的是一个图片,看他的分布集中不集中

Conditional Generation

目前为止,我们输入都只是一个随机分布而已,他不见得有用。
Icvr3.md.png
现在我们想要的是输入一个Conditional给generation,来使我们得到想要的结果。

应用

text to image

我们可以给机器一段文字,让他来输出图片.
IcKZ5.png
我们给他成对的资料进行训练。但是有已经生成好的图片对不上标签,可以将一部分文字和图片乱配。让discriminator看到这样的结果也会说不好。

pix2pix

这是通过图片生成图片,与文字生成图片没有什么不同。如果用自主监督学习并不会得到很好的结果,因为结果具有多样性。如果只用GAN他的创造力过强,并不能得到很好的结果。
Im41A.png

ImD0o.png
所以最好的办法就是这两个一起使用。

Learning from Unpaired Data

没有成对的训练资料怎么办呢,下面用图像风格转换来举例,将人脸转换为二次元。
ImbCk.png
有个问题就是我们不能确保这个图片生成的与x的输入有关系啊。

Cycle GAN

在这个模型里面会有两个Generator.

  • 第一个是把x domain变成y domain
  • 第二是把y domain变成y domain

在训练的时候就是要把输入和输出越接近越好,这两个输出都是向量,就是让这两个向量越接近越好。
所以现在这边我们有三个Network

  1. 第一个generator,它的工作是把X转成Y
  2. 第二个generator,它的工作是要把Y还原回原来的X
  3. 那这个discriminator,它的工作仍然是要看,蓝色的这个generator它的输出,像不像是Y domain的图

这个cycle是双向的,现在可以拿二次元图像输出人脸然后再去生成二次元图像
ImolA.png
那你依然要让,输入跟输出越接近越好,那你一样要训练一个discriminator,这个discriminator 是,Xdomain的discriminator,它是要看一张图片,像不像是真实人脸的discriminator,这个discriminato要去看说,这一个橙色的generator的输出,像不像是真实的人脸,这个橙色的generator它要去骗过,这个Dx这个绿色的左边,这一个discriminator,这个合起来就是Cycle GAN。

Text Style Transfer

这个技术也可以用在文字风格转换,可以搜集负面和正面的句子,和和上面图像风格转换类似,这里就不再赘述。