Theory behind GAN
本文是在李宏毅老师机器学习课堂讲解的基础上总结的GAN的原理推导。
Generation
理解GAN生成图像的背后是在做什么工作。
例如一张64 × \times × 64的图片 x x x,可以看做是64 × \times × 64维空间中的一个点。在这个64 × \times × 64维的Image Space中,存在一个固定的分布 P P P, 只有 P P P 中采样出的点(高维空间中的点,即是一幅图像),才会高概率是有意义的图像(比如要生成人脸,那么只有 P P P 中的点是人脸图像)。那么图像生成实际上就是让机器通过“看”大量的某一类图像,找出这个分布。
Before GAN
在GAN出现之前,完成上述目标是通过最大似然估计来完成的。
所谓最大似然估计,在这里就是对每一个真实数据分布的采样点
{
x
1
,
x
2
,
.
.
.
,
x
m
}
\{x^1,x^2,...,x^m\}
{x1,x2,...,xm},计算模型参数
θ
\theta
θ 下,从我们的分布
P
G
(
x
;
θ
)
P_G(x;\theta)
PG(x;θ) 中得到这个
x
i
x^i
xi 的似然。所以对于所有的采样点,可以得到一个total likelihood:
L
=
∏
i
=
1
m
P
G
(
x
i
;
θ
)
L = \prod_{i=1}^{m}{P_G(x^i;\theta)}
L=i=1∏mPG(xi;θ)
L
L
L 越大,说明我们创建的分布
P
G
(
x
;
θ
)
P_G(x;\theta)
PG(x;θ) 越接近真实分布
P
d
a
t
a
(
x
)
P_{data}(x)
Pdata(x) ,因此,目标就是找到使
L
L
L 最大的模型参数
θ
∗
\theta^*
θ∗ 。
另一个解释:最大似然估计等同于最小KL散度
需要注意图中约等于号的意思,简单来说就是maximize ∑ i = 1 m l o g P G ( x i ; θ ) \sum_{i=1}^{m}{logP_G(x^i;\theta)} ∑i=1mlogPG(xi;θ) 的过程近似等于maximize l o g P G ( x i ; θ ) logP_G(x^i;\theta) logPG(xi;θ) 的期望。图中剩下的部分都是简单的数学推导。但是实际上,复杂一点的情况下likelihood是很难计算的,早期生成工作(80年代就在做了。。。)都是用高斯分布来作为 P G ( x ; θ ) P_G(x;\theta) PG(x;θ),效果不尽人意。
Generator
生成器就是为了解决上述问题,通过一个网络,把一个正态分布或者均匀分布转换为 P G P_G PG, 然后最小化 P G P_G PG 和 P d a t a P_{data} Pdata 的divergence。但是存在一个很关键的问题,无论是 P G P_G PG 还是 P d a t a P_{data} Pdata ,它们的formulation是不知道的,所以更不可能计算divergence。(否则直接计算divergence再用gradient descent就好了)
Discriminator
GAN的高明之处就是引入了一个 Discriminator,通过Discriminator的存在,巧妙的转换了求解divergence的问题,先简单讲解一下Discriminator做了什么 。
首先在 P G P_G PG 和 P d a t a P_{data} Pdata 采样,如上图所示。得到的真实samples和生成samples用来训练discriminator。
在训练discriminator的时候,generator是固定住的。discriminator可以看作是一个二分类器,其目的就是对于生成的图像(即 P G P_G PG 的采样)输出越小越好,反过来对于真实图像(即 P d a t a P_{data} Pdata 的采样)输出越大越好。 V ( G , D ) V(G,D) V(G,D)就是目标函数,而这个目标函数是和前面说的无法计算的divergence有相关的。直观理解就是,如下图第一行中的两种星星,当两个分布的divergence很小时,discriminator很难区分,也就意味着目标函数也达不到很大的值;反过来就是,如果目标函数的值小,代表devergence小。那么,生成器中的 D i v Div Div就可以通过 max D V ( D , G ) \max_{D}V(D,G) maxDV(D,G)来替换。再通俗的说,用判别器来检测生成器生成的图像,当判别器无法分辨原始图像和真实图像时( max D V ( D , G ) \max_{D}V(D,G) maxDV(D,G)的值很小),就代表生成器生成的分布已经很接近真实图像分布( D i v Div Div)小,这就间接解决了上面说的 D i v Div Div无法计算的问题。具体过程可以结合下面的公式推导理解。
接下来是数学推导,这里我一步步给出公式,方便理解。
首先从判别器的目标函数
V
V
V 开始:
V
=
E
x
∼
P
d
a
t
a
[
l
o
g
D
(
x
)
]
+
E
x
∼
P
G
[
l
o
g
(
1
−
D
(
x
)
)
]
V = E_{x \sim P_{data}}[logD(x)]+E_{x \sim P_{G}}[log(1-D(x))]
V=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]
求期望改成积分形式:
V
=
∫
x
P
d
a
t
a
(
x
)
l
o
g
D
(
x
)
d
x
+
∫
x
P
G
(
x
)
l
o
g
(
1
−
D
(
x
)
)
d
x
V = \int_{x}{P_{data}(x)logD(x)dx} + \int_{x}{P_{G}(x)log(1-D(x))dx}
V=∫xPdata(x)logD(x)dx+∫xPG(x)log(1−D(x))dx
积分合并:
V
=
∫
x
[
P
d
a
t
a
(
x
)
l
o
g
D
(
x
)
+
P
G
(
x
)
l
o
g
(
1
−
D
(
x
)
)
]
d
x
V = \int_{x}{[P_{data}(x)logD(x) + P_{G}(x)log(1-D(x))]dx}
V=∫x[Pdata(x)logD(x)+PG(x)log(1−D(x))]dx
首先做一个假设,
D
(
x
)
D(x)
D(x) 可以是任意函数(实际上假设是不成立的,除非神经元无穷多)。有了这个假设,每个
x
x
x 的值都可以分开算,然后再求和(积分的过程),因此maximize
V
V
V,就变成了对于每一个
x
x
x ,找出一个
D
∗
D^*
D∗, 使得上式积分中的值最大,
P
G
P_G
PG 和
P
d
a
t
a
P_{data}
Pdata是固定的,令
P
d
a
t
a
=
a
P_{data} = a
Pdata=a,
P
G
=
b
P_G = b
PG=b,则有:
f
(
D
)
=
a
l
o
g
(
D
)
+
b
l
o
g
(
1
−
D
)
f(D) = alog(D) + blog(1-D)
f(D)=alog(D)+blog(1−D)
于是就变成很简单的求极值问题,对
f
(
D
)
f(D)
f(D)求微分:
d
f
(
D
)
d
D
=
a
×
1
D
+
b
×
1
1
−
D
×
(
−
1
)
=
0
\frac {df(D)}{dD} = a \times \frac 1D + b \times \frac 1{1 - D} \times (-1) = 0
dDdf(D)=a×D1+b×1−D1×(−1)=0
a
×
1
D
∗
=
b
×
1
1
−
D
∗
a \times \frac1D^* = b \times \frac 1{1-D^*}
a×D1∗=b×1−D∗1
a
×
(
1
−
D
∗
)
=
b
×
D
∗
a \times (1-D^*) = b \times D^*
a×(1−D∗)=b×D∗
D
∗
=
a
a
+
b
D^* = \frac a{a + b}
D∗=a+ba
D
∗
=
P
d
a
t
a
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
D^* = \frac {P_{data}(x)}{P_{data}(x) + P_G(x)}
D∗=Pdata(x)+PG(x)Pdata(x)
那么:
max
D
V
(
G
,
D
)
=
V
(
G
,
D
∗
)
\max_{D}V(G,D) = V(G, D^*)
DmaxV(G,D)=V(G,D∗)
接下来,把上面求出的
D
∗
D^*
D∗代入:
V
(
G
,
D
∗
)
=
∫
x
P
d
a
t
a
(
x
)
l
o
g
P
d
a
t
a
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
d
x
+
∫
x
P
G
(
x
)
l
o
g
P
G
(
x
)
P
d
a
t
a
(
x
)
+
P
G
(
x
)
d
x
V(G,D^*) = \int_{x}{P_{data}(x)log \frac {P_{data}(x)}{P_{data}(x) + P_G(x)}dx} + \int_{x}{P_{G}(x)log \frac {P_{G}(x)}{P_{data}(x) + P_G(x)}dx}
V(G,D∗)=∫xPdata(x)logPdata(x)+PG(x)Pdata(x)dx+∫xPG(x)logPdata(x)+PG(x)PG(x)dx
分子分母同乘一个
1
2
\frac 12
21,并把分子的
1
2
\frac 12
21提出来:
V
(
G
,
D
∗
)
=
−
2
l
o
g
2
+
∫
x
P
d
a
t
a
(
x
)
l
o
g
P
d
a
t
a
(
x
)
(
P
d
a
t
a
(
x
)
+
P
G
(
x
)
)
/
2
d
x
+
∫
x
P
G
(
x
)
l
o
g
P
G
(
x
)
(
P
d
a
t
a
(
x
)
+
P
G
(
x
)
)
/
2
d
x
V(G,D^*) = -2log2 + \int_{x}{P_{data}(x)log \frac {P_{data}(x)}{(P_{data}(x) + P_G(x))/2}dx} + \int_{x}{P_{G}(x)log \frac {P_{G}(x)}{(P_{data}(x) + P_G(x))/2}dx}
V(G,D∗)=−2log2+∫xPdata(x)log(Pdata(x)+PG(x))/2Pdata(x)dx+∫xPG(x)log(Pdata(x)+PG(x))/2PG(x)dx
那么,两个积分项便是两个KL divergence:
V
(
G
,
D
∗
)
=
−
2
l
o
g
2
+
K
L
(
P
d
a
t
a
∣
∣
P
d
a
t
a
+
P
G
2
)
+
K
L
(
P
G
∣
∣
P
d
a
t
a
+
P
G
2
)
V(G,D^*) = -2log2 + KL(P_{data}|| \frac {P_{data}+P_G}2) + KL(P_{G}|| \frac {P_{data}+P_G}2)
V(G,D∗)=−2log2+KL(Pdata∣∣2Pdata+PG)+KL(PG∣∣2Pdata+PG)
后面两项又是一个叫 Jensen-Shannon divergence的东西:
V
(
G
,
D
∗
)
=
−
2
l
o
g
2
+
2
J
S
D
(
P
d
a
t
a
∣
∣
P
G
)
V(G,D^*) = -2log2 + 2JSD(P_{data}||P_G)
V(G,D∗)=−2log2+2JSD(Pdata∣∣PG)
最终得到的结论就是,我们maximize 目标函数
V
V
V,其实就得到了
P
G
P_G
PG 和
P
d
a
t
a
P_{data}
Pdata之间的JS散度。所以,训练discriminator的过程,就是为了得到上述的
D
∗
D^*
D∗。
回顾一下生成器和判别器:
G
∗
=
a
r
g
min
G
D
i
v
(
P
G
,
P
d
a
t
a
)
G^* = arg\,\min_{G} Div(P_G, P_{data})
G∗=argGminDiv(PG,Pdata)
D
∗
=
a
r
g
max
D
V
(
D
,
G
)
D^* = arg\,\max_{D} V(D,G)
D∗=argDmaxV(D,G)
刚刚的推导得到,
max
D
(
D
,
G
)
\max_D(D,G)
maxD(D,G) 和
D
i
v
Div
Div是相关的,那么
D
i
v
(
P
G
,
P
d
a
t
a
)
Div(P_G, P_{data})
Div(PG,Pdata),就可以通过判别器中
max
D
V
(
D
,
G
)
\max_{D} V(D,G)
maxDV(D,G)来替换,即:
G
∗
=
a
r
g
min
G
max
D
V
(
D
,
G
)
G^* = arg\,\min_{G} \max_{D} V(D,G)
G∗=argGminDmaxV(D,G)
这个公式是不是很熟悉!
好了先到这里,第一次尝试深入理解GAN的原理,有错误欢迎指正。