这部分主要是数学上的推导:之前设置的目标函数度量的是生成图片和真实图片分布间的JS散度,如果使用其他散度,效果如何呢?引入概念f-divergence。
假设两个分布P和Q,和
分别为从中采样x的概率,则f-divergence表示为:
,其中
是凸函数,且
。其实就是在用一个广泛的函数
定义散度。
这样f-divergence就可以衡量分布P和Q间的差别:如果for all x,,应该取得f-divergence的最小值,此时
。而因为
是凸函数,根据其性质可得
,即0是f-divergence的最小值,表示分布P和Q之间的f-divergence至少为0,与上面推导相符。
根据不同的,f-divergence可以具体表示不同的散度:
凸函数的另一个性质:每一个
,都有一个对应的共轭函数
(注意共轭函数
转换了自变量)。对每一个自变量t,
的值为函数
自变量x所有取值下的
最大值,可以结合下图理解:
当时,对于不同的x取值(
),有不同的
值,取其中最大的
作为
的值;当
时,取其中最大的
作为
的值。其实这个函数就是一个包含max的分段函数,有子函数
,
,
等等,每一个子函数都是一条直线(因为只有一个自变量t),那么
就相当于在不同的t的阶段,取子函数的值最大的一个,相当于如下过程:
就是图中红色的线,注意这是一个凸函数,因此
为凸函数时,它的共轭函数
也是一个凸函数。令
,如下图所示:
红色的看起来就像一个指数函数:
,通过数学计算可以验证:
时,
,只要求得对于每个t能让
最大的x值即可得到
的值(此时t为常数,x为变量),得到函数
,求其最大值求导即可:令
可得
,代入
可得:
事实上,函数的共轭函数就是
,即两者互为共轭,那么对于函数
,有:
,也就是说计算任一个凸函数
,可以用它的共轭函数来表示。联系到上文的f-divergence式子,可以得到:
,其中函数
的自变量就是
,其中的变量
可以视为
也就是
的函数
,则有:
,中间花括号中的
其实就是判别器的工作,找出一个t令这个式子达到最大值。那么判别器的函数可以写作
,
就是采样点(也就是图像向量),输出的
就是判别器的得分。找到一个最佳的
使
最大,才能得到散度
。也就是说所有的
取值都只会得到一个小于散度
的值,即
因此只有越靠近最佳值(能令
最大的值),才能令式子
越接近f-divergence的形式,因此f-divergence可以继续转化:
在GAN中,两个分布P和Q就对应着和
,因此两者间的f-divergence为:
,也就是判别器的工作。而生成器的工作为:
看到这里就觉得熟悉了,其实就是把目标函数V(G, D)变成了一个含有f的形式,随着f的改变,目标函数也在改变,因此在训练过程中得到的判别器和生成器也会有所不同,如下图所示:
下面看两个在训练GAN中可能会出现的问题:
1. Mode Collapse:真实的数据分布是比较大的(x分布在很大范围的取值内),而生成器产生的分布确很小(x分布在中间一小簇)。实验中体现为原本真实数据集是很多种动画脸,然而训练中会发现我们的生成器产生的动画脸越来越单一,某种脸出现的次数越来越多。相当于此时生成器越来越趋向于选择保险项,反复产生它觉得可以骗过判别器的脸(假如之前某一种脸判别器给了高分,那就反复产生这个脸,仅仅稍作改变,保证依然得到高分)。
2. Mode Dropping:这种情况下,真实数据集有多个分布,如下图蓝色点有两簇,但生成器在训练中却只会产生其中一种分布,抛弃了另一种。比如下面的人脸,真实分布是有白色的脸,黄色的脸,黑色的脸;而生成器在迭代中,一次产生白色,一次产生黄色,一次产生黑色,每次只产生了其中一种分布。
以上问题可能就是由目标函数中我们选择的散度带来的,不同的散度决定了不同的目标函数和训练结果,导致GAN向错误的方向变化。下图就是KL散度和Reverse KL散度带来的不同优化结果:
蓝色的真实数据分布有两个峰值,就对应了第二个问题中的两簇,如果选用KL散度,如左图所示,会优化得到绿色虚线,峰值在中间,从中采样则几乎得到的都是蓝色线的低谷处,效果是很差的;然而选用Reverse KL散度时,如右图所示,得到的绿色虚线集中在左边的分布上,采样只会得到真实分布中一簇的点,传统GAN中的JS散度其实就和Reverse KL散度类似,产生Mode Dropping的问题。其实选用不同的散度都会出现各种问题,有一个方法是如果真实数据中有25个大类的图片,就用25个生成器,分别产生其中一个分布的结果,然后ensemble到一起。