这部分主要是数学上的推导:之前设置的目标函数度量的是生成图片和真实图片分布间的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到一起。