CV_shortcomings of the original GAN

shortcomings of the original GAN

1.Evaluation、梯度消失及梯度不稳定

original GAN的Loss Funtion表示,D实际上是在对P_data和P_G之间做一个JSD的衡量,也就是说,在学习训练D的过程,也就是在衡量给定的G所对应的分布P_G与真实数据所处的分布P_data之间的JS divergence。也正如前述,GAN和VAE使用了相同的架构,但是二者的区别在于Loss Function的不同,即GAN中使用的是D来作为GAN中G的训练方向的指引。所以就有必要来对这样的引导来进行一个评估。

通过计算JSD可以知道,其值介于0和log2之间。当P_data和P_G 完全overlap时,二者的JSD值才为0,否则二者的JSD值为小于log2的非零值。

而在实际过程中会发现,D的Loss Function值始终为0,即JSD始终为log2,也就是表示为P_data和P_G始终没有overlap。由于D的Loss Function始终不变,这也导致了梯度消失的现象。而在使用-logD(G(x))来替代log(1-D(G(x)))作为G的改进损失函数时,又会遇到梯度不稳定和损失函数意义不明确的问题,即在最小化一个不合理的距离度量,进一步还导致了mode collapse的问题,这点会在下一个小节内叙述。

当G的Loss Function使用<注意是G的Loss Function,即仅含V(G, D)中的唯一与G有关的一项>

时,根据Basic idea of GAN中将最佳D代入原先的Loss Function中得到的

将KL散度(注意下面是先g后r)变换成含D*的形式:

对该结果等号两边进行移动,并代入

得到

注意上式最后两项不依赖于生成器G,最终得到最小化

等价于最小化

这个等价最小化目标存在两个严重的问题。第一是它同时要最小化生成分布与真实分布的KL散度,却又要最大化两者的JS散度,一个要拉近,一个却要推远!这在直观上非常荒谬,在数值上则会导致梯度不稳定,这是后面那个JS散度项的毛病。

因此,该G的Loss Function存在优化目标荒谬、梯度不稳定的问题。

可能的原因有:

  • 对于P_data和P_G而言,二者通常是高维空间中的一个低维的manifold,所以二者的overlap通常非常非常小,或者说根本就没有。所以对于original GAN的Loss Function计算的用于衡量P_data和P_G之间相似度的JSD基本始终为log2,只有在二者完全重合时,JSD才为0。

  • b.在Loss Function的计算过程中,采用的是使用sample出来的data来进行E值的估计。正是由于采用的是sample的方式来估计E,才会给D机会找到一个hyperplane/boundary将从P_data和P_G中sample出来的样本很好的分开。如果是从分布的角度来计算Loss Function,就必然会有两个分布交叠的情况,而无法像对样本分类那样找到一个hyperplane/boundary将两个分布完全地分开。简而言之,由于是采用sample的方式来计算Loss Function,所以如果遇到一个很强势的D,那么将始终无法计算二者的overlap,也就是始终会导致JSD的值为log2。

根据原始GAN定义的判别器loss,我们可以得到最优判别器的形式;而在最优判别器的下,我们可以把原始GAN定义的生成器loss等价变换为最小化真实分布Pr与生成分布Pg之间的JS散度。我们越训练判别器,它就越接近最优,最小化生成器的loss也就会越近似于最小化Pr和Pg之间的JS散度。

问题就出在这个JS散度上。我们会希望如果两个分布之间越接近它们的JS散度越小,我们通过优化JS散度就能将Pg拉向Pr,最终以假乱真。这个希望在两个分布有所重叠的时候是成立的,但是如果两个分布完全没有重叠的部分,或者它们重叠的部分可忽略(下面解释什么叫可忽略),它们的JS散度是多少呢?

答案是log2,因为对于任意一个x只有四种可能<这里的P为分布,x为随机变量。P1和P2处于同一个空间,x为这个空间中的随机变量。下列式子为x取某个值时,P1和P2的取值>:

第一种对计算JS散度无贡献,第二种情况由于重叠部分可忽略所以贡献也为0,第三种情况对公式

右边第一个项的贡献是log2,第四种情况与之类似,所以最终JS(P1 || P2)=log2。

换句话说,无论Pr跟Pg是远在天边,还是近在眼前,只要它们俩没有一点重叠或者重叠部分可忽略,JS散度就固定是常数log2,而这对于梯度下降方法意味着——梯度为0!此时对于最优判别器来说,生成器肯定是得不到一丁点梯度信息的;即使对于接近最优的判别器来说,生成器也有很大机会面临梯度消失的问题。

