Generative Adversarial Nets论文阅读笔记

先附上本人使用pytorch实现的GAN:

https://github.com/1991yuyang/GAN

如果觉得有用大家可以给个star。

这篇博客用于记录Generative Adversarial Nets这篇论文的阅读与理解。对于这篇论文,第一感觉就是数学推导很多,于是下载了一些其他有关GAN的论文,发现GAN系列的论文的一大特点就是基本都是数学推导,因此,第一眼看上去还是比较抵触的,不过还是硬着头皮看了下来。

废话不多说,下面就介绍GAN的基本原理。

一.摘要

摘要部分主要说明了,作者通过一个对抗训练过程来估计生成模型,其过程如下:首先需要建立一个生成模型G用于捕捉数据分布,其次还需要建立一个判别模型D用于给出一个样本是来自于真实样本而非生成器G生成的假样本的概率。而作为生成器,希望其生成的假样本越逼真越好,因此其训练目标就是使得判别器D犯错误的概率越大越好,也就是将G生成的样本大概率的判别为真样本。对于所有的G和D,存在唯一解,G的唯一解能够回复真实数据的分布;而D的唯一解就是不能够判别样本是真实样本还是生成器G生成的样本,即给出的概率为0.5。

以上这个过程类似于假画作者和鉴宝专家,假画作者一开始画工拙劣,其画作难以骗过鉴宝专家。于是假画作者便提升自己的画功,随后能够成功骗过鉴宝专家,而鉴宝专家随后也提升了自身的鉴宝能力,便又能够识破假画作者的画作。如此循环往复,最后假画作者便可以创作出一幅足够真的假画。假画作者就是生成器G,而鉴宝专家就是判别器D。

二.对抗网络

如上图所示,通过为生成器输入符合某种先验分布p_z的随机噪音z,生成器产生出假的图片,将假图片和真图片同时输入至判别器,判别器针对每个样本输出0或1,如果输出1则表示对应样本为真实数据采样得到,如果输出0则表示为生成器生成的假样本。这里我们使用p_g表示生成器生成的样本空间分布,使用p_{data}表示真实样本分布。对于生成器G的训练目标是使得p_g尽可能的接近p_{data},即最小化log(1-D(G(z))),这是因为我们希望生成器生成的样本足够逼真骗过判别器,其中G(z)是输入随机噪音z生成器G生成的服从分布p_{g}的假图片,如果能够骗过判别器,则D(G(z))便会输出1,此时(1-D(G(z)))为0,而log(1-D(G(z)))则为负无穷。而判别器D的训练目标是能够准确区分真实样本和生成的假样本,实际上就是最大化log(D(x))+log(1-D(G(z))),这是因为,当判别器能够正确区分真样本和假样本时,D(x)会输出1,其中x是来自于真实样本分布的样本,而D(G(z))会输出0,此时表达式能够达到最大值0。通过数学表达式表示训练目标如下所示:

论文中提到,限于计算能力以及数据量的不足,每训练k次判别器D,训练1次生成器G。并提出,只要生成器G变化的足够慢,判别器D则会长时间维持在其最优解附近。

整个过程的伪代码如上所示。注意,在训练判别器D的内层循环中,对于目标函数使用的是梯度上升(ascending),而对于生成器G使用的是梯度下降(descending),这在前面已经提到,判别器是最大化目标,而生成器是最小化目标。

但随后论文中马上提到,上述最小最大目标函数可能在训练初期可能不会为生成器提供足够的梯度去训练。这是因为,在训练年初期,生成器生成的样本是很糟糕的,判别器一眼就能识别出真实样本和生成器生成的样本,此时D(G(z))基本为0。而G此时目标函数log(1-D(G(z)))对于G的参数(G网络中的权重)求导如下所示:

\frac{\partial log(1-D(G(z)))}{w_g}=\frac{\partial log(1-D(G(z)))}{\partial D(G(z))}*\frac{D(G(z))}{\partial G(z)}*\frac{G(z)}{\partial w_g}

上式的第一部分形式为log(1-x)对x求导,x在[0,1]之间,在x=0处的梯度很小,log(1-x)的函数图像如下所示:

因此G的目标函数对w求导的第一项中的D(G(z))就相当于上图中的x,并且在判别器足够好时其值接近于0,因此对于G的参数梯度很小。

因此,这时我们修改G的目标函数,将最小化log(1-D(G(z)))改变为最大化log(D(G(z))),此时目标函数对于G的参数求导如下所示:

\frac{\partial log(D(G(z))}{\partial w_g}=\frac{\partial log(D(G(z))}{\partial D(G(z))}*\frac{\partial D(G(z))}{\partial G(z)} * \frac{\partial G(z)}{\partial w_g}

其中第一部分符合log(x),x在[0,1]之间的形式,log(x)的函数图像如下所示:

可见当D(G(z))趋近于0时,也就是x趋近于0时其梯度是足够大的。因此将G的目标函数改变后在训练初期可以提供更充足的梯度。

三.证明全局最优为p_g=p_{data}

3.1证明当G给定时,D的最优解为\frac{p_{data}}{p_{data} + p_g}

当给定G时,D训练就是要使下式最大化

即log(D(x))的期望与log(1-D(G(z)))的期望之和最大化,令G(z)=x,则x的分布为p_g,则log(1-D(G(z)))的期望便可以表示为

E_{x \sim p_g}[log(1-D(x))]

当x为连续型随机变量时,log(D(x))和log(1-D(G(z)))也为连续型随机变量,因此D训练需要最大化下式(连续型随机变量求期望为概率密度与随机变量乘积求积分):

于上式中被积函数的形式为alog(y) + blog(1-y)的形式,则其求导为\frac{a-(a+b)y}{y(1 - y)}。令上式等于0可得y=\frac{a}{a + b},容易证明其就是alog(y) + blog(1-y)的最大值点(根据y取值范围在0到1之间,因此求导后分母大于0,因此根据分子的符号确定原函数增减......)。

因此可知当生成器G确定时,最优判别器为

D^*=\frac{p_{data}}{p_g+p_{data}}

3.2证明G达到全局最优时p_g=p_{data}

根据3.1中的证明,将最优判别器D带入优化的目标函数

则目标函数转化为

实际上式子为判别器D的对数似然函数,前半部分为正样本(来自于真实样本)的对数似然,后半部分为样本为负样本(来自于生成器)的对数似然(提示:因为求期望就是求和后除以样本个数,而对数求和就是真数相乘取对数,真数相乘的结果就是似然函数)。

目标函数进一步可表示为:

\int p_{data}log\frac{2 * p_{data}}{p_{data} + p_g} - p_{data}log2 + p_glog\frac{2 * p_g}{p_{data} + p_g} - p_glog2dx \newline=\int p_{data}log\frac{2 * p_{data}}{p_{data} + p_g} + p_glog\frac{2 * p_g}{p_{data} + p_g} - (p_{data} + p_g)log2dx

目标函数再进一步可以化简表示为

KL(p_{data}||\frac{p_{data} + p_g}{2}) + KL(p_g||\frac{p_{data} + p_g}{2}) - log4

其中KL(A||B)表示分布A和分布B的KL散度,可以衡量两个分布的距离,其公式如下所示:

KL散度大于等于0,当两个分布距离越近时KL散度越小,两个分布相等时达到最小为0(log1=0)

因此想要最小化目标函数,只需要使p_{data}\frac{p_{data} + p_g}{2}尽可能的相近,以及p_g\frac{p_{data} + p_g}{2}尽可能相近,因此可以得知使得目标函数最小既是使得p_{data}p_g相等,此时目标函数的值为-log4,也就是G达到最优时其目标函数值应当为-log4。

当然也可以将目标函数进一步表示为JS散度的形式,即

2(\frac{1}{2}KL(p_{data}||\frac{p_{data} + p_g}{2}) + \frac{1}{2}KL(p_g||\frac{p_{data} + p_g}{2})) - log4\newline=2JS(p_{data}||p_g)-log4

由于JS散度非负,因此当p_{data}p_g相等相等时JS散度达到最小值0,目标函数达到最小值-log4。

在这里多说一点此论文之外的,实际上这个目标函数是GAN的一个重大缺陷,因为如果p_{data}p_g极度不相似时,亦或者说p_{data}p_g没有重叠部分时JS散度是收敛到一个常数的,此时目标函数的值就是一个常数,其提供不了任何梯度供生成器学习。然而这样的情况在训练初期时很容易出现的,因为训练初期生成器生成的样本空间分布并不一定能够与真实样本空间分布很相似,所以JS散度可能趋近于常数。这也就是为什么说GAN很难训练的原因,有关这部分内容可以看Wasserstein GAN论文里的相关内容,其给出了有效的解决办法并使得GAN的训练变的更加容易、稳定。

最后文章证明了算法的收敛性,这里就不在细说,感兴趣的可以自己看一下。

好了,以上便是对于论文Generative Adversarial Nets的一些理解,希望能够帮到大家。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值