GAN系列:李宏毅老师GAN课程P5——General Framework

这部分主要是数学上的推导:之前设置的目标函数度量的是生成图片和真实图片分布间的JS散度,如果使用其他散度,效果如何呢?引入概念f-divergence。

假设两个分布P和Q,p(x)q(x)分别为从中采样x的概率,则f-divergence表示为:

D_{f}(P||Q)=\underset{x }{\int}q(x)f(\frac{p(x)}{q(x)})dx,其中f(x)是凸函数,且f(1)=0。其实就是在用一个广泛的函数f(x)定义散度。

这样f-divergence就可以衡量分布P和Q间的差别:如果for all x,p(x)=q(x),应该取得f-divergence的最小值,此时D_{f}(P||Q)=\underset{x }{\int}q(x)f(1)dx=\underset{x }{\int}q(x)0dx=0。而因为f(x)是凸函数,根据其性质可得D_{f}(P||Q)=\underset{x }{\int}q(x)f(\frac{p(x)}{q(x)})dx\geq f(\underset{x }{\int}q(x)\frac{p(x)}{q(x)}dx)=f(\underset{x }{\int}{p(x)}dx)=0,即0是f-divergence的最小值,表示分布P和Q之间的f-divergence至少为0,与上面推导相符。

根据不同的f(x),f-divergence可以具体表示不同的散度:

凸函数f(x)的另一个性质:每一个f(x),都有一个对应的共轭函数f^{*}(t)=\underset{x\in dom(f)}{max}\left \{ xt-f(x) \right \}(注意共轭函数f^{*}(t)转换了自变量)。对每一个自变量t,f^{*}(t)的值为函数f(x)自变量x所有取值下的xt-f(x)最大值,可以结合下图理解:

t=t_{1}时,对于不同的x取值(x_{1},x_{2},x_{3}),有不同的{xt_^{1}}-f(x)值,取其中最大的{{x_{1}}t_{1}}-f({x_{1}})作为f^{*}(t_{1})的值;当t=t_{2}时,取其中最大的{{x_{3}}t_{2}}-f({x_{3}})作为f^{*}(t_{2})的值。其实这个函数就是一个包含max的分段函数,有子函数{{x_{1}}t}-f({x_{1}}){{x_{2}}t}-f({x_{2}}){{x_{3}}t}-f({x_{3}})等等,每一个子函数都是一条直线(因为只有一个自变量t),那么f^{*}(t)就相当于在不同的t的阶段,取子函数的值最大的一个,相当于如下过程:

f^{*}(t)就是图中红色的线,注意这是一个凸函数,因此f(x)为凸函数时,它的共轭函数f^{*}(t)也是一个凸函数。令f(x)=xlogx,如下图所示:

红色的f^{*}(t)看起来就像一个指数函数:f^{*}(t)=exp(t-1),通过数学计算可以验证:

f(x)=xlogx时,f^{*}(t)=\underset{x\in dom(f)}{max}\left \{ xt-f(x) \right \}=\underset{x\in dom(f)}{max}\left \{ xt-xlogx \right \},只要求得对于每个t能让xt-f(x)最大的x值即可得到f^{*}(t)的值(此时t为常数,x为变量),得到函数g(x)=xt-xlogx,求其最大值求导即可:令g^{'}(x)=t-logx-1=0可得x=exp(t-1),代入f^{*}(t)可得:

f^{*}(t)=exp(t-1)t-exp(t-1)log(exp(t-1))

          =exp(t-1)t-exp(t-1)(t-1)=exp(t-1)

事实上,函数f^{*}(t)的共轭函数就是f(x),即两者互为共轭,那么对于函数f^{*}(t),有:f(x)=\underset{x\in dom(f^{*})}{max}\left \{ xt-f^{*}(t) \right \},也就是说计算任一个凸函数f(x),可以用它的共轭函数来表示。联系到上文的f-divergence式子,可以得到:

D_{f}(P||Q)=\underset{x }{\int}q(x)f(\frac{p(x)}{q(x)})dx=\underset{x }{\int}\left ( q(x)\left \{ \underset{t\in dom(f^{*})}{max}\frac{p(x)}{q(x)}t-f^{*}(t) \right \} \right )dx,其中函数f的自变量就是\frac{p(x)}{q(x)},其中的变量t可以视为x也就是\frac{p(x)}{q(x)}的函数D(x),则有:

D_{f}(P||Q)=\underset{x }{\int}\left ( q(x)\left \{ \underset{t\in dom(f^{*})}{max}\frac{p(x)}{q(x)}t-f^{*}(t) \right \} \right )dx,中间花括号中的\underset{t\in dom(f^{*})}{max}\frac{p(x)}{q(x)}t-f^{*}(t)其实就是判别器的工作,找出一个t令这个式子达到最大值。那么判别器的函数可以写作t=D(x)x就是采样点(也就是图像向量),输出的t就是判别器的得分。找到一个最佳的t=D(x)使\frac{p(x)}{q(x)}t-f^{*}(t)最大,才能得到散度D_{f}(P||Q)=\underset{x }{\int}\left ( q(x)\left \{ \underset{t\in dom(f^{*})}{max}\frac{p(x)}{q(x)}t-f^{*}(t) \right \} \right )dx。也就是说所有的t=D(x)取值都只会得到一个小于散度D_{f}(P||Q)的值,即D_{f}(P||Q)\geq \underset{x }{\int} q(x)\left ( \frac{p(x)}{q(x)}D(x)-f^{*}(D(x)) \right )dx= \underset{x }{\int} p(x)D(x)dx-\underset{x }{\int}q(x)f^{*}(D(x)) dx

因此只有t=D(x)越靠近最佳值(能令\frac{p(x)}{q(x)}t-f^{*}(t)=\frac{p(x)}{q(x)}D(x)-f^{*}(D(x))最大的值),才能令式子\underset{x }{\int} p(x)D(x)dx-\underset{x }{\int}q(x)f^{*}(D(x)) dx越接近f-divergence的形式,因此f-divergence可以继续转化:

D_{f}(P||Q)\approx \underset{D}{max}\underset{x }{\int}q(x)\left ( \frac{p(x)}{q(x)}D(x)-f^{*}(D(x)) \right )dx

                  = \underset{D}{max}\underset{x }{\int}p(x)D(x)dx-\underset{x }{\int}q(x)f^{*}(D(x))dx

                 =\underset{D}{max}\left \{ E_{x\sim P} [D(x)]- E_{x\sim Q}[f^{*}(D(x)] \right \}

在GAN中,两个分布P和Q就对应着P_{data}P_{G},因此两者间的f-divergence为:D_{f}(P_{data}||P_{G})\approx \underset{D}{max}\left \{ E_{x\sim P} [D(x)]- E_{x\sim Q}[f^{*}(D(x))] \right \},也就是判别器的工作。而生成器的工作为:

G^{*}=arg\underset{G}{min}D_{f}(P||Q)=arg\underset{G}{min}\underset{D}{max}\left \{ E_{x\sim P} [D(x)]- E_{x\sim Q}[f^{*}(D(x)] \right \}

      =arg\underset{G}{min}\underset{D}{max}V(G,D)

看到这里就觉得熟悉了,其实就是把目标函数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到一起。

猜你喜欢

转载自blog.csdn.net/lynlindasy/article/details/87900215
今日推荐