生成式对抗网络(Generative Adversarial Networks),这是一个多网络对抗的生成模型,它几乎能在所有深度学习需要生成的场景中得到使用(尤其是图形生成的任务中表现很好)。

这篇文章的主要目的是对这几年基于GAN的各种各种各种模型进行一次简单的思路性综述。(〃’▽’〃)
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
上图出自GAN Zoo

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

GAN的热度可见一番。


GAN的基础思想

GAN是一类生成模型,和VAE, pixelCNN等生成模型不同的是,GAN引入了NN的对抗环节,来帮助NN生成拟合效果更好的数据。对抗的环节为一个Discriminator NN与一个Generator NN。G的目的为生成拟合效果更好更逼真的数据来骗过D,D的目的为分辨出真实的原始数据和G生成的假数据。如原Paper中打的比方,G是制造假钱的坏人,D是警察专门分辨假钱(“充满暴力与犯罪的例子”)。

原始算法如下:
Pdata(X)为原数据集的分布,PG(X,θ)为G产生数据的分布。从Maximum Likelihood Estimation开始,G的目标是找到一个最优的θ有如下式子

θ=argmaxθi=1mPG(Xi;θ)
=argmaxθlogi=1mPG(Xi;θ)
=argmaxθi=1mlogPG(Xi;θ)
=argmaxθExPdata[logPG(Xi;θ)]
=argmaxθPdatalogPG(X;θ)dxPdatalogPG(X)dx
=argminθKL(Pdata||PG)

(注意这里的Xi是从原始数据集中取样的。)
则得到G的目标就是最小化两者的KL散度。

对于D来说,他的目标函数是

V(G,D)=ExPdata[logD(X)]+ExPG[log(1D(X))]

第一项作为正样本的奖励,第二项作为负样本的惩罚,可以看到这个函数有点类似于Sigmoid的cross entropy。
(PS:其实D用Sigmoid做二分类是不合理的,在PGPdata的overlap太小的时候,D可以很好的区分两类,这两类都在Sigmoid的左右两侧斜率几乎为0的地方,降低训练效率。采用Linear Regression的方式会更优一些。)

继续得到:

V(G,D)=[Pdata(x)logD(x)+PG(x)log(1D(x))]dx

理解为给定一个XD(X)都能最大化被积分的式子(假定NN能使D(X)为任意函数)。对被积分的式子进行求导,使导数为0,容易得到D(x)=Pdata(x)Pdata(x)+PG(x)(显然为最大值点)。代入V(G,D),得到
maxDV(G,D)=V(G,D)=2log2+Pdata(x)logPdata(x)(Pdata(x)+PG(x))/2dx)+PG(x)logPG(x)(Pdata(x)+PG(x))/2dx=2log2+2JSD(Pdata||PG)

所以呢,假如我们现在拥有了一个好的D,那么G上的loss就是两个分布之间的的JS散度。
(PS:用JS散度其实也是不好的,在两个分布都没有重叠的时候,散度项的值是定值,没有办法梯度上升)

对于G来说,则有

G=argminGmaxDV(G,D)
过程理解为下图:生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks,D随G变化而变化,选择D最大的那点,再在多个G中选择V最低的那点。

训练D与G的时候,其实就是一个D在给G指路的过程,每个迭代过程中,更新多次D,更新一次G(因为G在更新会导致PG分布变化,为防止D认不出G,不能更新太多次G,而且在分布变化的过程中,同时丧失了最小化JS散度的意愿)。

同时训练的时候有一些tricks。
按理来说G的目标是V=ExPG[log(1D(X))],但是训练时换为V=ExPG[logD(X)],以此提高训练速度。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

Generative Adversarial Networks


Least Square GAN

Less Square GAN是GAN的一个优化版本。LSGAN解决的问题是,原始D是一个sigmoid二分类器,在D分类效果过好(两个分布解决0或1)的时候,G在跟着D指路优化自身的时候获得的梯度过小,没有办法让两者的分布靠近。在原始的GAN架构中,提出的是减少D训练的次数,防止D分类能力过强,这就对超参的调节提出了很大的要求。

LSGAN将分类的sigmoid输出换成了线性输出,把输出转换成一个回归问题,训练的时候仍然是正样本接近1,负样本接近0。以此优化梯度传递的效果。

Least Squares Generative Adversarial Networks


Wasserstein GAN

在WGAN中,主要的工作是更换了评价两分布接近程度的指标,将JS散度,转换为Wasserstein Distance。

W(P,Q)=infγΠ(P,Q)E(x,y)γ[||xy||]

γ是分布P与分布Q的组合分布,目标为求样本期望距离||xy||的下界)

