该博客是根据台大李宏毅老师的关于GAN的****所整理的笔记,建议大家可以直接看这个老师的视频(因在youtube,故需翻墙)
Improving Generative Adversarial Network

f-GAN
总结:除了可以使用 J-S divergence 外,还可以选择其它任何 f-divergence 来评测两个分布的差异度,即任意 f-divergence 均可套用到 GANs 框架中
f-divergence
P 和 Q 是两个分布。p(x) 和 q(x) 是从这两个分布中采样得到 x 的概率,f-divergence 的计算公式为:
Df(P∣Q)=∫xq(x)f(q(x)p(x))dx≥0,s.t.,f is convex,f(1)=0
该公式用于评测这两个分布之间的差异,值越高,差异越大,反之越小。
(Reverse) KL-divergence 是 f-divergence 的一种特例:
f(x)=xlogxf(x)=−logxf(x)=(x−1)2→→→Df(P∥Q)=∫xq(x)q(x)p(x)logq(x)p(x)dx=∫xp(x)logq(x)p(x)dx (KL)Df(P∥Q)=∫xq(x)(−logq(x)p(x))dx=∫xq(x)logp(x)q(x)dx (Reverse KL)Df(P∥Q)=∫xq(x)(q(x)p(x)−1)2dx=∫xq(x)(p(x)−q(x))2dx (Chi Square)
Fenchel Conjugate (共轭函数)
每一个凸函数 f 都有一个共轭函数 f∗: f∗(t)=xt∈dom(f)max{xt−f(x)}=x∈dom(f)sup(xt−f(x)),即上确界。注意,f∗ 也是一个凸函数

例子:
f(x)=xlogx→→→→f∗(t)=maxx∈dom(f){xt−f(x)}g(x)=xt−xlogx, 给定t,求解使得g(x)最大的x对g(x)求导并令其导数为零解得: x=exp(t−1)f∗(t)=exp(t−1)×t−exp(t−1)×(t−1)=exp(t−1)
Connection with GAN
Df(P∥Q)∴Df(P∥Q)==≥=≈=∫xq(x)f(q(x)p(x))dx∫xq(x)(maxt∈dom(f∗){q(x)p(x)t−f∗(t)})dx(假设存在函数 D:x→t)∫xq(x)(q(x)p(x)D(x)−f∗(D(x)))dx∫xp(x)D(x)dx−∫xq(x)f∗(D(x))dxmaxD∫xp(x)D(x)dx−∫xq(x)f∗(D(x))dxmaxD{Ex∼P[D(x)]−Ex∼Q[f∗(D(x))]}
在实际中,由于 P、Q是无法得知的,故只能通过从 P、Q 中采样来计算其期望值,即用样本期望来近似真实期望。套用到 f-GAN 中即为:
Df(Ddata∥PG)G∗G∗=⇓===⇓=maxD{Ex∼Pdata[D(x)]−Ex∼PG[f∗(D(x))]}argminGDf(Pdata∥PG)argminGmaxD{Ex∼Pdata[D(x)]−Ex∼PG[f∗(D(x))]}argminGmaxDV(G,D)argminθGmaxθDV(θG,θD)
f-GAN算法训练流程:


WGAN
Earch Mover’s Distance 推土机距离


K-Lipschitz Function
满足如下定义的 f 即为 k-Lipschitz 函数:
∥f(x1)−f(x2)∥≤K∥x1−x2∥
从该式看,即要求 “output change” 比 “input change” 小 K 倍,背后意图是 “Do not change too fast”,更详细的可参考我的另一篇博客DL中常用的三种K-Lipschitz技术
Back to GAN
Df(Pdata∥PG)W(Pdata,PG)=⇓=maxD{Ex∼Pdata[D(x)]−Ex∼PG[f∗(D(x))]}maxD∈1-Lipschitz{Ex∼Pdata[D(x)]−Ex∈PG[D(x)]}
与 Df 相比,W 的好处(右边);将 D 限制在 1-Lipschitz 的原因(左边),本质上是限制右边绿色线的斜率,使之不会无穷大或无穷小

如何利用 gradient descent 来优化 W(Pdata,PG),论文提出两种方法:
将权重参数 w 限制在区间 [−c,c] 中。具体为:
在参数更新后,做
w=⎩⎪⎨⎪⎧c−cw,if w>c,if w<−c,others
注意,通过 Weight clipping 后并无法保证 D 是 1-Lipschitz,而只能保证它是 K-Lipschitz 的(对某个 K)。同时,也无法保证所找到的 D 是一定能最大化该函数的。算法实现如下:

使用 W-GAN 的话,可以直接用Discriminator的loss来直接评测模型的好坏,这是传统的GAN所无法做到的
- Gradient penalty: 即为下面 Improved WGAN 所用的方法
Improved WGAN
理论支持:一个可微函数是 1-Lipschitz 当且仅当它对所有的输入 x 均有 ∥∇xf(x)∥≤1,即:
D∈1-Lipschitz⟺∥∇xD(x)∥≤1 for all x
根据该理论,重写 WGAN 的 W 函数后即得到 Improved WGAN 的 W 函数,即:
W(Pdata,PG)W(Pdata,PG)=⇓≈≈maxD∈1-Lipschitz{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}maxD{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]−λ∫xmax(0,∥∇xD(x)∥−1)dx}maxD{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]−λEx∼Ppenalty[max(0,∥∇xD(x)∥−1)]}
改成新的函数后,所求解出的函数 D 随无法保证一定满足 ∥∇xD(x)∥≤1,但 D 会偏向于该性质。而式中的 Ppenalty 的获取方式如下:
- 从 Pdata、PG 中各采样出一个点 x1,x2
- 连接该两点获得线段 lx1x2,然后再从这条线段中在采样出一个点 x,该点即为 Ppenalty 的元素
- 重复1,2以获取多个 x 直至数量到达一个阈值

Conditional GAN

Cycle GAN

上面是真实图片风格化,下面是风格图片真实化