GAN训练技巧汇总
GAN自推出以来就以训练困难著称,因为它的训练过程并不是寻找损失函数的最小值,而是寻找生成器和判别器之间的纳什均衡。前者可以直接通过梯度下降来完成,而后者除此之外,还需要其它的训练技巧。
下面对历年关于GAN的论文提出的训练技巧进行总结,这里仅记录技巧,具体原理请直接看论文原文。
WGAN和WGAN-GP
WGAN论文将GAN原文用来度量两个分布之间差异的JS divergence改为了Wasserstein distance,从而有了拉近两个分布之间距离的“连续性”指标。经过转换后,对模型进行的修改如下:
1、判别器输出层去掉sigmoid,且损失函数不取对数log。也就是说原本的损失是先用sigmoid映射到$(0,1)$模拟概率值,然后再取对数映射到更大的区间以便计算。现在则是直接把这两步给取消了。实际上这两步就是多余的,因为不进行这两步的输出值就已经处于所需要的区间了。
2、将判别器参数的绝对值截断在常数C以内(不是特别大的数就行)。
3、不要用基于动量的优化算法,推荐RMSProp,SGD也行(这是论文实验得出的结论)。
WGAN-GP对WGAN做出了改进,且仅仅做出了一项改进:
1、将WGAN对判别器权重的裁剪约束,改为对判别器相对于输入的梯度的大小的约束。以正则项的形式直接加在目标函数中。改进目标函数如下:
$L = \mathop{\mathbb{E}}\limits_{\tilde{x}\sim \mathbb{P}_g} \left[D(\tilde{x})\right] - \mathop{\mathbb{E}}\limits_{x\sim \mathbb{P}_r} \left[D(x)\right] +\lambda \mathop{\mathbb{E}}\limits_{\hat{x}\sim \mathbb{P}_{\hat{x}}} \left[(||\nabla_{\hat{x}}D(\hat{x})||_2-1)^2\right] $
判别器参数$w$的更新就是求$L$对$w$的梯度,然后进行梯度下降。而因为有最后一个正则项,所以同样会把梯度限制在一定范围内。其中$\hat{x}$是$x$和$\tilde{x}$的随机加权和,至于为什么要用随机加权和而不是直接求$x$和$\tilde{x}$的梯度:关于WGAN-GP中的遗留问题? - 知乎
当然我们实践的时候,为了方便,可以直接使用$x$和$\tilde{x}$来对梯度的大小进行约束。也就是可以直接在keras中添加关于每个样本的正则化loss。
CGAN
相较于原始GAN,CGAN将图像的某些特征(比如手写数字对应的真实数字编码)加入生成器的输入进行训练。这样训练出来的生成器就能够以特征生成对应的图像,并且训练收敛的速度会更快一些,可能是因为输入增加了确定性。
InfoGAN
CGAN是添加与图像有关的特征到原本只有随机噪声的输入中增强训练,InfoGAN则是让生成器建立生成图像与输入生成器的随机噪声之间的映射关系,它大致看起来就像是自动编码器与GAN的结合。
InfoGAN除了定义生成器与判别器之外,还定义了一个与判别器共享大部分权重的“编码器”。相对于“编码器”,生成器就成了一个“解码器”。解码器将输入的噪声解码为图片,除了输入判别器外,还要将图片输入编码器。编码器则要尽量让自身的输出与解码器(生成器)输入的某一部分“噪声”相同,这一部分“噪声”是人为选择的隐变量,可以人为设置为离散或连续变量。这样一来,生成器不但要“照顾”判别器,生成尽量真实的图片,还要考虑让解码器能解码成功,生成与输入的噪声编码相关的图片。因此生成器的输入与其输出就会有一定的隐式联系。
DCGAN
对于深度卷积GAN,论文提出四个提高训练稳定性的方阵:
1、用步幅卷积层来代替所有的池化层。
2、在生成器和判别器中使用BN(Batch Normalization),但不要在生成器的输出与判别器的输入层使用。
3、对于层数较深的模型,隐层避免使用全连接层。
4、对于生成器,输出层激活函数使用Tanh,其它层激活函数都使用ReLu。生成器使用Tanh时,输出的图像颜色数值在$(-1,1)$内,因此训练集图像色值也要从$(0,1)$预处理到$(-1,1)$内。
5、对于判别器,所有层的激活函数都使用LeakyReLu。
NIPS 2016 Tutorial:GAN
生成器规模比判别器小更好。
GAN训练技巧汇总的更多相关文章
- 深度学习与CV教程(6) | 神经网络训练技巧 (上)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 移动平台3G手机网站前端开发布局技巧汇总
移动平台3G手机网站前端开发布局技巧汇总 作者:前端开发-武方博 发布:2011-05-10 09:11 分类:移动开发 阅读:120,618 views 7条评论 您或许正在 ...
- 移动平台WEB前端开发技巧汇总(转)
最近我很关注移动前端的知识,但做为一个UI设计师和web前端工作人员没有这个工作环境接触,做为门外汉,网上系统的知识也了了,一直有种雾里看花的感觉,见到本文,我自己是奉为经典.所以我分享之后又专门打笔 ...
- 【技巧汇总】eclipse中如何跳转到指定行
技巧汇总 持续更新ing eclipse中如何跳转到指定行 ctrl+L
- typora的基本使用技巧汇总
typora的基本使用技巧汇总 链接: https://www.jianshu.com/p/380005c8f104
- 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks
训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...
- CSS 技巧汇总
CSS 选择符优先级 !important 声明>内联样式(style)>id 选择符(#id)>类选择符(.class)=伪类选择符(:hover )=属性选择符([attr] ) ...
- 使用jmeter进行性能测试-Jmeter教程及技巧汇总 (转)
http://www.jmeter.cf/loadtesting-jmeter.html 为什么使用jmeter, 它免费开源, 不断发展, 功能逐渐强大. 可以做功能,负载, 性能测试.一套脚本可以 ...
- PL/SQL developer 使用技巧汇总
为了快速的使用PL/SQL developer 进行 oracle数据库相关开发,将一些使用频率较高的使用技巧进行汇总如下,以下转自网络和自己的测试 1.切换schema --switch schem ...
随机推荐
- go语言基础实例
一:变量 1)变量声明 func main() { var v1 int var v2 int //一次声明多个变量 var ( v3 int v4 int ) //变量最开始会有一个零值 fmt.P ...
- Python中的协程,为什么说它的底层是生成器?
我们曾经在golang关于goroutine的文章当中简单介绍过 协程 的概念,我们再来简单review一下.协程又称为是微线程,英文名是Coroutine.它和线程一样可以调度,但是不同的是线程的启 ...
- 【Android】listview 嵌套gridview报错,代码:”during second layout pass: posting in next frame
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, QQ986945193 公众号:程序员小冰 说明:本人曾经在listview嵌套gridview出现 ...
- docker搭建zabbix收集windows计数器性能数据
1 docker服务的安装 1)在线安装docker服务 在线安装可以参考下面的安装步骤 a 安装相关依赖组件 yum install -y yum-utils device-mapper-persi ...
- Rakefile
Rakefile https://www.jianshu.com/p/b18a6e42455a RAKE – Ruby Make http://docs.seattlerb.org/rake/ bun ...
- PyCharm切换解释器版本
Mac PyCharm > Preferences... > Project Interpreter > Python Interpreters Windows File->D ...
- 数据库的表的字段名称与实体类(pojo)不对应解决方案
数据库的表的字段名称与实体类(pojo)不对应解决方案 数据库表 函数包括边界值吗?数据是如何分布的?
事先申明下,我的DB环境是Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production,不保证在其它版本下也 ...
- 逆向工程,生成pojo、xml、mapper
package com.how2java; import java.io.File; import java.io.InputStream; import java.util.ArrayList; i ...
- Spring框架学习笔记(1)
Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...