写这篇文章不是为了介绍WGAN,而是为了把WGAN和Code对应起来。因为最后还是要付诸于实践,而不仅仅就是 介绍什么,因为关于WGAN好的介绍已经很多了。
如果想看懂,请认真仔细看。鄙人也是查询并收集了各种资料,学习了好久。同时也一步步推导过,所以这是一个慢慢的任务,认真看,别太着急。等你把这个看懂了并且可以自己写出来的时候,表示你已经看懂了。
看懂了,点个赞再走呗!!!
目录
一、WGAN比GAN的优越性
Wasserstein GAN(下面简称WGAN)成功地做到了以下爆炸性的几点:
- 彻底解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度
- 基本解决了collapse mode的问题,确保了生成样本的多样性
- 训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代表GAN训练得越好,代表生成器产生的图像质量越高
- 以上一切好处不需要精心设计的网络架构,最简单的多层全连接网络就可以做到
二、WGAN
1、基础理解
2、参数解释
从公式14——>公式15
重点
构造一个含参数w、最后一层不是sigmoid的判别器网络fw,在限制w不超过某个范围的条件下,使得公式15尽可能取到最大,此时L就会近似真实分布与生成分布之间的Wasserstein距离(忽略常数倍数)
在判别器中:
公式17是公式15的变形(取负),上面提到过“使得公式15尽可能取到最大”,同时这还是一个最大最小的博弈问题(original GAN ),但是在code中往往是最小化损失函数,所以采用公式17的损失函数这里取负,用来更新判别器的参数。
在生成器中:
损失函数,min max L,在判别器中,已经更新了fw之后,进入了生成器(此时fw是固定的),公式15中,第一项和生成器无关,所以公式16中fw(x)等价于fw(g(z)),进而来更新生成器的权重参数。
3、代码解释
WGAN与原始GAN第一种形式相比,只改了四点:
- 判别器最后一层去掉sigmoid
- 生成器和判别器的loss不取log
- 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
- 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
1)判别器最后一个去掉了sigmoid
2)生成器和判别器的loss不取log
3)每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
4)不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
4、算法解释
Require:w表示判别器参数(这里采用critic 代替了Discriminator),θ表示生成器参数(Generator)
判别器:
2:说明的是判别器更新次,然后生成器才更新一次,这里
3-4:表示采样
5:采用公式17,计算损失函数,来更新判别器的参数w,这里的w指的是判别器网络中每一层的参数
6:梯度更新优化w
7:每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
生成器:
10:生成器的损失函数,根据判别器的fw,构造出更新θ的损失函数
11:梯度更新优化θ