对于GAN的理解
借用参考资料[1]中对于GAN的描述: 假设一个城市治安混乱,很快,这个城市里就会出现无数的小偷。在这些小偷中,有的可能是盗窃高手,有的可能毫无技术可言。假如这个城市开始整饬其治安,突然开展一场打击犯罪的「运动」,警察们开始恢复城市中的巡逻,很快,一批「学艺不精」的小偷就被捉住了。之所以捉住的是那些没有技术含量的小偷,是因为警察们的技术也不行了,在捉住一批低端小偷后,城市的治安水平变得怎样倒还不好说,但很明显,城市里小偷们的平均水平已经大大提高了。 警察们开始继续训练自己的破案技术,开始抓住那些越来越狡猾的小偷。随着这些职业惯犯们的落网,警察们也练就了特别的本事,他们能很快能从一群人中发现可疑人员,于是上前盘查,并最终逮捕嫌犯;小偷们的日子也不好过了,因为警察们的水平大大提高,如果还想以前那样表现得鬼鬼祟祟,那么很快就会被警察捉住。 为了避免被捕,小偷们努力表现得不那么「可疑」,而魔高一尺、道高一丈,警察也在不断提高自己的水平,争取将小偷和无辜的普通群众区分开。随着警察和小偷之间的这种「交流」与「切磋」,小偷们都变得非常谨慎,他们有着极高的偷窃技巧,表现得跟普通群众一模一样,而警察们都练就了「火眼金睛」,一旦发现可疑人员,就能马上发现并及时控制——最终,我们同时得到了最强的小偷和最强的警察。 由此,可以引出生成对抗网络(GAN)的结构了,由2个重要的部分构成:
- 生成器(Generator):通过机器生成数据(大部分情况下是图像),目的是“骗过”判别器
- 判别器(Discriminator):判断这张图像是真实的还是机器生成的,目的是找出生成器做的“假数据”
GAN的公式理解
整体公式: 其中,x表示真实的图片,z表示网络中输入的噪声,G(z)表示G网络生成的图片,D(*)表示D网络判断图片是否真实的概率。
前半部分: 对于判别器D,我们希望它可以正确地识别真实数据,这便是GAN公式的前半部分: 其中,对数函数log可以用来放大损失,因为概率越接近于0,则通过log之后产生的值越大
其中,
E
x
?
p
d
a
t
a
E_{x-pdata}
Ex?pdata? 表示期望x从
P
d
a
t
a
P_{data}
Pdata? 中获取。x表示真实的数据,
P
d
a
t
a
P_{data}
Pdata? 表示真实的数据分布。
所以,公式的前半部分,即的含义是:判别器判别出真实数据的概率。我们的优化目标是希望这个概率越大越好。也就是说,对于服从
P
d
a
t
a
P_{data}
Pdata? 分布的图片x,判别器应该给出预测结果
D
(
x
)
=
1
D(x)=1
D(x)=1。
后半部分:
其中,
E
z
?
p
z
(
z
)
E_{z-p_z(z)}
Ez?pz?(z)? 表示期望z是从
P
z
(
Z
)
P_z(Z)
Pz?(Z) 中获取。z表示随机的噪声,
P
z
(
Z
)
P_z(Z)
Pz?(Z) 表示生成随机噪声的分布。
- 对于判别器D来说,如果输入的是生成的数据,即
D
(
G
(
z
)
)
D(G(z))
D(G(z)) ,判别器的目标是最小化
D
(
G
(
z
)
)
D(G(z))
D(G(z)) ,希望它被判定为0,也就是希望
l
o
g
(
1
?
D
(
G
(
z
)
)
)
log(1 - D(G(z)))
log(1?D(G(z))) 越大越好。
- 而对于生成器来说,它希望生成的数据被判别器识别为真,判别器的目标是最大化
D
(
G
(
z
)
)
D(G(z))
D(G(z)) ,希望它被判定为1,也就是希望
l
o
g
(
1
?
D
(
G
(
z
)
)
)
log(1 - D(G(z)))
log(1?D(G(z))) 越小越好。
由此可以看出,判别器D和生成器G对
l
o
g
(
1
?
D
(
G
(
z
)
)
)
log(1 - D(G(z)))
log(1?D(G(z))) 的优化目标是相反的,这就体现在公式中的:
总结起来就是: 对于判别器来说,训练目标是最大化
l
o
g
D
(
x
)
logD(x)
logD(x) 和
l
o
g
(
1
?
D
(
G
(
z
)
)
)
log(1 - D(G(z)))
log(1?D(G(z))) ,从而达到最大化
V
(
D
,
G
)
V(D, G)
V(D,G)的目标。 对于生成器来说,训练目标是最小化
l
o
g
(
1
?
D
(
G
(
z
)
)
)
log(1 - D(G(z)))
log(1?D(G(z))) ,从而达到最小化
V
(
D
,
G
)
V(D, G)
V(D,G)的目标。
因此,公式表示: 从判别器D的角度,希望最大化
V
(
D
,
G
)
V(D, G)
V(D,G), 从生成器G的角度,希望最小化
V
(
D
,
G
)
V(D, G)
V(D,G)。*
代码实现
基于本文的Pytorch版本的代码实现见下一篇博客: Pytorch搭建基本的GAN模型及训练过程
参考资料
[1] https://easyai.tech/ai-definition/gan/ [2] https://www.bilibili.com/video/BV1xm4y1X7KZ?p=2
|