但是Pr与Pg不重叠或重叠部分可忽略的可能性有多大?不严谨的答案是:非常大。比较严谨的答案是:Pr与Pg的支撑集(support)是高维空间中的低维流形(manifold)时,Pr与Pg重叠部分测度(measure)为0的概率为1。

不用被奇怪的术语吓得关掉页面,虽然论文给出的是严格的数学表述,但是直观上其实很容易理解。首先简单介绍一下这几个概念:

  • 支撑集(support)其实就是函数的非零部分子集,比如ReLU函数的支撑集就是(0, ∞),一个概率分布的支撑集就是所有概率密度非零部分的集合。
  • 流形(manifold)是高维空间中曲线、曲面概念的拓广,我们可以在低维上直观理解这个概念,比如我们说三维空间中的一个曲面是一个二维流形,因为它的本质维度(intrinsic dimension)只有2,一个点在这个二维流形上移动只有两个方向的自由度。同理,三维空间或者二维空间中的一条曲线都是一个一维流形。
  • 测度(measure)是高维空间中长度、面积、体积概念的拓广,可以理解为“超体积”。

回过头来看第一句话,“当Pr与Pg的支撑集是高维空间中的低维流形时”,基本上是成立的。原因是GAN中的生成器一般是从某个低维(比如100维)的随机分布中采样出一个编码向量,再经过一个神经网络生成出一个高维样本(比如64x64的图片就有4096维)。当生成器的参数固定时,生成样本的概率分布虽然是定义在4096维的空间上,但它本身所有可能产生的变化已经被那个100维的随机分布限定了,其本质维度就是100,再考虑到神经网络带来的映射降维,最终可能比100还小,所以生成样本分布的支撑集就在4096维空间中构成一个最多100维的低维流形,“撑不满”整个高维空间。

“撑不满”就会导致真实分布与生成分布难以“碰到面”,这很容易在二维空间中理解:一方面,二维平面中随机取两条曲线,它们之间刚好存在重叠线段的概率为0;另一方面,虽然它们很大可能会存在交叉点,但是相比于两条曲线而言,交叉点比曲线低一个维度,长度(测度)为0,可忽略。三维空间中也是类似的,随机取两个曲面,它们之间最多就是比较有可能存在交叉线,但是交叉线比曲面低一个维度,面积(测度)是0,可忽略。从低维空间拓展到高维空间,就有了如下逻辑:因为一开始生成器随机初始化,所以Pg几乎不可能与Pr有什么关联,所以它们的支撑集之间的重叠部分要么不存在,要么就比Pr和Pg的最小维度还要低至少一个维度,故而测度为0。所谓“重叠部分测度为0”,就是上文所言“不重叠或者重叠部分可忽略”的意思。

我们就得到了WGAN前作中关于生成器梯度消失的第一个论证:在(近似)最优判别器下,最小化生成器的loss等价于最小化Pr与Pg之间的JS散度,而由于Pr与Pg几乎不可能有不可忽略的重叠,所以无论它们相距多远JS散度都是常数log2,最终导致生成器的梯度(近似)为0,梯度消失。

接着作者写了很多公式定理从第二个角度进行论证,但是背后的思想也可以直观地解释:

  • 首先,Pr与Pg之间几乎不可能有不可忽略的重叠,所以无论它们之间的“缝隙”多狭小,都肯定存在一个最优分割曲面把它们隔开,最多就是在那些可忽略的重叠处隔不开而已。
  • 由于判别器作为一个神经网络可以无限拟合这个分隔曲面,所以存在一个最优判别器,对几乎所有真实样本给出概率1,对几乎所有生成样本给出概率0,而那些隔不开的部分就是难以被最优判别器分类的样本,但是它们的测度为0,可忽略。
  • 最优判别器在真实分布和生成分布的支撑集上给出的概率都是常数(1和0),导致生成器的loss梯度为0,梯度消失。

有了这些理论分析,原始GAN不稳定的原因就彻底清楚了:判别器训练得太好,生成器梯度消失,生成器loss降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以GAN才那么难训练。

