GAN——生成对抗网络详解

本文讲述了GAN的诞生故事,由Ian Goodfellow在一次酒吧讨论中提出,其理念是通过生成器与判别器的对抗训练生成逼真图像。文章介绍了GAN的基本流程、核心公式及其背后的优化目标,揭示了GAN如何通过博弈达到生成数据与真实数据分布相同的理想状态。
摘要由CSDN通过智能技术生成

GAN的诞生

在讲GAN的内容之前想先讲一下GAN诞生的故事。GAN的创造者是Ian Goodfellow,有一天为了庆祝一个朋友Razvan Pascanu获得了博士学位,他和一些朋友在蒙特利尔一家酒吧嗨。他们开始讨论一个新的研究方向,通过数学的方法确定图片内容,大概意思是把图片都喂给机器,通过统计之类的方法,机器可以自己生成图片。我们的主角Goodfellow也喝高了,表示这种方法不会work,有太多统计数据需要考虑,没人能把这些东西都记录下来。但是他有更好的方法:使用神经网络构建逼真的照片。

然后Goodfellow就说了他的思路,一个网络在学习如何生成一个逼真的图片的同时,另一个网络可以作为他的对手,试图确定这些图片的真假,通过这种方法,可以生成与真实图片无法区分的图像。

然后这两个人就发生了争执,都认为对方的方法不行。Goodfellow晚上回家就开始干这件事。

“我回家的时候还有点醉,我的女朋友已经睡了。酒吧里的朋友们错了!”他回忆道。“我熬夜并在笔记本电脑上开始写GAN”。

非常幸运的是,代码第一次跑起来就成功了。

“这真的非常幸运,”他说,“因为如果它没有奏效,我可能会放弃这个想法。”

之后他和其他一些研究人员在晚一些的时候发表了描述这个方法的论文。而在这之后,GAN就火了,几年里出了几百篇和GAN有关的论文。

在这里可以找到大部分的关于GAN的文章:
https://github.com/hindupuravinash/the-gan-zoo

这篇文章就是要讲一讲这个论文,也是GAN的开山之作,不过我觉得除了论文本身,它诞生的过程也有很多值得我们学习的地方。比如Goodfellow大胆的想法,比如他喝完了酒,嗨完了,回到家就开始验证他的想法的行动力,比如他为证明自己的想法不服输的精神。

我觉的这个过程换一个我们平常这些人还真不一定也能创造个GAN出来,我们平常出去嗨完了,肯定没心情再去搞研究去了,有些好的想法可能拖一段时间没做就给忘了之类的。总之,Goodfellow对于学术,对自己的要求,不断探索的精神都很值得我们学习。

GAN的公式

闲话不多说,现在开始讲GAN的论文。这里也贴一下原文下载地址:
https://arxiv.org/abs/1406.2661

另外,这篇文章公式推导部分会涉及到KL散度,JS散度之类的内容,如果之前没什么了解,也可以看一下我之前发的博客:
https://blog.csdn.net/qian99/article/details/85845292

首先说一下GAN的大体流程吧,网络主要由两部分构成,一个是生成器,负责生成图片,另一个是判别器,负责判断图片是否是真实图片,先生成一个噪声,这个噪声作为生成器的输入,生成器通过神经网络给出一个生成的图片,然后判别器会判断这张图片是否是真实图片。生成器可以通过判别器的结果知道自己生成的到底“像不像”,判别器可以通过真实图片与生成图片的判断结果知道自己的判断“准不准”,这样,两者就可以互相博弈,不断提高自己的能力,在论文中,会给出证明,两者最终会达到一个平衡状态,这个时候两者达到了纳什均衡。

在给出公式之前,先说一下符号定义。
这里先说一下,论文中公式带g下标或者G的符号,基本上都和生成器(Generator)有关。而公式中带d或者带D的符号,基本上都和判别器(Discriminator)有关。

d a t a data data : 这里指的就是训练数据,也可以说是一个真实数据的数据分布。
p g p_g pg :生成器的数据分布。
z z z :噪声
p z ( z ) p_z(z) pz(z) :噪声的概率分布。
G ( z ; θ g ) G(z;\theta_g) G(z;θg) :表示将噪声 z z z映射到 d a t a data data这个空间的生成器函数 G G G,它的参数是 θ g \theta_g θg,输出的在论文中的任务上是一张图片(其实可以推广到其他问题,也可以是其他输出)。
D ( x ; θ d ) D(x;\theta_d) D(x;θd) :判断输入 x x x来源于 d a t a data data这个数据分布的概率的判别器函数, x x x这里对应一张图片,输出是一个标量, θ d \theta_d θd是判别器的参数。

下面是论文中给出的优化的目标函数:

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_G\max_DV(D,G) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_z(z)}[log(1-D(G(z)))] GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]

乍一看挺复杂哈,没关系,我们把公式拆开了一部分一部分看。

首先是:
E x ∼ p d a t a ( x ) [ l o g D ( x ) ] E_{x\sim p_{data}(x)}[logD(x)] Expdata(x)[logD(x)]
这个形式的话,在我看来其实与交叉熵差不多,只不过少了一个负号,对这块东西不了解的同学可以参考上一篇博客:https://blog.csdn.net/qian99/article/details/85845292
简单来理解的话,就是判别器 D D D认为 x x x属于真实的数据分布的这一事件的负交叉熵,从数值上看的话,判别器越好,这个值就越大。

然后是:

E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_z(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]
这一项与上一项类似,输入项改为了生成的数据,简单来说,就是生成数据属于生成数据分布的负的交叉熵,从数值上看的话,当判别器 D D D固定,生成器越好,越像真实数据,这个值就越小,当生成器 G G G固定,判别器越好,这个值越大。

综合来看,这两部分的和在 D D D或者 G G G的某一个固定时,变化是一致的。

最后,我们看一下等式左边的那一项:
min ⁡ G max ⁡ D V ( D , G ) \min_G\max_DV(D,G) GminDmaxV(D,G)

V ( D , G ) V(D,G) V(D,G)表示我们要优化的值,由于生成器与判别器优化方向是不同的,这两个东西在不断的对抗,所以训练的时候肯定是固定一个,训练另一个,而 m i n min min m a x max max则指出了训练对应的网络时的训练方向。

公式推导与证明

接下来是推导公式,我们要证明,上面给出的公式是可以优化到一个最优解的,并给出这个最优解是什么。

G G G固定时, D D D的最优解是:
D G ∗ ( x ) = p d a t a ( x ) p d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值