GAN训练技巧汇总

  GAN自推出以来就以训练困难著称,由于它的训练过程并非寻找损失函数的最小值,而是寻找生成器和判别器之间的纳什均衡。前者能够直接经过梯度降低来完成,然后者除此以外,还须要其它的训练技巧。算法

  下面对历年关于GAN的论文提出的训练技巧进行总结,这里仅记录技巧,具体原理请直接看论文原文。函数

WGAN和WGAN-GP

  WGAN论文将GAN原文用来度量两个分布之间差别的JS divergence改成了Wasserstein distance,从而有了拉近两个分布之间距离的“连续性”指标。通过转换后,对模型进行的修改以下:优化

  一、判别器输出层去掉sigmoid,且损失函数不取对数log。也就是说本来的损失是先用sigmoid映射到$(0,1)$模拟几率值,而后再取对数映射到更大的区间以便计算。如今则是直接把这两步给取消了。实际上这两步就是多余的,由于不进行这两步的输出值就已经处于所须要的区间了。 编码

  二、将判别器参数的绝对值截断在常数C之内(不是特别大的数就行)。orm

  三、不要用基于动量的优化算法,推荐RMSProp,SGD也行(这是论文实验得出的结论)。图片

  WGAN-GP对WGAN作出了改进,且仅仅作出了一项改进:get

  一、将WGAN对判别器权重的裁剪约束,改成对判别器相对于输入的梯度的大小的约束。以正则项的形式直接加在目标函数中。改进目标函数以下:it

$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] $io

  判别器参数$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,论文提出四个提升训练稳定性的方阵:

  一、用步幅卷积层来代替全部的池化层。

  二、在生成器和判别器中使用BN(Batch Normalization),但不要在生成器的输出与判别器的输入层使用。

  三、对于层数较深的模型,隐层避免使用全链接层。

  四、对于生成器,输出层激活函数使用Tanh,其它层激活函数都使用ReLu。生成器使用Tanh时,输出的图像颜色数值在$(-1,1)$内,所以训练集图像色值也要从$(0,1)$预处理到$(-1,1)$内。

  五、对于判别器,全部层的激活函数都使用LeakyReLu。 

NIPS 2016 Tutorial:GAN

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

相关文章
相关标签/搜索