Tips for Improving GAN
本节思维导图
JS divergence衡量分布的问题
问题在于 P G 和 P d a t a P_G和P_{data} PG和Pdata是不重叠的。因为
-
图片是高维空间中的低维manifold,就像二维平面上的两条一维曲线,重叠的地方是很少的。
-
就算 P G 和 P d a t a P_G和P_{data} PG和Pdata有重叠部分,由于我们是对分布采样,所以一般也不会有重叠。
如果两个分布完全没有重合,它们的JS散度就是常数,这样会造成梯度消失,是没有办法做优化的。
Least Square GAN (LSGAN)
由于蓝色点这边的梯度都是0,很难训练。LSGAN提出用线性分类器替换sigmoid分类器,也就是把分类问题换成回归问题。train的目标是让真实数据越接近1越好,生成数据越接近0越好。
Wasserstein GAN (WGAN)
不用JS散度衡量两个分布的差别,使用Earth Mover’s Distance。
Earth Mover’s Distance
把P和Q的分布看作两堆土。如果想把P的形状变成Q,需要按照Q的形状,移动P堆的某些部分。
将需要填充的块旁边临近的部分移动过去。我们把每一种方案都计算出来,然后找到最小的那个。
可以把moving plan,也就是移动方案定义为一个
γ
\gamma
γ矩阵,
γ
[
i
]
[
j
]
\gamma[i][j]
γ[i][j]代表从第i列移动到第j列的土的多少。而i行元素的和是P土堆第i列土堆的大小,第j列元素的和是目标Q土堆第j列土的大小,对角线元素是P第i列中不移动的土的大小。
B
(
γ
)
=
∑
x
p
,
x
q
γ
(
x
p
,
x
q
)
∣
∣
x
p
−
x
q
∣
∣
W
(
P
,
Q
)
=
m
i
n
γ
∈
∏
B
(
γ
)
B(\gamma)=\sum_{x_p,x_q}\gamma(x_p,x_q)||x_p-x_q|| \\ W(P,Q)=\underset{\gamma \in \prod}{min}B(\gamma)
B(γ)=xp,xq∑γ(xp,xq)∣∣xp−xq∣∣W(P,Q)=γ∈∏minB(γ)
为什么用Earth Mover‘s Distance?
可以解决之前当两分布不重叠梯度就为0的问题。
对于Earth Mover‘s Distance,即使分布不重叠,对于不同差距的分布,是不同的, d 50 比 d 0 d_{50}比d_0 d50比d0更好。
WGAN
V ( G , D ) = m a x D ∈ 1 − L i p s c h i t z { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] } V(G,D)=\underset{D\in1-Lipschitz}{max}\{E_{x\sim{P_{data}}}[D(x)]-E_{x\sim{P_G}}[D(x)]\} V(G,D)=D∈1−Lipschitzmax{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]}
D要是一个1-Lipschitz的函数,也就是D要越平滑越好。这个公式就是希望如果x是从 P d a t a P_{data} Pdata中采样出来的,希望他的discriminator值越大越好,如果是从 P G P_G PG中采样出来的,希望他的discriminator值越小越好。
为什么D需要平滑呢?
因为如果不对D加这个约束的话,D就会在真实数据的地方趋向于正无穷大,生成数据的地方趋向于负无穷大。对D加一个限制,D就不会无限上升或者下降,它最终会在某个地方停下来。
Lipschitz Function
∣ ∣ f ( x 1 ) − f ( x 2 ) ∣ ∣ ≤ K ∣ ∣ x 1 − x 2 ∣ ∣ ||f(x_1)-f(x_2)||\leq{K||x_1-x_2||} ∣∣f(x1)−f(x2)∣∣≤K∣∣x1−x2∣∣
就是输出的变化要小于K倍的输入的变化,当K=1时,我们把满足这个不等式的函数称为1-Lipschitz,也就是
∣
∣
f
(
x
1
)
−
f
(
x
2
)
∣
∣
≤
∣
∣
x
1
−
x
2
∣
∣
||f(x_1)-f(x_2)||\leq{||x_1-x_2||}
∣∣f(x1)−f(x2)∣∣≤∣∣x1−x2∣∣
如何满足1-Lipschitz约束条件呢?
原论文中的方法是:weight clipping
就是需要把权重w限制在c和-c中,如果w>c,则w=c;如果w<-c,则w=-c。
当然这个方法弄出来的函数并不能满足1-Lipschitz function约束条件,但是基本能work,能达到值D平滑的目的。
Improved WGAN
对约束换了一个角度,限制梯度的norm要小于等于1。
D
∈
1
−
L
i
p
s
c
h
i
t
z
⇔
∣
∣
∇
x
D
(
x
)
∣
∣
≤
1
f
o
r
a
l
l
x
D\in{1-Lipschitz}\Leftrightarrow{||\nabla_xD(x)||\leq1for \,all\, x}
D∈1−Lipschitz⇔∣∣∇xD(x)∣∣≤1forallx
V ( G , D ) ≈ m a x D { E x ∼ P d a t a [ D ( x ) ] − E x ∼ P G [ D ( x ) ] − λ ∫ x m a x ( 0 , ∣ ∣ ∇ x D ( x ) ∣ ∣ − 1 ) d x } V(G,D)\approx\underset{D}{max}\{E_{x\sim{P_{data}}}[D(x)]-E_{x\sim{P_G}}[D(x)]-\lambda\int_xmax(0,||\nabla_xD(x)||-1)dx\} V(G,D)≈Dmax{Ex∼Pdata[D(x)]−Ex∼PG[D(x)]−λ∫xmax(0,∣∣∇xD(x)∣∣−1)dx}
后面这个积分类似与正则项,当
∣
∣
∇
x
D
(
x
)
∣
∣
≥
1
||\nabla_xD(x)||\ge1
∣∣∇xD(x)∣∣≥1就会存在正则项。但是由于我们的x是采样出来的,无法做积分,我们把正则项近似成:
−
λ
E
x
∼
P
p
e
n
a
l
t
y
[
m
a
x
(
0
,
∣
∣
∇
x
D
(
x
)
∣
∣
−
1
)
]
-\lambda E_{x\sim{P_{penalty}}}[max(0,||\nabla_xD(x)||-1)]
−λEx∼Ppenalty[max(0,∣∣∇xD(x)∣∣−1)]
做一个可视化,从
P
d
a
t
a
和
P
G
P_{data}和P_G
Pdata和PG中分别取一点,在它们的连线上random sample出一点,这个点就相当于从
P
p
e
n
a
l
t
y
P_{penalty}
Ppenalty中sample出来的。
所以 P p e n a l t y P_{penalty} Ppenalty的分布就是上图中蓝色的部分。
直观来看,只有 P G P_G PG和 P d a t a P_{data} Pdata之间的区域才会影响到 P G P_G PG的学习。
还有一个trick,对于梯度的约束,实际使用的正则项为 ( ∣ ∣ ∇ x D ( x ) ∣ ∣ − 1 ) 2 (||\nabla_xD(x)||-1)^2 (∣∣∇xD(x)∣∣−1)2,希望梯度越接近1越好。理由是因为在实验中这样的效果比较好。
Sepctrum Norm
限制discriminator在每一个位置的norm都满足小于1的条件。
GAN to WGAN
GAN的算法
-
在每次迭代中
-
从真实数据中抽取数据
-
从pior distribution中生成noise sample
-
把noise sample丢到G中,得到生成数据
-
更新生成器D(反复k次,直到收敛)
- M a x i m i z e V ^ = 1 m ∑ i = 1 m l o g D ( x i ) + 1 m ∑ i = 1 m l o g ( 1 − D ( x ~ i ) ) Maximize \,\hat{V}=\frac{1}{m}\sum_{i=1}^{m}logD(x^i)+\frac{1}{m}\sum_{i=1}^{m}log(1-D(\tilde{x}^i)) MaximizeV^=m1∑i=1mlogD(xi)+m1∑i=1mlog(1−D(x~i))
-
再从pior distribution中生成新的noise sample,放入G中,得到新的生成数据
-
更新G
- M i n i m i z e V ^ = − 1 m ∑ i = 1 m l o g D ( x i ) + 1 m ∑ i = 1 m l o g ( 1 − D ( G ( z i ) ) ) Minimize \,\hat{V}=-\frac{1}{m}\sum_{i=1}^{m}logD(x^i)+\frac{1}{m}\sum_{i=1}^{m}log(1-D(G(z^i))) MinimizeV^=−m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(G(zi)))
-
WGAN的算法
修改训练discrminator的式子
V
~
=
1
m
∑
i
=
1
m
D
(
x
i
)
−
1
m
∑
i
=
1
m
D
(
x
~
i
)
\tilde{V}=\frac{1}{m}\sum_{i=1}^{m}D(x^i)-\frac{1}{m}\sum_{i=1}^{m}D(\tilde{x}^i)
V~=m1i=1∑mD(xi)−m1i=1∑mD(x~i)
训练时还要主义使用Weight Clipping/Gradient Penalty等技巧,否则很难收敛。
而generator的式子修改为:
V
~
=
−
1
m
∑
i
=
1
m
D
(
G
(
z
i
)
)
\tilde{V}=-\frac{1}{m}\sum_{i=1}^{m}D(G(z^i))
V~=−m1i=1∑mD(G(zi))
EBGAN
使用autoencoder为discriminator。
好处:
- autoencoder可以pretrain,不需要negative example来训练,直接给positive example来minimize reconstruction error就可以。
- discriminator不再依赖generator,一开始就可以训练的很好。
训练时,我们希望的是在真实数据的时候,让reconstruction error越小越好,而不是在生成数据上的reconstruction error越大越好,因为前者很难,而后者很容易做到,output一个noise就可以做到,这和我们想要的结果不一样。
我们在训练中,为reconstruction error设置一个margin下限(超参数,需要手调),只要小于margin就好。
Loss-sensitive GAN
本来我们希望的是真实数据得分越大越好,而生成数据得分越小越好,但有的时候生成的数据已经很像了,也没必要压低它的分数。
参考: