李宏毅GAN教程(3)

4 年前 · 来自专栏 GAN的基础与应用

改进的GAN(为了让GAN容易训练)

JS散度不是很适合

最原始的GAN量的是Pg和Pdata之间的JS散度;但是有一个严重的问题:可能两个分布没有任何的重叠,一方面的原因是由于image在高维空间中的分布其实是低维的流形(二维平面折叠在三维空间中),高维空间中的低维流形几乎是可以忽略的;另一方面,在衡量Pg和Pdata的散度的时候,我们是从两个分布中sample得到两堆data,再去量他们之间的散度,即使计算分布有重叠,但是data之间是没有重叠的,我们完全可以视data的得到的分布没有任何交集(可以用弯曲的线划开)

由于Pg和Pdata没有任何的重合,JS散度会有很大的问题?

只要两个分布没有重叠,不管他们是不是接近,算出来的JS散度就是Log2。。。例子如图:虽然G1比G0更接近Pdata,但是从JS散度看起来,两者是没有差别的。这样的话,train起来是有问题的;(实际上在训练的时候,我们的生成器的目标是最小化Pg和Pdata之间的散度,然后你用判别器量出散度,但是对生成器来说Pg0和Pg1是一样的,因此生成器不会将Pg0更新为Pg1.)

下面从直觉角度看:为什么只要两个分布没有重叠,散度就是log2.

我们是怎样求两个分布的散度的呢?实际上的操作是:我们有两群data,把它视为两个class,然后判别器就是一个二元分类器,然后最小化交叉熵损失;只要两堆数据没有重合,那么他们的loss就是一样的,这意味着量出来的JS散度是一样的。

在原始GAN里面,当你train的是一个二元分类器时,你会发现是比较难以train的,因为没有重叠就是一样差的。

另外一个直观的想法是:当你learn一个二元分类器的话,会给蓝色的点0分,绿色点1分;output是sigmoid函数,在接近0或1的地方特别平,我们期待的是你train一个生成器,它会带领蓝色的点顺着梯度去移动分布,但是蓝色的点几乎是不动的,因为它的附近梯度几乎是0。 过去一个方法是不要把二元分类器训练的特别好(??),太好了就梯度为0了。

一、LSGAN

将输出的sigmiod换成linear.........从分类问题,变成了回归问题。正样本越接近1越好,负样本越接近0越好。

二、Wasserstein GAN (WGAN)

换一种方式来衡量Pg和Pdata,用的是earth mover's distance; 意思是假设你有两堆data P 和 Q,而你开着一个推土机,将 P土 推到 Q土 ,这个走过的距离就叫earth mover's distance。

出现一个问题:同样的分布,推土机可能走过的路程不一样,

穷举所有可能的铲土的方法,每一种方法我们叫做moving plan,看哪个方法的距离最小,就是earth mover's distance。

更正式的定义:想要把P挪到Q;我们首先要定义一个moving plans,其实就是一个矩阵,每一个元素指的是从纵坐标的挪多少土到横坐标;越亮表示挪的图越多。(这里先不管两个位置的距离)

假设给你一个moving plans,叫做gama;那么根据它所走的距离是多少呢?

穷举所有的位置:(xp,xq),然后每个位置你要挪多少土也就是moving plans,然后再算xp与xq之间的距离。

接下来,穷举所有的伽马 看哪个伽马最小,就是earth mover's distance

我们来看:当你使用JS散度的时候,不重叠都是log2;当使用W散度的时候,当两个分布虽然不重叠但是当距离变小的时候,散度也小。

我们怎样改判别器,才能使判别器得到的结果是wassertein distance呢?(最大化之前的V(也就是二分类训练)得到的结果是衡量JS散度的)我们怎样改V才能使最大化V是wassertein distance呢?

x是从Pdata中sample出来的,让它的判别器输出越大越好;

x是从Pdata中sample出来的,让它的判别器输出越小越好;

除此之外,还要有一个约束,就是判别器必须是一个1-Lipschitz函数;一个重要特点就是它很平滑

如果没有这个约束,判别器一味着让:real的分数就越来越高,generated的分数越来越低;那么就崩溃了,永远不会收敛;因为值可以越来越大越来越小。

因此必须有额外的限制,让判别器必须是平滑的


Lipschitz函数:输出变化要小于K倍输入变化;当K=1的时候就是1-Lipschitz函数

怎样来训练这个判别器网络呢?

1、weight clipping (稍微限制了平滑性,没有限制在1-Lipschitz)

仍然使用梯度上升来max V 但是当你发现某个参数w大于你设定好的C就设定为c,小于你设定好的-C就设定为-c

2、improve WGAN(WGAN-GP)

如果一个函数是1-Lipschitz的话,等价于:对于所有的input x都去求梯度的话,则梯度的范数总是小于等于1;

在原来的这项后面加上一个正则化项,对所有的x做积分,被积函数是:如果梯度范数大于1,则是梯度范数-1,则这一项有值;否则为0没有值;并且梯度范数对所有的x都要满足小于1;

但是我们不能做到对所有的X,因此我们是假设X是从某一个事先定好的分布中Ppenalty中sample出来的,只管这部分的x,其他的就不管了。

Ppenalty长什么样子呢?

就是从Pdata和Pg选取两个点,连成直线,从直线间sample当作Ppenalty中的x;为什么呢?结果好呀。因为我们是想让PG往Pdata移动,只有中间的区域才会影响你的结果。

除此之外,本来我们希望的是梯度的范数如果大于1,给它惩罚;小于1 不用惩罚;实际上我们在训练的时候是希望范数越接近1越好。

3、Spectrum Norm

让每一个位置的梯度范数都小于1:

怎样从GAN 改成 WGAN

我们首先看一下原始GAN 的算法:

WGAN: 要改四个地方:

1、改V

2、 sigmoid拿掉变成线性

3、加上正则化项

4、改生成器更新公式

三、EBGAN

把判别器改成了 autoencoder

对于一般的判别器,你需要让生成器慢慢变强,你的判别器才会强;但是autoencoder的判别器可以pre-train,可以用正样本进行预训练;一开始的判别器会很强,这样你的生成器一开始就会产生很好的image;

建设比较难但是破坏很简单,在训练的时候,会设置一个参数当小于时就定值。

发布于 2019-02-20 19:13

文章被以下专栏收录

    GAN的基础与应用

    GAN的基础与应用