在二分类问题中,使用JS散度是不合适的,因为图像的性质,PG和Pdata是不可能重叠的,不重叠的情况下计算出的JS散度永远是log2,所以上图中第一个图和第二个图没有区别,因此在二分类问题中会出现训练困难的问题。
tips1 LSGAN
问题:绿色点为real data,蓝色点为generated data。可能会出现一个状况,如果二分类器训练的太好(即蓝色为0,绿色为1),使用sigmoid函数进行训练会出现训练困难的问题,因为在0处梯度几乎为0。这样generator想把蓝色的点往右移发现会移不动。因此在没有这些tips的时候训练discriminator,不要训练的太差(分辨不出来),也不要训练的太好,一般边吃饭的时候边看输出(hahaha)。
有人提出使用LSGAN,即将sigmoid激活函数换成线性的。
tips2 WGAN
在之前训练GAN的时候,用的都是JS散度或者f散度,这里不再使用它们。
WGAN使用的是Earth Mover‘s Distance来衡量两个分布的差异。
假设有两个data P和G,假设有一台推土机,将P中的土铲到Q中走过的平均的距离即为W,上图假设一维空间下的情形,P和Q都在一个点上,则W=d。
但是该方法会有一个问题:铲土有好多种方法,哪个为所求呢?
一种方法:可以穷举所有铲土的方法,走过距离最小的即为所求。
首先要做一个moving plan。moving plan实质为一个矩阵,矩阵的值越亮代表P的土挪到Q越多。我们可以求出平均距离B(γ),然后穷举所有的B(γ),取最小值。
WGAN的discriminator应该是这样的,P中sample出的data应该尽可能大,G中sample出的data应该尽可能小。但是这样还是不够的,因为这样real会无限大,generated会无限小,永远不会收敛。因此应该加一个限制条件,D要足够平滑。
即输出的变化不能超过输入的变化。
问题是怎么解,如果把constraint拿掉,很好解,但是在D上加了constraint很难解。
解决办法:
最原始的解决办法是梯度裁剪,即权值绝对值超过某个值c,则把weight设置为c,结束。但是该方法达不到1-lipschitz的效果。
后来出现inproved WGAN(WGAN-GP)
上图中,使得D(x)在所有点的梯度小于等于1等价于D满足1-Lipschitz。
但是我们无法sample出所有的x进而计算D(x)的梯度。所以,我们从Ppenalty这个分布中sample x。
Ppenalty指的是:在Pdata中sample一个点,在PG中sample一个点,将两个点相连。若干个这样的连线构成的分布即Ppenalty。
一个直观的理解:WGAN的思想是将PG挪到Pdata,因此它们中间的地方才会有影响。
本来我们要求的是D(x)的梯度大于1有惩罚,小于1没有惩罚。但是WGAN最终做的是,让D(x)的梯度越接近1越好。文章中提出D(x)的梯度越接近1,表现越好。
实际上improved WGAN也是有问题的,比如右下角的图,将黄色的点移动到红色的点,给红色的线penalty,它可能不会沿着黑色的线走。
Spectrum Norm可以使得每个位置的gradient norm都小于1.具体细节请查阅文献。
训练GAN的流程
如果训练WGAN,需要把sigmoid拿掉,带着sigmoid实际上是JS diversion。
对于EBGAN,Generator是不变的,Discriminator使用的AutoEncoder。它的思想是将生成图片通过一个AutoEncoder,与重新生成的图片计算一下loss,将loss✖️-1得到的即为输出。
EBGAN的好处是,AutoEncoder是可以进行预训练的,它可以只用正样本进行预训练,而二分类问题是不行的。使用EBGAN可以对autoEncoder进行预训练,刚开始就可以拿到一个较强的Discriminator,否则需要先训练generator,要训练很久才能得到一个很厉害的Discriminator。
注意EBGAN在训练的时候,我们关注的是real data得分越大越好,并不是generate越小越好,因为建设难破坏容易。比如我们输入一个data,生成一个vector,再由vector重建图像是很困难的;但是加入一个noise就可以使得分很小,这样虽然可以使loss很小,但这不是我们要的,因此在generate的data中设置一个margin,得分小于margin即可。