Generative Adversarial Networks overview(1)

 

Libo1575899134@outlook.com数组

Libo网络

(原创文章,转发请注明做者)dom

本文章会先从Gan的简单应用示例讲起,从三个方面问题以及解决思路覆盖25篇GAN论文,第二个大部分会进一步讲Gan的全部领域应用ide

-----------------------------------------------------------------------------------函数

1: 下图GAN能够学到不一样的字体,而且在字体之间进行不一样的变换学习

2 下图能够用简笔画能够用GAN帮助生成想要画的东西,好比绿色的横线是想画一个草地,若是想把绿色的山变成雪山,能够在尖部画一些白色的线条。字体

3 下图展现了能够把线条进行填色,也能够把平面图变成立体图优化

4 下图是仿脸萌的一个应用,把人的真实头像换成一个卡通的头像。ui

5 下图展现了在不一样物体之间作的转换,好比从夏天的图转换到冬天的,从莫奈的画变成一个真实的照片或者从马变成斑马。编码

6 下图是说把上面的任务应用到一个更流行的场景,能够合成口型,这个图看起来效果不是很好,可是能够经过后期处理让其变得很是真实。

----------------------------------------------------------------------------------------------------------------------------------

下面未来介绍一些内容包括GAN的难点,以及针对这些难点有哪些技术解决方法,咱们经过三个思路归纳25篇论文。

困难一:Gan的自由度过高了,引入了神经网络以后随之带来的问题

困难二:优化JS散度带来的梯度消失问题

困难三:替代版损失函数优化KL散度引起的mode missing问题

GAN最直观的理解是给定一个随机数或者一个随机的向量生成咱们想要的东西,就象变戏法同样

它虽然是一个生成模型,它解决生成模型的想法是:假设有个造假币的人(生成模型),有个警察(判别模型),但愿造出来的假币很难被识别出来,警察须要抓捕造假币的人,二者属于一种对抗的模式,这种对抗会使得造假币的人不断提升本身的造假技术,警察不断提升本身的侦察技术,最后致使了一种平衡,最后致使了假币和真币没法被区分出来,认为两方都不可能变得更好了。

把这个想法变得数学化来讲就是:GAN用的是一种min-max的对抗模型来解决生成问题,刚才的假币制造商和警察对应着生成器G和判别器D,如图所示最左边输入一个随机数或者随机数组通过一个生成器(神经网络),生成假币或者图像,对于警察(判别器)要判别当前接触到的是真币仍是假币。

若是从数学公式来看的话,对D来讲 有两个目标,要最大可能的判断出真实的钱币(数据)是真实的,把正确的事情判断正确,要把不正确的事情判断出是不正确的

判别器要断定最大化两种状况下都正确的几率,生成器跟判别器相反,最小化目标。

吸引人的地方有不少,好比生成输入只须要是一个noise输出是x,由于须要反向传播的一些方法因此用神经网络量来模拟G,只须要用生成数据的分布去逼近真实数据的分布,逼近以后就能够直接从生成数据分布中采样就好了,最吸引人的地方在于并不须要写出一个如何生成数据的表达式,正如图模型的表现力有限,P的表达式越复杂,计算复杂度越高,gan解决了这个问题。

可是以下图生成的东西和咱们但愿的存在差别,甚至于真实的人脸可能会转换成一个卡通图像。

 

由于gan并不会对P有任何显性的要求,不须要写出一个具体的表达书,自由度过高了,失去控制,没有合理的引导生成不出想要的东西

困难一:由于用到了深度神经网络去逼近G,神经网络中很困惑的问题是如何在反向传播的过程当中,如何让梯度传播的更好,须要考虑模型的深度和复杂度,梯度消失梯度爆炸的问题,把神经网络固有的问题引入进来。

困难二:是GAN的目标函数,判别器的目标是:1 最大化正确数据判断正确的几率,2 最大化不真实的状况下判断为不真实的几率

原始论文中提到,生成器的目标最好用下面alternative的,为何呢?