这就会导致什么问题:

  • a.无法从loss值中去判断现在已经训练到什么程度了,或者说loss值并无法反映P_data和P_G的接近、相似程度,因为P_data和P_G的JSD值在绝大多数时候值都为log2,所以仅从由JSD构成的loss值中是无法反映二者的相似程度的。

  • b.很难达到收敛

solution:

  • a.不需要那么强的D,找一个相对弱的D即可。
  • b.加入噪声,使得P_data和P_G二者有更大的overlap的可能。

对生成样本和真实样本加噪声,直观上说,使得原本的两个低维流形“弥散”到整个高维空间,强行让它们产生不可忽略的重叠。而一旦存在重叠,JS散度就能真正发挥作用,此时如果两个分布越靠近,它们“弥散”出来的部分重叠得越多,JS散度也会越小而不会一直是一个常数,于是(在第一种原始GAN形式下)梯度消失的问题就解决了。在训练过程中,我们可以对所加的噪声进行退火(annealing),慢慢减小其方差,到后面两个低维流形“本体”都已经有重叠时,就算把噪声完全拿掉,JS散度也能照样发挥作用,继续产生有意义的梯度把两个低维流形拉近,直到它们接近完全重合。以上是对原文的直观解释。

2.Mode Collapse

也就是说,真实的数据分布中可能有多个mode,但是生成的分布中却只有一个mode。换言之,虽然training dataset中的数据的mode很丰富,并且生成的数据也很逼真,但是多次生成G_data后会发现,每次生成的data都只有相同的一个mode。根据生成分布你可以知道他能做什么,但是你无法得知他不能够做什么。他可能可以做更多的事,也可能不能,但是你不知道,因为他并没有表现出来。

然而使用MLL的方式来估计模型并不容易出现mode collapse的情况。

假设P_data中有多个mode。但是在学习G所对应的分布时,当G对应分布逼近P_data的一个mode时,发现能够很好地被D判别出来,这时G可能就会放弃这个mode转向逼近下一个mode…而不是同时去学习逼近多个P_data中对应的mode,因为这种行为可能反而更容易被D给判别出来,也就是说,让G去学习多个mode,相比之下G不如去只学习一个mode能够更好地从Loss Function中得到好的反馈(或者是更好地欺骗D)。这是由于Loss Funtion的所决定的。所以去思考Loss Function背后的含义以及Loss Function是如何引导G去学习的很重要。

更具体地从数学的角度去分析一下这个原因。在basic idea of GAN中提到,MLL相当于是在求P_data和P_G之间的KL散度。

而目标是让KL—>0。从式中可知,当P_G=0且P_data有值时,KL—>∞,当P_data=0时,KL=0

所以为了避免KL—>∞,P_G就会趋向在P_data有值时也有值,即不趋向于0。

这种情况下,反而使得P_G能够学得P_data中的多个mode。

而在reverse KL中

当P_data=0且P_G有值时,reverse KL—>∞,所以这就会导致P_G害怕跨过P_data=0处或者P_data很小的地方去逼近P_data中的多个mode,这就导致了mode collapse。

因为original GAN在D*=argmax_D V(G, D)下,对应的V(G, D*)表示的是JS divergence。而JS divergence

可以展开成下式

所以JSD中是包含reverse KL的,这可能是original GAN中出现mode collapse情况的原因。

当G的Loss Function使用<注意是G的Loss Function,即仅含V(G, D)中的唯一与G有关的一项>

时,由前述内容

可知,对其进行最小化等价于对

进行最小化。其中第一项的KL散度项是导致mode collapse的原因。因为KL散度不是一个对称的衡量。其中KL(Pr || Pg)和KL(Pg || Pr)是有差别的。以KL(Pg || Pr)为例:

换言之,KL(Pg || Pr)对于上面两种错误的惩罚是不一样的,第一种错误对应的是“生成器没能生成真实的样本”,惩罚微小;第二种错误对应的是“生成器生成了不真实的样本” ,惩罚巨大。第一种错误对应的是缺乏多样性,第二种错误对应的是缺乏准确性。这一放一打之下,生成器宁可多生成一些重复但是很“安全”的样本,也不愿意去生成多样性的样本,因为那样一不小心就会产生第二种错误,得不偿失。这种现象就是大家常说的collapse mode。

 

Reference

台大深度学习_李宏毅

令人拍案叫绝的Wasserstein GAN:https://zhuanlan.zhihu.com/p/25071913?columnSlug=f00cb0979b57ab6d7f70e287b0cba55d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值