0
前言
上次带大家写了原始版的 GAN,只生成了高斯分布。但兔子哥哥发现在 GAN 论文的底下,有 GAN 生成图片的 example。
因此,这足以说明 GAN 亦有能力生成图片,并非只有 DCGAN 才能生成图片,这一点与我学 GAN 之前的认知大为不同。于是我就开始尝试了使用原始的 GAN 来尝试生成图像,但接下来,我就开始怀疑人生了。
在开始的时候我采用了 MINST 的数据集,按照我上一篇文章兔子哥哥带你从零写一个 GAN中提及的训练 GAN 的方式中连续训练原始 GAN 多次,得到的仍然全是噪点,并没有一点手写数字的影子。
在尝试多次后,未免让我怀疑我是不是读了假论文,自己是不是一只假兔子。
在查阅多番资料后,在知乎偶遇到,令人拍案叫绝的 Wasserstein GAN - 知乎专栏 (下文简称 WGAN) 一文,不读不知道,读了简直惊为天人。读完之后,我打消了原本打算去学习 DCGAN 的念头,改成继续学习 WGAN。因此,本文兔子哥哥将会带读者一起来领略一下 WGAN 的风采。
文章目录如下:
为什么原始 GAN 训练困难重重?
WGAN 是什么鬼?
WGAN 的个人一些使用经验总结
为什么原始的 GAN 这样问题重重?
在令人拍案叫绝的 Wasserstein GAN - 知乎专栏一文中提及(亦是论文中提及),原始 GAN 的优化目标经过一定的数学推断后,可以等价于最小化真实分布 P(r) 与生成分布 P(g) 的 JS 散度。那么什么叫 JS 散度呢,为此我们先引出 KL 散度。
KL 散度又称 KL 距离,亦叫相对熵。这里先给出 KL 散度的公式:
其中 p,g 为 x 的概率分布。在一定程度上,熵这个概念可以度量两个随机变量的距离,因此 KL 散度可衡量两概率分布的差异,特别注意一点是该距离并非对称距离,即:
得知 KL 散度后,那么 JS 散度就很好理解了,JS 散度的表达式是
显然,JS 散度可以解释成用 p 和 q 分布离 pq 的平均分布的相对熵来作为衡量 p,q 间的距离,这个时候,该距离就是对称的了。其中经过数学式子的推断,原始 GAN 的损失函数是可以改写成以下式子:
在令人拍案叫绝的 Wasserstein GAN - 知乎专栏中分析了 p,q 各取 0 与非 0 时,对损失函数的影响,而得出的结论是,无论 p 和 q 的取值如何,其 JS 散度都是常数值 log2,既然是常数,优化就无从谈起。
而从另一个更加通俗的角度来说,在优化中,KL 散度和 JS 散度是突变的,这就导致了,如果 D 训练得太好了,那么 G 就会被按在地上摩擦,进而训练 G 的时候梯度将会梯度不稳定,但如过 D 太差了,G 的梯度不正确,会使得 G 往错误的方向前进。这么说来,就好像老婆和老妈掉进河里,你救谁一样,怎么回答的火候是难以把握的。
WGAN 是什么鬼
故名思意,WGAN 就是指用 Wasserstein distance 来替代掉 JS 散度和 KS 散度来作为优化目标的 GAN 模型咯。
那么,什么叫 Wasserstein 距离呢?
下文引用于令人拍案叫绝的 Wasserstein GAN - 知乎专栏
Wasserstein 距离又叫 Earth-Mover(EM)距离,定义如下:
解释如下:是Pγ和Pg组合起来的所有可能的联合分布的集合,反过来说,中每一个分布的边缘分布都是Pγ和Pg。对于每一个可能的联合分布γ而言,可以从中采样得到一个真实样本x和一个生成样本y,并算出这对样本的距离,所以可以计算该联合分布γ下样本对距离的期望值。在所有可能的联合分布中能够对这个期望值取到的下界,就定义为 Wasserstein 距离。
直观上可以把理解为在这个 “路径规划” 下把Pγ这堆 “沙土” 挪到Pg“位置” 所需的 “消耗”,而就是 “最优路径规划” 下的 “最小消耗”,所以才叫 Earth-Mover(推土机)距离。
而对于怎么把 Wasserstein 距离化作我们训练中的损失函数,论文作者使用 Lipschitz 连续即一些已知的数学定理来使得目标函数转化为
存在函数f(w)其满足 Lipschiz 连续,在取上界,此时就是 Wasserstein 距离。显然这个函数可以用深度学习技术来拟合,而 Lipschitz 连续的限制,则可以通过限制每一层神经网络的权重的取值范围来控制。
归纳起来,在 WGAN 中,D 的任务不再是尽力区分生成样本与真实样本,而是尽量拟合出样本间的 Wasserstein 距离,从分类任务转化成回归任务。而 G 的任务则变成了尽力缩短样本间的 Wasserstein 距离。
故 WGAN 对原始 GAN 做出了如下改变:
D 的最后一层取消 sigmoid
D 的 w 取值限制在 [-c,c] 区间内。
使用 RMSProp 或 SGD 并以较低的学习率进行优化 (论文作者在实验中得出的 trick)
WGAN 的个人一些使用经验总结
这些经验是基于自身的实验得出,仅供参考
WGAN 的论文指出使用 MLP,3 层 relu,最后一层使用 linear 也能达到可以接受的效果,但根据我实验的经验上,可能对于彩色图片,因为其数值分布式连续,所以使用 linear 会比较好。但针对于 MINST 上,因为其实二值图片,linear 的效果很差,可以使用 batch normalization + sigmoid 效果更好。
不要在 D 中使用 batch normalization,估计原因是因为 weight clip 对 batch normalization 的影响
使用逆卷积来生成图片会比用全连接层效果好,全连接层会有较多的噪点,逆卷积层效果清晰。
关于衡量指标,Wasserstein distance 距离可以很好的衡量 WGAN 的训练进程,但这仅限于同一次,即你的代码从运行到结束这个过程内。
另外有一点,虽然在 WGAN 的论文里面把原始 GAN 说得那么不堪,但人家原始 GAN 在论文里面也是有成功生成图片的例子,所以特别想问一句,如过有小伙伴用原始 GAN 生成过质量可观的图片的话,欢迎冒泡,交流一下。
这个是我用 WGAN 用拟合出的 MINST 的效果,不算太理想,继续训练应该有较好效果,但 GAN 系列的收敛速度都好像有点感人。。。
后话
参考文献:
令人拍案叫绝的 Wasserstein GAN - 知乎专栏
我的 Github,我的 WGAN 的代码可在这里找到
个人的学习总结,并非教程,仅供参考,如有错误,欢迎指出和交流。
雷峰网版权文章,未经授权禁止转载。详情见转载须知。