【GAN优化】什么是模式崩溃,以及如何从优化目标上解决这个问题

今天讲述的内容是GAN中的模式崩溃问题,之前的文章有提到这个问题,在接下来的两三期内,将和大家一起讨论有关模式崩溃的解决方法。

本期将会首先介绍什么是模式崩溃,然后给出两种通过修改GAN目标函数的解决方法,而下一期将从网络结构和mini-batch判别器的角度出发讨论模式崩溃的解决方法。

本期不会涉及什么数学知识,示意图将会最大限度的说明本质问题,如有问题欢迎底部留言。

作者 | 小米粥

编辑 | 言有三

1. 模式崩溃(mode collapse)

GAN,属于无监督生成模型中的一类。既然是生成模型,我们最起码应该关注两点:生成器生成样本的质量和样本多样性。

根据数据的流形分布定律,自然界中同一类别的高维数据,往往集中在某个低维流形附近,所以生成器最理想的情况是:将输入的噪声都映射到训练数据所在的流形上,并且与训练数据的概率分布对应。举一个简单的例子,对于某一个训练数据集,其中样本的概率分布为一个简单的一维高斯混合分布,包含两个峰:

理想状态下,生成器应该生成的样本应该如下所示(绿色标记),生成样本的位置几乎都在两个峰下,且分布符合训练集的概率分布:

但是,上述情况在实际中是不可能出现的,我们实际中大多时候生成的样本质量是比较差的,例如:

上图里生成器生成了一些质量比较差的样本(标记为红色),训练集中本不包含红色样本,生成器应该着力生成绿色样本而不应该产生红色样本,这属于生成质量问题(比如使用猫的图像训练GAN,最终GAN生成了一些狗?四不像?之类的照片)。而模式崩溃问题是针对于生成样本的多样性,即生成的样本大量重复类似,例如下图中,

生成的样本全部聚集在左边的峰下,这时虽然生成样本的质量比较高,但是生成器完全没有捕捉到右边的峰的模式。(如果使用多种猫的图像训练GAN,最终GAN只能产生逼真的英短,而无法产生其他品种)。

关于GAN模式崩溃问题的缓解方式有很多,我们接下来关注两种修改目标函数的解决方案。

2. unrolled GAN

首先需要说明:其实,生成器在某一时刻单纯地将样本都聚集到某几个高概率的峰下并不是我们讨厌模式崩溃的根本原因,如果生成器能“及时发现问题”,自动调整权值,将生成样本分散到整个训练数据的流形上,则能自动跳出当前的模式崩溃状态,并且理论上生成器确实“具备”该项能力(因为GoodFellow证明了GAN会实现最优解)。

但是实际情况是:对于生成器的不断训练并未使其学会提高生成样本的多样性,生成器只是在不断将样本从一个峰转移聚集到另一个峰下。这样的过程“没完没了”,无法跳出模式崩溃的循环。无论你在何时终止训练,都面临着模式崩溃,只是在不同时刻,生成样本所聚集的峰不同罢了。

不过,这种情况的发生有一定的必然性,我们先使用原始形式GAN对这个过程进行示意描述,其目标函数为:

真实数据集的概率分布还是如第一部分所示,生成器生成样本的概率分布如下:

我们先更新判别器:

假设判别器达到了最优状态,则其表达式应为:

对应的,D(x)的图像为:

可以看出,这时判别器会立刻“怀疑”x=-3附近样本点的真实性,接下来更新生成器:

此时的生成器将会非常“无可奈何”,为了使得目标函数f最小,最好的方法便是将样本聚集到x=3附近,即:

再更新判别器,同上述过程,判别器会立刻“怀疑”x=3附近样本点的真实性......这样的糟糕结果会不断循环下去。

对此,unrolled GAN认为:正是因为生成器缺乏“先见之明”,导致了无法跳出模式崩溃的困境,生成器每次更新参数时,只考虑在当前生成器和判别器的状态下可以获得的最优解,生成器并不知道当前选择的最优解从长远来看并不是最优解。

我们通过一定的改进,来赋予生成器“先见之明”。具体说来,判别器的目标函数仍然为:

参数更新方式为采用梯度下降方式连续更新K次,如下:

而生成器的优化目标修改为:

即生成器在更新时,不仅仅考虑当前生成器的状态,还会额外考虑以当前状态为起始点,判别器更新K次后的状态,综合两个信息做出最优解。其梯度的变化为:

其中,第一项就是非常熟悉的标准GAN形式的计算得到的梯度,而第二项便是考虑K次更新后判别器的状态而产生的附加项。

我们现在再看刚才的问题,unrolled GAN会跳出模式崩溃的循环。同样的初始状态,

生成器在进行下一步更新时,面对以下两种可能性(左边是之前提到过的模式崩溃状态,右边是比较理想的样本生成状态):

经计算,选择右边会比选择左边产生更小的目标函数值,故实际中,生成器进行梯度更新将会趋向于右边的状态从而跳出模式崩溃。可以看出,生成器跳出模式崩溃的核心原因就是更新参数时不仅考虑当下状态,而且额外考虑了K步判别器的反应,从而避免了短视行为,当然需要说明,这样做是明显增加了计算量的。

3. DRAGAN

GAN的参数优化问题并不是一个凸优化问题,存在许多局部纳什均衡状态。即使GAN进入某个纳什均衡状态,损失函数表现为收敛,其仍旧可产生模式崩溃,我们认为此时参数进入一个坏的局部均衡点。

通过实践,发现当GAN出现模式崩溃问题时,通常伴随着这样的表现:当判别器在训练样本附近更新参数时,其梯度值非常大,故DRAGAN的解决方法是:对判别器,在训练样本附近施加梯度惩罚项:

这种方式试图在训练样本附近构建线性函数,因为线性函数为凸函数具有全局最优解。需要额外说明,DRAGAN的形式与WGAN-GP颇为相似,只是WGAN-GP是在全样本空间施加梯度惩罚,而DRAGAN只在训练样本附近施加梯度惩罚。

[1] Kodali N , Abernethy J , Hays J , et al. On Convergence and Stability of GANs[J]. 2017.

[2] Metz L , Poole B , Pfau D , et al. Unrolled Generative Adversarial Networks[J]. 2016.

总结

这篇文章首先讲了GAN的模式崩溃问题,并用一个简单的例子做了过程示意,接着重点描述了unrolled GAN的思想,并同样进行了过程示意描述,最后又比较简单地描述了另一种方案:DRAGAN。下一期,我们将从GAN结构方面去考虑模式崩溃问题。

下期预告:解决模式崩溃的GAN结构

原文发布于微信公众号 - 有三AI(yanyousan_ai)

原文发表时间:2019-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券