深度学习-->Improved GAN-->WGAN

上两篇博文介绍和总结了Generative Adversarial Network 的原始版本以及改进后的版本fGAN,本篇博文将详细总结WGAN

Earth Mover Distance

original GAN 中,我们采用JensenShannon divergence 来衡量两种分布之间的拟合程度,在fGAN 中我们可以采用any fdivergence 来衡量不同分布之间的拟合程度,那么在WGAN中呢?

WGAN中采取一种叫做Earth Movers Distance 方式来衡量两种分布的拟合程度。

简单来说,假设有两种不同的分布分别为PQ,将P移动Q的位置与Q重合所移动的最小平均距离即为Earth Movers Distance。如下图:

深度学习-->Improved GAN-->WGAN

显然对于不同的移动方式(move plan),其移动距离是不一样的,例如下图:

深度学习-->Improved GAN-->WGAN

那么存在多种move plans 的情况下,如何定义上面的平均距离average move plan 呢?

对于所有可能的moving plans,也即是 all possible move plans Πγ表示某一种move planxpxq 分布表示PQ分布中某一个区间的概率。那么对于plan γ 的平均移动距离即为:

B(γ) = xp,xqγ(xp,xq)xpxq

其中γ(xp,xq)表示移动的量。

那么Earth Movers Distance 即为:

W(P,Q)=minγΠ B(γ)

那么使用Earth Movers Distance 有什么好处呢?

深度学习-->Improved GAN-->WGAN

显然相对于使用JensenShannon divergenceEarth Movers Distance 能检测到两种分布拟合程度,即使是在没有重合的情况下,那么在use gradient descent minmize Earth Movers Distance 时就有动力更新G

Original version (weight clipping)

论文:Martin Arjovsky,Soumith Chintala,Lé on Bottou,Wasserstein GAN,arXiv prepring,2017

推导过程

那么上面所说的Earth Movers Distance 的具体数学公式是什么呢?在WGAN的论文里面是这样定义的:

W(Pdata,PG)=maxD1Lipschitz{ExPdata[D(x)]ExPG[D(x)]}

这里需要介绍下Lipschitz Function

深度学习-->Improved GAN-->WGAN

我们可以这样理解:在 maximize W(Pdata,PG) ,如果不加D1Lipschitzmax 条件时,那么岂不是ExPdata[D(x)]+ExPG[D(x)],所以有必要加上这个条件,而这个条件的意义就是希望DPdataPG相差不要太大,不要变化太大太快。

那么当 k=1时有:

深度学习-->Improved GAN-->WGAN

相比在original gan 中,其Discriminator 是一个二元分类器,输出时加了sigmoid函数(因为有log),则其D(x) 图像可能如下:

深度学习-->Improved GAN-->WGAN
蓝色线条表示Pdata,橙色线条表示PGDPdata处可能为1,在PG处可能为0,并且在两端非常平滑,不易反向更新G。那么如果采取W(Pdata,PG),会有什么样的结果呢?

深度学习-->Improved GAN-->WGAN

上图的绿色的直线就是可能的D(x) for WGAN,因为其输出不需要加上sigmoid函数,在PdataPG出斜率比较大,不容易产生gradient vanish gradient explod 现象。

接下来的问题是如何得到下式的最优解,假如没有加max条件的话,我们可以直接利用gradient descent来求D的最优解的近似解,但是前面加了现在条件时How to use gradient descent to optimize?

W(Pdata,PG)=maxD1Lipschitz{ExPdata[D(x)]ExPG[D(x)]}

WGAN的原始论文中采用了一种叫做weight clipping 的方法,简单来说就是限制Dweight w[c,c]之间,也就是在更新参数时,始终做如下操作:

if w>c,then w=c; if w<c, then w=c

weight clipping做法的意义也就是保证D输出的变化在一定范围之内,在进行这种操作以后,我们仅仅能保证:
D(x1)D(x2)Kx1x2 for some K

这个时候有DKLipschitzWGAN论文中说相应的有:

深度学习-->Improved GAN-->WGAN

此时已经把条件放宽到KLipschitz,也就是做weight clipping后可以保证满足DKLipschitz,但是这样做不能保证真的最大化了ExPdata[D(x)]ExPG[D(x)],并且可能weight 参数w不在[c,c]之间也可能会满足上面DKLipschitz条件。

来看看做了weight clipping后有什么好处?

深度学习-->Improved GAN-->WGAN

如上图,如果在更新D没有做weight clipping,则D会对Pdata赋予越来越大的值,对PG赋予越来越小的值,这样train的话没办法停止,就是train飞了。所以一定要clipping,如果Discriminator是一条直线的话,就限制了直线的斜率。

算法总结

深度学习-->Improved GAN-->WGAN

Improved version (gradient penalty)

论文:Ishaan Gulrajani,Faruk Ahmed,Martin Arjovsky,Vincent Dumoulin,Aaron Courville,Improved Training of Wasserstein GANs,arXiv prepring,2017

由上面的推导总结已经可知:

W(Pdata,PG)=maxD1Lipschitz{ExPdata[D(x)]ExPG[D(x)]}

因为D1Lipschitz,所以可得:

深度学习-->Improved GAN-->WGAN

上式的意思就是对于任意的xxD(x) 表示 Dinputoutputgradient 都小于1

有了这个约束条件,我们可以利用以前学习的给object function添加惩罚项的思路,可以去掉D1Lipschitz,而去添加一个惩罚项,如下:

深度学习-->Improved GAN-->WGAN

由上式,当xD(x)1,则惩罚项对W的影响为0,当 xD(x)>1时,才会对W产生影响。所以加上这样的一个惩罚项以后,更容易产生符合xD(x)1D

但是在实做的时候不可能对所有的x做:

xmax(0,xD(x)1)

只能可能是从某一个uniform distributionsample出一些x

深度学习-->Improved GAN-->WGAN

但实际上,在Improved WGAN的论文中,这个Ppenalty并不是一个uniform distribution,而是如下图sample

深度学习-->Improved GAN-->WGAN

就是每次从Pdatasample一个点,从PGsample有个点,然后将其连成一条直线,从这条直线上再次sample一个点,作为从Ppenaltysample的点。

那么为什么这么做呢?论文中只是说这样做的效果比较好。

可以更进一步的思考,WGAN的核心就是围绕着D1Lipschitz这个条件进行,无论是weight clipping还是加惩罚项,目的都是不希望D的输出在某一个范围内,也即是:

D(x1)D(x2)x1x2 

那么这个时候xD(x)1,在上面加惩罚项时,当xD(x)1penalty,反之有。我们希望更新的Dpdata上面有较高的值,相反在PG上有较低的值,两者相差越大越好,说明这时D能很好的分辨,但是有不能相差太大,相差太大的话就会train飞了,既然如此,我们何不直接使得xD(x)==1呢?这样update出来的D岂不是更好?所以W(pdata,PG)有了如下改进:

深度学习-->Improved GAN-->WGAN