我们先尝试形象理解一下Wasserstein Distance是什么,假设我们有两个分布P和D,看做是两种土堆,我们要做的是,把P的土堆,挪成像Q的样子(是不是想起来上一篇文章里说过的histogram matching了),我们要记录的就是把所有土挪动的总距离之和。挪土的方法有很多种,Wasserstein Distance就是其中最小的,也就是最近的。

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

为了求解这个优化规划问题,我们先引入一个Wasserstein Metric帮助理解,这个矩阵就是一个挪土计划表(假装是离散)。这个矩阵的行对应分布Q,列对应分布P。每一行的值代表P里的土被如何分配,每一列的值代表,新土堆里的土由哪些土堆贡献。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

假设γ是最优的计划矩阵。 那么距离就是 W(P,Q)=xP,xQγ(xP,xQ)||xPxQ||

回到连续的情况下,经过转换后,我们得到的距离如下(别问我怎么转换的,原文说“ the Kantorovich-Rubinstein duality [22] tells us that”。谢谢各位数学家了):

W(P,Q)=supf1Lipschitz(ExP[f(X)]ExQ[f(X)])

所以目标函数成为
V(G,D)=maxD1LipschitzExPdata[D(X)]ExPG[D(X)]

(注意这里没有了原来的log,WGAN的D关注指标成为了一个scalar)

1-Lipschitz是符合lipschitz连续条件的一种,这是一个限制函数梯度的条件,一个比通常连续更强的光滑性条件,定义如下

||f(x1)f(x2)||K||x1x2||

这里的K常数取1就是1-Lipschitz条件。

原文里并没有追求如何求解保证D符合Lipschitz条件,而是采用了Weight Clipping(if k||c||, then k = c)的方式保证有一定的光滑性。

(再从直观的角度想一下,假如我们在原始GAN模型中,对D训练次数过多,就会导致正负样本被准确分类,D的曲线自然也就成为一个一端很高,一端很低,其他地方都是0的东西,自然也是不满足Lipschitz条件。)

WGAN的距离函数的思路被后来绝大部分GAN模型借鉴,减少了超参调节的压力,解决了由于JS梯度导致的梯度消失问题。
Wasserstein GAN


WGAN-GP

WGAN-GP是WGAN的又一次强化版,在WGAN中,我们使用的Weight Clipping方式并不能帮助我们真正实现1-Lipschitz,甚至说逼近效果也不好。

WGAN-GP提出一个加正则项的方法来逼近1-Lipschitz,理想情况下,我们去对D函数每个地方都求导,拿到一个正则项

max(0,||xD(x)1||)

但很显然每个地方求导的代价太大,我们就只从Ppenalty这个分布中去采样x,完成以下的目标函数

V(G,D)=ExPdata[D(X)]ExPG[D(X)]λExPpenalty[max(0,||xD(x)1||)]

那么现在选择一个合适的Ppenalty成为了一个问题,在原文中,把Ppenalty取做PdataPG的“中间分布”,从直觉上认为,因为两个分布是互相靠近的,所以要保证的只有Ppenalty分布中的D符合1-Lipschitz(“enforcing it …. seems sufficent and experimentally results in good performence”,翻译过来大概是反正就是work了,我就要发论文。)。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

