论文:https://arxiv.org/pdf/1701.07875.pdf
发表:2017
WGAN 算法流程
从GAN 到 WGAN 的转变
相比于原始 GAN,WGAN 只需要修改以下几点,就能使得训练更稳定,生成质量更高:
1. 此时的判别器相当于做回归任务,它输出的是一般意义上的分数,而不是之前的概率。所以判别器最后一层去掉 sigmoid;
2. 生成器和判别器的 loss 不取 log;
3. 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数 c;
4. 论文作者推荐使用 RMSProp 等非基于动量的优化算法。
5. 判别器训练得越好,对生成器的提升更有利,因此可以放心地多训练Critic。所以有n_critic=5,即训练更新5次判别器,训练更新1次生成器。
WGAN 优点:
-
训练过程中有一个有意义的 loss 值来指示生成器收敛,并且这个数值越小代表 GAN 训练得越好,代表生成器产生的图像质量越高;
-
改善了优化过程的稳定性,解决梯度消失等问题,并且未发现存在生成样本缺乏多样性的问题。
作者指出我 Wasserstein 距离越小,错误率越低,生成质量越高,因此存在指示训练过程的意义。
对比与 JS 散度,当模型训练得越好,JS 散度或高或低,与生成样本质量之间无关联,没有意义。
实验表明 WGAN 和 DCGAN 都能生成的高质量的样本,左图 WGAN,右图 DCGAN。
而如果都不使用批标准化,左图的 WGAN 生成质量很好,而右图的 DCGAN 生成的质量很差。
如果 WGAN 和 GAN 都是用 MLP,WGAN 生成质量较好,而 GAN 出现样本缺乏多样性的问题。
WGAN 缺点:
1、训练不稳定、训练困难
2、权重裁剪后收敛缓慢(裁剪窗口太大)。这源于 weight clipping 的方法太简单粗暴了,导致判别器的参数几乎都集中在最大值和最小值上,相当于一个二值神经网络了,没有发挥深度神经网络的强大拟合能力。
3、梯度消失(裁剪窗口太小)
WGAN 实践:
基于DCGAN修改为WGAN,同样训练50poch. 视觉上看差不多,可能还略输dcgan。也许是我没有做第5条改动。
DCGAN
WGAN
参考文章:
1:WGAN的来龙去脉 - 知乎
2:深度学习GAN系列课程笔记4—Origin GAN训练过程中的一些Tips ( WGAN / EBGAN ) - 知乎
3:Wasserstein GAN (WGAN) 解决本质问题 | 莫烦Python
4:令人拍案叫绝的Wasserstein GAN - 知乎
参考代码:
1:https://github.com/znxlwm/pytorch-generative-model-collections/blob/master/WGAN.py
2:https://github.com/YixinChen-AI/CVAE-GAN-zoos-PyTorch-Beginner/blob/master/WGAN/WGAN.py
3:https://github.com/Zeleni9/pytorch-wgan
4:https://github.com/eriklindernoren/PyTorch-GAN/blob/master/implementations/wgan/wgan.py