一文读懂生成对抗网络GANs(附学习资源)

一文读懂生成对抗网络GANs(附学习资源)

原文标题:AnIntuitive Introduction to Generative Adversarial Networks

作者:KeshavDhandhania、ArashDelijani

翻译:申利彬

校对:和中华

本文约4000字,建议阅读10分钟

本文以图像生成问题引出GAN模型,并介绍了GAN模型的数学原理和训练过程,最后提供了丰富的GAN学习资料。

本文讨论生成对抗网络,简称GANs。在生成任务或更广泛的无监督学习中,GANs是为数不多在此领域表现较好的机器学习技术之一。特别是他们在图像生成相关任务上拥有出色表现。深度学习领域先驱Yann LeCun,称赞GAN是机器学习近十年来最好的想法。最重要的是,GAN相关核心概念很容易理解(事实上,读完本文后你就可以对它有个清晰的认识)。

我们将GANs应用在图像生成任务中,并以此来解释GANs,下面是本文的概要:

  • 简单回顾深度学习

  • 图像生成问题

  • 生成任务中的关键问题

  • 生成对抗网络

  • 挑战

  • 进一步阅读

  • 总结

简单回顾深度学习

一文读懂生成对抗网络GANs(附学习资源)

(前馈)神经网络示意图,棕色为输入层,黄色为隐藏层,红色为输出层

我们先简单介绍一下深度学习。上图是神经网络示意图,它是由神经元组成,神经元之间通过边相互连接,而且神经元按层排列,中间为隐藏层,输入层和输出层分别在左右两侧。神经元之间的连接边都有权重,每一个神经元都会根据与其连接的神经元的输入值加权求和,然后带入非线性激活函数中计算,这类激活函数有Sigmoid和ReLU。例如,第一层隐藏层神经元对来自输入层神经元的值进行加权求和,然后再应用ReLU函数。激活函数引入了非线性,它使神经网络可以模拟复杂的现象(多个线性层等价于一个线性层)。

给一个特定的输入,我们依次计算每个神经元输出的值(也称为神经元的活性)。从左到右,我们利用前层计算好的值来逐层计算,最后得到输出层的值。然后根据输出层的值和期望值(目标值)定义一个损失函数,例如,均方误差损失函数。

一文读懂生成对抗网络GANs(附学习资源)

其中,x是输入,h(x)是输出,y是目标值,总和包含数据集中所有数据点。

在每步中,我们的目标是以合适的数值优化每条边的权重,从而尽可能降低损失函数的大小。我们计算出梯度值,然后利用梯度具体优化每一个权重。当我们计算出损失函数值,就可以用反向传播算法计算梯度。反向传播算法的主要结果是:利用链式求导法则和后一层参数的梯度值来计算这层的梯度。然后,我们通过与各个梯度成比例的量(即梯度下降)来更新每个权重。

如果你想要进一步了解神经网络和反向传播算法的细节,我推荐你阅读Nikhil Buduma写的简单学习深度学习(Deep Learning in aNutshell)

http://nikhilbuduma.com/2014/12/29/deep-learning-in-a-nutshell/

图像生成问题

图像生成问题上,我们希望机器学习模型可以生成图像。为了训练模型,我们得到了一个图像数据集(比如从网络下载的1,000,000张图片)。在测试的时候,模型可以生成图像,这些图像看起来像属于训练集,但实际上并不是训练集中的图像。也就是说,我们想生成新的图像(与单纯地记忆相反),但仍然希望它能捕获训练数据集中的模式,从而使新的图像感觉与训练数据集相似。

一文读懂生成对抗网络GANs(附学习资源)

图像生成问题:没有输入,所需的输出是一个图像

需要注意的一点是:在测试或预测阶段,这个问题没有输入。每次“运行模型”时,我们希望它生成(输出)一个新的图像。这可以说输入将从一个容易抽样的分布(例如均匀分布或高斯分布)中随机抽样而来。

生成任务中的关键问题

生成任务中的关键问题是:什么是一个好的损失函数?假如你有两张机器学习模型生成的图片,我们如何决定哪一个更好,好多少呢?

在以前的方法中,这个问题最常见的解决方案是计算输出图像和训练集中最邻近图像的距离,其中使用一些预定义的距离度量标准来计算距离。例如,在语言翻译任务中,我们通常有一个源语句和一个小的(约5个)目标句子集,也就是由不同翻译人员提供的译文。当模型生成一个译文,我们把译文与提供的目标句子比较,然后根据它距离哪个目标句子最近,分配一个相应的分数(特别是,我们是用BLEU分数,它是根据两个句子之间有多少个n-grams匹配的距离度量标准)。但这是一种单句子翻译方法,当目标是一个较大的文本时,同样的方法会使损失函数的质量严重恶化。例如,我们的任务可能是生成给定文章的段落摘要,那么这种恶化源于少量的样本无法代表在所有可能的正确答案中观察到的变化范围。

生成对抗网络

GAN针对上面问题的回答是:用另外一个神经网络---记分神经网络(称为判别器 Discriminator),它将评估生成神经网络输出的图像的真实性。这两个神经网络具有相反的目标(对抗),生成网络的目标是生成一个看起来真实的假图像,判别网络的目标是区分假图像和真实图像。

这将生成任务的设置类似于强化学习的双人游戏(如象棋,Atari games or 围棋),在强化学习中我们有一个从零开始通过自我对抗不断改进的机器学习模型 。象棋或者围棋这些游戏的对抗双方总是对称的(尽管并非总是如此),但对于GAN的设置,两个网络的目标和角色是不相同的。一个网络产生假的样本,而另一个网络区分真的和假的样本。

一文读懂生成对抗网络GANs(附学习资源)

生成对抗网络的示意图,生成器网络标记为G,判别器网络标记为D

如上图所示,是生成对抗网络示意图。生成网络G和判别网络D在进行一场双方极大极小博弈。首先,为了更好地理解这种对抗机制,需要注意到判别网络(D)的输入可以是从训练集中抽样出的样本,也可以是生成网络(G)的输出,不过一般是50%来自训练集,剩余50%来自G。为了从G中生成样本,我们从高斯分布中提取潜在的向量并输入生成网络(G)。如果我们想生成200*200的灰度图像,那么生成网络(G)的输出应该是200*200的向量。下面给出目标函数,它是判别网络(D)做预测的标准对数似然函数。

生成网络(G)是最小化目标函数,也就是减小对数似然函数或是说“迷惑”判别网络(D)。也就是说,无论何时从生成网络(G)输出中抽取样本作为判别网络(D)的输入,都希望判别网络识别为真样本。判别网络(D)是要最大化目标函数,也就是要增大对数似然函数或者说是把真实样本和生成样本区分开。换句话说,如果生成网络(G)在“迷惑”判别网络(D)上效果很好,也就会通过增大公式第二项中D(G(z))来最小化目标函数。另外,如果判别网络(D)能很好地工作,那么在从训练数据中选择样本的情况下,会通过第一项(因为D(x)很大)增大目标函数,也会通过第二项减小它(因为D(x)很小)。

如同平常的训练过程一样,使用随机初始化和反向传播,此外,我们需要单独交替迭代更新生成器和判别器。下面是在特定问题上应用GANs的端到端的工作流程描述:

1. 决定GAN网络架构:G的架构是什么?D的架构是什么?

2. 训练:一定数量的交替更新

  • 更新D(固定G):一半样本是真的,另一半是假的

  • 更新G(固定D):生成所有样本(注意,即使D保持不变,梯度流还是会经过D)

3. 人工检查一些假样本,如果质量很高(或者质量没有提升)则停止,否则重复2。

当G和D都是前馈神经网络时,我们得到的结果如下(在MNIST数据集中训练)

一文读懂生成对抗网络GANs(附学习资源)

来自Goodfellow et. Al,从训练集开始,最右边一列(黄色框内)图像与其紧邻左边一列的图像最接近。其它所有图像都是生成的样本

