赞
踩
目录
GAN for Sequence Generation(生成文字)
Image Translation/pix2pix(图像翻译)
Learning from Unpaired Data (Cycle GAN)
Evaluation of Generation(GAN的评价方法)
Frechet Inception Distance (FID)
本周的学习从GAN的基本理论再到介绍流行的GAN方法最后到GAN生成的评价方法,在训练GAN的时候,Generator的目标是希望生成的数据与真实的数据越相似越好,而Discriminator的目标是尽量将生成的数据与真实的数据区分开来。两者之间这种棋逢对手的关系,导致GAN成为一个很难训练的模型,为了优化GAN的训练,也诞生了WGAN、Conditional GAN、CylceGAN等方法。最后对GAN背后的数学原理进行推导。
This week's learning starts with the basic theory of GAN, then introduces popular GAN methods, and finally discusses the evaluation methods generated by GAN. When training GAN, the goal of the generator is to hope that the generated data is as similar as real data as possible, while the goal of the discriminator is to try to distinguish the generated data from real data as much as possible. The competitive relationship between the two has made GAN a difficult model to train. In order to optimize GAN training, methods such as WGAN, Conditional GAN, and CylceGAN have also emerged. Finally, the mathematical principles behind GAN are derived.
上一周学习了GAN的训练,那么训练的目标是什么呢?
将Distribution中sample出来的向量丢到generator里面,会产生一个比较复杂的Distribution,而真正的data也形成了一个Distribution , 我们希望和越接近越好。
假设输入输出都是一维的向量,从一维的角度来看,输入的Distribution通过一个generator之后得到的Distribution中点的位置会发生一系列的变化,而是真正的数据分布,显然与是存在一定差异的。
即Divergence,是衡量两个Distribution相似度的一个major,当Divergence的值越大就代表这两个Distribution越不像。Divergence的值越小就代表这两个Distribution越相近。
与普通的神经网络的训练一样,定义Loss Function,找到一组参数使得Loss的值最小。那么在Generation的训练要做的事情就是找一组Generator里面的参数(Generator是一个Network,里面也有大量的weight和bias),使得通过在这组参数下的Generator得到的与c越小越好。因此在Generation问题中我们的Loss Function就是
在做Generation的训练的时候,我们所遇到的问题就是不知道如何躯计算这个Divergence,而GAN可以解决不会计算Divergence的限制。
对于GAN来说,不需要知道和的分布,只要知道怎么从和中sample东西出来,就可以算出Divergence,而和是可以sample的。对于真实的数据从图片库里sample一些出来就可以得到了,而的sample是可以通过Generaator产生得到的。
通过sample就可以计算Divergence,这就需要依靠Discriminator的力量了,Discriminator 就是要尽量把从里sample的数据与从里sample的数据分开,这其实也可以用 Binary Classifier 做,把的sample 当作 class 1, 把 的sample当作class 2,如下图所示。设计 Classifier 的目标函数
根据从和中sample出来的data训练一个Discriminator,训练的目标就是看到real data就给它高分,看到generation data就给低分,也就是要分辨一个图片是真的图还是生成的图。
其实Discriminator的问题可以当作是一个Optimization的问题
训练出来的Discriminator可以去maximize Objective Function,(minimize的就叫Loss Function),因此要找一个D可以Maximize这个Objective Function。
如下图所示。设计 Classifier 的目标函数
我们希望可以找到一个D使得越大越好,也就是说希望的值越大越好,代表给真正的Image打分越高越好。经过推导可以发现的最大值与 JS divergence 有关。
下面通过例子从直观上来理解为什么Objective Function的最大值是和Divergence有关的,当和两组sample出来的数据之间的divergence很小的时候,Discriminator 很难分辨两者,因此打的分数不准确,则的值小。反之当divergence很大的时候,Discriminator 很容易分辨两者,因此打的分数比较准确,则的值大。
训练Discriminator的目标就是分辨出真正的Image和生成的Image,即使的值达到最大,而Generator的目标就是让生成的图片瞒过Discriminator,因此它的目标是让的值越小越好,因此等式右边既有min又有max。
和有一个关键特性就是重叠部分非常少,有两个方面的原因。
而JS divergence有一个特性就是两个分布没有重叠,那么算出来的divergence永远都是log2,这导致 Generator 无法知道训练是否带来结果的提升,训练学不到东西。
除了 JS divergence,还可以使用其它的 divergence,即设置discriminator不一样的目标函数。而GAN 是出了名的不好训练。下面介绍知名的一个最有名的训练技巧:WGAN。
Wasserstein distance就是将P推着移动到Q的平均距离,也就是图中的d
移动的方法有很多种,但不同的方法移动距离不同,因此为了让Wasserstein distance的值唯一,它的定义就是穷尽所有的”moving plans“,看看哪种方法的平均距离最小,这个最小的值就是Wasserstein distance。
从JS divergence换到Wasserstein distance的好处:
假设可以计算Wasserstein distance的值,当使用Wasserstein distance来衡量divergence的时候,从移动到的距离d是很遥远的,想要”一步到位“是很难的,对于JS divergence而言,只有”一步到位“它的loss才会有差异,但是对于Wasserstein distance而言,需要步步递进,每次移动一点Wasserstein distance就会有变化,Wasserstein distance变化就可以训练Generator,去Minimize W distance。
用Wasserstein distance代替JS divergence的GAN 就叫做WGAN
Wasserstein distance的计算公式如下:
在WGAN中,对判别器D做出了限制,D必须满足1-lipschitz的条件,也可以理解为D必须是一个足够平滑的Function。
当和没有重叠的时候,但两者相距很近的时候,要在上得分很高,就会取到正无穷,在取得分低就会到负无穷,那这个function的变化就会很大,D的训练就没办法收敛,因此在两组数据没有重叠的情况下,算出来的max值就会无限大。
Q:为什么加上这个限制就可以解决无限大的问题?
A:这个限制是要求Discriminator不可以变化剧烈要平滑, 因此在两组数据挨得很近的时候,在平滑的限制下,real上的值不会非常大,generated上的值也不会特别小,因此计算得到的值就会比较小,这样的值才是Wasserstein distance。
WGAN中让判别器满足1-lipschitz的条件的方法其实相对较为简单,训练network的时候,更新参数后将权重w限制在c到-c之间,如下图所示:
在Imprived WGAN中提到了Gradient Penalty的方法,在real data的分布与fake data的分布中各取sample,然后在两袋奶现在也有很多其他1-lipschitz的方法比谱归一化Spectral Normalization就是很好的例子,其有效的让梯度在各个地方都小于1防止梯度消失。
虽然已经有了WGAN,并不意味着GAN就很好训练了,依旧很难训练。因为Generaator与Discriminator两个network是棋逢对手的关系,需要共同成长,一旦一个停止进步了,另一个也跟着再进步了。
如上图所示。在实际训练中,无法保证每一次 Discriminator 的 loss 都会下降,一旦 loss 不下降,Discriminator停止训练,那么Generator也随着不再训练,就会出现连锁反应,整个结构都不再改进。
训练GAN最难的就是拿GAN来生成文字,为什么呢?
由前面学习的知识可知,生成文字需要一个Sequence to Sequence的模型,模型里面的Decoder会产生一段文字。在Transform里面它是Decoder,而在GAN中它扮演了Generator的角色,负责生成文字。
在算法上来说,与图片生成的Generator没有什么不同,一个是产生图片一个是产生文字,通过调整参数,想办法“骗过”Discriminator,让Discriminator去辨别是真的文字还是生成的文字,给出一个分数。那难点就在于,如果要用gradient descend去训练Decoder,让Discriminator的得到的分数越大越好,会发现做不到。gradient descend训练也就是看改变参数对目标的影响大小,假设改变Decoder的参数,但是这个改变不足以影响概率,因为 Generator 的输出是取概率最大的那个,输出 sequence 不变,进而 Discriminator 的输出也不变,没有变化也就算不出微分。
为什么CNN的Max Pooling可以做微分,这里的Max不能呢?
当输入变化时,CNN里面的max pooling是选取,而这里的max是取样
目前为止学的Generator,输入都是一个随机分布,现在我们想要操纵Generator的输入,给它一个condition x,然后通过x和分布Z来产生y,这样的Conditional Generator的应用有很多。
例如将red eyes作为condition,生成什么样的图片取决于Z中sample出来的分布,但不管怎么sample,得到的结果都有红眼睛这个共同的特征。
但这样的方法不能完全解决Conditional GAN的问题,如果训练Discriminator的时候只看Generator的输出y的话,Generator会学到怎么骗过Discriminator的非常清晰的图片,但是跟输入没有任何关系,因为对于Generator来说只要能骗过Discriminator即可,不需要管输入的condition是什么。
因此在要做Conditional GAN中要做不一样的设计,把Generator的输出y和Generator的输入x一起作为Discriminator的输入,这是得到的数值不只是看图片好否,也要看是不是符合condition的要求。
简单 GAN 是不需要标注的,而这里的 conditional GAN的输入是两个,则需要一些标注,也就是说引入了有监督学习。这也好理解,既然对机器产生的数据有一定要求,肯定要有示例告诉机器应该怎么做。
具体来说,就是 Discriminator 的输入为成对数据 ( x , y ) 。以文字生成图片 (Text-to-image) 为例,Discriminator 的训练目标是:输入为(文字,与之对应的训练图片),输出为 1;输入为(文字,生成的图片)时,输出为 0。除此之外,还需要一种 negative sample:(文字,与之不对应的训练图片),输出为 0,如上图所示。
除了Text-to-image之外,还有Image Translation,即看到图片产生图片,与文字产生图片非常相似,只是将输入的文字x改为图片。例如给它一张建筑的设计图,让它根据设计图纸生成真实的建筑图片,还有看到黑白图生成对于的彩色图片等。
从声音生成相应的图片,比如输入狗叫声,生成小狗图片,输入水声,生成溪流图片。
静态图转动态,让照片里的人物动起来。
在Conditional GAN里面需要成对的资料,那遇到不成对的资料 ,也就是没有标注的资料,怎么训练network?GAN 的妙用就是unsupervised learning ,也就是接下来要介绍的 Cycle GAN。
实际中,常常有大量未标注数据,怎么利用上这部分数据呢?
有一个方法是 semi-supervised learning,只需要少量标注数据,未标注数据可以用模型标注 (pseudo label)。但是很多任务仍然还是需要一些成对的资料来训练模型,否则模型效果不好,标注也不好。
会有完全没有标注的数据吗?会。一个例子就是 Style Transfer,例如图像风格转换,假设我们有一些人脸图片,另外有一些动漫头像,两者没有对应关系,也就是 unpaired data,如下图所示。
怎么利用GAN在这种完全没有成对的资料的情况下学习,Cycle GAN 就是为了解决这个问题。
在原来的GAN里面,我们将从分布里面sample出来的东西丢入Generator里面就行,如下图从Domain x 中sample一张图片丢入,会生成一张图片,Discriminator就会判断生成的这张图片是不是y Domian里面的图片,是的话给高分不是则给低分。与以往GAN不同的只是不是从Gaussian中sample,而是从真人照片里面sample出来。
但是完全套用以往的GAN是不够的,因为Generato可以训练成产生二次元图片(y Domian ),但是与输入的图像没有任何关系,她只需要得到Discriminator的高分即可。
那怎么强调训练Generator时输入和输出的关系呢?
与前面介绍的 GAN 不同,Cycle GAN 的输入不是从 Gaussian Distribution 采样,而是从 original data 采样,在Cycle GAN中会训练两个Generator,第一个是将x domian的图变成y domian的图,第二个是将y domian的图还原成x domian的图。输入经过两次转换后得到的输出要与输入越接近越好,这个叫做cycle的consistency。
此外,还可以反向训练,从动漫图片到人物图片,再到动漫图片。但仍然需要训练一个Discriminator,但这里的Discriminator是判断该图片是否是x Domain的图片。训练 Cycle GAN 时可以两个方向同时训练。
不仅可以应用在图片上,也可以运用在文字上,比如把消极的文字都转换为积极的文字。
对于监督学习模型可以和 label 比对,而 Generator 生成的图片与原来的图片相似但不相同,怎么去判断呢?
怎么自动评估生成图像好与不好呢?
有一个方法是将图片跑一个分类器 ,输入是一张图片y,输出是一个几率的分布,这个几率分布的越集中代表生成的图片越好,表示机器能够清楚的辩识图像上的是什么,例如猫狗,如图中所示,几率都集中在了class2。
但是光用上面这个做法是不够的,存在一个问题就是生成的数据可能集中在某部分区域,比如下面两种情况,Mode Collapse(模型崩溃)和Mode Dropping(模型下降)
训练到后面可以发现,一张图片反复使用,每次做一点不同的改变,比如换个头发颜色。因为区域内的图片判定为真的可能性大,而generator发现了这个盲点,因此大量生成集中在这个范围的图片。
对于下图中的例子,如果只看左边这部分会发现generated data 还不错,但real data还有右边部分,整的来看产生出来的资料只有真实资料的一部分,generated data 的种类比real data少很多。
Mode Collapse与Mode Dropping,前者是针对一张图片而言的,generator针对一张真实图片反复生成能骗过discriminator的图片;后者是针对一堆图片而言,generator针对几十张真实图片反复生成能骗过discriminator的图片。但两者都是多样性问题。
需要解决上面的问题,我们需要关注generator产生出来的图片多样性够不够,过去有个做法就是采用图像分类器,将产生的所有的图片都丢到图像分类器里面,每张图片都可以得到一个几率分布,将所有的几率分布进行平均,如果平均的分布非常集中,也就是每张图片都很相似,就代表现在多样性不够。
如果每一张图片丢到分类器里面产生概率分布都非常不相同,平均完后的结果是非常平坦的,说明现在的多样性是够的。
Inception Score (IS) 就是结合了 Quality of Image 和 Diversity。Quality 高, Diversity 大,对应的 IS 就大。
在评估的标准上,同样采用图像分类器的方法,而quality和diversity貌似是互斥的,quality中几率分布越集中,代表质量越好,但在diversity中几率分布越平均,代表多样性越大。但是需要注意的是两者的评估范围不一样,quality看的是一张图片的结果(单个分布),而diversity看的是Generater 生成全部的图片得到的结果(平均分布)。
Inception Score (IS) 就是结合了 Quality of Image 和 Diversity。Quality 高, Diversity 大,对应的 IS 就大。
而对于作业中的生成二次元人物头像图片,不能用 Inception Score,因为都是人脸图片,Classifier 都识别为一类,因此 Diveristy 不高。解决方法:用 Frechet Inception Distance (FID)。
一些情况下,生成的图像是同一类别的,看分布并不合适。把生成的二次元人像图片丢到Inception network里面一直到softmax,那么得到类别就是人脸,那我们要的不是类别。取出进入softmax之前的向量代表这张图片。
如下图所示,图中红色点是真实的图像,蓝色点表示生成的图像,FID 计算的是两个 Gaussian Distribution 之间的 Frechet Distance。这里做了一个假设:真实和生成的图像都是 Gaussian Distribution。
会存在的问题:
那有了这些衡量标准就可以去衡量GAN的好坏了吗?
在下图的例子中,生成图片的 Quality 和 FID 都不错,可是在生成的图片中跟给出的真实图片一模一样,可是我们希望机器能生成新的图片,如果和训练图片一模一样,直接到训练图片集采样就好了。对于这个问题的应对方法可以计算 generated data 和 real data的相似度,看是不是一样。
而机器又会学会“耍滑”将图片左右翻转一下,这种情况计算相似度是不同,其实还是原图片。
因此衡量 Generative Model 的好坏挺难的。
假如我们想要生成一些人脸图,实际上,我们是想找到一个分布,从这个分部内sample出来的图片,像是人脸,而不属于这个distribution的分布,生成的就不是人脸,GAN要做的就是找到这个distribution。而在GAN诞生之前,之前用的是Maximum Likelihood Estimation,最大似然估计来做生成的,通过转换最大似然估计做的事情就是找到一个参数最小化和之间的divergence。
但是我们常常要先假定一个具体的分布去逼近实际分布,我们的分布不一定是高斯分布,如果是一个NN,就没有办法算likelihood。因此我们需要一个通用的分布,去逼近这个复杂的图像真实分布。因此要用GAN的Generator来解决这个问题。
1.GAN的特点
● 相比较传统的模型,他存在两个不同的网络,而不是单一的网络,并且训练方式采用的是对抗训练方式
● GAN中生成网络G的梯度更新信息来自判别网络D,而不是来自数据样本
2.GAN 的优点:
● GAN是一种生成式模型,相比较其他生成模型(玻尔兹曼机和GSNs)只用到了反向传播,而不需要复杂的马尔科夫链
● 相比其他所有模型, GAN可以产生更加清晰,真实的样本
● GAN采用的是一种无监督的学习方式训练,可以被广泛用在无监督学习和半监督学习领域
● 相比于变分自编码器, GANs没有引入任何决定性偏置( deterministic bias),变分方法引入决定性偏置,因为他们优化对数似然的下界,而不是似然度本身,这看起来导致了VAEs生成的实例比GANs更模糊
● 相比VAE, GANs没有变分下界,如果鉴别器训练良好,那么生成器可以完美的学习到训练样本的分布.换句话说,GANs是渐进一致的,但是VAE是有偏差的
● GAN应用到一些场景上,比如图片风格迁移,超分辨率,图像补全,去噪,避免了损失函数设计的困难,不管三七二十一,只要有一个的基准,直接上判别器,剩下的就交给对抗训练了。
3. GAN的缺点:
● 训练GAN需要达到纳什均衡,有时候可以用梯度下降法做到,有时候做不到.我们还没有找到很好的达到纳什均衡的方法,所以训练GAN相比VAE或者PixelRNN是不稳定的,但我认为在实践中它还是比训练玻尔兹曼机稳定的多
● GAN不适合处理离散形式的数据,比如文本
● GAN存在训练不稳定、梯度消失、模式崩溃的问题(目前已解决)
通过这周的学习,从理论方面学习了GAN的训练,以及训练中可能遇到的问题,同时学习了几种优化GAN训练的几种方法,以及评估一个GAN模型的好坏标准。下周将继续学习GAN的实例,进一步学习GAN的原理与应用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。