GAN的基本介绍和变种

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GAN的基本介绍和变种相关的知识,希望对你有一定的参考价值。

参考技术A

GAN,全称为Generative Adversarial Nets,直译为“生成式对抗网络”。GAN作为生成模型的代表,自2014年被Ian Goodfellow提出后引起了业界的广泛关注并不断涌现出新的改进模型,深度学习泰斗之一的Yann LeCun高度评价GAN是机器学习界近十年来最有意思的想法。

GAN始终存在训练难、稳定性差以及模型崩塌(Model Collapse)等问题。产生这种不匹配的根本原因其实还是对GAN背后产生作用的理论机制没有探索清楚。

在推动GAN应用方面,2017年有两项技术是非常值得关注的。其中一个是CycleGAN,其本质是利用对偶学习并结合GAN机制来优化生成图片的效果的,采取类似思想的包括DualGAN以及DiscoGAN等,包括后续的很多改进模型例如StarGAN等。CycleGAN的重要性主要在于使得GAN系列的模型不再局限于监督学习,它引入了无监督学习的方式,只要准备两个不同领域的图片集合即可,不需要训练模型所需的两个领域的图片一一对应,这样极大扩展了它的使用范围并降低了应用的普及难度。

另外一项值得关注的技术是英伟达采取“渐进式生成”技术路线的GAN方案,这项方案的引人之处在于使得计算机可以生成1024*1024大小的高清图片,它是目前无论图像清晰度还是图片生成质量都达到最好效果的技术,其生成的明星图片几乎可以达到以假乱真的效果(参考图3)。英伟达这项由粗到细,首先生成图像的模糊轮廓,再逐步添加细节的思想其实并非特别新颖的思路,在之前的StackGAN等很多方案都采用了类似思想,它的独特之处在于这种由粗到细的网络结构是动态生成的而非事先固定的静态网络,更关键的是产生的图片效果特别好

首先,有一个一代的 generator,它能生成一些很差的图片,然后有一个一代的 discriminator,它能准确的把生成的图片,和真实的图片分类,简而言之,这个 discriminator 就是一个二分类器,对生成的图片输出 0,对真实的图片输出 1。

接着,开始训练出二代的 generator,它能生成稍好一点的图片,能够让一代的 discriminator 认为这些生成的图片是真实的图片。然后会训练出一个二代的 discriminator,它能准确的识别出真实的图片,和二代 generator 生成的图片。以此类推,会有三代,四代。。。n 代的 generator 和 discriminator,最后 discriminator 无法分辨生成的图片和真实图片,这个网络就拟合了。

对抗样本(adversarial examples)是机器学习模型的输入,攻击者故意设计它们以引起模型出错;它们就像是机器的视觉错觉。

对抗样本指的是一个经过微小调整就可以让机器学习算法输出错误结果的输入样本。在图像识别中,可以理解为原来被一个卷积神经网络(CNN)分类为一个类(比如“熊猫”)的图片,经过非常细微甚至人眼无法察觉的改动后,突然被误分成另一个类(比如“长臂猿”)。

对抗训练

对抗训练是防御对抗样本攻击的一种方法。将对抗样本和正常样本一起训练是一种有效的正则化,可以提高模型的准确度,同时也能有效降低对抗样本的攻击成功率。不过这种防御也只是针对同样用来产生训练集中的对抗样本的方法。

确实在下图中可以看到,训练集是正常样本和对抗样本,测试集是正常样本的红线比训练集和测试集都是正常样本的错误率要降低,说明对抗训练是有正则化的功能。

Figure 9

在训练的时候直接生成对抗样本是比较低效的,之前提到的FGSM是一个高效的对抗训练方法。只需要改变目标函数就能在训练每个正常样本的同时也考虑了对抗样本。模型训练去给对抗样本赋予和正常样本原分类同样的类别。

用经过FGSM训练的网络,可以有效的防御用FGSM产生的对抗样本攻击,但是如果换其他对抗攻击方法,也会被攻破。

对抗样本的工作思路,可以有以下两个方面的意义:

结论

要为集成模型创建对抗样本,因为梯度方法的问题,难度会加大。但是生成的算法更为可行有效。

单个模型出现盲点可以由其他模型弥补,采用的会是输出结果最好的模型数据。

我们发现当我们用动态创建的对抗模型来训练算法时,能够解决这些对抗样本的问题。这是因为当模型面对这些可能出现问题的对抗低概率区域时,可以产生更高的“免疫力”。这同时也支持了低概率区域的论点,在这些区域的对抗样本更难处理。

