WGAN-div:默默无闻的WGAN填坑者 | 附开源代码
作者丨苏剑林
单位丨广州火焰信息科技有限公司
研究方向丨NLP,神经网络
个人主页丨kexue.fm
今天我们来谈一下 Wasserstein 散度,简称“W 散度”。注意,这跟 Wasserstein 距离(Wasserstein distance,简称“W 距离”,又叫 Wasserstein 度量、Wasserstein metric)是不同的两个东西。
本文源于论文 Wasserstein Divergence for GANs,论文中提出了称为 WGAN-div 的 GAN 训练方案。
这是一篇我很是欣赏却默默无闻的 paper,我只是找文献时偶然碰到了它。不管英文还是中文界,它似乎都没有流行起来,但是我感觉它是一个相当漂亮的结果。
▲ WGAN-div的部分样本(2w iter)
如果读者需要入门一下 WGAN 的相关知识,不妨请阅读拙作互怼的艺术:从零直达 WGAN-GP。
WGAN
我们知道原始的 GAN(SGAN)会有可能存在梯度消失的问题,因此 WGAN 横空出世了。
W距离
WGAN 引入了最优传输里边的 W 距离来度量两个分布的距离:
这里的 p̃(x) 是真实样本的分布,q(x) 是伪造分布,c(x,y) 是传输成本,论文中用的是 c(x,y)=‖x−y‖;而 γ∈Π(p̃(x),q(x)) 的意思是说:γ 是任意关于 x,y 的二元分布,其边缘分布则为 p̃(x) 和 q(y)。
直观来看,γ 描述了一个运输方案,而 c(x,y) 则是运输成本,Wc(p̃(x),q(x)) 就是说要找到成本最低的那个运输方案所对应的成本作为分布度量。
对偶问题
W 距离确实是一个很好的度量,但显然不好算。当 c(x,y)=‖x−y‖ 时,我们可以将其转化为对偶问题:
其中 T(x) 是一个标量函数,‖T‖L 则是 Lipschitz 范数:
说白了,T(x) 要满足:
生成模型
这样一来,生成模型的训练,可以作为 W 距离下的一个最小-最大问题:
第一个 arg max 试图获得 W 距离的近似表达式,而第二个 arg min 则试图最小化 W 距离。
然而,T 不是任意的,需要满足 ‖T‖L≤1,这称为 Lipschitz 约束(L 约束),该怎么施加这个约束呢?因此,一方面,WGAN 开创了 GAN 的一个新流派,使得 GAN 的理论上了一个新高度,另一方面,WGAN 也挖了一个关于 L 约束的大坑,这个坑也引得不少研究者前仆后继地跳坑。
L约束
目前,往模型中加入 L 约束,有三种主要的方案。
权重裁剪
这是 WGAN 最原始的论文所提出的一种方案:在每一步的判别器的梯度下降后,将判别器的参数的绝对值裁剪到不超过某个固定常数。
这是一种非常朴素的做法,现在基本上已经不用了。其思想就是:L 约束本质上就是要网络的波动程度不能超过一个线性函数,而激活函数通常都满足这个条件,所以只需要考虑网络权重,最简单的一种方案就是直接限制权重范围,这样就不会抖动太剧烈了。
梯度惩罚
这种思路非常直接,即 ‖T‖L≤1 可以由 ‖∇T‖≤1 来保证,所以干脆把判别器的梯度作为一个惩罚项加入到判别器的 loss 中:
但问题是我们要求 ‖T‖L≤1 是在每一处都成立,所以 r(x) 应该是全空间的均匀分布才行,显然这很难做到。所以作者采用了一个非常机智(也有点流氓)的做法:在真假样本之间随机插值来惩罚,这样保证真假样本之间的过渡区域满足 L 约束。
这种方案就是 WGAN-GP。显然,它比权重裁剪要高明一些,而且通常都 work 得很好。但是这种方案是一种经验方案,没有更完备的理论支撑。
谱归一化
另一种实现 L 约束的方案就是谱归一化(SN),可以参考我之前写的文章深度学习中的Lipschitz约束:泛化与生成模型。
本质上来说,谱归一化和权重裁剪都是同一类方案,只是谱归一化的理论更完备,结果更加松弛。而且还有一点不同的是:权重裁剪是一种“事后”的处理方案,也就是每次梯度下降后才直接裁剪参数,这种处理方案本身就可能导致优化上的不稳定;谱归一化是一种“事前”的处理方案,它直接将每一层的权重都谱归一化后才进行运算,谱归一化作为了模型的一部分,更加合理一些。
尽管谱归一化更加高明,但是它跟权重裁剪一样存在一个问题:把判别器限制在了一小簇函数之间。也就是说,加了谱归一化的 T,只是所有满足 L 约束的函数的一小部分。因为谱归一化事实上要求网络的每一层都满足 L 约束,但这个条件太死了,也许这一层可以不满足 L 约束,下一层则满足更强的 L 约束,两者抵消,整体就满足 L 约束,但谱归一化不能适应这种情况。
WGAN-div
在这种情况下,Wasserstein Divergence for GANs 引入了 W 散度,它声称:现在我们可以去掉 L 约束了,并且还保留了 W 距离的好性质。
论文回顾
有这样的好事?我们来看看 W 散度是什么。一上来,作者先回顾了一些经典的 GAN 的训练方案,然后随手扔出一篇文献,叫做 Partial differential equations and monge-kantorovich mass transfer [1],里边提供了一个方案(下面的出场顺序跟论文有所不同),能直接将 T 训练出来,目标是(跟原文的写法有些不一样):
这里的 r(x) 是一个非常宽松的分布,我们后面再细谈。整个 loss 的意思是:你只要按照这个公式将 T 训练出来,它就是 (2) 式中 T 的最优解,也就是说,接下来只要把它代进 (2) 式,就得到了 W 距离,最小化它就可以得到生成器了。
一些注解
首先,我为什么说作者“随手”跑出一篇论文呢?因为作者确实是随手啊……
作者直接说“According to [19]”,然后就给出了后面的结果,[19] 就是这篇论文,是一篇最优传输和偏微分方程的论文,59 页。我翻来翻去,才发现作者引用的应该是 36 页和 40 页的结果(不过翻到了也没能进一步看懂,放弃了),也不提供多一点参考资料,尴尬。
还有后面的一些引理,作者也说“直接去看 [19] 的 discussion 吧”..... 然后,读者更多的疑问是:这玩意跟梯度惩罚方案有什么差别,加个负号变成最小化不都是差不多吗?
做实验时也许没有多大差别,但是理论上的差别是很大的,因为 WGAN-GP 的梯度惩罚只能算是一种经验方案,而 (7) 式是有理论保证的。后面我们会继续讲完它。
W散度
式 (7) 是一个理论结果,而不管怎样深度学习还是一门理论和工程结合的学科,所以作者一般化地考虑了下面的目标:
其中 k>0,p>1。基于此,作者证明了 Wk,p 有非常好的性质:
1. Wk,p 是个对称的散度。散度的意思是:D[P,Q]≥0 且 D[P,Q]=0⇔P=Q,它跟“距离”的差别是它不满足三角不等式,也有叫做“半度量”、“半距离”的。Wk,p 是一个散度,这已经非常棒了,因为我们大多数 GAN 都只是在优化某个散度而已。散度意味着当我们最小化它时,我们真正是在缩小两个分布的距离。
2. Wk,p 的最优解跟 W 距离有一定的联系。(7) 式就是一个特殊的 W1/2,2。这说明当我们最大化 Wk,p 得到 T 之后,可以去掉梯度项,通过最小化 (8) 来训练生成器。这也表明以 Wk,p 为目标,性质跟 W 距离类似,不会有梯度消失的问题。
3. 这是我觉得最逗的一点,作者证明了:
不总是一个散度。当 n=1,p=2 时这就是 WGAN-GP 的梯度惩罚,作者说它不是一个散度,明摆着要跟 WGAN-GP 对着干。不是散度意味着 WGAN-GP 在训练判别器的时候,并非总是会在拉大两个分布的距离(鉴别者在偷懒,没有好好提升自己的鉴别技能),从而使得训练生成器时回传的梯度不准。
WGAN-div
好了,说了这么久,终于可以引入 WGAN-div 了,其实就是基于 (9) 的 WGAN 的训练模式了:
前者是为了通过 W 散度 Wk,p 找出 W 距离中最优的 T,后者就是为了最小化 W 距离。所以,W 散度的角色,就是一个为 W 距离的默默无闻的填坑者,再结合这篇论文本身的鲜有反响,我觉得这种感觉更加强烈了。
实验
k,p的选择
作者通过做了一批搜索实验,发现 k=2,p=6 时效果最好(用 FID 为指标)。这进一步与 WGAN-GP 的做法有出入:范数的二次幂并非是最好的选择。
▲ 不同的k,p对FID的影响(FID越小越好)
r(x)的选择
前面我们就说过,W 散度中对 r(x) 的要求非常宽松,论文也做了一组对比实验,对比了常见的做法:
真假样本随机插值
真样本之间随机插值、假样本之间随机插值
真假样本混合后,随机选两个样本插值
直接选原始的真假样本混合
直接只选原始的假样本
直接只选原始的真样本
结果发现,在 WGAN-div 之下这几种做法表现都差不多(用 FID 为指标),但是对于 WGAN-GP,这几种做法差别比较大,而且 WGAN-GP 中最好的结果比 WGAN-div 中最差的结果还要差。这时候 WGAN-GP 就被彻底虐倒了。
▲ 不同采样方式所导致的不同模型的FID不同差异(FID越小越好)
这里边的差别不难解释,WGAN-GP 是凭经验加上梯度惩罚,并且“真假样本随机插值”只是它无法做到全空间采样的一个折衷做法,但是 W 散度和 WGAN-div,从理论的开始,就没对 r(x) 有什么严格的限制。
其实,原始 W 散度的构造(这个需要看参考论文)基本上只要求 r(x) 是一个样本空间跟 p̃(x)、q(x) 一样的分布,非常弱的要求,而我们一般选择为 p̃(x)、q(x) 两者共同衍生出来的分布,相对来说收敛快一点。
参考代码
自然是用 Keras 写的,人生苦短,我用 Keras。
https://github.com/bojone/gan/blob/master/keras/wgan_div_celeba.py
随机样本(自己的实验结果):
▲ WGAN-div的部分样本(2w iter)
当然,原论文的实验结果也表明 WGAN-div 是很优秀的:
▲ WGAN-div与不同的模型在不同的数据集效果比较(指标为FID,越小越好)
结语
不知道业界是怎么看这篇 WGAN-div 的,也许是觉得跟 WGAN-GP 没什么不同,就觉得没有什么意思了。不过我是很佩服这些从理论上推导并且改进原始结果的大牛及其成果。虽然看起来像是随手甩了一篇论文然后说“你看着办吧”的感觉,但这种将理论和实践结合起来的结果仍然是很有美感的。
本来我对 WGAN-GP 是多少有些芥蒂的,总觉得它太丑,不想用。但是 WGAN-div 出现了,在我心中已经替代了 WGAN-GP,并且它不再丑了。
相关链接
[1]. Evans, L.C.: Partial differential equations and monge-kantorovich mass transfer. Current developments in mathematics 1997(1) (1997) 65–126
点击以下标题查看作者其他文章:
变分自编码器VAE:原来是这么一回事 | 附开源代码
变分自编码器VAE:这样做为什么能成?
深度学习中的互信息:无监督提取特征
全新视角:用变分推断统一理解生成模型
细水长flow之NICE:流模型的基本概念与实现
细水长flow之f-VAEs:Glow与VAEs的联姻
深度学习中的Lipschitz约束:泛化与生成模型
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。
▽ 点击 | 阅读原文 | 查看作者博客
WGAN-div:默默无闻的WGAN填坑者 | 附开源代码相关推荐
- android 适配简单粗暴,Android10填坑适配指南(实际经验代码)
Android10填坑适配指南(实际经验代码) 发布时间:2019-12-03 09:40 来源:互联网 当前栏目:web技术类 今天看到一篇好的文章,分享给大家,膜拜大佬. Android10填坑适 ...
- 卷积神经网络失陷,CoordConv来填坑(附代码&视频)
来源: 机器之心 本文约5632字,建议阅读10分钟. 本文讲述了卷积神经网络在涉及坐标建模等方面的缺陷,但是提出了CoordConv 作为解决方案. [ 导读 ] 卷积神经网络拥有权重共享.局部连接 ...
- 填坑-关于SysTick定时器
目录 01.坑的由来 02.填坑 03.修改代码验证 04.总结 本文主要来填坑,更正之前文章的错误.也进一步加深了我对SysTick定时器的理解,希望对你有帮助. 01.坑的由来 在之前的推文中&l ...
- NIOS_II填坑之路——EPCS出现“Cannot open flash device”解决办法
读写EPCS出现"Cannot open flash device"的解决办法 SOPC填坑--第n天 代码看了千万遍,Debug千万遍,alt_flash_open_dev(EP ...
- 关于Echarts的填坑之旅
正如标题所说,这是Echarts的一遍填坑,如果你是一些echart的配置的话可以阅读 http://echarts.baidu.com/opti...的官网配置信息.今天我想给大家分享的是一些我前段 ...
- ASP.NET MVC 支付宝当面付(沙箱环境)-即扫二维码支付1(填坑)
1,环境 我用的是 vs2017 创建一个 mvc项目 新建一个文件夹将 SDK 文件放进去 sdk地址 :https://support.open.alipay.com/docs/doc.h ...
- jQuery Mobile使用中遇到的坑!填坑很难,但很有成就感。。
jQuery Mobile使用中遇到的坑!填坑很难,但很有成就感.. 最近参与到一个项目的前端开发中,为了提高用户体验使用到了jQuery Mobile.主要是用到了页面过渡效果,这种效果可以做到页面 ...
- H5填坑笔记--持续更新
最近一直在做移动端的页面,发现很多的坑,这里做一下总结,填填坑-- css常见的问题(一) 一.iOS键盘首字母自动大写 IOS的机子,默认英文输入法状态下,首字母是自动大写的,有时候挺烦人的. 在i ...
- css|direction: rtl;填坑
direction: rtl;填坑 direction: rtl;造成的问题是特殊符号结尾会显示在文本的最左边. <html><head><style type=&quo ...
最新文章
- [Nodejs原理] 核心库Libuv入门(Hello World篇)
- 视频+案例,玩转LightGBM
- IDEA 工具从Json自动生成JavaBean
- SprinMVC 拦截器验证权限和登录与注销的实现
- win7安装AHCI驱动
- 电路串联和并联图解_蓄电池串联与并联方式图解
- Mac生成和查看SSH Key
- pagefile.sys删除
- 融360 D轮融资超10亿 平台型互联网金融价值凸显
- car | 线性回归(三)——残差分析和异常点检验
- 【NeurIPS2022】阿里提出基于离散化对抗训练的鲁棒视觉新基准
- Yapi远程命令执行漏洞
- 实验十二、十三 配置PPP协议、配置Frame-relay协议
- Aspose.Words开发者指南
- 2023考研辅导机构:考研复试调剂十大问题答疑
- 知识图谱学习笔记02-经典的知识图谱项目介绍
- 好用的蓝牙耳机推荐,试试这几款绝对超值
- 微信端字体图标显示不正常(不显示/显示成方框)
- Veeam Backup Replication 12 配置信息备份
- 在iPad上运行一个Linux系统:iSH Shell
热门文章
- 常用模块(数据序列化 json、pickle、shelve)
- springboot 静态注入 单例
- web.xml中load-on-startup的作用
- ora-24811提供写入的数据少于指定的数据_C++开源、高性能时序数据库pinusdb
- linux ffmpeg 64下载,linux ffmpeg 怎么编64位
- Android图片粘上后仍错误,android – 在Activity被销毁后,ImageView上的图像丢失了
- php需要什么技能,成为一个好的PHP工程师需要掌握什么技能
- spark 数据存储
- mac笔记本怎么外接显示屏_苹果MAC笔记本怎么外接显示器?
- python脚本自动运行失败_解决Python中定时任务线程无法自动退出的问题