关于G和D我们可以使用更复杂的架构,例如使用跳格卷积(strided convolutional)和adam优化器来代替随机梯度下降。另外,还有其它一些方面的改进,例如优化架构,使用超参数和优化器(具体可参考论文)。改进后,我们得到了如下的结果:

一文读懂生成对抗网络GANs(附学习资源)

卧室图片,来自Alec Radford et. Al

挑战

训练GANs最关键的挑战是有可能不收敛,有时这个问题也被称为模式崩溃(mode collapse)。举个例子,来简单解释这个问题。假设任务是生成数字图像,就像MNIST数据集中的一样。可能出现的问题(实践中确实出现)是生成器G开始生成数字6,而不能生成其它数字。一旦D适应G的当前行为,为了最大限度地提高分类的准确性,它开始把所有的数字6归为假,所有其它数字都是真实的(假设它不能分辨假的6和真实的6)。然后G又适应了D的当前行为,开始只生成数字8而不生成其它数字。然后D又适应,开始把数字8归为假,其它的都是真。接着G又开始只生成3,如此循环下去。基本上,生成器G仅生成与训练数据集的一个小的子集相似的图像,而一旦识别器D开始把这个小的子集与其余的区分开,生成器G又转换到另外的子集,它们将一直简单的来回震荡。虽然这个问题没有被完全解决,但还是有一些方法可以避免这个问题。这些方法涉及小批量特征(minibatch features)和多次更新D的反向传播。我们不再讨论这些方法的细节,如果要了解更多信息,请查看下一节中的建议阅读材料。

进一步阅读

如果你想更深一步了解GANs,我建议你阅读ICCV 2017 tutorials on GANs( https://sites.google.com/view/iccv-2017-gans/home),那里有很多最新的教程,并且它们对GANs的不同方面各有侧重。

我还想说一点关于条件GANs(Conditional GANs)的概念,条件GANs,是在输入的条件下产生输出。例如,任务可能是输出与输入描述相匹配的图像。所以,当你输入狗时,输出的应该是狗的图像。

下面是一些最近研究的成果(附论文链接)。

一文读懂生成对抗网络GANs(附学习资源)

文本到图像合成( ‘Text to Image synthesis’)成果,作者Reed et. al

一文读懂生成对抗网络GANs(附学习资源)

超分辨率图像(Image Super-resolution)成果,作者Ledig et. Al

一文读懂生成对抗网络GANs(附学习资源)

图像到图像转换(Image to Image translation)成果,作者Isola et. Al

一文读懂生成对抗网络GANs(附学习资源)

生成高分辨率名人相(Generating high resolution ‘celebritylike’ images),作者Karras et. Al

最后也是最重要的,如果你想阅读更多关于GANs资料,请查看这个按照GANs的应用分类的论文列表 :

https://github.com/zhangqianhui/AdversarialNetsPapers

100+GAN的变种论文清单:

https://deephunt.in/the-gan-zoo-79597dc8c347

总结

通过这篇文章,希望你可以理解深度学习领域中的一种新技术—生成对抗网络。它们是无监督机器学习中少数成功的技术,并且这种技术正在快速革新我们执行生成任务的能力。过去的几年中,我们发现了一些让人印象深刻的成果。GANs应用在语言任务中,提高语言任务的稳定性和训练的方便性,等等,也是研究的热点。GANs在工业中也被广泛应用,从交互式图像编辑、三维形状估计、药物发现、半监督学习到机器人技术。最后,我希望这篇文章是你对抗机器学习之旅的开始。

原文链接:http://blog.kaggle.com/2018/01/18/an-intuitive-introduction-to-generative-adversarial-networks/

一文读懂生成对抗网络GANs(附学习资源)

申利彬,研究生在读,主要研究方向大数据机器学习。目前在学习深度学习在NLP上的应用,希望在THU数据派平台与爱好大数据的朋友一起学习进步。

相关推荐