生成对抗网络学习——WGAN

笑着哭i 提交于 2019-12-17 03:46:13


WGAN,全称是Wasserstein GAN。

【paper】:

https://arxiv.org/abs/1701.07875

【GitHub】:

参考资料:

原理:

1、令人拍案叫绝的Wasserstein GAN

2、李弘毅GAN网络MOOC

代码解读:

【1】WGAN-GP代码及注释
https://blog.csdn.net/qq_20943513/article/details/73129308

【2】包括了DCGAN,LSAGN,WGAN,以及WGAN-GP的代码
https://blog.csdn.net/Diana_Z/article/details/87184465

【3】WGAN代码解读及实验总结
https://blog.csdn.net/CLOUD_J/article/details/94392474


一、WGAN原理

自从2014年Ian Goodfellow提出以来,GAN就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进DCGAN依靠的是对判别器和生成器的架构进行实验枚举,最终找到一组比较好的网络架构设置,但是实际上是治标不治本,没有彻底解决问题。而Wasserstein GAN(下面简称WGAN)成功地做到了以下爆炸性的几点:

  • 彻底解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度
  • 基本解决了collapse mode的问题,确保了生成样本的多样性
  • 训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代表GAN训练得越好,代表生成器产生的图像质量越高( 训练进程的指标,我们搞机器学习最关心的东西,重点了解一下
  • 以上一切好处不需要精心设计的网络架构,最简单的多层全连接网络就可以做到( 这是否意味着网络架构没有用了?

从以下几个角度对WGAN进行解释介绍:

  • 原始GAN究竟出了什么问题?
  • KL散度,JS散度
  • Wasserstein距离的优越性质
  • 从Wasserstein距离到WGAN

第一部分:原始GAN究竟出了什么问题?

原始GAN中判别器要最小化如下损失函数,也就是尽可能把真实样本分为正例(打高分),生成样本分为负例(打低分):

在这里插入图片描述

其中Pr是真实样本分布,Pg是由生成器产生的样本分布。

对于生成器,Goodfellow一开始提出来一个损失函数,后来又提出了一个改进的损失函数,分别是

在这里插入图片描述

生成器的loss代表着两个分布之间的距离

第一种原始GAN形式的问题

一句话概括:判别器越好,生成器梯度消失越严重。

在生成器G固定参数时最优的判别器D应该是什么

GAN训练有一个trick,就是别把判别器训练得太好,否则在实验中生成器会完全学不动(loss降不下去)

Kullback–Leibler divergence(简称KL散度)Jensen-Shannon divergence(简称JS散度)
两个重要的衡量相似度的指标

Wasserstein距离

不是很理解这几种散度的定义

当Pr与Pg的支撑集(support)是高维空间中的低维流形(manifold)时,Pr与Pg重叠部分测度(measure)为0的概率为1。

不用被奇怪的术语吓得关掉页面,虽然论文给出的是严格的数学表述,但是直观上其实很容易理解。首先简单介绍一下这几个概念:

支撑集(support) 其实就是函数的非零部分子集,比如ReLU函数的支撑集就是[公式],一个概率分布的支撑集就是所有概率密度非零部分的集合。
流形(manifold) 是高维空间中曲线、曲面概念的拓广,我们可以在低维上直观理解这个概念,比如我们说三维空间中的一个曲面是一个二维流形,因为它的本质维度(intrinsic dimension)只有2,一个点在这个二维流形上移动只有两个方向的自由度。同理,三维空间或者二维空间中的一条曲线都是一个一维流形。
测度(measure) 是高维空间中长度、面积、体积概念的拓广,可以理解为“超体积”。

在(近似)最优判别器下,最小化生成器的loss等价于最小化Pr与Pg之间的JS散度,而由于Pr与Pg几乎不可能有不可忽略的重叠,所以无论它们相距多远JS散度都是常数log2,最终导致生成器的梯度(近似)为0,梯度消失。

第二种原始GAN形式的问题

第三部分:Wasserstein距离的优越性质

Wasserstein距离又叫Earth-Mover(EM)距离,定义如下:
在这里插入图片描述
在这里插入图片描述
Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近。

举个简单的例子。。。

KL散度和JS散度是突变的,要么最大要么最小,Wasserstein距离却是平滑的,如果我们要用梯度下降法优化 θ 这个参数,前两者根本提供不了梯度,Wasserstein距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则KL和JS既反映不了远近,也提供不了梯度,但是Wasserstein却可以提供有意义的梯度。

第四部分:从Wasserstein距离到WGAN

既然Wasserstein距离有如此优越的性质,如果我们能够把它定义为生成器的loss,不就可以产生有意义的梯度来更新生成器,使得生成分布被拉向真实分布吗?

没那么简单,因为Wasserstein距离定义(公式12)中的在这里插入图片描述

没法求解,作者用了一个已有的定理把它变换为如下形式
在这里插入图片描述
证明过程被作者丢到论文附录中了,我们也姑且不管,先看看上式究竟是什么意思。

在这里插入图片描述
数学真是神奇!f是变量,我们要从所有满足条件的f中找到那个满足条件的f,就可以求出这个式子的值了,K也是一个不确定的值,可以自己随便取??只要能把f求出来?

此时求解公式13可以近似变成求解如下形式
在这里插入图片描述

那么,如何求f?(能够同时满足取到上界,Lipschitz常数又不能超过K的条件)

①用深度学习的方法,把f用一个带参数w的神经网络来表示,由于神经网络的拟合能力足够强大,我们有理由相信,这样定义出来的一系列fw虽然无法囊括所有可能,但是也足以高度近似公式13要求的那个了。

②我们其实不关心具体的K是多少,只要它不是正无穷就行,因为它只是会使得梯度变大K倍,并不会影响梯度的方向。所以作者采取了一个非常简单的做法

在这里插入图片描述
到此为止,我们可以构造一个含参数f、最后一层不是非线性激活层的判别器网络fw,在限制w不超过某个范围的条件下,使得
在这里插入图片描述
尽可能取到最大,此时L就会近似真实分布与生成分布之间的Wasserstein距离(忽略常数倍数K)。注意原始GAN的判别器做的是真假二分类任务,所以最后一层是sigmoid,但是现在WGAN中的判别器fw做的是近似拟合Wasserstein距离,属于回归任务,所以要把最后一层的sigmoid拿掉(鉴别器的任务都变了)

接下来生成器要近似地最小化Wasserstein距离,可以最小化L,由于Wasserstein距离的优良性质,我们不需要担心生成器梯度消失的问题。再考虑到L的第一项与生成器无关,就得到了WGAN的两个loss。

WGAN的两个loss
在这里插入图片描述
公式15是公式17的反,可以指示训练进程,其数值越小,表示真实分布与生成分布的Wasserstein距离越小,GAN训练得越好。(所以公式16的数值仅仅是用于训练使用,其实没有什么参考价值)

WGAN完整的算法流程(***gw是w的梯度的意思?***)
在这里插入图片描述
WGAN与原始GAN第一种形式相比,只改了四点:

  • 判别器最后一层去掉sigmoid
  • 生成器和判别器的loss不取log
  • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
  • 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

前三点都是从理论分析中得到的,已经介绍完毕;第四点却是作者从实验中发现的,属于trick,相对比较“玄”。作者发现如果使用Adam,判别器的loss有时候会崩掉,当它崩掉时,Adam给出的更新方向与梯度方向夹角的cos值就变成负数,更新方向与梯度方向南辕北辙,这意味着判别器的loss梯度是不稳定的,所以不适合用Adam这类基于动量的优化算法。作者改用RMSProp之后,问题就解决了,因为RMSProp适合梯度不稳定的情况。

最后补充一点论文没提到,但是我个人觉得比较微妙的问题。判别器所近似的Wasserstein距离能够用来指示单次训练中的训练进程,这个没错;接着作者又说它可以用于比较多次训练进程,指引调参,我倒是觉得需要小心些。比如说我下次训练时改了判别器的层数、节点数等超参,判别器的拟合能力就必然有所波动,再比如说我下次训练时改了生成器两次迭代之间,判别器的迭代次数,这两种常见的变动都会使得Wasserstein距离的拟合误差就与上次不一样。那么这个拟合误差的变动究竟有多大,或者说不同的人做实验时判别器的拟合能力或迭代次数相差实在太大,那它们之间还能不能直接比较上述指标,我都是存疑的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!