GAN训练技巧汇总

摘要:
自引入以来,GAN一直以其训练困难而闻名,因为其训练过程不是寻找损失函数的最小值,而是寻找生成器和鉴别器之间的纳什均衡。前者可以通过梯度下降直接完成,而后者除此之外还需要其他训练技能。以下是多年来GAN论文中提出的培训技能总结。这里只记录了技能。具体原则请参考原论文。WGAN和WGAN-GP WGAN的论文将用于测量两种分布之间差异的GAN原文改为WAS

  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_{ ilde{x}sim mathbb{P}_g}  left[D( ilde{x}) ight] - mathop{mathbb{E}}limits_{xsim mathbb{P}_r}  left[D(x) ight] +lambda mathop{mathbb{E}}limits_{hat{x}sim mathbb{P}_{hat{x}}}  left[(|| abla_{hat{x}}D(hat{x})||_2-1)^2 ight] $

  判别器参数$w$的更新就是求$L$对$w$的梯度,然后进行梯度下降。而因为有最后一个正则项,所以同样会把梯度限制在一定范围内。其中$hat{x}$是$x$和$ ilde{x}$的随机加权和,至于为什么要用随机加权和而不是直接求$x$和$ ilde{x}$的梯度:关于WGAN-GP中的遗留问题? - 知乎

  当然我们实践的时候,为了方便,可以直接使用$x$和$ ilde{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

  生成器规模比判别器小更好。

RGAN/RaGAN

  将判别器的loss从向固定值优化改为扩大真实与生成图像之间的差距,生成器则是缩小真实与生成图像之间的差距。

SELUs

  论文证明了一个几乎对于任意层数的模型都可以使输出均值保持在0附近的激活函数。

免责声明:文章转载自《GAN训练技巧汇总》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何查看和修改Windows远程桌面端口71.Ext.form.ComboBox 完整属性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

tfgan折腾笔记(二):核心函数详述——gan_model族

定义model的函数有: 1.gan_model 函数原型: defgan_model( #Lambdas defining models. generator_fn, discriminator_fn, #Real data and conditioning. real_data, generator_inputs,...

使用GAN进行异常检测——可以进行网络流量的自学习哇,哥哥,人家是半监督,无监督的话,还是要VAE,SAE。

实验了效果,下面的还是图像的异常检测居多。 https://github.com/LeeDoYup/AnoGAN https://github.com/tkwoo/anogan-keras 看了下,本质上是半监督学习,一开始是有分类模型的。代码如下,生产模型和判别模型: ### generator model define def generator_m...

开发者自述:我是这样学习 GAN 的

Generative Adversarial Network,就是大家耳熟能详的 GAN,由 Ian Goodfellow 首先提出,在这两年更是深度学习中最热门的东西,仿佛什么东西都能由 GAN 做出来。我最近刚入门 GAN,看了些资料,做一些笔记。 1.Generation 什么是生成(generation)?就是模型通过学习一些数据,然后生成类似的数...

Wasserstein GAN

  WGAN论文指出,原始GAN以JS、KL散度作为损失容易导致生成器梯度消失,他们提出了一种新的损失函数——Wasserstein 距离,很大程度上解决了GAN训练难的问题。 原始GAN的损失函数的缺陷   当两个分布之间重叠很小,或者说,两个分布的概率密度同时大于0的区域在整个分布的占比几乎为0时(无穷小,但还不是0),随着分布之间的靠拢,用于衡量分布...

GAN作用——在我做安全的看来,就是做数据拟合、数据增强

from:https://www.zhihu.com/question/56171002/answer/155777359GAN的作用,也就是为什么GAN会火了(有部分原因可能是因为Lecun的赞赏)。如果GAN只是用来生成一些像真是数据一样的数据的话,那不会有像现在这么火。更多的,或者对于机器学习研究员来说,看待的最关键一点应该是GAN可以用来 拟合数据...

使用GAN 进行异常检测——anoGAN,TODO,待用于安全分析实验

先说实验成功的代码: git clone https://github.com/tkwoo/anogan-keras.git mkdir weights python main.py --mode train 即可看到效果了! 核心代码:main.py from __future__ import print_function import matp...