完整笔记:http://www.gwylab.com/note-gans.html
——————————————————————-
Part1 GANs基于Divergence的改进
1. GANs并不完美
1.1 JS divergence距离偏差问题
我们现在来认真反思,前一篇所介绍的GANs理论,它真的能够学习到,或者说它真的能够无限逼近真实数据分布吗?回想一下,在前面的介绍中,我们提到discriminator,它的最大化
的过程实际上就是上就是在求解
与
之间的JS divergence距离,但是到了generator中,它的最小化
的过程是在最小化
与
之间的JS divergence距离吗?答案是不一定,我们画张图来理解一下:
假设上面这张图是discriminator训练完成之后,找到了D=使得V(
)最大,接下来我们开始训练generator部分。
假设训练了一次generator之后,变成
,V(
)变成了下图的V(
)。
因为在训练generator的时候我们是固定D的,但是我们可以看到此时的不再是让V(
)达到最大值的解,也就是说从这时开始,把D=
代入 V(
)中计算出的值不再等于
与
之间的JS divergence距离(只有
才等于JS距离),那么在接下来在继续训练generator的过程中,minimize的值就不再会是
与
之间的JS divergence距离了。
这个问题可以通过限制训练次数来解决。对于discriminator,理论上我们需要让它训练非常多次,直到discriminator找到的是
的全局最大解,这样
在传给generator时才能保证
是
与
之间的JS divergence距离;而对于generator,我们限制它只能训练1次,这是为了防止训练完一次后
发生变化导致
不再是
的解。于是原始的算法优化为如下算法:
不过,在实际操作中我们往往不会非常多次地训练discriminator,因为找到真正的解需要的训练次数太多,为了减小训练代价我们只会训练k次,找到
的近似解
即可停止。所以在实际的应用中,我们计算的都是JS Divergence的近似值,最终GANs学到的是近似分布而不是数据的真实分布,这是我们需要明白的地方。
1.2 训练速度问题
原始GAN中,discriminator对于仿造数据的处理式是:
我们注意到,这个表达式,一开始减得很慢,后面减得很快,我们不妨与
这个表达式对比一下:
我们知道,一开始鉴别器是很容易鉴别仿造数据的,因此D(x)的初始值是在靠近0的左端。而对于刚开始训练的模型,我们希望在初期D(x)能够快速地更新,但不幸的是,目标函数左端刚好是平缓的区域,依据梯度下降原理这会阻碍D(x)的快速更新。
为了解决这一问题,有人提出了把这个表达式换成
,同样能满足discriminator的目标函数要求,并且在训练初期还能更新得比较快。
上述方法便是在这个非常小的地方做了改进。不过后来,人们为了区分这两种GAN,还是分别起了不同的名字。第一种GAN被叫做MMGAN(Minimax GAN),它也是人们常说的原始GANs;第二种GAN被叫做NSGAN(Non-saturating GAN)。
前面两节是在一些细节上对GANs做了改进,那其实还有很多专门的paper对GANs做了架构上的改进,我会在第3节进行介绍,不过在那之前我会先介绍一篇非常有趣的paper,叫做fGAN,它能帮助我们对GANs有更深的理解。