一.原始GAN存在的训练崩溃问题
所谓GAN的训练崩溃,指的是训练过程中,生成器和判别器存在一方压倒另一方的情况。
GAN原始判别器的Loss在判别器达到最优的时候,等价于最小化生成分布与真实分布之间的JS散度,由于随机生成分布很难与真实分布有不可忽略的重叠以及JS散度突变特性,使得生成器面临梯度消失的问题;可是如果不把判别器训练到最优,那么生成器优化的目标也就失去了意义。因此需要我们小心的平衡二者,要把判别器训练的不好也不坏才行。否则就会出现训练崩溃,得不到想要的结果。
二 .WGAN的提出
WGAN作者提出了使用Wasserstein距离,以解决GAN网络训练过程难以判断收敛性的问题。Wasserstein距离定义如下:
L=Ex∼pdata(x)[fw(x)]−Ex∼pg(x)[fw(x)]
通过最小化Wasserstein距离,得到了WGAN的Loss:
- WGAN生成器Loss:
−Ex∼pg(x)[fw(x)]
- WGAN判别器Loss:
L=−Ex∼pdata(x)[fw(x)]+Ex∼pg(x)[fw(x)]
从公式上WGAN似乎总是让人摸不着头脑,在代码实现上来说,其实就以下几点:
- 判别器最后一层去掉sigmoid。
- 生成器和判别器的loss不取log。
- 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数C。
三.WGAN-GP:带有梯度正则的WGAN
实际实验过程中发现,WGAN没有那么好用,主要原因在于WGAN进行梯度截断。梯度截断将导致判别网络趋向于一个二值网络,造成模型容量的下降。
于是作者提出使用提度惩罚来替代梯度截断。
L=−Ex∼pdata(x)[fw(x)]+Ex∼pg(x)[fw(x)]+λEx∼px(x)[∥∇x(D(x))∥p−1]2
由于上式是对每一个梯度进行惩罚,所以不适合使用BN,因为它会引入同个batch中不同样本的相互依赖关系。如果需要的话,可以选择Layer Normalization。实际训练过程中,就可以通过Wasserstein距离来度量模型收敛程度了。
由上图可知,随着迭代的进行,Wasserstein距离趋于收敛,生成图像也趋于稳定。