https://www.bilibili.com/video/av9770302/?p=15

 

前面说了auto-encoder,VAE可以用于生成

VAE的问题,

AE的训练是让输入输出尽可能的接近,所以生成出来图片只是在模仿训练集,而无法生成他完全没有见过的,或新的图片

由于VAE并没有真正的理解和学习如何生成新的图片,所以对于下面的例子,他无法区分两个case的好坏,因为从lost上看都是比7多了一个pixel

GAN (Generative Adversarial Network)

 

所以产生GAN,

大家都知道GAN是对抗网络,是generator和discriminator的对抗,对抗是有一个逐渐进化的过程

而generator不会看到训练集,训练集只用来训练discriminator,所以generator是试图去生成新的图片,而不是单纯的模仿训练集

过程是,

我们通过V1的generator的输出和real images来训练V1的discriminator,让V1的discriminator可以判别出两者的差别

然后,将V1的generator和V1的discriminator作为整体network训练(这里需要固定discriminator的参数),目标就是让generator产生的图片可以骗过V1的discriminator

这样就产生出V2的generator,重复上面的过程,让generator和discriminator分别逐渐进化

 GAN (Generative Adversarial Network)

 

训练Discriminator的详细过程, 

GAN (Generative Adversarial Network)

 

训练generator的详细过程,

可以看到 generator会调整参数,产生image让discriminator判别为1,即骗过discriminator

并且在网络训练的时候,虽然是把generator和discriminator合一起训练,但是要fix住discriminator的参数,不然discriminator只需要简单的迎合generator就可以达到目标,起不到对抗的效果

GAN (Generative Adversarial Network)

 

下面从理论上来看下GAN,

GAN的目的是生成和目标分布(训练集所代表的分布)所接近的分布

GAN (Generative Adversarial Network)

Pdata就是训练数据所代表的分布

PG是我们要生成的分布

所以我们的目标就是让PG和Pdata尽可能的close

从Pdata中sample任意m个点,然后用这些点去计算PG,用最大似然估计,算likelihood

让这些点在PG中的概率和尽可能的大,就会让PG分布接近Pdata

GAN (Generative Adversarial Network)

这里的推导出,上面给出的最大似然估计,等价于求Pdata和PG的KL散度,这个是make sense的,KL散度本身就用来衡量两个分布的相似度

这里PG可以是任意函数,比如,你可以用高斯混合模型来生成PG,那么theta就是高斯混合中每个高斯的参数和weight

那么这里给定参数和一组sample x,我们就可以用混合高斯的公式算出PG,根据上面的推导,也就得到了两个分布的KL散度

当然高斯混合模型不够强大,很难很好的去拟合Pdata

所以这里是用GAN的第一个优势,我们可以用nn去拟合PG

GAN (Generative Adversarial Network)

这个图就是GAN的generator,z符合高斯分布,z是什么分布不关键也可以是其他分布

通过Gz函数,得到x,z可以从高斯分布中sample出很多点,所以计算得到很多x,x的分布就是PG;只要nn足够复杂,虽然z的分布式高斯,但x可以是任意分布

这里和传统方法,比如高斯混合的不同是,这个likelihood,即PG不好算,因为这里G是个nn,所以我们没有办法直接计算得到两个分布的KL散度

 

所以GAN需要discriminator,它也是一个nn,用discriminator来间接的计算PG和Pdata的相似性,从而替代KL散度的计算

GAN (Generative Adversarial Network)

GAN可以分成Generator G和Discriminator D,其中D是用来衡量PG和Pdata的相似性

GAN (Generative Adversarial Network)

最终优化目标的公式,看着很唬人,又是min,又是max

其实分成两个步骤,

给定G,优化D,使得maxV(红线部分),就是训练discriminator,计算出两个分布之间的差异值;在上图中就是在每个小图里找到那个红点

给定D,优化G,使得min(maxV),就是在训练generator,最小化两个分布之间的差异;就是在上图中挑选出G3

 

这里有个问题没有讲清楚的是,

为何给定G,优化D,使得maxV,得到的V可以代表两个分布的差异?

如果这个问题明白了,下一步优化G,去最小化这个分布间的差异是很好理解的

GAN (Generative Adversarial Network)

做些简单的转换,如果我们要最后一步这个积分最大,那么等价于对于每个x,积分的内容都最大

GAN (Generative Adversarial Network)

这里是给定G,x,Pdata(x),PG(x)都是常量,所以转换成D的一个简单函数

求最大值,就极值,就是求导找到极点

这里推导出当V max的时候, D的定义,并且D的值域应该在0到1之间

GAN (Generative Adversarial Network)GAN (Generative Adversarial Network)

