1. 模型的提出
在深度学习中,我们希望寻找到一种模型能够在学习大量已有数据后,生成符合自然图片、声音的概率分布(probability distributions),即通过机器产生出以假乱真的图片、声音信号。到目前为止,我们在判别模型(discriminative model)领域已经取得了良好的效果,能够将高维的原始信息转换为类别信息。然而,在生成模型(generative model)领域中,使用最大似然估计等方式很难去对概率进行估计,因此收效甚微。为了解决生成模型中的这些问题,作者提出了生成对抗网络框架(generative adversarial nets,GAN)。
2. 模型的思想
GAN 模型的思想其实非常简单,GAN 中存在两个模型:生成模型(generative model)和判别模型(discriminative model)。以图片为例,生成模型的目标是将随机噪声的概率分布转换为与真实的自然图片相同的概率分布,而判别模型的目标则是对生成的图片与自然图片进行区分判别。形象来讲,生成模型就像制造假币的组织,企图制造让人难以辨别的假币,而判别模型就像警察,试图从所有钱币中检测出假币。两种模型相互对抗,共同提高,最终生成模型能够产生出以假乱真的图片。
3. 模型的架构
首先写出目标函数:
min
G
max
D
V
(
D
,
G
)
=
E
x
∼
p
d
a
t
a
(
x
)
[
l
o
g
D
(
x
)
]
+
E
z
∼
p
z
(
z
)
[
l
o
g
(
1
−
D
(
G
(
z
)
)
)
]
\min \limits_{G} \max \limits_{D} V(D,G) = E_{x \sim p_{data}(x)}[logD(x)] + E_{z \sim p_{z}(z)}[log(1 - D(G(z)))]
GminDmaxV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]其中
D
D
D 代表判别函数(真返回1,假返回0),
G
G
G 代表生成函数,
p
d
a
t
a
(
x
)
p_{data}(x)
pdata(x) 是真实分布,
p
z
(
z
)
p_{z}(z)
pz(z) 是噪声分布。
对于不同的生成函数 G G G,都会存在一个判别函数 D D D,能够最大限度的区分出生成的假样本与实际的真样本, max D V ( D , G ) = E x ∼ p d a t a ( x ) [ l o g D ( x ) ] + E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] \max \limits_{D} V(D,G) = E_{x \sim p_{data}(x)}[logD(x)] + E_{z \sim p_{z}(z)}[log(1 - D(G(z)))] DmaxV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))] 反映的就是真假样本分布的差异大小,而目标函数就是希望能寻找到最小化该差异的生成函数 G G G。
下图能够比较清楚地说明生成模型与判别模型相互对抗,共同提高的过程。
黑线代表实际真样本的分布,绿线代表生成假样本的分布,蓝线代表判别函数的判别情况,熟悉最小错误率贝叶斯判别的朋友应该能看懂这个图。
(a)图为初始情况,生成函数得到的样本分本与实际样本分布差异较大。(a)到(b)的过程就是判别函数训练的过程,后面的推导中可以得到最佳判别函数的表达式为 D ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) D^*(x)=\frac{p_{data}(x)}{p_{data}(x)+p_g(x)} D∗(x)=pdata(x)+pg(x)pdata(x), p g ( x ) p_g(x) pg(x) 代表的是生成样本的分布,即 G ( z ) G(z) G(z) 的分布。(b)到(c)的过程是生成函数训练的过程,进一步误导更新后的判别函数。经过反复迭代,最终达到(d),生成函数产生的样本分布与实际样本分布相同,判别函数无法分辨真假样本, D ( x ) = 1 2 D(x)=\frac{1}{2} D(x)=21。
下图是算法实际的训练过程。
先训练判别函数,再训练生成函数,反复迭代后结束。这里面有几个要注意的地方。
- 训练判别函数时,迭代了 k 次,目的是希望每次判别函数能够获得更加准确的判别效果,这能够加速整个迭代过程的收敛,同时激发出生成函数的潜能,获得更好的生成函数。(若判别函数训练效果很差,认为所有的样本均为真样本,那生成函数就没必要再训练了)
- 更新的时候一般采取梯度下降法,在判别模型中,因为是最大化 V ( D , G ) V(D,G) V(D,G),因此更新的时候,是加梯度。
- 在生成模型的更新过程中,因为目标函数第一项与 G G G 无关,因此求梯度时我们只考虑第二项。
4. 理论推导
下面我们进一步推导生成模型与判别模型的每一次更新后的理想结果。
4.1. 判别模型
对于固定的
G
G
G,我们最优的
D
D
D 为:
D
G
∗
(
x
)
=
p
d
a
t
a
(
x
)
p
d
a
t
a
(
x
)
+
p
g
(
x
)
D^*_G(x)=\frac{p_{data}(x)}{p_{data}(x)+p_g(x)}
DG∗(x)=pdata(x)+pg(x)pdata(x) 下面来证明这个结论。
V
(
D
,
G
)
=
E
x
∼
p
d
a
t
a
(
x
)
[
l
o
g
D
(
x
)
]
+
E
z
∼
p
z
(
z
)
[
l
o
g
(
1
−
D
(
G
(
z
)
)
)
]
=
∫
x
p
d
a
t
a
(
x
)
l
o
g
D
(
x
)
d
x
+
∫
z
p
z
(
z
)
l
o
g
(
1
−
D
(
G
(
z
)
)
)
d
z
=
∫
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
=
∫
x
[
p
d
a
t
a
(
x
)
l
o
g
D
(
x
)
+
p
g
(
x
)
l
o
g
(
1
−
D
(
x
)
)
]
d
x
\begin{aligned} V(D,G) & = E_{x \sim p_{data}(x)}[logD(x)] + E_{z \sim p_{z}(z)}[log(1 - D(G(z)))] \\ & = \int_x p_{data}(x)\ logD(x) dx + \int_z p_z(z)\ log(1-D(G(z))) dz \\ & = \int_x p_{data}(x)\ logD(x) dx + \int_x p_g(x)\ log(1-D(x)) dx \\ & = \int_x \Big[p_{data}(x)\ logD(x) + p_g(x)\ log(1-D(x)) \Big] dx \end{aligned}
V(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]=∫xpdata(x) logD(x)dx+∫zpz(z) log(1−D(G(z)))dz=∫xpdata(x) logD(x)dx+∫xpg(x) log(1−D(x))dx=∫x[pdata(x) logD(x)+pg(x) log(1−D(x))]dx 把
D
(
x
)
D(x)
D(x) 当自变量,易证当
D
(
x
)
=
p
d
a
t
a
(
x
)
p
d
a
t
a
(
x
)
+
p
g
(
x
)
D(x) = \frac{p_{data}(x)}{p_{data}(x)+p_g(x)}
D(x)=pdata(x)+pg(x)pdata(x) 时,
V
(
D
,
G
)
V(D,G)
V(D,G) 最大。
4.2. 生成模型
将
D
G
∗
(
x
)
D^*_G(x)
DG∗(x) 带入
max
D
V
(
D
,
G
)
\max \limits_D V(D,G)
DmaxV(D,G),并令
C
(
G
)
=
max
D
V
(
D
,
G
)
C(G) = \max \limits_D V(D,G)
C(G)=DmaxV(D,G),生成模型的目标就是最小化
C
(
G
)
C(G)
C(G)。
C
(
G
)
=
max
D
V
(
G
,
D
)
=
∫
x
[
p
d
a
t
a
(
x
)
l
o
g
D
G
∗
(
x
)
+
p
g
(
x
)
l
o
g
(
1
−
D
G
∗
(
x
)
)
]
d
x
=
∫
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
)
+
p
g
(
x
)
l
o
g
p
g
(
x
)
p
d
a
t
a
(
x
)
+
p
g
(
x
)
]
d
x
=
−
l
o
g
(
4
)
+
∫
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
+
p
g
(
x
)
l
o
g
p
g
(
x
)
p
d
a
t
a
(
x
)
+
p
g
(
x
)
2
]
d
x
=
−
l
o
g
(
4
)
+
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
)
=
−
l
o
g
(
4
)
+
2
⋅
J
S
D
(
p
d
a
t
a
∥
p
g
)
\begin{aligned} C(G) & = \max \limits_D V(G,D) \\ & = \int_x \Big[p_{data}(x)\ logD^*_G(x) + p_g(x)\ log(1-D^*_G(x)) \Big] dx \\ & = \int_x \bigg[p_{data}(x)\ log\frac{p_{data}(x)}{p_{data}(x)+p_g(x)} + p_g(x)\ log\frac{p_g(x)}{p_{data}(x)+p_g(x)} \bigg] dx \\ & = -log(4) + \int_x \Bigg[p_{data}(x)\ log\frac{p_{data}(x)}{\frac{p_{data}(x)+p_g(x)}{2}} + p_g(x)\ log\frac{p_g(x)}{\frac{p_{data}(x)+p_g(x)}{2}} \Bigg]dx \\ & = -log(4) + KL \bigg(p_{data} \bigg\Vert \frac{p_{data} + p_g}{2} \bigg) + KL \bigg(p_g \bigg\Vert \frac{p_{data} + p_g}{2} \bigg) \\ & = -log(4) + 2 \cdot JSD(p_{data} \Vert p_g) \end{aligned}
C(G)=DmaxV(G,D)=∫x[pdata(x) logDG∗(x)+pg(x) log(1−DG∗(x))]dx=∫x[pdata(x) logpdata(x)+pg(x)pdata(x)+pg(x) logpdata(x)+pg(x)pg(x)]dx=−log(4)+∫x[pdata(x) log2pdata(x)+pg(x)pdata(x)+pg(x) log2pdata(x)+pg(x)pg(x)]dx=−log(4)+KL(pdata∥∥∥∥2pdata+pg)+KL(pg∥∥∥∥2pdata+pg)=−log(4)+2⋅JSD(pdata∥pg) 由此,我们可以得到,当
p
d
a
t
a
=
p
g
p_{data}=p_g
pdata=pg 时,
C
(
G
)
C(G)
C(G) 最小
5. 测试
下图展现了 GAN 的训练结果。
每幅图最右侧一列为实际的训练样本,左侧均为模型产生的图片。可见,对于图像相对简单的手写字体以及人脸的生成,效果还是比较不错的,但对于自然界中的复杂物体,生成效果并不算太好,因此在这篇文章提出之后,后续又有人提出了各种 GAN 的改进算法,取得相对较好的效果,感兴趣的朋友可以阅读相关文献,深入学习 GAN。
6. 模型优缺点
6.1. 优点
- 计算机可解决的;
- 生成模型并未看过实际图片,因此训练出的模型比较鲁棒;
- 最终得到的生成模型可以表达成任意形式的分布。
6.2. 缺点
判别模型 D D D 和生成模型 G G G 在训练过程中必须同步更新,防止出现 “the Helvetica scenario” 的现象,即多个不同的输入对应同一个输出,这种现象也叫做 “mode collapse”。因此该模型的训练是比较困难的,对于参数的调整也要求一定的技巧。