以下内容将分为如下几个部分:

1. 为什么提出GAN


1.1 提出的背景

  想要对一个事物(某种数据)有更加深刻的理解,就需要利用到生成方法:对数据的分布进行假设和对分布进行参数学习,并能够根据学习而来的模型采样出新的样本。这是什么意思呢,其实可以分为两种玩法: 
  (1)密度概率估计:也就是说在不了解时间概率分布的情况下,先假设随机分布(常用高斯分布,也称正态分布),然后通过数据观测来确定真正的概率密度是怎样的,知道了概率密度不就知道数据是怎么分布的了吗? 
  (2)生成样本:即本身拥有非常多的训练样本数据,通过训练后的模型来生成类似的样本。也就是说我自己不事先假设随机分布了,依靠训练来让机器自动学得数据的分布。 
  在神经网络还未发展如此火热之时,大多数的方法都是基于一个假设的随机分布,然后通过训练真实数据来拟合出模型,而GAN(Generative Adversarial Nets ,生成对抗网络)的目的就是估测数据样本的潜在分布形式并生成新得数据样本。


1.2 大概怎么解决问题

 上面说到生成对抗网络就是为了只通过训练样本数据(真实数据)来估计出真实数据的潜在分布形式,生成新的样本数据。 
 基本思想:整个网络由一个生成器G(generator)和一个判别器D(discriminator)构成,介于博弈论中的二人零和博弈:

在严格竞争下,一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加总和永远为“零”,双方不存在合作的可能。

双方争个你死我活,在互相争斗中同时历炼成长,即通过这种生成器G与判别器D对抗学习的方式来对真实数据进行学习来得到一个新的无限接近真实数据分布的数据分布。当然,两个网络并不是一直都在斗争,它们不得不协同合作以达到共同的目标。在整个训练过程中,辨别器不得不教导生成器如何在生成的数据上微做调整。同时它也一直都在学习如何做一个更好的老师。它们共同变强,在理想状态下,会达到一种平衡。

可能有人对这个新的数据分布有啥用还不是太理解,举几个例子吧。

作为一个具有 “无限” 生成能力的模型, GAN 的直接应用就是建模, 生成与真实数据分布一致的 数据样本, 例如可以生成图像、视频等. GAN 可以 用于解决标注数据不足时的学习问题, 例如无监督 学习、半监督学习等. GAN 还可以用于语音和语言 处理, 例如生成对话、由文本生成图像、生成数字、人脸等物体对象,构成各种逼真的室内外场景,,从分割图像恢复原图 像,,给黑白图像上色,从物体轮廓恢复物体图像,从低分辨率图像生成高分辨率图像等。 此外,GAN已经开始被应用到语音和语言处理、电脑病毒监测、棋类比赛程序等问题的研究中。

所以你可能要问了,这个生成器G和判别器D怎么来理解呢?

2. 基本思想及其过程


 生成式对抗网络 GAN (Generative adversarial networks) 是 Goodfellow 等在 2014 年提出的一种生成式模型。系统由一个生成器和一个判别器构成。生成器捕捉真实数据样本的潜在分布, 并生成新的数据样本; 判别器是一个二分类器, 判别输入是真实数据还是生成的样本。生成器和判别器均可以采用目前研究火热的深度神经网络。GAN 的优化过程是一个极小极大博弈 (Minimax game) 问 题, 优化目标是达到纳什均衡, 使生成器估测到数据样本的分布。 
 再解释上面两个黑体的概念之前,先放一张GAN的网络框图1.1 


深度学习之生成对抗网络GAN
图1.1 生成对抗网络框图

