不知道从什么时候开始,我发现我也掉到了GAN的大坑里边了,唉,争取早日能跳出来...

这篇博客介绍的是我最近提交到arxiv的一个关于GAN的新框架,里边主要介绍了一种对概率散度的新理解,并且基于这种理解推导出了一个新的GAN。整篇文章比较偏理论,对这个GAN的相关性质都做了完整的论证,自认为是一个理论完备的结果。

文章链接:https://papers.cool/arxiv/1811.07296

先摆结论:

1、论文提供了一种分析和构造概率散度的直接思路,从而简化了构建新GAN框架的过程。

2、推导出了一个称为GAN-QP的GAN框架(15),这个GAN不需要像WGAN那样的L约束,又不会有SGAN的梯度消失问题,实验表明它至少有不逊色于、甚至优于WGAN的表现。

GAN-QP效果图

GAN-QP效果图

论文的实验最大做到了512x512的人脸生成(CelebA HQ),充分表明了模型的有效性(效果不算完美,但是模型特别简单)。有兴趣的朋友,欢迎继续阅读下去。

直面对偶空间 #

我们现在要构建一个GAN框架,一般包含三个步骤

1、寻求一种良好的概率散度;

2、找出它的对偶形式;

3、转化为极小-极大游戏(min-max game)。

问题是:真正对训练过程有用的是第二、第三步,第一步并不是那么必要。

事实上,从原空间要定义一个新的散度很难,定义了之后也不一定容易转化为对偶形式。然而,我们可以直接在对偶空间分析,由此可以发现一批新的、形态良好的散度。换言之,我们其实可以直接在对偶空间中论述一个式子是否满足散度的定义,从而直接给出可优化的目标,而不需要关心它具体是JS散度还是W距离了。

下面我们来举例说明这个思路。

散度 #

首先我们来给出散度的定义:

如果D[p,q]是关于p,q的标量函数,并且满足:

1、D[p,q]0恒成立;
2、D[p,q]=0p=q

那么称D[p,q]p,q的一个散度,散度与“距离”的主要差别是散度不用满足三角不等式,也不用满足对称性。但是散度已经保留了度量差距的最基本的性质,所以我们可以用它来度量p,q之间的差异程度。

SGAN #

基本定义 #

我们先来看SGAN中的判别器loss,定义
D[p(x),q(x)]=maxT12Exp(x)[logσ(T(x))]+12Exq(x)[log(1σ(T(x)))]+log2


这其实就是JS散度的对偶形式。但是我们可以直接基于这个定义来证明它是一个散度,然后讨论这个散度本身的性质,而根本不需要知道它是JS散度。

怎么证明?只需要证明这个结果满足刚才说的散度的两点要求。注意,按照我们的逻辑,我们不知道它是JS散度,但我们可以从数学角度证明它是一个散度。

其实如果读者真的明白了式(1)的含义,证明就不困难了。式(1)先定义了一个期望的式子,然后对T取最大(用更准确的说法是求“上确界”),取最大的结果才是散度。再强调一遍,“取最大之后的结果才是散度”,12Exp(x)[logσ(T(x))]+12Exq(x)[log(1σ(T(x)))]+log2这个式子并不是散度。

具体的证明过程略微冗长,就不完整摆出来了,请读者自行去看原文的附录。或者看下面的WGAN的部分,因为WGAN的部分相对简单。

对抗网络 #

假如有了散度之后,我们就可以通过缩小两个概率分布的散度,来训练生成模型了。也就是说接下来要做的事情应该是
minGD[p(x),q(x)]


注意D[p(x),q(x)]是通过maxT操作实现的,所以组合起来就是一个min-max的过程,比如前面的例子,等价地就是:
G,T=argminGargmaxTExp(x)[logσ(T(x))]+Ex=G(z),zq(z)[log(1σ(T(x)))]

这就是SGAN。

所以我们发现,GAN的过程其实就两步:1、通过max定义一个散度;2、通过min缩小两个分布的散度。这里的新观点,就是将max直接作为散度的定义的一部分。

性能分析 #

我们知道SGAN可能有梯度消失的风险,这是为什么呢?我们考察一个极端情形:
p(x)=δ(xα),q(x)=δ(xβ)


其中αβ。这样一来,两个分布分别只是单点分布,完全没有交集。这种情况下代入(1),结果就是
D[p(x),q(x)]=maxT12[logσ(T(α))]+12[log(1σ(T(β)))]+log2

注意我们对T没有任何约束,所以为了取最大,我们可以让T(α)+,T(β),从而得到上确界是一个常数log2。即这种情况下D[p(x),q(x)]=log2

