目录
1. JS divergence is not suitable
4. Why Earth Mover’s Distance?
摘要
最原始的 GAN 使用的是 JS Divergence 测量生成数据分布与原始数据分布的距离,但是这面临一个数据维度的问题。因此,考虑把 sigmoid 换成 linear ,这是 Least Square GAN (LSGAN) 。使用 Earth Mover’s Distance 代替 JS divergence ,这是 Wassertein GAN (WGAN) 。最后总结了改为 WGAN 的算法需要做哪些。还介绍了用autocoder 作为 discriminator 的 Energy-based GAN (EBGAN) ,这是个很有效的做法,可以使得Discriminator不依赖generator,直接开局就很强的鉴别能力。
1. JS divergence is not suitable
最原始的 GAN 使用的是 JS Divergence 测量生成数据分布与原始数据分布的距离,但是有一个严重的问题:可能两个分布没有任何的重叠,因为在衡量PG和Pdata的散度的时候,我们是从两个分布中sample得到两堆data,再去量他们之间的散度,即使计算分布有重叠,但是data之间是没有重叠的,我们完全可以视data的得到的分布没有任何交集(可以用弯曲的线划开)。
由于PG和Pdata没有任何的重合,JS散度会有很大的问题?
只要两个分布没有重叠,不管他们是不是接近,算出来的JS散度就是Log2。例子如图:虽然G1比G0更接近Pdata,但是从JS散度看起来,两者是没有差别的。这样的话,train起来是有问题的。
下面从直觉角度看:为什么只要两个分布没有重叠,散度就是log2。
我们是怎样求两个分布的散度的呢?实际上的操作是:我们有两群data,把它视为两个class,然后判别器就是一个二元分类器,然后最小化交叉熵损失;只要两堆数据没有重合,那么他们的loss就是一样的,这意味着量出来的JS散度是一样的。
另外一个直观的想法是:当你learn一个二元分类器的话,会给蓝色的点0分,绿色点1分;output是sigmoid函数,在接近0或1的地方特别平,我们期待的是你train一个生成器,它会带领蓝色的点顺着梯度去移动分布,但是蓝色的点几乎是不动的,因为它的附近梯度几乎是0。
2. Least Square GAN (LSGAN)
看我们上图中的右下角,将输出的sigmiod换成linear…从分类问题,变成了回归问题。正样本越接近1越好,负样本越接近0越好。
3. Wasserstein GAN (WGAN)
换一种方式来衡量PG和Pdata,用的是earth mover’s distance;意思是假设你有两堆data P 和 Q,而你开着一个推土机,将 P土 推到 Q土 ,这个走过的距离就叫earth mover’s distance。
上面的分布是简化了的,土堆应该是这样:
出现一个问题:同样的分布,推土机可能走过的路程不一样:
上图中的左边是是把邻近的土进行移动,右边是比较远的土进行移动。我们一般用左边的那种。穷举所有可能的铲土的方法,每一种方法我们叫做moving plan,看哪个方法的距离最小,就是earth mover’s distance。
上图中右边是这个例子中最好的一个moving plan
4. Why Earth Mover’s Distance?
我们来看:当你使用JS散度的时候,不重叠都是log2;当使用W散度的时候,当两个分布虽然不重叠但是当距离变小的时候,散度也小。
我们怎样改判别器,才能使判别器得到的结果是wassertein distance呢?(最大化之前的V(也就是二分类训练)得到的结果是衡量JS散度的)我们怎样改V才能使最大化V是wassertein distance呢?
x是从Pdata中sample出来的,让它的判别器输出越大越好;
x是从PG中sample出来的,让它的判别器输出越小越好;
除此之外,还要有一个约束,就是判别器必须是一个1-Lipschitz函数;一个重要特点就是它很平滑
5. GAN to WGAN
我们首先看一下原始GAN 的算法:
看一下使用WGAN之后的算法:
WGAN: 要改四个地方:
- 改V
-
sigmoid拿掉变成线性
-
使用Weight clipping 或者 Gradient Penalty(加上正则化项)等
-
改生成器更新公式
6. Energy-based GAN (EBGAN)
把判别器改成了 autoencoder:
对于一般的判别器,你需要让生成器慢慢变强,你的判别器才会强;但是autoencoder的判别器可以pre-train,可以用正样本进行预训练;一开始的判别器会很强,这样你的生成器一开始就会产生很好的image;
所以从整体上来看Discriminator和之前的GAN的Discriminator一样,输入一个对象,得到这个对象和真实对象的差距,只不过是得到这个差距的方法不一样,之前是JS divergence,这里是Autoencoder。简单来说就是根据一个图片是否能够被reconstruction,如果能被还原得很好,说明这个图片是一个high quality的图片,反之亦然。
这个方法的好处就是Autoencoder是可以pretrain的,不需要negative example来训练,直接给它positive example来minimize reconstruction error即可。
结论与展望
因为最原始的 GAN 使用的是 JS Divergence 测量生成数据分布与原始数据分布的距离,会有一个严重的问题,即只要两个分布没有重叠,不管他们是不是接近,算出来的JS散度都是Log2,这样train起来是有问题的,因为实际上在训练的时候,我们的生成器的目标是最小化PG和Pdata之间的散度的,然后你用判别器量出散度,但是对生成器来说两个分布没有重叠的分布都是一样的话,生成器就很难更新从一个PG到离Pdata更近的PG了。
于是提出了Least Square GAN,在训练2分类器时,将输出的sigmiod换成linear…从分类问题,变成了回归问题。正样本越接近1越好,负样本越接近0越好。我们也可以换一种方式来衡量PG和Pdata分布的距离,使用W散度,当两个分布虽然不重叠但是当距离变小的时候,散度变小。
最后,提出了一种Energy-based GAN,把判别器改成了 autoencoder,因为其可以进行预训练,可以用正样本进行预训练,一开始的判别器会很强,这样你的生成器一开始就会产生很好的image。