W-GAN和GAN相比只改了四点:
- 判别器最后一层去掉sigmoid
- 生成器和判别器的loss不取log
- 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
- 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
GAN的问题
《Towards Principled Methods for Training Generative Adversarial Networks》ICLR’17
W-GAN的作者先在这篇文章中通过大量的数学公式推导分析出了GAN的问题所在。
GAN在实际应用中有一个常见现象就是判别器不能训得太好,如果训得太好就会导致生成器学不到梯度,即没有任何信息传来。而且判别器训练的越好,生成器得到的梯度信息越少。文章中的实验证明:固定生成器不动,随着判别器的训练,生成器的梯度均迅速衰减。
这是GAN的损失函数所导致的。Goodfellow提出了两个损失函数:
E x ∼ P g [ log ( 1 − D ( x ) ) ] \mathbb{E}_{x \sim P_{g}}[\log (1-D(x))] Ex∼Pg[log(1−D(x))]
E x ∼ P g [ − log D ( x ) ] \mathbb{E}_{x \sim P_{g}}[-\log D(x)] Ex∼Pg[−logD(x)]
两个损失函数都有问题:
E x ∼ P g [ log ( 1 − D ( x ) ) ] \mathbb{E}_{x \sim P_{g}}[\log (1-D(x))] Ex∼Pg[log(1−D(x))]
这篇文章关于生成器G梯度消失的第一个论证是:
在(近似)最优判别器下,最小化生成器的loss等价于最小化 P data P_{\text {data }} Pdata 与 P g P_{\text {g}} Pg之间的JS散度,而由于 P data P_{\text {data }} Pdata 与 P g P_{\text {g}} Pg几乎不可能有不可忽略的重叠,所以无论它们相距多远JS散度都是常数 l o g 2 log_2 log2,最终导致生成器的梯度近似为0,梯度消失。
这里有两个知识点,一个是“最小化生成器的loss等价于最小化 P data P_{\text {data }} Pdata 与 P g P_{\text {g}} Pg之间的JS散度”,这点是作者从GAN的损失函数 E x ∼ P g [ log ( 1 − D ( x ) ) ] \mathbb{E}_{x \sim P_{g}}[\log (1-D(x))] Ex∼Pg[log(1−D(x))]推导而来;
另一个知识点是“ P data P_{\text {data }} Pdata 与 P g P_{\text {g}} Pg几乎不可能有不可忽略的重叠”,这一点的依据是当的 P data P_{\text {data }} Pdata 与 P g P_{\text {g}} Pg的支撑集(support)是高维空间中的低维流形(manifold)时, P data P_{\text {data }} Pdata 与 P g P_{\text {g}} Pg重叠部分测度(measure)为0的概率为1。形象的理解 P data P_{\text {data }} Pdata 与 P g P_{\text {g}} Pg是两个分布,而我们真正计算这两个分布的距离时,其实是通过采样sampling得到的,即用模型的输出来采样分布,而采样出来的点重叠的概率简直可以忽略。如下图所示,有限个点相对于一个平面的面积可以忽略不计:
另一个角度
从另一个角度也可以理解,由于判别器是一个二分类分类器,非0即1,当判别器训练到一定程度时,从两个分布中采样出的点,无论他们有多交错在一起,判别器都有可能找到一个复杂的分割曲面,把两个分布完全划分开。所以导致真实图片的标签一直是1,生成的图片的标签一直是0,永远没有梯度可用。
所以GAN性能不稳定的情况清楚了:判别器训练火候不够的话,生成器得到的梯度没有意义,约等于梯度随机游走;判别器训练火候过了的话,生成器梯度消失,无法学习。然而这个“训练火候”可是无处琢磨的。