这就是说,对于两个几乎没有交集的分布,式(1)定义的散度给出的度量结果是常数log2,常数就意味着梯度是0,无法优化。而WGAN的那两篇文章则表明,“没有交集”理论上在GAN中是很常见的,所以这是SGAN的固有毛病。

一般的f散度 #

上面的几个小节已经完整了呈现了这种理解的流程:

1、我们通过max定义一个数学式子,然后可以从数学角度直接证明这是一个散度,而不用关心它叫什么名字;

2、通过min最小化这个散度,组合起来就是一个min-max的过程,就得到了一种GAN;

3、为了检查这种散度在极端情况下的表现,我们可以用p(x)=δ(xα),q(x)=δ(xβ)去测试它。

上述关于SGAN的论述过程,可以平行地推广到所有的f-GAN中(参考《f-GAN简介:GAN模型的生产车间》),各种f散度其实没有本质上的差异,它们有同样的固有毛病(要不就梯度消失,要不就梯度爆炸)。

WGAN #

基本定义 #

现在我们转向一类新的散度:Wasserstein距离。注意Wasserstein距离是一个严格的、满足公理化定义的距离,不过我们这里只关心它的散度性质。定义
W[p(x),q(x)]=maxT,TL1Exp(x)[T(x)]Exq(x)[T(x)]


这里
TL=maxxy|T(x)T(y)|d(x,y)

d(x,y)是任意一种现成的距离。

可以直接证明它是一个散度。这个证明还算经典,所以将它写在这里:

1、不管是什么p(x),q(x),只要让T(x)0,我们就得到Exp(x)[T(x)]Exq(x)[T(x)]=0,因为散度的定义是要遍历所有的T取最大的,所以它至少不会小于0,这就证明了第一点非负性。

2、证明p(x)=q(x)时,W[p(x),q(x)]=0,也就是W[p(x),p(x)]=0,这几乎是显然成立的了。

3、证明p(x)q(x)时(严格来讲是它们不等的测度大于0),W[p(x),q(x)]>0。这个相对难一点,但其实也很简单,只需要令T0(x)=sign(p(x)q(x)),那么显然有
Exp(x)[T0(x)]Exq(x)[T0(x)]=(p(x)q(x))sign(p(x)q(x))dx>0

这样我们就直接地证明了W[p(x),q(x)]是满足散度的定义的。

对抗网络 #

同样地,有了新散度,就可以定义新GAN了:
G,T=argminGargmaxT,TL1Exp(x)[T(x)]Ex=G(z),zq(z)[T(x)]


这就是WGAN,本博客的参考资料有《互怼的艺术:从零直达WGAN-GP》《WGAN-div:一个默默无闻的WGAN填坑者》

性能分析 #

同样地,用p(x)=δ(xα),q(x)=δ(xβ)去测试W[p(x),q(x)]散度的性能,我们得到
W[p(x),q(x)]=maxT,TL1T(α)T(β)


注意我们有L约束TL1,这意味着|T(α)T(β)|d(α,β),等号可以取到,所以
W[p(x),q(x)]=d(α,β)

结果不是常数,所以即使在这种极端情况下我们可以也拉近两个分布的距离。所以从这一点看,WGAN要比SGAN要好。

L约束 #

WGAN的遗留问题就是如何往判别器加入L约束,目前有三种方案:参数裁剪、梯度惩罚、谱归一化,请参考《深度学习中的Lipschitz约束:泛化与生成模型》《WGAN-div:一个默默无闻的WGAN填坑者》

参数裁剪基本已经被弃用了。梯度惩罚原则上只是一个经验方法,有它的不合理之处,而且要算梯度通常很慢。谱归一化看起来最优雅,目前效果也挺好,不过也有限制的太死的可能性。进一步讨论请看《WGAN-div:一个默默无闻的WGAN填坑者》

新散度,新GAN #

现在的结论是:SGAN可能有梯度消失的风险,WGAN虽然很好,但需要额外的L约束。那么很自然就会问:有没有不需要L约束,又不会梯度消失的GAN?鱼与熊掌能否兼得?

还真的可以,下面带你找一个。不对,其实不止一个,带你找一批都行。

平方势散度 #

基本定义 #

下面要给出的散度,形式是这样的:
L[p(x),q(x)]=maxTE(xr,xf)p(xr)q(xf)[T(xr,xf)T(xf,xr)(T(xr,xf)T(xf,xr))22λd(xr,xf)]


其中λ>0是一个超参数,d可以是任意距离。

这个形式好像就在WGAN的基础上加了一个平方形式的势能,所以称为平方势散度(QP-div,quadratic potential divergence)。

论文的附录已经证明了式(12)确实是一个散度。

性能分析 #