DCGAN是继GAN之后比较好的改进,其主要的改进主要是在网络结构上,到目前为止,DCGAN的网络结构还是被广泛的使用,DCGAN极大的提升了GAN训练的稳定性以及生成结果质量。

论文的主要贡献是:

◆ 为GAN的训练提供了一个很好的网络拓扑结构。

◆ 表明生成的特征具有向量的计算特性。

D(x)表示D网络判断真实图片是否真实的概率(因为x是真实的,所以对于D来说,这个值越接近1越好)。而D(G(z))D(G(z))是为了D判断G生成的图片是否真实的概率。

G的目的:G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))D(G(z))尽可能得大,这是V(D,G)V(D,G)会变小。

D的目的:D的能力越强,D(x)D(x)应该越大,D(G(x))D(G(x))应该越小。因此D的目的和G不同,D希望V(D,G)V(D,G)越大越好。

DCGAN对卷积神经网络的结构做了一些改变,以提高样本的质量和收敛的速度,这些改变有:

取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入stride的卷积代替pooling。

在D和G中均使用batch normalization

去掉FC层,使网络变为全卷积网络

G网络中使用ReLU作为激活函数,最后一层使用tanh

D网络中使用LeakyReLU作为激活函数

DCGAN中的G网络示意:

DCGAN的生成器网络结构如上图所示,相较原始的GAN,DCGAN几乎完全使用了卷积层代替全链接层,判别器几乎是和生成器对称的,从上图中我们可以看到,整个网络没有pooling层和上采样层的存在,实际上是使用了带步长(fractional-strided)的卷积代替了上采样,以增加训练的稳定性。

DCGAN能改进GAN训练稳定的原因主要有:

◆ 使用步长卷积代替上采样层,卷积在提取图像特征上具有很好的作用,并且使用卷积代替全连接层。

◆ 生成器G和判别器D中几乎每一层都使用batchnorm层,将特征层的输出归一化到一起,加速了训练,提升了训练的稳定性。(生成器的最后一层和判别器的第一层不加batchnorm)

◆ 在判别器中使用leakrelu激活函数,而不是RELU,防止梯度稀疏,生成器中仍然采用relu,但是输出层采用tanh

◆ 使用adam优化器训练,并且学习率最好是0.0002,(我也试过其他学习率,不得不说0.0002是表现最好的了)

BigGAN在训练中 Batch 采用了很大的 Batch,已经达到了 2048(我们平常训练 Batch 正常都是 64 居多),在卷积的通道上也是变大了,还有就是网络的参数变多了,在 2048 的 Batch 下整个网络的参数达到了接近 16 亿

GAN系列学习——前生今世

作者:刘威威

编辑:李文臣


1
1. GAN 的 ‘前世’?

大家都知道GAN是Ian Goodfellow 2 014年放出的一篇开山之作,在深度学习界评价很高,可以说GAN的出现,给深度学习界带来了很多的研究(shui)课(lun)题(wen)。但是如果说GAN是另外一种网络的变种,不知道你是否相信呢?但是有一个人是坚信不疑的,这个人就是德国AI科学家Jürgen Schmidhuber,说到这个人可能很多人不太了解,毕竟不是像Hinton Yoshua bengio, Yan lecun这样出名的人,事实上他对AI界做出了很大的贡献,LSTM就是他在97年发明的。其本人照片如下:

OK!Jürgen Schmidhuber之所以认为GAN是其他模型的变种,主要他在92年提出了一种PM(Predictability Minimization)模型,其与GAN有一些相似之处(起码他自己这样认为),所以他一直认为GAN是goodfellow在自己PM模型上的改进。他92年提出的PM模型才是“第一个对抗网络”,而GAN跟PM的主要差别仅仅在于方向反过来了,可以把GAN名字改成“inverse PM”,即反过来的PM。并且多次与goodfellow邮件往来说明这个问题,毫无疑问得到了goodfellow的否决。事情甚至发展到Jürgen Schmidhuber在2016NIPS大会上与goodfellow公开互怼。

事情是这样子的:

2016NIPS大会上,goodfellow正在做GAN的tutorial,这时,Jürgen Schmidhuber打断了演讲,站起来首先介绍了一下自己92年提出的PM模型,其实就差直接阐明PM和GAN很相似,然后反问goodfellow,如何看待GAN和PM的相似点。

外人看上去只是普通的一次提问或者辩证,但是goodfellow反应及其激烈,甚至都要发火了。原来早在GAN提出之后,他们两人就已经互相往来邮件讨论过这个问题,大概流程就是Jürgen Schmidhuber认为GAN是他的PM模型的演化,现在GAN那么出名了,goodfellow应该承认PM对GAN的贡献。Goodfellow当然说不,自己的成果平白无故被上了一个套,要谁谁也不干,而且在本质上GAN和PM也有很大的不同。但是Jürgen Schmidhuber还是不死心,以至于事情闹到了NIPS大会上,结果就是:

可能是动了真怒,Goodfellow直接明说他们之前已经在邮件里讨论了这个问题,不想牵扯到NIPS大会上来做无意义的争辩,最后结果就是goodfelllow的一番话赢得了在场大佬的多次掌声。

题外话

Jürgen Schmidhuber已经五十多岁了,而且是Dalle Molle人工智能研究所的联席主任。他表示自己的早期研究常常被忽视,另外据网上传言,LeCun教授在一封电子邮件中说道,“Jürgen太想得到大家的认可,每次别人讲完话他都会站起来,说刚刚提出的东西有他的功劳,但是这种方式却不是特别恰当。”

实际上,Jürgen Schmidhuber的确对人工智能界做出了很大的贡献,LSTM就是一个典型的例子。


接下来简单介绍一下PM模型。可以用下图来表示PM模型的原理,图片来自郑华滨的知乎文章,下文有关PM的部分均是从他的文章中总结而来,以简单的文字形式来表述,详情可参考链接:

https://zhuanlan.zhihu.com/p/27159510?utm_source=wechat_session&utm_medium=social


图片的左边是一个自编码器,自编码器对输入输出重构,输入数据经过编码解码后得到输出数据,输入输出存在一个重构误差,当重构误差越小时,说明自编码器中的隐藏层越能学习到表示数据的特征,但是我们希望不仅能学习到特征,而且希望学习到好的特征,于是Jürgen Schmidhuber就提出了PM模型,如何衡量好的标准,假设自编码器隐藏层学习到的特征是三维的向量,每一维用c来表示,有人认为,当每一维的特征向量是相互独立即解耦的,说明特征就很好,那么Jürgen Schmidhuber就提出使用一个预测器f(PM中的P部分),f根据其中两个维度的值去预测另外一个维度的值,如果预测的很准,说明他们C之间的独立性就很差,解耦性不好,学习到的特征不好,如果预测的很不准,说明编码器学习到的特征很好。既然这样,可以通过一个损失函数

建立编码器和f预测能力之间的对抗,自编码器希望得到很好的特征表示,令c相互独立,但是f希望预测的很准,预测的准就表示c的独立性差,所以他们之间也有一种‘对抗’,然后通过对抗得到很好的特征表示。


2. PM与GAN的区别:

乍一看或许他们两个很相似,都有‘对抗’机制,实际上差别还是很大的。

首先,PM种的对抗只是相当于一种对获得好的特征表示的辅助,但是GAN的特点就是对抗训练,对抗训练是GAN 的主体。

其次,PM是从复杂分布得到的解耦分布做对抗,而GAN直接对复杂的原始分布做处理,得到最后的判别,所以说GAN或许是inversePM。

再者,PM判别每一个数据的维度,而GAN最后的判别是一维的,即对与错的程度(概率)。

而且PM的作用有限,拓展性不强,而GAN可以用在很多领域,拓展性更强。

我还是很支持GAN是原创的。

有关GAN前世就简单介绍到这里,下文介绍GAN本身的部分,包括GAN的特点,优缺点总结,常用的训练tricks,以及GAN的一些改进成果,有基础的可以直接跳过这一部分。本文的第三部分会介绍一些GAN的变种以及复现很好的GitHub代码链接,感兴趣的可以看一下。在本文的第四部分,我会列举一些GAN的应用,介绍其原理,同时附有github代码链接。



2

首先,啰嗦一下什么是GAN(Generative adversarial nets),中文是生成对抗网络,他是一种生成式模型,也是一种无监督学习模型。其最大的特点是为深度网络提供了一种对抗训练的方式,此方式有助于解决一些普通训练方式不容易解决的问题。并且Yan lecun明确表示GAN是近几十年除了面包机最伟大的发明,并且希望是自己发明的GAN。

 关于GAN的入门可以参考机器学习算法全栈工程师公众号之前的文章:GAN入门与实践,里面包含了GAN的入门介绍以及生成人脸图片的实践tensorflow代码。


1. GAN诞生背后的故事:

学术界流传,GAN创始人 Ian Goodfellow 在酒吧微醉后与同事讨论学术问题,当时灵光乍现提出了GAN初步的想法,不过当时并没有得到同事的认可,在从酒吧回去后发现女朋友已经睡了,于是自己熬夜写了代码,发现还真有效果,于是经过一番研究后,GAN就诞生了,一篇开山之作。附上一张大神照片。

 Ian goodfellow


2. GAN的原理:

GAN的主要灵感来源于博弈论中零和博弈的思想,应用到深度学习神经网络上来说,就是通过生成网络G(Generator)和判别网络D(Discriminator)不断博弈,进而使G学习到数据的分布,如果用到图片生成上,则训练完成后,G可以从一段随机数中生成逼真的图像。G, D的主要功能是:

●  G是一个生成式的网络,它接收一个随机的噪声z(随机数),通过这个噪声生成图像 

●  D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片

训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量辨别出G生成的假图像和真实的图像。这样,G和D构成了一个动态的“博弈过程”,最终的平衡点即纳什均衡点.


3. GAN的特点:

●  相比较传统的模型,他存在两个不同的网络,而不是单一的网络,并且训练方式采用的是对抗训练方式

●  GAN中G的梯度更新信息来自判别器D,而不是来自数据样本


4. GAN 的优点:

(以下部分摘自ian goodfellow 在Quora的问答)

●  GAN是一种生成式模型,相比较其他生成模型(玻尔兹曼机和GSNs)只用到了反向传播,而不需要复杂的马尔科夫链

●  相比其他所有模型, GAN可以产生更加清晰,真实的样本

●  GAN采用的是一种无监督的学习方式训练,可以被广泛用在无监督学习和半监督学习领域

●  相比于变分自编码器, GANs没有引入任何决定性偏置( deterministic bias),变分方法引入决定性偏置,因为他们优化对数似然的下界,而不是似然度本身,这看起来导致了VAEs生成的实例比GANs更模糊

●  相比VAE, GANs没有变分下界,如果鉴别器训练良好,那么生成器可以完美的学习到训练样本的分布.换句话说,GANs是渐进一致的,但是VAE是有偏差的

●  GAN应用到一些场景上,比如图片风格迁移,超分辨率,图像补全,去噪,避免了损失函数设计的困难,不管三七二十一,只要有一个的基准,直接上判别器,剩下的就交给对抗训练了。


5. GAN的缺点:

●  训练GAN需要达到纳什均衡,有时候可以用梯度下降法做到,有时候做不到.我们还没有找到很好的达到纳什均衡的方法,所以训练GAN相比VAE或者PixelRNN是不稳定的,但我认为在实践中它还是比训练玻尔兹曼机稳定的多

●  GAN不适合处理离散形式的数据,比如文本

●  GAN存在训练不稳定、梯度消失、模式崩溃的问题(目前已解决)


模式崩溃(model collapse)原因

一般出现在GAN训练不稳定的时候,具体表现为生成出来的结果非常差,但是即使加长训练时间后也无法得到很好的改善。

具体原因可以解释如下:GAN采用的是对抗训练的方式,G的梯度更新来自D,所以G生成的好不好,得看D怎么说。具体就是G生成一个样本,交给D去评判,D会输出生成的假样本是真样本的概率(0-1),相当于告诉G生成的样本有多大的真实性,G就会根据这个反馈不断改善自己,提高D输出的概率值。但是如果某一次G生成的样本可能并不是很真实,但是D给出了正确的评价,或者是G生成的结果中一些特征得到了D的认可,这时候G就会认为我输出的正确的,那么接下来我就这样输出肯定D还会给出比较高的评价,实际上G生成的并不怎么样,但是他们两个就这样自我欺骗下去了,导致最终生成结果缺失一些信息,特征不全。

关于梯度消失的问题可以参考郑华滨的令人拍案叫绝的wassertein GAN,里面给出了详细的解释,不过多重复。

局部极小值点

鞍点



为什么 GAN中的优化器不常用 S GD

1. SGD容易震荡,容易使GAN训练不稳定,

2. GAN的目的是在高维非凸的参数空间中找到纳什均衡点,GAN的纳什均衡点是一个鞍点,但是SGD只会找到局部极小值,因为SGD解决的是一个寻找最小值的问题,GAN是一个博弈问题。



