博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
抛开复杂证明,我们从直觉上理解W-GAN为啥这么好训
阅读量:5835 次
发布时间:2019-06-18

本文共 2007 字,大约阅读时间需要 6 分钟。

这篇文章要结合另一篇来看.讲述的挺清晰的,好评!

欢迎关注作者

关于GAN基础的知识,大家可以参考我另一篇

最关键的地方其实是D(X),即对整个H*W*C这个高维空间的评分系统,好不好训,最关键的地方其实是D(X)的打分是否是从G(X)(生成分布)的支撑集的低分逐渐升高到R(X)(真实分布)的支撑集处的高分,从而使得G(X)这个生成分布可以顺着D(X)的梯度不断靠近真实分布R(X)。

以往的损失函数在固定G后train出来的D(X)都没能很好的构造出这种梯度,所以train不起来,而W-GAN做到了。

W-GAN: 论文证明原始GAN的损失在D取极值时候描述的是JS散度,而具有特定语义特征的图片在高维空间中呈现的应该是一个manifold,两分布支撑集冲重叠部分的measure为0,随机初始化参数后,训练完D,对G来说,G的的梯度一直都是零,因为生分布与真实分布没有重合的时候,JS散度一直都是0,所以才有了D不能train的太好的训练经验。至于Ian Goodfellow提出的“- log D trick”,对G来说,包含梯度的部分实际是

注意KL散度是非对称的, ,KL散度趋于0,即G会趋向于不生成这部分真实的图片,因为这时候惩罚很小,而 ,KL趋向于 ,惩罚巨大,因此G确实就趋向于不生成假的图片,这种不对称性,就使得G仅仅在学到的部分真实分布停滞不前,而把其他还没有学到的概率空间的某些 存在分布的地方直接置为零,因为这样惩罚很小,就产生了所说的collapse mode情况。为了解决这样的问题,作者提出了Wassertein 距离,其可以度量两个分布没有重合时候的距离,也就是可以提供 改善自己的梯度,其实具体的推导没有看懂,但是从最后结果的表示来看,可以有一个直观的理解。

D的目标就是最大化 ,同时要让D满足L-Lipschitz < 某个常数K,我们从直觉上理解这种限制,假如不进行Lipschitz常数的限制,那么D会倾向于给fake sample打低分,给real sample打高分,而两者之间的D(X)会倾向于产生一个gap,这样对于与真实分布 与G映射出来的分布 之间就形成不了有效的梯度(看我垃圾手绘中的图一),即G会不知道如何让fake sample改变来获得高分。加上Lipschitz限制条件之后,在D使得上面的损失函数最大化的时候,因为梯度不能太大,D不能无脑的并且无限制的给fake打低分,给real打给分,因为这样会使得fake与real只之间的Lipschitz大于k,也就是加上此限制后,D(X)并不会在fake分布的区域打很低的分数,然后经历一个gap到real分布的很高的参数,而是在fake与real之间形成一个较为平缓的坡,fake处G可以了解到往哪里移动过可以获得更高的分数,从而解决对G来说梯度消失的问题。实现的时候想到了一个方法就是简单将参数clip,简单的限制到一个区间中,这样经过简单的乘加,Lipschitz必定是限制在某个上限下。

W-GANGP: 很快大家发现简单的限制参数范围效果并不好,因为W的简单限制使得网络的表达能力受限,因为D为了使得fake 与real的差距变大,那么大多数参数必定都简单的达到clip的上限或者下限,极大的限制了网络的拟合能力,并且在这样的简单的clip情况下,非常容易引起梯度消失或者梯度爆炸,因为许多的clip上界或者下界相乘,clip稍大就可能爆炸,稍小就可能消失。于是作者就想到了另一种限制Lipschitz的方法 --- Gradient Penalty。想法是朴素的,就是为了限制D的梯度,干脆直接设置一个惩罚项,最后选择惩罚项为

原本我们是希望不出现fake 与 real 之间的梯度不要很大大,而fake跟real的区域几乎没有梯度,而这个惩罚项,现在直接希望其梯度能尽量接近某个常数,作者仅仅是说实验上这个带来的更好的效果,但是我看来这是可以解释的,因为这个限制可以让fake sample1之间也能产生梯度,因为同是fake但是距离真实的分布的距离还是有所不同的,加上此限制后,每个fake sample 都处在一个有梯度地方(渣渣手绘的图三),此时梯度下降时显然会收敛的更快,而类似

这样的panalty,其可能仅仅限制fake 与 real 之间的梯度,使得距离real 较近的fake 点可以感受到梯度,而距离较远的可能就感受不到,梯度下降时候还是较慢。

我手画了一张图来对比这些不同。

实际实现的时候,我们想要在整个样本空间上对梯度加以限制是困难的,那么如何施加这种限制呢,其实我们仅仅限制fake 与real,以及他们之间的空间梯度就可以了,我们可以在fake 与real 的sample之间进行线性的插值,作为中间区域的空间的取样,并对他们的梯度做策划惩罚就可以了。

转载地址:http://uzycx.baihongyu.com/

你可能感兴趣的文章
建议收藏:你想要的开发和设计资源全部都在这里
查看>>
基于 D3.js 绘制动态进度条
查看>>
你为什么会被解雇? — Top 10 面试问题解析
查看>>
lodash源码分析之缓存使用方式的进一步封装
查看>>
Android复杂数据流的“高效”渲染(二)
查看>>
Android监测用户行为之中AOP编程之AspectJ实战
查看>>
用 Swift 来刷 leet code 吧 (1-20)
查看>>
20分钟上手 webAssembly
查看>>
SpringBoot下使用定时任务的方式全揭秘
查看>>
强引用、弱引用、软引用
查看>>
Maven构建自动化
查看>>
说好的敬畏每一行代码呢?Antd代码彩蛋炸翻一圈人
查看>>
区块链Hyperledger Fabric的落地挑战与阿里云探索经验分享
查看>>
(翻译) MongoDB(20)配置 mongo Shell
查看>>
一个简单的chrome拓展程序开发
查看>>
车内逃脱支持网址(Car Escape Support URL)
查看>>
你不知道的jQuery
查看>>
工作手记之工作点滴积累之Javascript方法篇
查看>>
使用 Reek 检查 feature branch 相关文件的 code smell
查看>>
Kali Linux 秘籍 第五章 漏洞评估
查看>>