训练的时候也做了一些玄学trick,惩罚项被设置为ExPpenalty(||xD(x)||1)2(看上去像是想让斜率逼近1……

Improved Training of Wasserstein GANs

(PS:其实PdataPG的逼近过程中,显然不一定是走直线的。也就有后续的文章把Ppenalty设置为Pdata,证实结果更好。

(btw,ICLR 2018有一个针对完全符合1-Lipschitz的工作:Spectral Normalization for Generative Adversarial Networks


Conditional GAN

CGAN这 GAN模型主要的想法是为GAN的生成过程中添加一个标签Y有监督地作为输出的一个监督参考。我们使D同时接受G的输出和标签Y两个变量,除了要判断G的输出是否realistic,同时要判断输出与Y 是否有关联

目标函数如下

minGmaxDV(G,D)=ExPdata[logD(X|Y)]+ExPG[log(1D(X|Y))]

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

Conditional Generative Adversarial Nets


Cycle GAN

Cycle GAN想要解决的问题是无监督情况下地去实现Conditional GAN的目标。

假如我们一开始的架构和原始GAN类似,首先需要一个GX>Y,input图片经过GX>Y后生成我们的目标output图片,利用D来判别output是否属于原始domain。

在这样的情况下,GX>Y很容易被训练成为一个只会讨好D的生成器,而不注重输出的图是否和输入有关(比如不管input是什么,都输出一张目标domain里的原图)。为解决这样的问题,我们引入一个GY>X将output图片重构恢复成一个input2,在此处引入Cycle Consistency Loss的概念,目的是为了计算inputinput2是否足够接近。

直观上进行理解,假如output生成的图片和input关系不大,那么GY>X就没有能力恢复重构出一个和input非常接近的input2

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

Cycle的做法也可以是走一个双向的路径,既然我们训练了GY>X,那么我们完全可以开一条类似的循环生成路径来把目标domain的图片转化为原始domain的图片(如下图)。

Lcyc(G,F)=Expdata(x)[||F(G(x)x)||]+Eypdata(y)[||G(F(y)y)||]

这里的G(x)F(y)分别对应前文的GX>YGY>X

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

(PS:Cycle GAN这样的方法只能说大部分时候是work的,但是毛病也不少,举例NIPS2017的CycleGAN: a Master of Steganography指出Cycle GAN的做法,不能保证output图片中可用于重构input的信息是以原始方式保存的。

如下图的例子,白色的高亮建筑的特点并没有在output中呈现出来,但是GY>X的确完成了恢复重构input的工作。文章认为,这部分的信息被转写隐藏到了图片的其他位置中(Steganography)。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
)


Star GAN

在之前的GAN中,每个G都只能完成一个特定domain到另一个特定domain的转换过程。Star GAN想要做的是,我们训练出来的G可以完成任意多个domain之间的互相转换。

在Star GAN中,我们的D的输入和往常一样,输出有两个,一个是判断input是否真实,另一个是判断input应该属于哪个domain。而我们的G接收两个输入,一个是input图片,另一个是目标domain,输入一个output图片,这张output图片除了将被扔入D来帮助D训练外,还将被再次扔入G,去生成一个原始domain的重构图片input2,我们再通过比较inputinput2的差距来帮助训练G。(Loss式子的结构都和前文中模型类似,就不写了 )

这里的domain可以是多种类型的独热编码的组合,以此可以表达出多种数据集中的多种特征,一个模型来实现多个生成效果的组合。

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation


CoGAN

CoGAN想要解决的问题,也是Unsupervised Conditional GAN。

如下图,假设我们拥有一个两套针对domain X与Y的自动编码机,我们希望的是,EncoderXEncoderY能够分别对domain X与Y进行正确的编码,输出的feature也要是同一体系的。假如我们把这两套自动编码机分开训练的话,显然我们不能保证中间橙色部分的feature是相同的表示,这样就会导致Decoder交叉工作时候发生错误。

为了解决这样的情况,我们需要把两个Encoder的末几个hidden layers需要共享参数,从而保证feature的正常表示,两个Decoder的前几层共享参数,从而保证feature的正常读取。

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

基于以上的想法,我们在Generator中的共享参数方式表示如下图。

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
Coupled Generative Adversarial Networks

(基于解决feature分布不同问题的还有很多种方法。例如,我们引入一个额外的Ddomain来对中间的feature部分进行判断,看这个被encode出来的feature到底是哪个domain里的。如果Ddomain能够判别出feature的domain信息,说明feature还是依赖了domain信息。我们的训练目标就是使两个domain的input经过encode后能够让$D_{domain}分不出是来自于哪个feature的,这就说明两种feature都是同一分布,也就解决了问题。)


Combo GAN

Combo GAN也是对应Unsupervised Conditional GAN问题。

前面我们提到了feature的分布可能不同的问题,Combo GAN的解决方式是,我们干脆让input经过EncoderX,生成featureX,再经过DecoderY生成一张outputY图片,outputY再作为EncoderY的输入再次输出一次featureY,最后经过DecoderX生成outputX图片。通过结算outputXinput的距离来作为一个Cycle Loss。这个思路潜在的思维是,假如我们两个Decoder的输出feature分布是不同的话,那么在DecoderY这一步,图片就会被玩坏,自然就不能够重构出正确的outputX

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

ComboGAN: Unrestrained Scalability for Image Domain Translation

(基于图片被玩坏这个猜想,显然featureXfeatureY的距离也不会小,这部分其实就是XGAN里提到的Sematic Consistency Loss。)


Patch GAN

GAN后来被实验认为面对大分辨率图像生成的任务中表现逊色,而Patch GAN的想法是让我们拥有多个D,分别观察大分辨率图像的各个局部图片(或语音上的局部),最后综合得到一个scalar。防止训练出来的D过拟合或是训练效率低。

这个判别器的设计思路被Cycle GAN等许多GAN采用。

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
Patch-Based Image Inpainting with Generative Adversarial Networks


Stack GAN

Stack GAN想解决的问题同样是大分辨率图像生成的任务。

它的想法是,在G的生成网络中,采用分级输出的方式,一个G1输出64*64的图片,D1来进行评判,我们又拿来一个G2把64*64放大到256*256,再有D2……通过级联的方式来保证最后大分辨率图像的输出质量。

训练的时候应先训练G1,再训练G1G2的级联,如此循环地进行“套娃”式地训练过程。

生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks


fGAN

在原始GAN中,我们已经证明我们实际上作为loss的是两个分布的JS散度,fGAN提出的是我们可以使用f-散度(f-divergence)这类中的任何散度来衡量。

先解释什么是f-divergence:

Df(P||Q)=xq(x)f(p(x)q(x))dx

如上的公式,P、Q是两个分布,p(x)和q(x)是对x取样的概率。在保证f是一个凸函数,且f(1)=0的前提下,我们就获得一个f-divergence。如下,通过修改f我们可以获得任意一个f-divergence。

假设f=xlogx,代入得到KL-divergence

Df(P||Q)=xp(x)logp(x)q(x)dx

同理假设f=logx,我们就得到Reverse KL,假设f=(x1)2,我们就得到Chi Square (前文中提到的Least Square其实也可以推出来用的是卡方)。

因为f是一个凸函数,我们先引入共轭函数(Fenchel Conjugate)进行凸优化,共轭函数(针对向量版本)是函数yTx和函数f(x)之间差值的上界,同时它自身也是一个凸函数,定义如下

f(y)=supxdomf(yTxf(x))

如下图进行直观理解,y是一个常数,我们要求的差值是两条平行线之间在y轴上的距离
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

因为共轭的关系是可逆的,我们得到如下式子

Df(P||Q)=xq(x)suptdomf[p(x)q(x)tf(x)]dx

t是D输出的scalar,我们写作D(x),得到
Df(P||Q)maxD xp(x)D(x)dx xq(x)f(D(x))dx=maxD(ExPdata[D(X)]ExPG[f(D(X))])

这时候我们就写出了GAN的对抗形式。

更换散度带来的好处包括解决Mode Collapse问题还有类似的Mode Dropping问题。指假如我们的目标domain Y包含三个子domain a\b\c,但是我们的G只能生成a中的样本,虽然这样的情况下也能够使得我们的loss很小(比如人脸生成任务,G一直生成同一个人的脸),但是这样显然不符合GAN的任务需求。

如下图,绿色虚线是对于不同散度评价下对于蓝色分布一个较好的拟合情况。对于KL散度,G倾向生成一个平均一点的分布,导致了模糊的现象,对于Reverse KL散度来说,G就很容易倾向产生Mode Dropping问题。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

f-GAN: Training Generative Neural Samplers using Variational Divergence Minimization


Energy-based GAN

EBGAN把Discriminator修改成了一个Autoencoder,把Discriminator输出的scalar设置为Autoencoder的reconstrcution error(MSE来算距离,这在文中称为能量函数)。基于的假设是如果待评判的图片质量不好,那么重构的结果也不好。

这样做最明显的好处就是,因为训练过程中不再需要负样本,我们不再需要去控制D训练的次数幅度,取而代之的Autoencoder可以提前训练好。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
我们使用了来Autoencoder实现D的功能,训练的方式也有改变,因为reconstrcution error是一个难提升,但很容易降低的值,我们要防止对于错误样本的scalar过低导致惩罚过度。我们需要设置一个超参margin, s.t. if scalarnegmargin , then scalarneg=margin

EBGAN对LG增加了一个正则项repelling regularizer,来保证使用Autoencoder作为D的时候,不会发生mode collapse的情况。

fPT(S)=1N(N1)iji(SiTSj||Si||||Sj||)2

SRs×N,代表从encoder output layer取出的一批样本,fPT(S)计算这批样本内的平均余弦距离,以此作为惩罚。

Energy-based Generative Adversarial Network


Loss-sensitive GAN

LSGAN的主要贡献是在D输出scalar的前提下,我们想让D学会一个loss。

假设我们拥有多个迭代版本的G,我们希望的是,通过不同代G的生成,D也能区分出不同G的生成与目标分布的接近程度。

Loss-Sensitive Generative Adversarial Networks on Lipschitz Densities


Boundary Equilibrium GAN

前面讲了好几个对原始GAN进行优化的思路,比如WGAN系列,fGAN等等,他们的优化思路集中在于改善衡量分布距离的标准。BEGAN提出了另一个优化的方向,并且提出了一个方法来权衡G的生成质量和生成多样性。

在Discriminator上,BEGAN的目标函数和EBGAN一样,不赘述。

BEGAN的直接目标是优化分布的分布误差之间的相似度,而不是分布的相似度。

W(P,Q)2=infγE(x1,x2)γ(|x1x2|)

γ是P和Q的任一组合分布,然后用Jensen不等式得出

infE(|x1x2|)inf|E(x1x2)|=|m1m2|

m是分布的期望。

所以我们就可以直接面向优化|m1m2|了,虽然距离函数来自于WGAN的思路,但是这可比优化1-Lipschitz条件来得简单不知道多少。我们只需要把其中任意一个推高,另一个推低,就可以满足目标。

文章中提出,我们不需要让模型完全收敛到均衡点,我们设置一个超参γ,使得

γ=E(D(G(z)))E(D(x))

通过调整γ我们就可以让D在对真实图片自编码和区分图片这两个任务中间进行取舍。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

BEGAN的一大优势就是网络结构简单(就是非常单纯地上采样上采样,下采样下采样),降低了训练时对各种trick的需求,什么relu,minibatch,BN全都不需要,而且图像质量被推到了一个很高的水平。

如下图,默秒全了。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

BEGAN: Boundary Equilibrium Generative Adversarial Networks


Info GAN

对于所有生成模型来说,我们都希望知道input的vector每一个维度代表了什么样的语义,有什么具体的均匀的影响。我们均匀地变化某一维度的值时,我们期待output也是均匀地变化。

InfoGAN的思路是我们在输入的vector中加入多维的c作为一个编码,用来表示具体的语义,其他部分仍然是随机噪音。训练目标就是使得G能够准确输出一个和c有高度相关性的output,所以我们引入一个Classifier来判断output对应的c是什么。原文在目标函数中添加了一项λI(c;G(z,c)),以mutual information(互信息)的方式来评判c与output之间的关系。

I(c;G(z,c))=H(c)H(c;G(z,c))

H是熵,衡量不确定度。

因为P(c|x)不好得到,故原文使用变分分布Q(c|x)来逼近P(c|x),通过Variational Information Maximization的方式求出下界。

最后注意让Classifier和Discriminator前几层共享参数(他们的input同一分布)。

最后的效果
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets


VAE-GAN

VAE-GAN是一个把VAE和GAN结合的产物。VAE和GAN同为生成模型,VAE的问题是生成的图片很容易过于模糊,不够realistic,GAN的问题是G不好训练。所以把两者结合起来,互相加强。

如下图中的架构,VAE-GAN相当于把GAN中的G换成了一个Autoencoder,或者说为VAE的output增加一个D来增强监督。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks

encoder的目标是使得z属于一个正态分布(通过KL散度),decoder的目标是欺骗D,AE的目标是降低reconstruction error,D的目标是区分出图片的真假。

Autoencoding beyond pixels using a learned similarity metric


BiGAN

BiGAN应该说是一个利用GAN的思想来帮助训练VAE的模型。在BiGAN中,Encoder和Decoder不再是链接起来训练,而是通过一个Discriminator来监督各自训练。这个Discriminator接受code和image,输出的是输入数据的来源(encoder or decoder)。

x取样real image,x取样fake image,z取样正态分布,z取样于把 x encode的结果。
D的目的是提高D(x,z),降低D(x,z)(其实反过来结果也是一样的)。
Encoder、Decoder的目的是提高D(x,z),降低D(x,z)

看上去Encoder和Decoder分开训练比较反直觉,但是实际上D还是在做衡量P(x,z)Q(x,z)两分布差异的工作。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
假如说不采用对抗的方式,我们尝试用z和x各自的reconstruction error来训练的话,其实目标是一模一样的,但是实际上这种思路训练出来的效果不如BiGAN。
Adversarial Feature Learning


Triple GAN

Triple GAN是利用了GAN的对抗思路,完成一个Semi-supervised的任务。首先,Triple GAN的目标是在绝大部分已有数据未打label的情况下训练出一个Classifier。

遮住Classifier先不看,G和D的主要工作思路和cGAN类似。加入的Classifier可以通过已打label的(Xl,Yl)来学习,也可以通过G生成的(Xg,Yg)来学习。同时Classifier为未打label标签进行分类后,这个(Xc,Yc)会帮助D进行学习。
生成式对抗网络相关模型论文阅读整理,不服来Generative Adversarial Networks
Triple Generative Adversarial Nets


本文的所有图片若无注明,均来自原始论文的截图或Hung-yi Lee的Tutorial for Generative Adversarial Network。

笔者只是初学者,若有指出错误万分感谢。

相关文章: