GAN开山之作论文解读及感想
研一生涯快结束了,看了一些论文,最终还是决定继续深度学习,本科阶段学过了TensorFlow,也还算有一些基础吧,了解了一下GAN生成对抗网络,写一写学习心得
GAN模型介绍
《Generative Adversarial Nets》是Ian J.Goodfellow发表在NIPS 2014上的一篇论文,也是GANs的开山之作。文中提出了GAN的模型定义以及数学公式定义与证明,并用警察和印假钞的犯罪分子的例子去解释生成器G和判别器D,最后给出了在理想情况下G能生成以假乱真的样本,而此时D的损失值loss为1/2的结论。
在原文中使用了印假钞的犯罪分子与辨识假钞的警察为例,犯罪分子希望能够印刷骗过警察的假钞,而警察希望能够辨识出假钞。在一次次的博弈中,警察的辨识手段越来越丰富,而犯罪分子的技术也越来越高明。最后,假钞能够以假乱真,而警察完全无法辨识,双方在不断的博弈中达到纳什均衡。其中犯罪分子对应生成器G,而警察对应判别器D。
这里我想补充一点的是,在警察和印假钞的犯罪分子的博弈之间,警察是需要分辨真钞和假钞的,也就是说,真钞和假钞都是警察所要判断的数据集,而犯罪分子是需要通过自己的手段去使假币尽量成真,也就是说生成器并不是以真实图像作为自己的目标,而是以判别器为目标,生成能够骗过判别器的数据,从而使判别器无法分辨此时的图像是真实的还是生成器生成的图片,也就是让警察分辨不出他所印的不是真钞。如果还是不太明白的话,可以拿枯叶蝶举个例子,枯叶蝶想要不让天敌发现自己,将自己伪装成枯叶,可它本身是不可能变成枯叶的,只能让自己在枯叶中不被天敌发现。
模型结构
这张图可以简化成下图:
模型分为生成器G和判别器D两部分,生成器G输入噪声z生成样本,判别器D输入真实样x和G生成的样本G(z),并输出表示输入的样本是否为真实样本概率的一个标量。
D希望最大化甄别真实样本的概率
E
x
∼
p
d
a
t
a
(
x
)
[
l
o
g
D
(
x
)
]
E_{x∼pdata(x)}[logD(x)]
Ex∼pdata(x)[logD(x)]
和甄别生成样本的概率
E
z
∼
p
z
(
z
)
[
l
o
g
(
1
−
D
(
G
(
z
)
)
]
E_{z∼pz(z)}[log( 1−D(G(z))]
Ez∼pz(z)[log(1−D(G(z))]
而G的目标则是最小化第二项。文中使用V (G ,D)来表述这一过程:
其中,z表示随机噪声,pz(z)表示随机噪声z服从的概率分布,G(z)表示生成器输入z输出假图像,x~p_data表示真实数据服从的概率分布,D(x)表示输入图像输出改图像来自x的概率。
训练过程
图中黑色虚线表示真实数据分布,蓝色虚线表示判别器预测x为真实数据的概率,绿色实线为生成器生成图像分布,水平线x是图像空间,z为噪声空间。
首先,通过训练判别器D,可以在b图中看出,判别器在前期准确判断的判断率很高,在绿色实线附近蓝色虚线是很低的,这说明在训练刚开始时D能轻易分辨出真实样本,其次,训练生成器G,固定判别器D,此时c图反映出判别器还是能够大概率分辨出真实样本和生成样本,最后,随着生成器和判别器交替训练若干轮,两者达到纳什均衡,此时判别器判断输入是数据是真实数据的概率为0.5,即判别器完全无法区分两个分布。
证明过程
对于给定G,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)
由(1)式最大化判别器价值函数
将上式的期望改为积分形式,可以得到:
期望与积分的转化其实就是期望的定义:
E
p
(
X
)
[
f
(
x
)
]
=
∫
x
p
(
x
)
f
(
x
)
d
x
E_{p_{(X)}}[f(x)]=\int_xp(x)f(x)dx
Ep(X)[f(x)]=∫xp(x)f(x)dx
而当z-x为单射时,对噪声z采样相当于对假图像采样,故
E
p
z
(
z
)
l
o
g
(
1
−
D
(
G
(
z
)
)
)
=
E
p
G
(
x
)
l
o
g
(
1
−
D
(
x
)
)
E_{p_z(z)}log(1-D(G(z)))=E_{p_G(x)}log(1-D(x))
Epz(z)log(1−D(G(z)))=EpG(x)log(1−D(x))
对于任何
(
a
,
b
)
∈
R
2
\
{
0
,
0
}
(a,b)\in\mathbb{R}^{2}\backslash\{0,0\}
(a,b)∈R2\{0,0}
方程
a
log
(
y
)
+
b
log
(
1
−
y
)
a\log(y)+b \log(1-y)
alog(y)+blog(1−y)
总是能够在
y
=
a
a
+
b
y=\frac{a}{a+b}
y=a+ba
时取到最大值,
y
∈
[
0
,
1
]
y\in[0,1]
y∈[0,1]
在原式中
a
=
p
d
a
t
a
(
x
)
,
b
=
p
g
(
x
)
a=p_{data}(x),b=p_{g}(x)
a=pdata(x),b=pg(x)
因此求得
D
∗
=
p
data
(
x
)
p
data
(
x
)
+
p
g
(
x
)
D^*=\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}
D∗=pdata (x)+pg(x)pdata (x)
这里其实用得是凸函数的性质,推断公式如下:
当且仅当
p
g
=
p
d
a
t
a
p_{g} = p_{data}
pg=pdata
时,生成器价值函数C(G)取得全局最小解-log4.
其实此篇文章最难懂的就是数学证明这一部分,这一部分的证明当时也是看的头很大,然后去B站搜了一些视频看,好在最后看懂了一些,GAN的学习之旅算是开了个头,以后要继续深入学习,争取有时间就把感想写下来,把输入转变为输出,继续努力!
本文所提到的文献地址:https://papers.nips.cc/paper/5423-generative-adversarial-nets.pdf
最后,书读百遍,其义自见!