fGAN 其实想要表达的就是一件事,不只是 JS Div,任何的 Div(统称为 f-Div)都可以
被放到 GANs 的架构中去。
fGAN 的证明。
设定 P 和 Q 是两个不同的分布, p(x)和 q(x)代表着分别从 P 和 Q 采样出 x 的几率,
则我们将 f-Div 定义为:
上述公式衡量 P 和 Q 有多不一样,公式里边的函数 f 可以是很多不同的版本,只要 f
满足以下条件:它是一个凸函数同时 f(1)=0 。
分析:
- 假设对于所有的 x 来说,都有 p(x)=q(x),则有D𝑓(P,Q)=0,也就是意味着两个分布
没有区别,和假设一样。 - 同时 0 是D𝑓能取到的最小值:
也就是说,只要两个分布稍有不同,就能通过 D𝑓得到的正值反映出来。这个时候我们
发现之前常用的 KL Div 其实就是 F Div 的一种。
当你设置 f(x)=xlogx,即将 F Div 转换为了 KL Div 了。
当你设置 f(x)=−logx,即将 F Div 转换为了 Reverse KL Div。
当你设置 f(x)=(x − 1)2,即将 F Div 转换为了 Chi Square。
生成函数列表
Fenchel 共轭(Fenchel Conjugate)
每一个凸函数 f(x)都有对应的一个共轭函数取作f ∗(x):
上述公式的意思就是给定 t 找出一个在 f(x)里边有定义的 x 使得 xt−f(x) 最大,当然
t 可以无限取值,那么假定我们取值 t=t1 和 t=t2 则有:
对于所有可能的变量 t ,xt−f(x) 对应了无数条直线:
这个时候给定某个 t 看看哪个 x 可以取得最大值:
如上图,当 t=t1 的时候,找到最大点 f ∗(t1),当 t=t2 的时候,找到最大点 f ∗(t2),遍
历所有的 t 即可得到红色的这条函数就是 f ∗(t):
例子
当 f(x)=x logx 时,可以将对应的f∗(t)画出来:
这个图实际上是一个指数函数,当 f(x)=x logx 时,f∗(t)=e
t
^t
t
−
^-
−
1
^1
1。
由于
假设让 g(x)=xt−x logx,那么现在的问题就变成了:给定一个 t 时, 求 g(x)的最大值问题。对 g(x) 求导并让导数为 0:dg(x)/dx=t−logx−1=0,可解得 x=e
t
^t
t
−
^-
−
1
^1
1。再带入回原公式可得:
f∗(t)=e
t
^t
t
−
^-
−
1
^1
1×t−e
t
^t
t
−
^-
−
1
^1
1×(t−1)=e
t
^t
t
−
^-
−
1
^1
1。
f-Div GAN
那我们怎么用上边的数学知识和 GAN 联系在一起呢? 我们首先要记得这条公式,关
于 f ∗(t) 和 f(x)的转换关系式:
利用这个关系,我们能够将 F Div 的定义变形为一个类似于 GAN 的式子。
解释一下上式:
- 第一行就是 F Div 的定义式;
- 第三行将 t 替换成 D(x) 并将 = 替换成 ⩾ 原因是:我们要求得的是给定 x 找到一
个 t 使得式子最大,也就是说不管 D(x) 取什么值都一定小于或者等于第二行的式子; - 最后一步就是,我要找到一个 D 使得,式子最大,上界就是等于第二行的式子。
现在我们推导出关于 f Div 的变式:
我们知道,GAN 的目的是训练生成器 G,使其产生的数据分布 𝑃𝐺与真实数据的分布
𝑃𝑑𝑎𝑡𝑎尽可能小。换言之,如果我们用 f-Div 来表达 𝑃𝐺 与 𝑃𝑑𝑎𝑡𝑎 的差异,则希望最小化
。
对于生成器来说,我们就是要找到一个 𝑃𝐺使得有:
上述从数学推导上给出了 V(G,D) 的定义方式。但实际上要注意,此处的 V(G,D) 不一
定就是原生 GAN 的形式。 f-Div GAN 是对 GAN 模型的统一,对任意满足条件的 f 都可
以构造一个对应的 GAN。
分析
我们先考虑一下𝑃𝐺 与 𝑃𝑑𝑎𝑡𝑎的实际分布情况,我们会发现,大多数情况下 𝑃𝐺 与 𝑃𝑑𝑎𝑡𝑎
是没有重合的。因为一方面,从理论上来说,𝑃𝐺 与 𝑃𝑑𝑎𝑡𝑎都属于高维空间中的低维流形,二者具有重合的可能性是非常低的;另外一方面,从实际上来看,即算𝑃𝐺 与 𝑃𝑑𝑎𝑡𝑎的分布有了重合区域(如下左图),但是在实际训练中我们是从𝑃𝐺 与 𝑃𝑑𝑎𝑡𝑎中取的采样,这些采样形成的分布很有可能是互不相交的(如下右图),我们仍然能找到一条分割线将𝑃𝐺 与 𝑃𝑑𝑎𝑡𝑎完美分割开来(如右图中的黑线)。所以我们可以认为,大多数情况下 𝑃𝐺 与 𝑃𝑑𝑎𝑡𝑎是没有重合的。
在上图中可以看出,𝑃𝐺0与𝑃𝐺1都与𝑃𝑑𝑎𝑡𝑎没有交集,但是𝑃𝐺1与𝑃𝑑𝑎𝑡𝑎的距离比𝑃𝐺0与𝑃𝑑𝑎𝑡𝑎的距离近,然而用 JS Div 去衡量二者的距离却是一样的,都为 log2,这是我们认为 JS Div 不合理的地方,因为实际情况是Div(𝑃𝐺1 ,𝑃𝑑𝑎𝑡𝑎)应当比Div(𝑃𝐺0 ,𝑃𝑑𝑎𝑡𝑎)要小,才能反映出𝑃𝐺1与 𝑃𝑑𝑎𝑡𝑎比𝑃𝐺0与𝑃𝑑𝑎𝑡𝑎要靠的更近。有必要说明一下,为什么如果两个分布完全没有重合的话,那么这两个分布的 JS Div 会是一样的。前面有提到,JS Div 是通过判别器计算出来的,而判别器的本质是二分类器,只要𝑃𝐺与𝑃𝑑𝑎𝑡𝑎完全没有重合,判别器就能 100%地鉴别出𝑃𝐺(𝑥)与 𝑃𝑑𝑎𝑡𝑎(𝑥)的差异,因此二者的 JS Div 就是一样的。