深度学习-->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 。如下图:

这里写图片描述

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

这里写图片描述

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

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

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

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

那么 Earth Movers Distance 即为:

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

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

这里写图片描述

显然相对于使用 JensenShannon divergence Earth 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

这里写图片描述

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

那么当 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 函数,在 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 的方法,简单来说就是限制 D weight 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

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

这里写图片描述

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

来看看做了 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)=maxD1Lipschitz{ExPdata[D(x)]ExPG[D(x)]}

因为 D1Lipschitz ,所以可得:

这里写图片描述

上式的意思就是对于任意的 x xD(x) 表示 D input output gradient 都小于 1

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

这里写图片描述

由上式,当 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 的核心就是围绕着 D1Lipschitz 这个条件进行,无论是 weight clipping 还是加惩罚项,目的都是不希望 D 的输出在某一个范围内,也即是:

D(x1)D(x2)x1x2 

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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/mr_tyting/article/details/79346768
今日推荐