使用原始的G目标函数会致使G的D梯度消失问题,由于直观上,在训练的初期阶段,D很容易对检测有信心G,因此D的输出几乎老是0

直观上来理解,由于生成器是从无到有学习起来的,在训练初期生成器生成的样本质量很是差,对于判别器很是容易判别出来,判别器的损失几乎为0,进而生成器也没法更新。

那么从原理上说,当均衡状态下判别器达到最优时,目标函数是在最小化JS散度,为啥呢?

当靠拢到最佳状态时,咱们能够求得一个最优的判别器的表达式D*,r是真实数据的分布,g是生成数据的分布,损失函数就能够等价下式,2log2是常数,其实是在优化这两个分布的JS散度

JS散度和KL散度是什么意思呢?

假设有两我的,一我的爱狗,说的频率很高,一我的爱猫,这里会引入一个交叉熵的概念

在语言系统中咱们但愿表达更加有效率,咱们但愿更常说的东西由更简单的编码去编,两我的说话词汇的频率不同,则编码系统就会不同,当一我的用到另外一我的的编码系统时会致使信息量不同,信息量就叫交叉熵H

Hp(q)和Hq(p)就是两我的分别说对方语言的交叉熵,alice 说“狗”时候,“狗”本身系统的编码长度很大。 Bob说猫的时候,就须要很大的信息量。因此是非对称的,致使KL散度就不是衡量两个非对称分布的度量。

因此KL散度的计算如如下公式,各自交叉熵不是一样大小,减去各自的熵,KL散度也不是对称的

KL散度是计算距离的,若是是非对称的分布就会带来不少麻烦,须要变成对称的,方法是:

先找到r的分布,在p和q之间取一个平均值,就能够计算出每一个单独分布和每一个中间值r的KL散度,加起来后就是一个JS散度,JS散度就已是一个对称散度了。

有个直观的例子:当两个分布彻底重叠的时候,KL散度和JS散度都是0,当两个分布重合度很低的时候,KLJS 都会增大,达到最大。

回头再来看问题2,当D达到最优的时候,等价是在优化JS散度,关键是优化JS散度是不太对的。

 由于,若是两个分布几乎没有重叠的话,JS散度就会是一个常数,就会不贡献任何信息,传递导数时几乎没有导数传过来,致使了梯度消失的问题。

困难三:刚才都是一直在说原始的D是有问题的,提出了替代版的目标函数,可是一样有问题,由于生成器G一开始的目标是最小化让D把它抓出来的几率,D是最大化把它揪出来的几率。问题转换一下,最大化D抓不出来的几率,但实际上在理论上是不等价的

 

没有理论上的保证会带来不少问题,因此替代版的目标函数等价于优化下面的目标函数,最小化KL散度的同时,最大化JS散度,可是KL散度和JS散度是同增同减的,并非相反的。则同时让一个最大化一个最小化是不对的

 

两项是相反的,就会致使优化会乱跑就会致使梯度不稳定的问题。

那么若是暂时不考虑优化JSD的部分,由于在不overlap的时候JSD等于常数,只考虑只优化KL散度有没问题呢?一样是有问题的,由于之因此引入JS散度就是由于KL散度是不对成的,不对称带来的问题是,当生成器生成了一个不够真实的样本和生成器没有生成真实样本的时候,两种状况下获得惩罚是不同的,D返回的数据是不同的,这就是不对成的KL散度在这个问题中的直观反应,会致使,生成器为了减少本身可能获得的惩罚,就会生成不少看起来尽可能真实,可是很可能都长一个样的样本,由于这样的获得的KL散度在某个方向的惩罚较小,致使了生成的样本多样性不够丰富,会出现一个叫mode missing的问题。

 

------------------------------------------------------------------------------------------------

解决思路以下:

方法1.1: 部分指导,显示的加入指导信息

方法1.2: 细粒度指导,隐性的知道,迭代学习

方法1.3: 神经网络优化技巧 skip-connection 等

Solution 1: Partial and Fine-grained Guidance

 

传统的输入是蓝色向量noise,绿色向量word2vec embding ,onehot编码的向量均可以,也能够是一个图片,能够是任何表达的信息,后面有不少版本,有人加到了中间层并非输入层,在判别器的里面也要把输入的信息给他,作的实验就是加了word embding的标达。简单理解就是判别器要断定生成图像和输入conditional是否是一个pair

接着看2016年openAI的improved Gan的paper 提出了2个技巧.

一个技巧是feature matching. D学的很好,G学的不是很好,就把D的信息传过来,到底经过什么样的feature把G抓出来的,把这个feature也学出来。

第二个技巧minibatch disc解决的有点关乎mode missing 的问题,生成了太多长的同样的样本,由于每次判别器只看同样本,是不是真实的,会致使当前生成器生成的样本被断定为有效的时候就会致使生成器老是生成此个样本,解决办法是不要一次判断一个,把以前判断的其余样本的feature一块儿送进来,判断的时候会考虑一堆样本的信息,能够理解为其余样本的feature给了当前样本更多的信息,来指导靠拢其余的有效信息。

接下来的工做是朱骏彦团队的iGAN或者GVM,思路是GAN 不修正的话老是比较模糊,能够考虑把清楚的纹路贴过来,这个工做里会有两个监督信息,一个是如何来变形,user能够给定一个信息变成什么样的(低邦鞋变成高筒靴)。

另一个监督信息是要把原始纹路贴过来,直接贴会有问题,由于若是变形的话贴过来确定是不对应的。

下图所示就是给定一个变形的监督信息,给了一个变形的方向,根据指导去融合。

第二种监督信息是把变形的过程作interpolation(插值) , 在interpolation中捕捉光场,光场能够理解成一种motion+color的变化,目标是把光场的流向变形过来

以下图只要是能够捕捉到光场,就能够把光场的对应关系一点一点应用到贴片的对应关系中,先从光场的信息中学到了点对点的映射,利用映射把原始信息贴到对应位置上就好了,因此在损失函数中就有很对对应的term(空间和颜色)。

下面这个工做是除了变形靴子,变形物品意外,还能够用手残画变成更好的画,或者对画进行修饰和调整,若是北京雾霾比较严重,就能够给它画出一片蓝天,山等等

下面的工做pix2pix在18年年初特别火,目标是咱们把线条画变成一个上色的画,把平面图变成立体图,以前的全部GAN的工做,都是让D去判断一张图片,或者一组图片一组图片也是来自于真实或者生成的,可是pix2pix 须要传入一个pair的数据给D,因此D分辨的是这一组之间的映射关系是否是对应的(是否是能够映射为一组)

假以下图要给kitty上色,真实的pair是左边,失败的上色是右边的pair,因此D须要断定的不是生成的是否是kitty,而是生成是否是符合我上色要求的kitty

下面展现的也是pix2pix的工做,景深图跟真实照片图的转换

下面的工做叫Gaussian-Poisson GAN,跟igan干的事情比较相似,在PS过程当中常常会抠图跟明星合影或者是换一个场景呀,因此须要抠图+贴图,可是不清晰 融合也很差 各类问题,因此GP-gan 就是能让这个融合过程更真实,好比下面的天是不同的。

他们是怎么作的呢?首先有个blending GAN,是有监督的模型,要把一个比较类似的融合好的图像/融合好的图像做为一个目标图像,因此是一个监督的损失函数,此外里面有一个Color Constraint 有点像IGAN中光场的那种限制条件,算是一种有监督信息的补充

上面是解决方法一的第一小种,都是显性的给一些部分指导,显性的给一些有监督的信息。

下面是第二种,是给一些隐性的指导,并非真的给一个图片或者向量。

LAPGAN是2015年facebook的工做,拉普拉斯GAN

第二篇Match-aware 作的事从文字合成图像的工做,我写你画

第三篇 stackGan 任务几乎同样

LAPGAN 在2015已经很厉害了,以前的GAN只能生成16*16 32*32的图像,LAPGAN是第一篇生成到64*64的图像,思想是不要一次性生成,一步一步生成的,从小到大

具体实现技巧很欠缺,每一个部分都是不一样组的gan  ,多个G和D,不可以端到端的train。下一步要基于上一步的生成信息,同时还有有noise和onehot的输入。

Matching-aware 的工做是从文本生成图像,你们可能认为C-gan就能够实现,可是他们提出了重要的改进,三种不一样的可能性:

1,    很是真实的图像和文本

2,    我生成了很是真实的图像可是和文本是不对成的

3,    符合个人要求可是文本是同样的。

因此说D要分辨两种不一样的error,判断两种可能性都是假的

给左边的描述生成右边的图像,有些仍是能够看的ICML2016。

接下来看StackGan ,当时引发了必定的轰动,是由于生成了256*256的图像,为何叫stackGan呢?跟LAPGAN同样,有点像LAPGAN和matching-aware 的结合同样,不要一步到位的生成,先把鸟大体的轮廓和颜色分布画出来,再精修细节

在实际训练过程当中也是同样,GAN很是擅长分开学习前景和背景,这是GAN的特性,最近专门有人作成一个目标函数,要求先生成比较模糊的背景后生成细节。

接下来看PPGN  17年年末很是的火,全称叫“Plug and Play Generative Networks”,主要解决的是mode-missing的问题。PPGN能够生成很是丰富的样本,效果看起来很是solid

之因此把它归类为Fine-grained Guidance 的缘由是:它们用一个迭代的,去噪声的自动编码器,生成的,通过了不断的迭代去噪的过程加了其余的限制致使图像很丰富。

 

之因此把它归类为Fine-grained Guidance 的缘由是:它们用一个迭代的,去噪声的自动编码器,生成的,通过了不断的迭代去噪的过程加了其余的限制致使图像很丰富。

接下来介绍第一大类中的第三类,虽然有人已经用加强学习来自动选择网络结构了,可是仍是更要相信手工炼丹的方法,须要了解下哪些结构在GAN的工做被证明有效。

 

第一篇DC Gan 的重要性在于,在它以前就有4,5篇成功应用了MLP的gan模型,MLP中基本都是全链接层,发现其余结构都不太work

作法以下: 把全部的pooling层 替代成了 strided conv , 也用了bn , 移除了 fc , 加了一些relu , leakyrelu , tanh

第一次在大规模上图像集,LF 大规模场景理解数据集上work的,有趣的是能够学出不带窗户过渡到带窗户的。

第二个pix2pix的工做,提出了U-net在里面表现的更好,最重要的缘由是U-net加了skip-connection.

GP-GAN在Blending gan中是一个enconder – deconder的结构,可是在最中间加了FC层,彻底抛弃了channel wise的fc,变成fully connect 的全链接层,能够帮助传播全局信息

给咱们的启示就是要按照不一样任务选择不一样的网络结构,第一种会引起的梯度传导困难的问题基本解决了。

 

 

解决 2.1:encoder方法

解决 2.2:Noisy input

第二个问解决方案主要是针对于第三个困难,也就是mode-missing的问题,gan生成出来的样本常常不够丰富,这类方法统称为加encoder的方法,来解决两个问题,

1 : 强制生成分布和真实数据分布有必定重合度,使得JSD是有必定意义的,就再也不是一个常数了,能够传梯度了

2 : encoder来做为真实数据和生成数据的桥梁,不要直接判别生成数据和真数据,让它判别假数据生成数据和一个编码事后的数据.

 那么什么是mode missing的问题呢? 下面箭头表明了生成的流形,M1 和 M2 是数据里的两个Mode, 蓝色比较大, 紫色比较小, 蓝色样本特别多,就是一个大mode, 好比人脸数据集 白人多, 白人就是个大Mode.

OK,若是同时在数据集中存在两种不一样大小的Mode的时候, 在作梯度传导的时候,大部分的梯度都会传向大Mode , 小Mode 没法学习.

