![](https://i-blog.csdnimg.cn/blog_migrate/11c1e23d4e408bb3851db6b526ce6d10.png)
接下来,先放结论: maximum likelihood estimation 就等价于 minimize KL Divergence
![](https://i-blog.csdnimg.cn/blog_migrate/07e921c6c69d1b6f11a0df903dbc0ce8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8b9e041ba67c1292be85dfd8b43352f2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a0c132f729f083d554502346bbbca0b1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/55a4b47048bc79e0bccd64b672bb0ae5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d6d7d38794e112fe27a8515bb5c36762.png)
重要假设是,D(x) 可以是任意函数(NN拟合的理想情况),那么对于某一个 x ,都可以找一个 D(x) 令 V(G, D) 最大。V 对 D 求梯度后令其为0,得到极大值点 D(x) = P_data(x) / ( P_data(x) + P_G(x) )
再把 D* 代入 V(G, D) 中,就得到了 maxD V(G, D) = V(G, D*) 。然后把log里面的分母除以2,就能提出来两个 -log2
提出来常数项 -2log2 之后,可以发现后面剩下的部分就是两倍的JS散度。因为 JS散度定义为 JSD(P || Q) = KL(P || M) /2 = KL(Q || M) /2,其中 M = (P + Q) / 2
到这里就比较清楚了,接下来就要找一个 G ,最小化 JSD(P_data || P_G) 。举个例子,假设只有3个 G 可以选,那么先对每个固定的 G 找 V(G, D*),然后找一个 Gi 令 V(Gi, D*) 最小,下图所示显然应该选 G3。
对应 GAN 的训练过程,总结一下:
对于 G 的训练,就是要在固定刚才找到的最好的 D 之后,最小化 L(G, D)
这里有个疑问,L(G) 中有 max 函数,能够求梯度吗? —— 可以,分段求(回忆一下 maxout network)
还存在别的问题吗?
回顾一下整个 GAN 的训练流程和实际做法:
这里面还有个技巧,实际上训练 G 的目标函数可以不跟上面的公式一模一样,因为原来的式子会导致起始的时候梯度很小、更新的会很慢
实际的训练过程中,真的会导致 D 最后训练得如下图所示吗(完全不能做判别)?
我自己觉得不会。。。因为实际的训练不会这么理想,本身就有太多假设和近似在里面。
GAN 的一般框架:fGAN
如何把不同的 f-divergence 应用到 GAN 中。 f-divergence 的定义:
满足一些性质:当 p(x) = q(x),Df (P || Q) = 0;并且 Df (P || Q) >= 0
一些常见的 f-divergence 和对应的 f 函数:
任意一个凸函数 f 都有一个共轭函数 f*,满足
求解方式如下图所示,穷举所有的 x,所有的直线 xt-f(x) 求包络线就行了
回到 Df (P || Q) 的表达式,f 的自变量是 p(x) /q(x),代入。本来要穷举所有的 t 让后面的项最大,现在就找一个 D(更新 D 的参数),令 D(x) = t 使得后面的项最大。
其中,由于 D 的拟合能力有限,所以只能得到一个下界
所以,把积分写成对分布求期望
这就是把不同的 f-divergence 应用到 GAN 中的目标函数了
这样做是要解决什么问题? —— Mode Collapse、Mode Dropping
生成数据的模式太集中
Mode Collapse:
Mode Dropping:
这可能是散度的选择导致的,所以就多一些可能的 f-divergence 来选择,然后 ensemble 一下。(不过其实已经有更好的解决方案了)