第二十周学习周报
目录
- 摘要
- abstract
- Theory behind GAN
- GAN训练目标
- GAN训练技巧
- 总结
摘要
本周的学习内容是GAN的基本理论,在训练GAN的时候,Generator的目标是希望生成的数据与真实的数据越相似越好,而Discriminator的目标是尽量将生成的数据与真实的数据区分开来。两者之间这种棋逢对手的关系,导致GAN成为一个很难训练的模型,为了优化GAN的训练,也诞生了WGAN、Conditional GAN、CylceGAN等方法。
abstract
This week’s learning content is the basic theory of GAN. When training GAN, the goal of the generator is to hope that the generated data is as similar as real data as possible, while the goal of the discriminator is to try to distinguish the generated data from real data as much as possible. The competitive relationship between the two has made GAN a difficult model to train. In order to optimize GAN training, methods such as WGAN, Conditional GAN, and CylceGAN have also emerged.
Theory behind GAN
GAN训练目标
上一周学习了GAN的训练,那么训练的目标是什么呢?
将Distribution中sample出来的向量丢到generator里面,会产生一个比较复杂的Distribution PG,而真正的data也形成了一个Distribution Pdata,我们希望 PG和Pdata越接近越好。
假设输入输出都是一维的向量,从一维的角度来看,输入的Distribution通过一个generator之后得到的Distribution中点的位置会发生一系列的变化,而Pdata是真正的数据分布,显然与 PG是存在一定差异的。
Divergence
Div( PG,Pdata)即Divergence,是衡量两个Distribution相似度的一个major,当Divergence的值越大就代表这两个Distribution越不像。Divergence的值越小就代表这两个Distribution越相近。
与普通的神经网络的训练一样,定义Loss Function,找到一组参数使得Loss的值最小。那么在Generation的训练要做的事情就是找一组Generator里面的参数(Generator是一个Network,里面也有大量的weight和bias),使得通过在这组参数下的Generator G*得到的PG与c越小越好。因此在Generation问题中我们的Loss Function就是Div( PG,Pdata)。
在做Generation的训练的时候,我们所遇到的问题就是不知道如何躯计算这个Divergence,而GAN可以解决不会计算Divergence的限制。
对于GAN来说,不需要知道 PG和Pdata的分布,只要知道怎么从 PG和Pdata中sample东西出来,就可以算出Divergence,而 PG和Pdata是可以sample的。对于真实的数据Pdata从图片库里sample一些出来就可以得到了,而 PG的sample是可以通过Generaator产生得到的。
GAN中鉴别器的目标
通过sample就可以计算Divergence,这就需要依靠Discriminator的力量了,Discriminator 就是要尽量把从PG里sample的数据与从Pdata里sample的数据分开,这其实也可以用 Binary Classifier 做,把Pdata的sample 当作 class 1, 把 PG的sample当作class 2,如下图所示。设计 Classifier 的目标函数 V(G,D)
根据从 PG和Pdata中sample出来的data训练一个Discriminator,训练的目标就是看到real data就给它高分,看到generation data就给低分,也就是要分辨一个图片是真的图还是生成的图。
其实Discriminator的问题可以当作是一个Optimization的问题
训练出来的Discriminator可以去maximize Objective Function,(minimize的就叫Loss Function),因此要找一个D可以Maximize这个Objective Function。
如下图所示。设计 Classifier 的目标函数 V(G,D)
log D(y): Pdata的sample 经过 Discriminator 得到的分数
log (1-D(y)): PG的sample 经过 Discriminator 得到的分数
我们希望可以找到一个D使得 V(G,D)越大越好,也就是说希望log D(y)的值越大越好,代表给真正的Image打分越高越好。经过推导可以发现V(G,D)的最大值与 JS divergence 有关。
下面通过例子从直观上来理解为什么Objective Function的最大值是和Divergence有关的,当 PG和Pdata两组sample出来的数据之间的divergence很小的时候,Discriminator 很难分辨两者,因此打的分数不准确,则maxV(G,D)的值小。反之当divergence很大的时候,Discriminator 很容易分辨两者,因此打的分数比较准确,则maxV(G,D)的值大。
训练Discriminator的目标就是分辨出真正的Image和生成的Image,即使V(G,D)的值达到最大,而Generator的目标就是让生成的图片瞒过Discriminator,因此它的目标是让V(G,D)的值越小越好,因此G*等式右边既有min又有max。
GAN训练技巧
为什么JS divergence不适合?
PG和Pdata有一个关键特性就是重叠部分非常少,有两个方面的原因。
从数据本身特性来说,PG和Pdata都是要产生图片,而图片就是在高维空间中一条低维的流行,以二维空间为例,那么图片的分布就是一条直线,因此重叠几乎可以忽略。
在计算Divergence的时候是不看PG和Pdata的分布,而是通过sample出来的图片计算,因此就算PG和Pdata有重叠的部分,如果sample的点不够多,Discriminator也很难发现有重叠,可能刚好就画了一条线将两者分布区分开来。
而JS divergence有一个特性就是两个分布没有重叠,那么算出来的divergence永远都是log2,这导致 Generator 无法知道训练是否带来结果的提升,训练学不到东西。
WGAN
除了 JS divergence,还可以使用其它的 divergence,即设置discriminator不一样的目标函数。而GAN 是出了名的不好训练。下面介绍知名的一个最有名的训练技巧:WGAN。
Wasserstein distance
Wasserstein distance就是将P推着移动到Q的平均距离,也就是图中的d
移动的方法有很多种,但不同的方法移动距离不同,因此为了让Wasserstein distance的值唯一,它的定义就是穷尽所有的”moving plans“,看看哪种方法的平均距离最小,这个最小的值就是Wasserstein distance。
从JS divergence换到Wasserstein distance的好处:
假设可以计算Wasserstein distance的值,当使用Wasserstein distance来衡量divergence的时候,从PG移动到的距离Pdata d是很遥远的,想要”一步到位“是很难的,对于JS divergence而言,只有”一步到位“它的loss才会有差异,但是对于Wasserstein distance而言,需要步步递进,每次移动一点Wasserstein distance就会有变化,Wasserstein distance变化就可以训练Generator,去Minimize W distance。
用Wasserstein distance代替JS divergence的GAN 就叫做WGAN
Wasserstein distance的计算公式如下:
在WGAN中,对判别器D做出了限制,D必须满足1-lipschitz的条件,也可以理解为D必须是一个足够平滑的Function。
当PG和Pdata没有重叠的时候,但两者相距很近的时候,要在Pdata上得分很高,就会取到正无穷,在PG取得分低就会到负无穷,那这个function的变化就会很大,D的训练就没办法收敛,因此在两组数据没有重叠的情况下,算出来的max值就会无限大。
加上这个限制就可以解决无限大的问题的原因:
这个限制是要求Discriminator不可以变化剧烈要平滑, 因此在两组数据挨得很近的时候,在平滑的限制下,real上的值不会非常大,generated上的值也不会特别小,因此计算得到的值就会比较小,这样的值才是Wasserstein distance。
WGAN中让判别器满足1-lipschitz的条件的方法其实相对较为简单,训练network的时候,更新参数后将权重w限制在c到-c之间,如下图所示:
在Imprived WGAN中提到了Gradient Penalty的方法,在real data的分布与fake data的分布中各取sample,然后在两袋奶现在也有很多其他1-lipschitz的方法比谱归一化Spectral Normalization就是很好的例子,其有效的让梯度在各个地方都小于1防止梯度消失。
虽然已经有了WGAN,并不意味着GAN就很好训练了,依旧很难训练。因为Generaator与Discriminator两个network是棋逢对手的关系,需要共同成长,一旦一个停止进步了,另一个也跟着再进步了。
如上图所示。在实际训练中,无法保证每一次 Discriminator 的 loss 都会下降,一旦 loss 不下降,Discriminator停止训练,那么Generator也随着不再训练,就会出现连锁反应,整个结构都不再改进。
总结
本周的学习使我对GAN的理论有了进一步的了解,为后续研究和应用打下了一定的基础。GAN的训练过程涉及两个阶段的交替进行:判别器训练和生成器训练。生成器的目标是产生尽可能接近真实数据的假样本,而判别器的目标是区分真实样本和生成器产生的假样本。在后续的学习中我将继续学习GAN的相关内容。