【GAN的优化】从KL和JS散度到fGAN
欢迎来到专栏《GAN的优化》,这是第二期。在这个专栏中,我们会讲述GAN的相关背景、基本原理、优化等相关理论,尤其是侧重于GAN目标函数的优化。小米粥和有三将带领大家从零学起,深入探究GAN的点点滴滴。
其实,比起来东拼西凑的资料的堆叠,我更喜欢讲故事,从头到尾讲一个故事,中间环环相扣,逻辑条理清晰,读完之后细细回想,便可融会贯通。
上一期我们从一般的生成模型开始说起,谈了谈极大似然法和显式定义概率分布的模型,最后讲到GAN的结构、本质。今天我将和大家一起学习fGAN。fGAN是一个具有一定“通用”意义的模型,它定义了一个框架,从这个框架中可以自然而然得衍生出其他GAN模型。这篇文章不一定能帮你提高你的实验效果,但是对了解早期的GAN,提升机器学习的水平和见解还是大有裨益的。
作者&编辑 | 小米粥
今天是第二期,主要介绍fGAN。本文将先建立一下距离和度量的概念,然后引出f散度的概念,利用共轭函数和神经网络来计算f散度,最后将简述KL散度和JS散度的问题。
1 分布间的距离
最初提出的GAN是基于博弈论角度的,它包括一个判别器和一个生成器,判别器会给出输入的样本来源于训练集的概率,而生成器会努力产生可以欺骗判别器的样本。整个GAN的流程稍微复杂却非常具象,甚至可以将其拟人化来理解。其实,更一般地,我们应该从样本概率分布的角度去理解GAN,从这里入手虽然略微抽象,但是能触碰到GAN的本质。
GAN的生成器隐式地定义了一个概率分布,并依此概率分布来生成样本,而训练样本集也是在某一个概率分布上连续独立采样获得的,故GAN的核心目标就是:驱使生成器定义的隐式的概率分布接近训练样本集的本质概率分布,pg是生成器概率,pdata是训练集概率,如下:
不同的概率密度函数之间距离有“远近之分”,例如下图中黄色分布和蓝色分布的距离“感觉上”应该比较近,而红色分布和蓝色分布的距离“感觉上”应该比较远,我们需要定义度量函数来量化分布之间的距离(将两个概率密度函数映射为一个实数)。
在向量空间中,将每一个向量视为一个元素,存在许多种两个元素间距离的度量方式,比如闵科夫斯基距离、欧式距离、曼哈顿距离、切比雪夫距离等。类似的,将每一个概率分布视为概率密度函数空间中的一个元素,则可以定义元素之间的距离。需要注意定义的距离需要满足非负性、对称性、三角不等式。
2 f-divergence
f散度(f-divergence)提供了一套“距离”,对于数据集的本质概率分布和生成器隐式的概率分布,我们用以下公式来定义它们的距离:
其中要求f(u)为凸函数,且f(1)=0。f(1)=0保证了当两个分布完全重合时,f散度为0。f(u)为凸函数保证了f-divergence的值非负。我们用Jensen不等式来简单证明一下:
f散度中f(u)可以有很多形式,具体如下图所示:
常用的满足要求的凸函数f(u)的函数图像如下图所示:
3 共轭函数
即使知道了f散度的一般表达式,我们也无法精确计算其值,或许训练数据集的概率密度函数的表达式可以得到,但是生成器隐式定义的概率密度函数是不可知的。
我们利用共轭函数将f散度转变成可以计算的形式。共轭(或对偶)通常指成对出现的两个具有很强关系的实体,它们具有相同的结构和意义。额外提一句,无论原函数是否是凸函数,其共轭函数必为凸函数(凸函数在做优化时拥有非常好的数学性质)。
定义共轭函数为
t的定义域为f(u)的一阶导数的值域。即对于任意给定的u,要遍历所有可能的t代入计算,然后寻找最大值。
此时f散度可转化为:
t和u具有非常复杂的数学解析关系,则t和x也具有非常复杂的数学解析关系,即便用共轭函数给出了f散度的一个下界,依然无法写成解析式而使用蒙特卡洛方法近似求解。利用神经网络强大的函数拟合能力,可以构造一个神经网络T来拟合t和x的复杂函数关系,即
这里要注意通过设置最后一层的激活函数以保证神经网络的输出在f(u)的一阶导数的值域中。
所以,对于这个神经网络T,我们应该以
为目标函数通过采样的方式进行训练,将求极值的问题转化成训练神经网络的问题,理论上,经过完美的训练,上述目标函数即转化成了f散度的一个下界。所以在fGAN的框架下来看,训练判别器本质上是为了逼近一个f散度,然后利用f散度去指示生成器的学习。从现在开始,判别器已经不再像最原始的GAN拥有具象的意义了。
需要补充说明一下,如何通过选择最后一层输出神经元的激活函数来保证T的输出在f(u)的一阶导数的值域中。
4 产生GAN
现在,我们可以利用上述的流程在fGAN的框架下生成原始版本的GAN。在原始版本的GAN中,希望用JS散度来度量两个概率分布的距离,则选择原函数和其对应的共轭函数为
代入其中则
做一个简单的变换(同时注意相应调整激活函数):
则有
这就是熟悉的GAN的判别器的目标函数了。若要有人尝试使用直接用KL−divergence KL-divergenceKL−divergence,则有
当然也可以选择使用逆KL散度。另外,对于LSGAN,可以证明其使用的是卡方距离,而EBGAN使用总变差距离。
5 两个小问题
KL散度和逆KL散度在严格意义上并不是一种度量,因为不符合对称性,即
非对称性意味着使用KL散度或者逆KL散度作为优化目标,其得到结果将具有显著差异。例如,用分布Q去拟合分布P,选择KL散度,Q会将诸多高概率的峰模糊化:
如若使用逆KL散度,则会导致Q去拟合高概率的单峰:
另一个需要解释的问题,为什么原始GAN中使用JS散度效果不好。因为训练集的概率分布和生成器隐式定义的概率分布往往只是高维空间的低维流形,例如下图在三维空间中,两个分布均是二维流形,其交集最多为一条线段,以至于在计算JS散度时,忽略重叠部分的问题在维数很高时,将愈加严重,在此只给出一个三维空间示意图。
即对于任意x,在绝大部分情况下,两个概率分布至少有一个为0。
显然,这样计算得来的JS散度为常数。所以如果将判别器训练的太好(即学习到了JS散度)但JS散度为一个常数,无法提供任何梯度信息供生成器训练,就是大家常说的“学不动”。