上面推导出如果要Vmax,D要满足

GAN (Generative Adversarial Network)

所以进一步将D带入V的公式,这里经过一系列推导得到,V就等价于jensen-shannon divergence

jensen-shannon divergence的定义,如下,

GAN (Generative Adversarial Network)

比KL divergence好的是,KL是非对称的,而jensen-shannon divergence是对称的,可以更好的反应两个分布间的差异

那么这里的推导就证明,给定G,优化D让V最大的时候,V就表示Pdata和PG的jensen-shannon divergence,所以这个Vmax就可以表示这个两个分布的差异,也就回答了前面的问题

 

总结一下,

GAN (Generative Adversarial Network)

GAN,有两部分Generator G,Discriminator D

我们的目的是找到一个G,可以生成出足够好的x,即满足minmaxV(G,D),其中V的定义在蓝框中

GAN分两步,先给定G,去MaxD,然后再通过找到最优的G以满足,Pg(x) = Pdata(x)

GAN (Generative Adversarial Network)

MaxV,给定G,找到最大D,所以可以看成G的函数,设为L(G)
那么这样找到最优G,就是对L(G)进行梯度下降

这里的问题是L(G)中有一个Max,如何梯度下降?
下面给出一个例子,给定x先找出max的D,再对D做梯度下降

GAN (Generative Adversarial Network)

所以算法的步骤,

给定G0,max V得到D0,这里V(G0,D0)就Pdata和PG的JS divergence

然后固定D0,对V进行梯度下降,尽量降低JS divergence,得到G1,。。。。。。

但这里会有一个问题,

GAN (Generative Adversarial Network)

从G0梯度下降到G1,如果step太大,会导致图中的情况,在G1,D1会和D0差的比较远,这样有可能V(G,D)反而变大了

但是我们只要控制住G的变化程度,这个问题就可以避免

 

在实际实现的时候,对于V,我们是无法算出Pdata,PG的期望的

所以只能sample,对Pdata,PG中进行m个sample

GAN (Generative Adversarial Network)

所以对于给定G,我们要算使得V max的D,这就是在训练discriminator

把m个sample的数据带入V的公式,期望E就变成求平均

这个式子就等同于binary classifer,这个很直觉,本身discriminator就是在训练一个二元分类,来判断是否是生成数据

GAN (Generative Adversarial Network)

完整的过程如上,分为两部分,

Learning D,需要固定G,去maximize V,所以这里用的梯度上升,这个步骤可以做多次,以尽量找到max

Learning G,固定D,去minimize V,用梯度下降,这个步骤只做一次,上面说了如果G变化太大,会导致JS divergence变大而不是变小;用红线划掉部分,因为和G无关,所以梯度下降时可以去掉

GAN (Generative Adversarial Network)

实现上,learning G的时候,我们往往不会对上面那个式子做梯度下降,因为你可以看图,D(X)比较小的时候(开始训练时,D会很小),这个曲线的梯度是很小的,很难训练

所以会用下面的式子替代,这样,在开始训练时候梯度会比较大,训练较快

 

在训练GAN的时候,往往会出现discriminator过强,导致无法训练的问题,

GAN (Generative Adversarial Network)

比如上面的例子,强弱两种generator,但是在discriminator看来,没有区别,它都可以很轻松的判别出他们是false的,这样就会无法训练,因为没有梯度

GAN (Generative Adversarial Network)GAN (Generative Adversarial Network)

为何discriminator很容易判断出Pdata和PG是完全没有交集?

两个原因,首先因为我们只是对分布做了sample,所以虽然两个分布有交集,但是我们sample的数据有可能很容易被过拟合绕开

再者,data是高维空间的manifold,所以重叠的部分可能非常的小,导致discriminator认为没有重叠

GAN (Generative Adversarial Network)

所以问题就在于,你无法从PG0直接跳到PG100,需要逐渐演化,而过强的discriminator会导致在100之前,JS divergence一直是log2,这样就完全没有梯度

GAN (Generative Adversarial Network)

这个比较简单的解决方法就是给discriminator加noise,效果如图,会让分布的overlap更加明显

但这个noises需要随着时间递减,因为随着generator变强,noise会干扰正常的训练

 

Conditional GAN

 GAN (Generative Adversarial Network)

Conditional GAN的不同就是,需要给一个条件输入,比如这里的text,train
这里用GAN和其他简单的模型的差异是,GAN还有一个输入是z,在是一个prior distribution的sample,所以一个条件train对应的不是一个输出,而是一个分布
这里对于train可能有很多种picture,所以更为合理,普通的nn一个输入只对应一个输出

同样对于discriminator,也要同时输入condition和x,来进行判别

 

相关文章: