本文主要是介绍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。
二.对抗网络
如上图所示,通过为生成器输入符合某种先验分布的随机噪音z,生成器产生出假的图片,将假图片和真图片同时输入至判别器,判别器针对每个样本输出0或1,如果输出1则表示对应样本为真实数据采样得到,如果输出0则表示为生成器生成的假样本。这里我们使用表示生成器生成的样本空间分布,使用表示真实样本分布。对于生成器G的训练目标是使得尽可能的接近,即最小化log(1-D(G(z))),这是因为我们希望生成器生成的样本足够逼真骗过判别器,其中G(z)是输入随机噪音z生成器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网络中的权重)求导如下所示:
上式的第一部分形式为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的参数求导如下所示:
其中第一部分符合log(x),x在[0,1]之间的形式,log(x)的函数图像如下所示:
可见当D(G(z))趋近于0时,也就是x趋近于0时其梯度是足够大的。因此将G的目标函数改变后在训练初期可以提供更充足的梯度。
三.证明全局最优为
3.1证明当G给定时,D的最优解为
当给定G时,D训练就是要使下式最大化
即log(D(x))的期望与log(1-D(G(z)))的期望之和最大化,令G(z)=x,则x的分布为,则log(1-D(G(z)))的期望便可以表示为
当x为连续型随机变量时,log(D(x))和log(1-D(G(z)))也为连续型随机变量,因此D训练需要最大化下式(连续型随机变量求期望为概率密度与随机变量乘积求积分):
于上式中被积函数的形式为的形式,则其求导为。令上式等于0可得,容易证明其就是的最大值点(根据y取值范围在0到1之间,因此求导后分母大于0,因此根据分子的符号确定原函数增减......)。
因此可知当生成器G确定时,最优判别器为
3.2证明G达到全局最优时
根据3.1中的证明,将最优判别器D带入优化的目标函数
则目标函数转化为
实际上式子为判别器D的对数似然函数,前半部分为正样本(来自于真实样本)的对数似然,后半部分为样本为负样本(来自于生成器)的对数似然(提示:因为求期望就是求和后除以样本个数,而对数求和就是真数相乘取对数,真数相乘的结果就是似然函数)。
目标函数进一步可表示为:
目标函数再进一步可以化简表示为
其中KL(A||B)表示分布A和分布B的KL散度,可以衡量两个分布的距离,其公式如下所示:
KL散度大于等于0,当两个分布距离越近时KL散度越小,两个分布相等时达到最小为0(log1=0)
因此想要最小化目标函数,只需要使和尽可能的相近,以及和尽可能相近,因此可以得知使得目标函数最小既是使得和相等,此时目标函数的值为-log4,也就是G达到最优时其目标函数值应当为-log4。
当然也可以将目标函数进一步表示为JS散度的形式,即
由于JS散度非负,因此当和相等相等时JS散度达到最小值0,目标函数达到最小值-log4。
在这里多说一点此论文之外的,实际上这个目标函数是GAN的一个重大缺陷,因为如果和极度不相似时,亦或者说和没有重叠部分时JS散度是收敛到一个常数的,此时目标函数的值就是一个常数,其提供不了任何梯度供生成器学习。然而这样的情况在训练初期时很容易出现的,因为训练初期生成器生成的样本空间分布并不一定能够与真实样本空间分布很相似,所以JS散度可能趋近于常数。这也就是为什么说GAN很难训练的原因,有关这部分内容可以看Wasserstein GAN论文里的相关内容,其给出了有效的解决办法并使得GAN的训练变的更加容易、稳定。
最后文章证明了算法的收敛性,这里就不在细说,感兴趣的可以自己看一下。
好了,以上便是对于论文Generative Adversarial Nets的一些理解,希望能够帮到大家。
这篇关于Generative Adversarial Nets论文阅读笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!