fGAN的基本想法就是希望用不同的散度来取代JS散度

使得任何divergence都可以应用到GAN的框架中

f-divergence :Df(P||Q)=xq(x)f(p(x)q(x))dx

f函数需满足当x=1f(x)=0fconvex

这个式子可以衡量分布P和Q的差异

若P分布和Q分布相同,则Df(P||Q)=xf(1)dx=0

当P分布与Q分布不同时,Df(P||Q)=xq(x)f(p(x)q(x))dxf(xq(x)p(x)q(x))=f(1)=0

(这里的积分大于等于是因为fconvex)

f(x)=xlogx

Df(P||Q)=xp(x)q(x)log(p(x)q(x))=xp(x)log(p(x)q(x))=DKL(P||Q)

f(x)=logx

Df(P||Q)=DKL(Q||P),即ReverseKL

共轭函数(Fenchel Conjugate):

每个convex function f,都有一个conjugate function f

f(t)=maxxdom(f)xtf(x)

f(t1)xt1f(x)x的任意取值取得的最大值

我们将x取不同值的xtf(x)直线画出来

取每一段位置的upperbound就是f的Fenchel Conjugate

比如xlogx的Fenchel Conjugate就是f(t)=exp(t1)

f(t)=maxxdom(f)xtf(x)

g(x)=xtxlogx

现在给定t要使得g(x)最大

prove:

tlogx1=0

x=exp(t1)

f(t)=exp(t1)texp(t1)(t1)=exp(t1)

得证

因为ff是共轭函数

所以f(t)=maxxdom(f)xtf(x)

可以转化为f(x)=maxxtf(t)

tdom(f)

Df(P||Q)=xq(x)f(p(x)q(x))dx

=xq(x)(maxp(x)q(x)tf(t))dx

Df(P||Q)xq(x)(p(x)q(x)D(x)f(D(x)))dx

=xp(x)D(x)dxxq(x)f(D(x))dx

所以说我们只要找一个D(x)输出为t

只要其能逼近t,那么这个式子就能逼近xdivergence

Df(P||Q)

maxDxp(x)D(x)dxxq(x)f(D(x))dx

=maxDExP[D(x)]ExQ[f(D(x))]

G=argminGDf(Pdata||PG)

=argminGmaxDExPdata[D(x)]ExPG[f(D(x)]

那么只要得到f的共轭函数,我们就能构造出一个对应的GAN

在GAN的训练中通常会碰到以下两个问题:

Mode Collapse:训练到最后可能生成结果中同一张人脸会反复出现

Mode Dropping:Generator switches mode during training(比如第t次迭代全是黄皮肤,t+1次全是白皮肤,t+2次全是黑皮肤)

不同的divergence测试说明了这两个问题和JS-divergence无关