为什么GAN不适合处理文本数据

1. 文本数据相比较图片数据来说是离散的,因为对于文本来说,通常需要将一个词映射为一个高维的向量,最终预测的输出是一个one-hot向量,假设softmax的输出是(0.2, 0.3, 0.1,0.2,0.15,0.05)那么变为onehot是(0,1,0,0,0,0),如果softmax输出是(0.2, 0.25, 0.2, 0.1,0.15,0.1 ),one-hot仍然是(0, 1, 0, 0, 0, 0),所以对于生成器来说,G输出了不同的结果但是D给出了同样的判别结果,并不能将梯度更新信息很好的传递到G中去,所以D最终输出的判别没有意义。

2. 另外就是GAN的损失函数是JS散度,JS散度不适合衡量不想交分布之间的距离。

(WGAN虽然使用wassertein距离代替了JS散度,但是在生成文本上能力还是有限,GAN在生成文本上的应用有seq-GAN,和强化学习结合的产物)



训练GAN的一些技巧

1. 输入规范化到(-1,1)之间,最后一层的激活函数使用tanh(BEGAN除外)

2. 使用wassertein GAN的损失函数,

3. 如果有标签数据的话,尽量使用标签,也有人提出使用反转标签效果很好,另外使用标签平滑,单边标签平滑或者双边标签平滑

4. 使用mini-batch norm, 如果不用batch norm 可以使用instance norm 或者weight norm

5. 避免使用RELU和pooling层,减少稀疏梯度的可能性,可以使用leakrelu激活函数

6. 优化器尽量选择ADAM,学习率不要设置太大,初始1e-4可以参考,另外可以随着训练进行不断缩小学习率,

7. 给D的网络层增加高斯噪声,相当于是一种正则



GAN的变种

自从GAN出世后,得到了广泛研究,先后几百篇不同的GANpaper横空出世,国外有大神整理了一个GAN zoo(GAN动物园),链接如下,感兴趣的可以参考一下:

https://github.com/hindupuravinash/the-gan-zoo

GitHub上已经1200+star了,顺便附上一张GAN的成果图,可见GAN的研究火热程度:

由于GAN的变种实在太多,这里我只简单介绍几种比较常常用的成果,包括DCGAN,, WGAN, improved-WGAN,BEGAN,并附有详细的代码github链接。



GAN的广泛应用

1. GAN本身是一种生成式模型,所以在数据生成上用的是最普遍的,最常见的是图片生成,常用的有DCGAN WGAN,BEGAN,个人感觉在BEGAN的效果最好而且最简单。

2. GAN本身也是一种无监督学习的典范,因此它在无监督学习,半监督学习领域都有广泛的应用,比较好的论文有

Improved Techniques for Training GANs

Bayesian GAN(最新)

Good Semi-supervised Learning

3. 不仅在生成领域,GAN在分类领域也占有一席之地,简单来说,就是替换判别器为一个分类器,做多分类任务,而生成器仍然做生成任务,辅助分类器训练。

4. GAN可以和强化学习结合,目前一个比较好的例子就是seq-GAN

5. 目前比较有意思的应用就是GAN用在图像风格迁移,图像降噪修复,图像超分辨率了,都有比较好的结果,详见pix-2-pix GAN 和cycle GAN。但是GAN目前在视频生成上和预测上还不是很好。

6. 目前也有研究者将GAN用在对抗性攻击上,具体就是训练GAN生成对抗文本,有针对或者无针对的欺骗分类器或者检测系统等等,但是目前没有见到很典范的文章。

注:配图来自网络


参考文献:

https://www.zhihu.com/question/56171002/answer/148593584

http://www.inference.vc/instance-noise-a-trick-for-stabilising-gan-training/

https://github.com/soumith/ganhacks

https://github.com/hindupuravinash/the-gan-zoo

https://zhuanlan.zhihu.com/p/25071913


后续连载。。

~敬请期待~


以上是关于GAN的基本介绍和变种的主要内容,如果未能解决你的问题,请参考以下文章

变分推断

李宏毅2021机器学习深度学习6-1 生成式对抗网络GAN1 基本概念介绍

生成对抗网络(GAN)详细介绍及数字手写体生成应用仿真(附代码)

【模型解读】历数GAN的5大基本结构

生成式对抗网络模型综述

Bloom Filter的基本原理和变种