极大极小博弈怎么理解?其实就是由上图生成模型G生成的样本数据G(z)(也称fake data即造假数据),与真实数据x到底有多接近这样一个评判标准,你可以想象成损失函数即标签数据与训练得到数据得到的值之间差异的描述,当损失函数最小时,不就是标签数据与训练数据得到值之间的差异最小化。再说一句,后续大多数对GAN的研究都是对这个GAN的优化过程进行改进。 
还有一种我得理解就是当你学无穷小的时候,老师怎么教的呢?就是当这个数比最小的那个数也就是ϵ,怎么样评判这个ϵ就成了定义无穷小的关键。 
纳什均衡怎么理解?生成器G通过不断的训练学习来加强自己的造假能力也就是生成G(z),让判别器D无法判别出G(z)和x有啥区别。而判别器D就是通过不断训练学习来提升自己的判别能力,也就是判别出x就是x,G(z)你就是假的!


 下面就详细介绍下生成对抗网络GAN

  1. 输入: 
    生成器G:随机噪声分布z(通常为高斯噪声分布) 
    判别器D:真实数据x以及生成器生成造假数据G(z)

  2. 输出: 
    当判别器D判别概率等于0.5时,输出G(z)=x

  3. 过程: 
    目标函数 
    深度学习之生成对抗网络GAN
    这个目标函数是一个交叉熵函数(为什么用交叉熵函数?) 
    深度学习之生成对抗网络GAN
    接下来我们来理解这个目标函数,根据Ian GoodFellow本人说,max放在里面一是表明先对判别器D 进行训练,二是经过实验表明这样效果比较好,若min在内部容易产生过拟合问题。 
    我们知道判别器D的目的就是正确区分出Pdata(x)和Pz(z),因此判别器D努力的增加D(x),并且减小D(G(z))(相当于增大(1-D(G(z)))因为,D()∈[0,1]),因此要maxV(G,D),而生成器G就是要增大D(G(z))(相当于减小(1-D(G(z)))),若C(G)=maxV(D,G),所以要minC(G)。先看看其训练过程。 
    深度学习之生成对抗网络GAN
     训练过程就是多次迭代,以其中一次迭代为例,先对判别器D进行k次训练,训练过程为分别从真实样本Pdata和随机噪声Pz中抽样m个,然后利用上述目标函数(1)对参数进行求导,并且按梯度上升的方向求得最大值,然后进行生成器G的训练,从随机噪声z中抽样m个,并按图中的函数(因为只有随机噪声z一个输入)利用随机梯度下降的方法对参数求导求的最小值,从而形成一个极大极小博弈。 
     下面来严谨分析下目标函数: 
    为了方便分析,先假设生成器G不变,只分析判别器D。 
    由(1)有: 
    深度学习之生成对抗网络GAN
    要求V(G,D)最大值,就相当于求积分内的方程的最大值,将Pdata(x)和Pg(x)看作常数,对D(x)求导,相信你能很快求得D(x)极值为D*(x): 
    深度学习之生成对抗网络GAN 
    然后令C(G)=maxV(G,D) 
    深度学习之生成对抗网络GAN
    当取得全局极值,也就说所谓的“纳什均衡”状态时,也就是Pdata(x)=Pg(x)时,此时C(G)=-log4,作者为了很好的衡量C(G),引入了JS散度: 
    深度学习之生成对抗网络GAN
    这里的KL代表KL散度,也就是: 
    深度学习之生成对抗网络GAN 
    但是这里有个问题就是KL散度只能针对两个分布之间有重叠的情况,分析这个式子就能看出,没有重叠的时候,两个分布相除为0,KL散度就是一个常数,不能进行训练了,因为常数的梯度为0。 
    C(G)就变成了 
    深度学习之生成对抗网络GAN
    因此C(G)的最小值实际上当Pdata=Pg时就是-log4。 
     可能这时就有人问为什么判别器D执行k步时生成器G才执行1步,Ian GoodFellow说这有利于只要当生成器改变的足够慢时,判别器D总是维持在最优解的附近,我理解就是生成器G和判别器D训练时间不一致,为了让两个模型训练达到一个同步的状态,对D做了一定的延时处理,同步的目的是为了避免“Helevtica scenario”,即防止在训练过程中生成器丢失了许多相同于x的z值,因为生成器不就是为了学习到x的近似G(z)分布嘛。 
     由于Ian GoodFellow的文章在生成器G和判别器D中都用的是多层感知机,且没有给出结构框图,为了方便理解,上两张DCGAN(deep convolutional generative adversarial network,称为深层卷积生成对抗网络)中的生成器G和判别器D的模型结构图方便理解。 
    深度学习之生成对抗网络GAN
    上图为利用CNN作为一个生成器G,输入是噪声分布,通过解卷积升维最终得到一个图片大小和真实样本数据(图片)大小相同都为64x64x3,即长宽都为64的RGB三通道彩色图片。 
    解卷积过程:即在原有像素上进行上采样,就是在其周围填充0,白色方块代表0像素,蓝色方块代表原始像素。 
    深度学习之生成对抗网络GAN 
    下图为判别器D的网络框图,输入为64x64x3的RGB三通道彩色真实样本图片或者造假图片,最后给出结果,1表示真实图片,0表示造假图片。 
    深度学习之生成对抗网络GAN 
    下图为卷积过程,即提取特征并降维的一个过程: 
    深度学习之生成对抗网络GAN 
     在DCGAN中,如果你把这些梯度加到生成的图片上,在辨别器看来,图片就会变得更真实一点。但是我们不仅仅把梯度加到图片上。相反,我们进一步反向传播这些图片梯度成为组成生成器的权重,这样一来,生成器就学习到如何生成这幅新图片。技术上来说,通过反向传播辨别器输出的梯度来调整生成图片。以这种方式训练生成器,你将会得到与图片形状一样的梯度向量。


