上两篇博文介绍和总结了Generative Adversarial Network 的原始版本以及改进后的版本f−GAN,本篇博文将详细总结WGAN
Earth Mover Distance
在original GAN 中,我们采用Jensen−Shannon divergence 来衡量两种分布之间的拟合程度,在f−GAN 中我们可以采用any f−divergence 来衡量不同分布之间的拟合程度,那么在WGAN中呢?
WGAN中采取一种叫做Earth Mover′s Distance 方式来衡量两种分布的拟合程度。
简单来说,假设有两种不同的分布分别为P、Q,将P移动Q的位置与Q重合所移动的最小平均距离即为Earth Mover′s Distance。如下图:

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

那么存在多种move plans 的情况下,如何定义上面的平均距离average move plan 呢?
对于所有可能的moving plans,也即是 all possible move plans Π,γ表示某一种move plan,xp、xq 分布表示P、Q分布中某一个区间的概率。那么对于plan γ 的平均移动距离即为:
B(γ) = ∑xp,xqγ(xp,xq)∥∥xp−xq∥∥
其中
γ(xp,xq)表示移动的量。
那么Earth Mover′s Distance 即为:
W(P,Q)=minγ∈Π B(γ)
那么使用Earth Mover′s Distance 有什么好处呢?

显然相对于使用Jensen−Shannon divergence ,Earth Mover′s Distance 能检测到两种分布拟合程度,即使是在没有重合的情况下,那么在use gradient descent minmize Earth Mover′s Distance 时就有动力更新G。
Original version (weight clipping)
论文:Martin Arjovsky,Soumith Chintala,Lé on Bottou,Wasserstein GAN,arXiv prepring,2017
推导过程
那么上面所说的Earth Mover′s Distance 的具体数学公式是什么呢?在WGAN的论文里面是这样定义的:
W(Pdata,PG)=maxD∈1−Lipschitz{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}
这里需要介绍下Lipschitz Function:

我们可以这样理解:在 maximize W(Pdata,PG) ,如果不加D∈1−Lipschitzmax 条件时,那么岂不是Ex∼Pdata[D(x)]→+∞ ,Ex∼PG[D(x)]→−∞,所以有必要加上这个条件,而这个条件的意义就是希望D 在Pdata、PG相差不要太大,不要变化太大太快。
那么当 k=1时有:

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

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

上图的绿色的直线就是可能的D(x) for WGAN,因为其输出不需要加上sigmoid函数,在Pdata、PG出斜率比较大,不容易产生gradient vanish 或gradient explod 现象。
接下来的问题是如何得到下式的最优解,假如没有加max条件的话,我们可以直接利用gradient descent来求D的最优解的近似解,但是前面加了现在条件时How to use gradient descent to optimize?
W(Pdata,PG)=maxD∈1−Lipschitz{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}
WGAN的原始论文中采用了一种叫做weight clipping 的方法,简单来说就是限制D的weight w在[−c,c]之间,也就是在更新参数时,始终做如下操作:
if w>c,then w=c; if w<−c, then w=−c
weight clipping做法的意义也就是保证
D输出的变化在一定范围之内,在进行这种操作以后,我们仅仅能保证:
∥D(x1)−D(x2)∥≤K∥x1−x2∥ for some K
这个时候有
D∈K−Lipschitz,
WGAN论文中说相应的有:

此时已经把条件放宽到K−Lipschitz,也就是做weight clipping后可以保证满足D∈K−Lipschitz,但是这样做不能保证真的最大化了Ex∼Pdata[D(x)]−Ex∼PG[D(x)],并且可能weight 参数w不在[−c,c]之间也可能会满足上面D∈K−Lipschitz条件。
来看看做了weight clipping后有什么好处?

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

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)=maxD∈1−Lipschitz{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}
因为
D∈1−Lipschitz,所以可得:

上式的意思就是对于任意的x,∥▿xD(x)∥ 表示 D 的input对output的gradient 都小于1。
有了这个约束条件,我们可以利用以前学习的给object function添加惩罚项的思路,可以去掉D∈1−Lipschitz,而去添加一个惩罚项,如下:

由上式,当∥▿xD(x)∥≤1,则惩罚项对W的影响为0,当 ∥▿xD(x)∥>1时,才会对W产生影响。所以加上这样的一个惩罚项以后,更容易产生符合∥▿xD(x)∥≤1的D。
但是在实做的时候不可能对所有的x做:
∫xmax(0,∥∥▽xD(x)−1∥∥)
只能可能是从某一个uniform distribution内sample出一些x。

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

就是每次从Pdata中sample一个点,从PG中sample有个点,然后将其连成一条直线,从这条直线上再次sample一个点,作为从Ppenalty中sample的点。
那么为什么这么做呢?论文中只是说这样做的效果比较好。
可以更进一步的思考,WGAN的核心就是围绕着D∈1−Lipschitz这个条件进行,无论是weight clipping还是加惩罚项,目的都是不希望D的输出在某一个范围内,也即是:
∥D(x1)−D(x2)∥≤∥x1−x2∥
那么这个时候
∥▿xD(x)∥≤1,在上面加惩罚项时,当
∥▿xD(x)∥≤1无
penalty,反之有。我们希望更新的
D在
pdata上面有较高的值,相反在
PG上有较低的值,两者相差越大越好,说明这时
D能很好的分辨,但是有不能相差太大,相差太大的话就会
train飞了,既然如此,我们何不直接使得
∥▿xD(x)∥==1呢?这样
update出来的
D岂不是更好?所以
W(pdata,PG)有了如下改进:
