一、极大似然估计
- 极大似然估计
- 存在的问题
Generator
二、GAN的原理
- GAN的基本理念
求解
- 算法
f(x)
issue
三、实践中的一些issue
- 实作中Generator目标函数的问题
在训练Generator时,我们实际上在极小化这个式子:
图像
这个式子的梯度就符合我们的期望,不过这样就不是在极小化JS散度,而是在极小化另外一个奇怪的散度。
- 评估JS散度
在训练Discriminator时,理论上Discriminator的loss就代表JS散度的大小,但是在实际操作时Discriminator的loss几乎趋近于,也就是说Discriminator总是有办法把生成的图片与真实的图片分开。举例来说,在下面的实验中,Generator采用了训练1、10、25个epoch的三种,其中训练越多epoch的Generator产生的图片越接近真实,但是从图中看到无论哪一种Generator它们的Discriminator的loss总是能够趋近于,并且Discriminator也总能训练到100%的准确率,Discriminator的loss并不能反映JS散度的大小:
实验
另外一个例子如下,使用一个较强和一个较弱的Generator,可以看到强的Generator生成的图片已经很真实了,但是它们的Discriminator的loss缺失差不多的,这表明Discriminator的loss并没有反映JS散度:
实验
- Reason1:通过采样的方式来训练
由于我们始终没有办法直接计算损失函数中的期望,因此只能通过采样的方法来进行训练,那么有可能如下图所示,对于采样出的样本,由于Discriminator过于powerful,那么它总有办法寻找一个边界来分开样本,类似过拟合:
过拟合
解决这种问题我们考虑让Discriminator变得弱一点,要么迭代次数少一点要么加dropout,不过要将Discriminator变弱到什么程度,这又是很难把握的,而且这与我们最初的设想又出现了矛盾,Discriminator能够衡量JS散度的一个前提就是Discriminator要足够地powerful,因此这里就出现了一些矛盾。
- Reason2:数据的本质
GAN要拟合的数据和Generator生成的数据实际上是高维空间中的流形(manifold)。拿二维空间中的一维流形来说,可能很少有交集,或者交集很少,像图中这样的数据的JS散度就会很小:
流形
我们之前有说过GAN的训练和生物进化很类似,比如下面图中生物进化出眼睛的过程,只要从左到右的进化对生物的繁衍是有利的,这个进化的过程才能持续下去:
眼睛的进化
GAN的训练
解决这个问题的方法是可以给Discriminator的输入添加一些噪声或者给标签添加一些噪声(随机标记一些正样本为负样本,负样本为正样本),这样会使数据产生下图中的效果,因而重叠的部分就有可能变大:
加噪
不过要将加入的噪声随着训练而减弱,否则会影响机器对真实的数据分布的判断。
另一种方式是使用别的度量差异度的方式,比如WGAN这方法,这一类方法下一篇中再具体介绍。
- Mode Collapse
Mode Collapse
举例来说,在下面的二次元人物头像生成的图片中就有许多图片是重复的,这就是Mode Collapse的问题:
Mode Collapse
再举一个例子来说,比如要拟合的数据如下图:
真实数据
我们期待GAN能够按照下面的方式来逐步学习到数据的真实分布:
期待的结果
而实际的结果可能只会像下面这样,这就是Mode Collapse的问题:
实际的结果
原因分析
但是因为是可以由我们自己来设计的,因此我们可以设计目标函数来让GAN最小化KL散度,然而Mode Collapse的问题还是存在。具体的有关Mode Collapse的问题之后再介绍,这里就不再赘述。