从数学角度讲:最开始的任务是优化min max game  左边是真是, 让D 最大化正确的几率,让G最小化D正确的几率.

等式两边发现 理论上相等,可是实际不相等,以下图的直观理解, 若是让生成器去逼近8个高斯分布(8个平均的Mode,分布很散),学习时困惑,到低应该逼近哪个Mode

Mode Regularized GANs , 咱们引入了一个encoder, 让一个image 或者 noise 通过一个Encoder 以后会生成一个表达式再经过这个表达式生成真实的样本, 因此G 是附和在E的上面的. 就会有一个encoding 的L1 的loss,试过L2 可是不work,  那么生成器的目标函数就会有一些变化,除了要最大化D抓不到的几率 (这里是替代版的function) ,还要加上enconder的loss , 这些都被加到生成器的loss里.

判别器不变.

可是依然会出现梯度消失的问题,若是不用复杂的网络结构,目前仍是用的DCGAN, 生成器前期仍是比较差劲 那能不能用别的方式解决梯度消失的问题呢?

针对于梯度降低 就作了以下改进,

1 Manifold让生成分布和真实分布的流形尽可能长得一个样,形状类似

 Manifold 就能够利用encoder获得的信息, 去比较他们的流形

2 让两个东西的几率比较类似.

把整个生成过程拉成了2, 直观的理解每一步都有一个D, MDGAN中有D1,D2,在两步分别判断, 第一个D1 在判断真实数据和编码数据的差别,再也不是真实数据和生成数据的分布, 第二步变成了, 编码数据和生成数据的差别,也不是判断生成数据和真实数据的分布.

如今至关于缩短了,判别器比较的两种样本之间的原本的差距, 理论上会认为, 真实程度是生成的最不真实, 编码的东西比较真实,真实的数据最真实, 利用编码器在最不真实和最真实之间加了一座桥,D在两个桥之间比较,缩短了他们之间不类似的几率 , 不类似的程度也就增大了梯度的大小,

假设须要逼近6个高斯,传统的GAN会在训练过程当中不停的绕,若是用Reg-Gan 的话,很快就会把 分布散开, 散开以后会慢慢逼近6个分布,最后拟合的会比较好.

实验结果减小了Mode-missing的几率生成了不一样形态的人.

还有人引入了encoder 作各类各样的问题, 此外比较火的还有,BE-GAN , 是基于EB-GAN,他们两个长得很像:

EB-Gan在生成器上方加了一个encoder , 让Enc 数据传给Dec 最后输出一个MSE, 而后再综合起来输出一个E(能量),把一个能量函数做为了D的输出.

那么BE-GAN比较不同,把后面的简化了.

三个本质上都是经过encoder解决了一个问题, 解决了 PR和PG 有overlap 的问题 , 这个问题被不少人发现有更简单的解决办法, 能够归纳为Noisy input, 咱们只须要把样本和分布加一点点noise (其余空间的分布) , 就能够致使他们有overlap , JSD 就会变得颇有指导意义.

1 以前也有人试验过 往生成器和 判别器的层里面加Noise

2 instance Noise,直接在image上面加Noise , 真实图像在传进去以前也要加Noise, 用这个简单的东西就能够实现让两个分布overlap

因此encoder的东西work work 还须要仔细探究一下.

最近有人给出了更加直观的解释:

从另外一个角度理解,传统的A是咱们但愿的map,两个domain的图像,都是向左的map到一块儿,都是向右的map到一块儿,若是用传统Gan去学,会致使b的状况,Mode Missing的问题

这样会致使生成这样的东西很模糊,有点像生成的平均同样,能够和以前不少Gan的模型生成的比较模糊联系到一块儿

第三个是简单把一个Gan加一个encoder的办法,细节不同,可是归纳了刚才说的三种方法,

因此就有了后面三篇基本长得同样的论文

下一篇:Generative Adversarial Networks overview(2)

相关文章
相关标签/搜索