p(x)=δ(xα),q(x)=δ(xβ)去测试这个散度,结果是
L[p(x),q(x)]=maxTT(α,β)T(β,α)(T(α,β)T(β,α))22λd(α,β)


z=T(α,β)T(β,α)就得到zz22λd(α,β),很熟悉有没有?这只是个二次函数的最大值问题呀,最大值是12λd(α,β)呀,所以我们就有
L[p(x),q(x)]=12λd(α,β)

这不就跟WGAN差不多了嘛,哪怕对于极端分布,也不会有梯度消失的风险。鱼与熊掌真的可以兼得。

GAN-QP #

对抗网络 #

有了散度就可以构建对抗网络,我们最终给出的形式为
T=argmaxTE(xr,xf)p(xr)q(xf)[T(xr,xf)T(xf,xr)(T(xr,xf)T(xf,xr))22λd(xr,xf)]G=argminGE(xr,xf)p(xr)q(xf)[T(xr,xf)T(xf,xr)]


我在论文中称之为GAN-QP。

注意不要把二次项(T(xr,xf)T(xf,xr))22λd(xr,xf)这一项加入到生成器的loss中(理论上不成问题,但是用梯度下降优化时会有问题。),因为这一项的分母是d(xr,xf),一旦最小化二次项,等价于最小化d(xr,xf),也就是用d(xr,xf)来度量图片的差距,这是不科学的。

解的分析 #

通过变分法可以证明(还是在附录),判别器的最优解是:
p(xr)q(xf)p(xf)q(xr)p(xr)q(xf)+p(xf)q(xr)=T(xr,xf)T(xf,xr)λd(xr,xf)

由这个最优解,我们可以得到两点结论。首先,不难证明最优解满足
1T(xr,xf)T(xf,xr)λd(xr,xf)1


也就是说最优解自动满足L约束。所以我们可以认为GAN-QP是一种自适应L约束的方案。

其次,将最优解代入生成器的loss,那么得到总的目标是:
λp(xr)q(xf)p(xr)q(xf)p(xf)q(xr)p(xr)q(xf)+p(xf)q(xr)d(xr,xf)dxrdxf


这也是一个概率散度,并且我们也从理论上证明了它不会梯度消失/爆炸(跟柯西不等式有关)。此外,还可以看到λ只是一个缩放因子,事实上并不重要,从而这个GAN-QP对λ是鲁棒的,λ不会明显影响模型的效果。

实验结果 #

论文在CelebA HQ数据集上,比较了多种GAN与GAN-QP的效果,表明GAN-QP能媲美甚至超越当前最优的模型。

注意,模型(15)中,T(xr,xf)的二元函数,但实验表明,取最简单的一元特例T(xr,xf)T(xr)即可,即T(xr,xf)T(xf,xr)T(xr)T(xf)就够了,改成二元函数并没有明显提升(但也可能是我没调好)。这样的话,形式上就跟WGAN-GP非常相似了,但理论更完备。

代码开源:https://github.com/bojone/gan-qp

128x128 #

在128x128分辨率上,我们进行了较为全面的比较,定量指标是FID。结果如下图:

不同GAN的FID定量曲线

不同GAN的FID定量曲线


以及下表
GAN-QP-L1/L2WGAN-GPWGAN-SNSGAN-SNLSGAN-SNBest FID45.0/44.755.547.844.545.8Speed1x/1x1.5x1x1x1x

256与512 #

在128分辨率上,最好的表现是GAN-QP和SGAN-SN,不过在256x256分辨率上,它们的表现就拉开了差距:
GAN-QPSGAN-SNBest FID22.727.9


我最大把GAN-QP的实验做到了512x512的人脸生成,效果还是不错的,最终的FID是26.44:

512x512人脸效果图

512x512人脸效果图

论文综述 #

这篇文章源于我对概率散度的思考,企图得到一种更直接的理解概率散度的方案,其中还受启发于WGAN-div

幸好,最后把这条路走通了,还得到了一些新结果,遂提交到arxiv上,供各位参考,希望得到各位前辈高手的指点。事实上,基于类似的思路,我们可以构造很多类似的散度,比如将平方换成4次、6次方等,只不过理论分析起来就会困难一些了。

限于算力,加之我不是专门研究GAN的,所以实验方面可能做得不够完善,基本能论证结论即可,请大家体谅,当然也欢迎各位的指导。

转载到请包括本文地址:https://spaces.ac.cn/archives/6163

更详细的转载事宜请参考:《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (Nov. 20, 2018). 《不用L约束又不会梯度消失的GAN,了解一下? 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/6163

@online{kexuefm-6163,
        title={不用L约束又不会梯度消失的GAN,了解一下?},
        author={苏剑林},
        year={2018},
        month={Nov},
        url={\url{https://spaces.ac.cn/archives/6163}},
}