原始 GAN 到底出了什么问题
在近似最优判别器下,最小化生成器的 loss 等价于最小化 $P_{\text{data}}$ 和 $P_g$ 之间的 JS 散度,而由于 $P_{\text{data}}$ 和 $P_g$ 几乎不可能有不可忽略的重叠,所以无论它们相距多远,JS 散度都是常数 $\log 2$ ,最终导致生成器的梯度近似为 $0$ ,梯度消失。
又因为最小化目标等价于最小化
这个目标要求同时最小化生成分布和真是分布的 KL 散度,并且最大化两者的 JS 散度。产生了数值上的不稳定。最终造成生成器宁可多生成一些重复但是很“安全”的样本,也不愿意去生成多样性的样本。就发生了所谓的 collapse mode。
Wasserstein GAN 改动了什么
Wasserstein GAN 与 GAN 相比,只改了四点:
- 判别器最后一层去掉 sigmoid
- 生成器和判别器的 loss 不取 log
- 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数 c
- 不要用基于动量的优化方法(包括 momentum 和 Adam),推荐使用 RMSProp,SGD 也行。
PS:第四点是论文作者从实验中用玄学得到的。因为如果使用 Adam,判别器的 loss 有时候会崩掉,然后 Adam 给出的更新方向与梯度方向夹角的 cos 值就会变成负数,判别器的 loss 梯度就变得不稳定了。但是改用 RMSProp 以后就解决了上述问题。
PPS:推荐使用比较小的 learning rate,论文中使用的是 $\alpha=0.00005$ 。
一个 TensorFlow 示例(基于 MNIST 数据库)
1 | import tensorflow as tf |