gan原理_gan学习指南:从原理入门到制作生成demo - CSDN
精华内容
参与话题
  • 生成对抗网络 一.背景 一般而言,深度学习模型可以分为判别式模型与生成式模型。由于反向传播(Back propagation, BP)、Dropout等算法的发明,判别式模型得到了迅速发展。然而,由于生成式模型建模较为困难,因此...

    生成对抗网络

    一.背景

    一般而言,深度学习模型可以分为判别式模型与生成式模型。由于反向传播(Back propagation, BP)、Dropout等算法的发明,判别式模型得到了迅速发展。然而,由于生成式模型建模较为困难,因此发展缓慢,直到近年来最成功的生成模型——生成式对抗网络的发明,这一领域才焕发新的生机。
    在这里插入图片描述
    生成式对抗网络(Generative adversarial network, GAN)自Ian Goodfellow[1]等人提出后,就越来越受到学术界和工业界的重视。而随着GAN在理论与模型上的高速发展,它在计算机视觉、自然语言处理、人机交互等领域有着越来越深入的应用,并不断向着其它领域继续延伸。

    二.简介

    生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。

    三 .GAN算法流程原理

    3.1 判别模型和生成模型

    机器学习的模型可大体分为两类,生成模型(Generative Model)和判别模型(Discriminative Model)。判别模型需要输入变量 ,通过某种模型来预测 。生成模型是给定某种隐含信息,来随机产生观测数据。举个简单的例子,

    • 判别模型:给定一张图,判定图中的动物是什么类别
    • 生成模型:给一系列猫的图片,生成一张新的猫咪

    3.2 GAN 原理

    在这里插入图片描述
    GAN的基本原理其实非常简单,这里以生成图片为例进行说明。假设我们有两个网络,G(Generator)和D(Discriminator)。正如它的名字所暗示的那样,它们的功能分别是:
    G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)。
    D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。在这里插入图片描述
    在训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。

    二人零和博弈思想(two-player game)

    GAN 的思想是一种二人零和博弈思想(two-player game)博弈双方的利益之和是一个常数,比如两个人掰手腕,假设总的空间是一定的,你的力气大一点,那你就得到的空间多一点,相应的我的空间就少一点,相反我力气大我就得到的多一点,但有一点是确定的就是,我两的总空间是一定的,这就是二人博弈,但是呢总利益是一定的。
    在GAN中就是可以看成,GAN中有两个这样的博弈者,一个人名字是生成模型(G),另一个人名字是判别模型(D)。他们各自有各自的功能。

    两者的相同点

    • 这两个模型都可以看成是一个黑匣子,接受输入然后有一个输出,类似一个函数,一个输入输出映射

    不同点

    • 生成模型功能:比作是一个样本生成器,输入一个噪声/样本,然后把它包装成一个逼真的样本,也就是输出。
    • 判别模型:比作一个二分类器(如同0-1分类器),来判断输入的样本是真是假。(就是输出值大于0.5还是小于0.5)

    如下图所示:
    在这里插入图片描述

    3.3 GAN 算法中的生成器

    对于生成器,输入需要一个n维度向量,输出为图片像素大小的图片。因而首先我们需要得到输入的向量。

    这里的生成器可以是任意可以输出图片的模型,比如最简单的全连接神经网络,又或者是反卷积网络等。
    这里输入的向量我们将其视为携带输出的某些信息,比如说手写数字为数字几,手写的潦草程度等等。由于这里我们对于输出数字的具体信息不做要求,只要求其能够最大程度与真实手写数字相似(能骗过判别器)即可。所以我们使用随机生成的向量来作为输入即可,这里面的随机输入最好是满足常见分布比如均值分布,高斯分布等。

    假如我们后面需要获得具体的输出数字等信息的时候,我们可以对输入向量产生的输出进行分析,获取到哪些维度是用于控制数字编号等信息的即可以得到具体的输出。而在训练之前往往不会去规定它。
    在这里插入图片描述

    3.4 GAN算法中的判别器

    对于判别器不用多说,往往是常见的判别器,输入为图片,输出为图片的真伪标签。
    在这里插入图片描述
    同理,判别器与生成器一样,可以是任意的判别器模型,比如全连接网络,或者是包含卷积的网络等等。

    四.GAN 的训练

    在这里插入图片描述

    1.在噪声数据分布中随机采样,输入生成模型,得到一组假数据,记为D(z)
    2.在真实数据分布中随机采样,作为真实数据,记做x;
    将前两步中某一步产生的数据作为判别网络的输入(因此判别模型的输入为两类数据,真/假),判别网络的输出值为该输入属于真实数据的概率,real为1,fake为0.
    3.然后根据得到的概率值计算损失函数;
    4.根据判别模型和生成模型的损失函数,可以利用反向传播算法,更新模型的参数。(先更新判别模型的参数,然后通过再采样得到的噪声数据更新生成器的参数)

    在这里插入图片描述

    这里需要注意的是:生成模型与对抗模型是完全独立的两个模型,他们之间没有什么联系。那么训练采用的大原则是单独交替迭代训练。

    GAN强大之处在于能自动学习原始真实样本集的数据分布,不管这个分布多么的复杂,只要训练的足够好就可以学出来。

    传统的机器学习方法,一般会先定义一个模型,再让数据去学习。
    比如知道原始数据属于高斯分布,但不知道高斯分布的参数,这时定义高斯分布,然后利用数据去学习高斯分布的参数,得到最终的模型。
    再比如定义一个分类器(如SVM),然后强行让数据进行各种高维映射,最后变成一个简单的分布,SVM可以很轻易的进行二分类(虽然SVM放松了这种映射关系,但也给了一个模型,即核映射),其实也是事先知道让数据该如何映射,只是映射的参数可以学习。
    以上这些方法都在直接或间接的告诉数据该如何映射,只是不同的映射方法能力不一样。

    而GAN的生成模型最后可以通过噪声生成一个完整的真实数据(比如人脸),说明生成模型掌握了从随机噪声到人脸数据的分布规律。GAN一开始并不知道这个规律是什么样,也就是说GAN是通过一次次训练后学习到的真实样本集的数据分布。
    在这里插入图片描述

    五.GAN 的损失函数

    在这里插入图片描述
    在这里插入图片描述
    判别器在这里是一种分类器,用于区分样本的真伪,因此我们常常使用交叉熵(cross entropy)来进行判别分布的相似性,交叉熵公式如下图所示:在这里插入图片描述
    公式中 [公式][公式] 为真实的样本分布和生成器的生成分布。
    在当前模型的情况下,判别器为一个二分类问题,因此可以对基本交叉熵进行更具体地展开如下图所示:
    在这里插入图片描述
    上式推广到N个样本后,将N个样本相加得到对应的公式如下:

    在这里插入图片描述

    GAN损失函数期望形式

    在这里插入图片描述
    在这里插入图片描述

    六.GAN 算法的不足

    在这里插入图片描述

    1. 可解释性差,生成模型的分布 Pg(G)没有显式的表达
    2. 比较难训练,D与G之间需要很好的同步(例如D更新k次而G更新一次),GAN模型被定义为极小极大问题,没有损失函数,在训练过程中很难区分是否正在取得进展。GAN的学习过程可能发生崩溃问题(collapse problem),生成器开始退化,总是生成同样的样本点,无法继续学习。当生成模型崩溃时,判别模型也会对相似的样本点指向相似的方向,训练无法继续。
    3. 网络难以收敛,目前所有的理论都认为GAN应该在纳什均衡上有很好的表现,但梯度下降只有在凸函数的情况下才能保证实现纳什均衡。
    4. 训练GAN需要达到纳什均衡,有时候可以用梯度下降法做到,有时候做不到.还没有找到很好的达到纳什均衡的方法,所以训练GAN相比VAE或者PixelRNN是不稳定的,但在实践中它还是比训练玻尔兹曼机稳定的多
    5. 它很难去学习生成离散的数据,就像文本
    6. 相比玻尔兹曼机,GANs很难根据一个像素值去猜测另外一个像素值,GANs天生就是做一件事的,那就是一次产生所有像素, 你可以用BiGAN来修正这个特性,它能让你像使用玻尔兹曼机一样去使用Gibbs采样来猜测缺失值

    参考:
    复旦大学 《深度学习》

    展开全文
  • GAN系列-原理

    千次阅读 2018-10-15 20:31:27
    这篇博客重点是从原理上去说明GAN,会涉及较多的数学公式。GAN的训练方式大家都很熟悉了,认为很简单。但是我认为,要想深入地理解GAN模型光能实践还是不够地,还是需要理解他地由来,以及数学表达方式。这样才有...

    最近开始看GAN相关地知识。GAN是很经典的模型,个人认为这里面的坑还是比较多的,以后写论文说不定能用上。
    这篇博客重点是从原理上去说明GAN,会涉及较多的数学公式。GAN的训练方式大家都很熟悉了,认为很简单。但是我认为,要想深入地理解GAN模型光能实践还是不够地,还是需要理解他地由来,以及数学表达方式。这样才有可能进一步地利用GAN ,做出我们自己想要地东西,而不是从网上copy个代码,跑一下就完事了。
    接下来的内容我们分为这几个方面讲

    GAN的原理
    GAN训练要注意的地方
    GAN的优势

    GAN 从high level 上说就是在拟合一个数据分布。比如我们要生成人脸图像,我们生成器输出可以看作是一个高维度向量,在这个维度向量里面,只有一部分数据看着像是人脸图像,而其他数据就不像人脸,我们地GAN网络中地生成器就是要去拟合那部分 像人脸的向量空间。
    那去拟合一个分布,我们使用的方法叫做KL散度。在李宏毅老师的科城里面,证明如下的一个数学式子,就是极大似然其实等价于 KL散度。
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    从以上我们可以看出,我们做的事情就是在判别阶段,我们把他当成是一个binary cross entropy 的问题,学习出一个D之后,我们学习G V(G,D)最小。

    如果单纯看以上的公式,不能有很好的直觉理解,接下来我们从直觉的角度去解释他。
    我们都知道,判别其是学习如何更好地对真实数据和生成数据进行判断,那么我们在公式中看到地minimize 是做什么的呢? 从直觉理解就是 minimize对应的是生成器的部分,minimize 意思是学习让生成数据真实数据之间 KL散度距离更小。以下会从数学推到上去理解这个关系

    在这里插入图片描述
    以上是我们试着求出max(g,d)中对应的d ,并把d代入到公式中后,我们会发现,我们得到的是KL散度
    在这里插入图片描述

    在这里插入图片描述

    由此可以看出,我们的minimize 其实 对应的KL 散度

    GAN在训练的时候需要注意的问题

    在这里插入图片描述

    如图中所示,我们在更新 G0之后 得到新的G1 ,很有可能我们得到新的点(G1,D)并不是V(G,D)对应值最大的点,这个是训练时候可能会遇到的问题。所以我们的GAN训练是基于这样的假设,G0 和 G1 之间差别不是很大。实现中具体表现为,我们的判别器训练可能会迭代很多次,而生成器迭代就会次数少很多(甚至次数为1)

    ** GAN的优势**

    GAN 效果会如此好,我们分析以下其中的原因。
    在没有GAN之前,我们在对于这种生成任务,我们是用有监督学习(VAE),这种生成模型有一个明显缺点是他的输出之间是独立的。因为输出都是经过神经网络的softmax层 ,输出之间是没有关联,而这明显和现实是有差别的。为了增加输出之间的关联性,我们的VAE可能会在原来输出的基础上增加很多层。而如果我们用GAN的话,GAN使用判别器来对数据进行判断。判别器对输出的数据有一个全局考虑的优势,也就弥补了输出之间独立这样的缺点。

    最后我们来讲一讲GAN方面,理论方面的争议

    有一种观点认为 判别其是学习 生成数据和 真实数据之间的差异。所以GAN训练到最后的时候,判别其就会崩掉,就是没有办法学习,所有数据他都没有办法判别。
    但是在实际操作中,我们会对这样一个理论产生怀疑
    很多论文里面可以看到,在训练判别其的时候会把之前生成器产生的数据和现在生成器产生的数据一起送入到判别器,他的效果会提升。
    还有很多人会用GAN与预训练判别器,从这些情况我们可以猜测 判别器是在学习数据的分布,是用来评价一个数据的好与坏,对他进行打分。
    但是以上还是基于猜测,还有待进一步去正式。

    展开全文
  • GAN原理,优缺点、应用总结

    万次阅读 多人点赞 2017-12-21 17:06:59
    GAN原理、优缺点、应用简要总结


    GAN原理,优缺点、应用总结


    本文已投稿至微信公众号–机器学习算法全栈工程师,欢迎关注


    1.GAN的 ‘前世’?

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

    640?wx_fmt=png&wxfrom=5&wx_lazy=1

    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的相似点。

    0?wx_fmt=png

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

    0?wx_fmt=png

    可能是动了真怒,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

    0?wx_fmt=png


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

    0?wx_fmt=png

    建立编码器和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代码链接。

    0?wx_fmt=png



    2

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

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


    1. GAN诞生背后的故事:

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

    0?wx_fmt=png

     Ian goodfellow

    0?wx_fmt=png


    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,里面给出了详细的解释,不过多重复。

    0?wx_fmt=png局部极小值点

    0?wx_fmt=jpeg

    鞍点



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

    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的研究火热程度:

    0?wx_fmt=png

    由于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


    后续连载。。

    ~敬请期待~


    1. GAN的入门与实践

    2. 史上最详细的XGBoost实战(上)

    3. 机器学习从零开始系列连载(2)——线性回归

    3. Scikit-learn之决策树




    对机器学习和人工智能感兴趣,请扫码关注微信公众号!
    这里写图片描述

    展开全文
  • GAN原理与实现

    2020-08-14 15:21:59
    GAN原理与实现GAN原理与实现GAN原理与实现 1.GAN原理介绍 2.数据准备 3.编写生成器模型和辨别器模型 4.编写loss函数,定义优化器 5.定义批次训练函数 6.GAN的训练与结果可视化 7.简单GAN的代码实现(一) 8....

    GANGAN的原理与实现

    1.视频教程:
    B站、网易云课堂、腾讯课堂
    2.代码地址:
    Gitee
    Github
    3.存储地址:
    Google云
    百度云:
    提取码:

    1.GAN的原理介绍


    • 生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分
      布上无监督学习最具前景的方法之一。

    • GAN是"生成对抗网络” (Generative Adversarial Networks)的简称,由2014年还在蒙特利尔读博士的Ian
      Goodfellow弓|入深度学习领域。201 6年,GAN热潮席卷Al 领域顶级会议,从ICLR到NIPS,大量高质量论文被发表和探
      讨。Yann LeCun曾评价GAN是"20年来机器学习领域最酷的想法"

    • 机器学习的模型可大体分为两类,生成模型 (Generative Model)和判别模型( Discriminative Model)。
      判别模型需要输入变量,通过某种模型来预测。生成模型是给定某种隐含信息,来随机产生观测数据。

    • GAN主要包括了两个部分,即生成器generator与 判别器discriminator。生成器主要用来学习真实图像
      分布从而让自身生成的图像更加真实,以骗过判别器。 判别器则需要对接收的图片进行真假判别。

    在这里插入图片描述


    • 在训练过程中,生成器努力地让生成的图像更加真实, 而判别器则努力地去识别出图像的真假,这个过程相当于一个二人博弈, 随着时间的推移,生成器和判别器在不断地进行对抗。

    • 最终两个网络达到了一一个动态均衡:生成器生成的图 像接近于真实图像分布,而判别器识别不出真假图像,
      对于给定图像的预测为真的概率基本接近0.5 (相当于随机猜测类别)

    GAN原理

    1. 对于给定的真实图片,判别器要为其打上标签1;
    2. 对于给定的生成图片,判别器要为其打上标签0;
    3. 对于生成器传给辨别器的生成图片,生成器希望辨别器打上标签1。

    • 训练过程中,生成网络G的目标就是尽量生成真实的 图片去欺骗判别网络D。而D的目标就是尽量把G生成 的图片和真实的图片分别开来。 这样,G和D构成了一一个动态的"博弈过程"

    • 博弈的结果是什么?
    • 在最理想的状态下,G可以生成足以“以假乱真”的 图片G(z)。对于D来说,它难以判定G生成的图片究竟
      是不是真实的,因此D(G(z)) = 0.5。 目的:得到了一个生成模型G,可以用来生成图片。

    在这里插入图片描述

    2.数据准备

    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras import layers
    import matplotlib.pyplot as plt
    %matplotlib inline
    import numpy as np
    import glob
    import os
    
    tf.__version__
    
    (train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data()
    

    在这里插入图片描述

    train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')
    train_images = (train_images - 127.5) / 127.5      # Normalize the images to [-1, 1]
    
    BUFFER_SIZE = 60000
    BATCH_SIZE = 256
    
    # Batch and shuffle the data
    train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
    

    3.编写生成器模型和辨别器模型

    def generator_model():
        model = tf.keras.Sequential()
        model.add(layers.Dense(256, use_bias=False, input_shape=(100,)))
        model.add(layers.BatchNormalization())
        model.add(layers.LeakyReLU())
        
        model.add(layers.Dense(512, use_bias=False))
        model.add(layers.BatchNormalization())
        model.add(layers.LeakyReLU())
        
        model.add(layers.Dense(28*28*1, use_bias=False, activation='tanh'))
        model.add(layers.BatchNormalization())
        
        model.add(layers.Reshape((28, 28, 1)))
    
        return model
    
    def discriminator_model():
        model = tf.keras.Sequential()
        
        model.add(layers.Flatten())
        
        model.add(layers.Dense(512, use_bias=False))
        model.add(layers.BatchNormalization())
        model.add(layers.LeakyReLU())
        
        model.add(layers.Dense(256, use_bias=False))
        model.add(layers.BatchNormalization())
        model.add(layers.LeakyReLU())
        
        model.add(layers.Dense(1))
    
        return model
    

    4.编写loss函数,定义优化器

    cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)
    
    def discriminator_loss(real_output, fake_output):
        real_loss = cross_entropy(tf.ones_like(real_output), real_output)
        fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)
        total_loss = real_loss + fake_loss
        return total_loss
    
    def generator_loss(fake_output):
        return cross_entropy(tf.ones_like(fake_output), fake_output)
    
    generator_optimizer = tf.keras.optimizers.Adam(1e-4)
    discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)
    
    EPOCHS = 100
    noise_dim = 100
    num_examples_to_generate = 16
    
    seed = tf.random.normal([num_examples_to_generate, noise_dim])
    

    5.定义批次训练函数

    generator = generator_model()
    discriminator = discriminator_model()
    
    @tf.function
    def train_step(images):
        noise = tf.random.normal([BATCH_SIZE, noise_dim])
    
        with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
            generated_images = generator(noise, training=True)
    
            real_output = discriminator(images, training=True)
            fake_output = discriminator(generated_images, training=True)
    
            gen_loss = generator_loss(fake_output)
            disc_loss = discriminator_loss(real_output, fake_output)
    
        gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)
        gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)
    
        generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))
        discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator,discriminator.trainable_variables))
    

    6.GAN的训练与结果可视化

    def generate_and_save_images(model, epoch, test_input):
      # Notice `training` is set to False.
      # This is so all layers run in inference mode (batchnorm).
        predictions = model(test_input, training=False)
    
        fig = plt.figure(figsize=(4, 4))
    
        for i in range(predictions.shape[0]):
            plt.subplot(4, 4, i+1)
            plt.imshow((predictions[i, :, :, 0] + 1)/2, cmap='gray')
            plt.axis('off')
    
        plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))
        plt.show()
    
    def train(dataset, epochs):
        for epoch in range(epochs):
            for image_batch in dataset:
                train_step(image_batch)
                print('.', end='')
            print()
    
            generate_and_save_images(generator,
                                 epoch + 1,
                                 seed)
    
    
        generate_and_save_images(generator,
                               epochs,
                               seed)
    

    在这里插入图片描述


    7.简单GAN的代码实现(一)

    8.简单GAN的代码实现(二)

    展开全文
  • 这次的内容主要是想梳理 GAN 从 NIPS 2014 被提出,到 2017年5月,都有哪些重要的从原理和方法上的重要研究。一共覆盖了25篇重要论文(论文列表见本文最下方)。 引言:GAN的惊艳应用 首先来看看 GAN 现在能...
  • 深入浅出GAN框架原理

    2018-07-01 21:51:35
    for=pc严格来说,一个GAN 框架,最少(但不限于)拥有两个组成部分,一个是生成模型 G,一个是判别模型 D。在训练过程中,会把生成模型生成的样本和真实样本随机地传送一张(或者一个 batch)给判别模型 D。判别模型...
  • 各种GAN原理总结及对比

    万次阅读 2018-04-21 15:00:19
    最近试着玩了多种GAN,今天我们主要总结下常用的GAN包括DCGAN,WGAN,WGAN-GP,LSGAN-BEGAN,SRGAN的详细原理介绍以及他们对GAN的主要改进,并推荐了一些Github代码复现链接。 本文旨在对GAN的变种做一些梳理工作,...
  • GAN网络原理入门,由浅入深,由结构框架到核心函数的通俗讲解。附GAN网络在各个热门方向的应用。还有这个地方的摘要要凑够50字。
  • 本文记录的是李弘毅老师的GAN的第二节课,bilibili视频链接为:https://www.bilibili.com/video/av24011528/?p=2,相关的课程课件链接为:http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2018/Lecture/CGAN.pdf ...
  • CycleGAN原理与实验详解

    千次阅读 2017-11-13 17:14:36
    CycleGAN是在今年三月底放在arxiv(地址:[1703.10593] Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks)的一篇文章,同一时期还有两篇非常类似的DualGAN和DiscoGAN,简单来说...
  • 深度学习----GAN(生成对抗神经网络)原理解析

    万次阅读 多人点赞 2019-03-01 16:12:40
    一、原理部分 1.1、 GAN原理: 1.2、架构 1.3、 GAN 的特点及优缺点: 二、为什么GAN中的优化器不常用SGD 三、为什么GAN不适合处理文本数据 四、训练GAN的一些技巧 五、GAN的广泛应用 ...
  • GAN公式原理推到

    千次阅读 2017-08-09 14:35:46
    上一篇论文中介绍了GAN[1]的原理,这篇继续介绍下它的公式推导的具体的过程,如果需要原理介绍的,可以回到上一篇关于GAN的文章的介绍中。(http://blog.csdn.net/susanzhang1231/article/details/73604302) 这...
  • 关于PatchGAN的理解

    万次阅读 多人点赞 2019-01-16 16:26:53
    GAN一般情况下的网络结构,在一些人的实验中已经表明对于要求高分辨率、高细节保持的图像领域中并不适合,有些人根据这一情况设计了PatchGAN的思路。这种GAN的差别主要是在于Discriminator上,一般的GAN是只需要输出...
  • GAN 的发展现状与展望

    千次阅读 2018-11-06 11:51:17
    本场 Chat 首先会带领大家了解下 GAN 的基本原理,然后对 GAN 的发展过程中的几个经典 GAN 进行解读,对 GAN 的可以落地的方向进行详细的阐述,最后,对 GAN 的优化目标的发展和训练技巧做一些简单总结。 本场 ...
  • patchGAN-patch判别器的理解

    千次阅读 热门讨论 2019-01-15 18:00:12
    参见:patchGAN-patch判别器的理解和多种写法(tensorflow)  https://github.com/ChengBinJin/V-GAN-tensorflow     【论文】GAN图像转换之从pix2pix到cycle GAN 该节分享两篇使用GAN的方法来进行图像...
  • # 深度学习-52:生成式对抗网络GAN(原理、模型和演进)。GAN模型演化出WGAN、WGAN GP、LS GAN、DRAGAN、BEGAN等GAN模型变体。Goodfellow认为正确使用数据的方式,先对数据集的特征信息有insight之后,再干活。在2014年...
  • 参考下面的github链接就明白了: https://github.com/ChengBinJin/V-GAN-tensorflow
  • 【论文笔记】CycleGAN

    万次阅读 多人点赞 2017-12-14 22:13:14
    前言: CycleGAN是发表于ICCV17的一篇GAN工作,可以让两个domain的图片互相转化。传统的GAN是单向生成,而CycleGAN是互相生成,网络是个环形,所以命名为Cycle。并且CycleGAN一个非常实用的地方就是输入的两张图片...
  • 生成对抗网络GAN损失函数Loss的计算

    万次阅读 2017-09-22 14:53:02
    损失函数的计算辨别器对假数据的损失原理相同,最终达到的目标是对于所有的真实图片,输出为1;对于所有的假图片,输出为0。 生成器的目标是愚弄辨别器蒙混过关,需要达到的目标是对于生成的图片,输出为1.`d_loss_...
  • 深度学习-StyleGAN试玩

    千次阅读 2019-06-08 21:23:35
    原理什么的可以看github,主要是用了不同的卷积大小对不同细节的学习,我还没深入研究,先下来玩了下,觉得很有意思,分享下。 随机生成动漫头像 这个是老外的模型 链接:https://pan.baidu.com...
1 2 3 4 5 ... 20
收藏数 7,062
精华内容 2,824
关键字:

gan原理