3. GAN的优缺点及其发展

 首先Ian GoodFellow就说过,判别器D中的判别即使到了所谓了“纳什均衡状态”,也就是Pdata=Pz时,其结果并不是恒定,而是一个在其周围振荡的过程,不够稳定,并是不真正意义上的“纳什均衡状态”。

 对于为什么目标函数有Log,那是因为log是的小数据差异明显,根据对数函数的图像可以分析出来。也就是说更偏向生成器G一点点。 
GAN的优点: 
1. 使用潜在的编码用来表达潜在的维数,控制数据的隐含关系。 
2. 数据逐渐统一。 
3. 不需要马尔可夫链。 
4. 被认为可以生成最好的样本分布。

GAN的缺点: 
1. “纳什均衡”就没有那么好得到,因为根据实验观察, “纳什均衡状态”,也就是Pdata=Pz时,其结果并不是恒定,而是一个在其周围振荡的过程,不够稳定,并是不真正意义上的“纳什均衡”。 当博弈双方都由神经网络表示时,在没有实际达到均衡的情况下,让它们永远保持对自己策略的调整是可能的 
2. 模式崩溃问题,GAN模型被定义为极小极大问题,没有损失函数,在训练过程中很难区分是否正在取得进展。GAN的学习过程可能发生崩溃问题(collapse problem),生成器开始退化,总是生成同样的样本点,无法继续学习。当生成模型崩溃时,判别模型也会对相似的样本点指向相似的方向,训练无法继续。 
3. 不需要预先建模,模型过于自由而不可控。与其他生成式模型相比,GAN这种竞争的方式不再要求一个假设的数据分布,即不需要明确表达p(x),而是使用一种分布直接进行采样,从而真正达到理论上可以完全逼近真实数据,这也是GAN最大的优势。然而,这种不需要预先建模的方法缺点是太过自由了,对于较大的图片,较多的像素的情形,基于简单 GAN 的方式就不太可控了。在GAN中,每次学习参数的更新过程,被设为判别器D更新k回,生成器G才更新1回,也是出于类似的考虑。 
4. 
  z一般维数会比x高。最大似然估计实际上是KL散度最小化的方法。对KL散度进行简单的分解之后与最大似然估计的形式进行简单的比较即可明白。KL变换不能处理两个不重叠分布的问题,也是之后出现Wassertein GAN的主要原因之一。

 对于训练GAN,Ian GoodFellow也提出了两个小技巧: 
1. 将标签进行平滑:也就是0->0.1,1->0.9,但是由于这0.1在D()中的分子项引入了Pg,也就是造假数据的分布,因此改为单边标签平滑,也就是0->0,1->0.9,这样做的好处是让判别函数D()不会给出太大的梯度信号,也防止算法走向极端样本的陷阱,增加了网络抗干扰的能力。 
2. 批数据归一化:对输入数据x取其中m个,计算这些x的均值和标准差,归一化x为(x-mean(x))/standard deviation(x)。但由于可能同一批数据太过于相似,对于一个无监督的GAN而言,很容易被偏而误以为它们这些数据都一样,即最终的生成模型的结果会混着同一个batch的好多其他的无关特征。因此最终改进为取一个固定的batch R,然后对x归一化时,把x加入到R中,形成一个新的虚拟batch V,并用这个V的均值和标准差来对x进行归一化,这种方法叫虚拟批处理归一化