深入浅出 GAN 之原理篇文字版(上)

昨天为大家推送了5月21日的线下活动的 slides 和视频。但由于现场有一些口误,还有一些紧张,所以还是想 整理一份文字版的内容 。虽然文字版不是与视频中的话完全对应的,但是可能更清晰哦!因为内容实在太多,今天先发布前一个小时的内容!

这次的内容主要是想梳理 GAN 从 NIPS 2014 被提出,到 2017年5月,都有哪些重要的从原理和方法上的重要研究。一共覆盖了25篇重要论文(论文列表见本文最下方)。首先来看看 GAN 现在能做到哪些惊艳的事呢?

GAN 可以被用来学习生成各种各样的字体——也就是说,以后字迹辨认这种侦查手段很可能就不靠谱啦!这个工作还有很多动图,在 GitHub 上搜 zi2zi 这个 project 就可以。

有了 GAN,以后就不怕灵魂画手了!左边这么简单的“简笔画”,居然也可以直接生成出对应的蕴含丰富含义的完整图画呢。这个工作来自[24],同时还可以用来做一些修正,比如可以把春天的山变成被白雪覆盖尖端的山——而这一切只需要一点点白色的涂抹(可以参考这个工作[24]的官方页面)。

有了 GAN,不仅仅可以在有辅助的情况下作画,还可以在无辅助的情况下完成很多修饰!比如从分割图变成真实照片,从黑白图变成彩色图,从线条画变成富含纹理、阴影和光泽的图……这些都是用 pix2pix[21] 里的方法生成的。

去年非常火爆的应用,脸萌当然也难不倒 GAN!想拥有自己的专属Q版定制头像吗?快去看看[22] 吧( 这篇工作以前也已经写过哦,传送门点此 )。

当然还少不了前段时间刷爆社交网络的“梵高在春天醒来”、“马变斑马”“四季变换”的工作啦。来自依然也写过的 CycleGAN[9], 传送门点此

这些惊艳的工作基本都是2016年8月甚至10月以后的,也就是 GAN 被提出两年后。这是因为,虽然 GAN 有非常吸引人的性质,想要训练好它并不容易。经过两年的摸索、思考与尝试,才有了如今的积累和突破。

那么这个非常吸引人的 GAN 是什么样呢。其实 GAN 最初让人“哇”的地方在于,作为一个生成模型,GAN 就像魔术师变魔术一样,只需要一个噪音(噪音向量),就可以生成一只兔子!

而想要成为一个成功的欺骗观众的魔术师并不容易,GAN 也是在不断地失败、穿帮、磨练技艺中成长起来的!要知道,观众们见过很多兔子,如果变出来的东西根本不像兔子,或者变不出来,这个魔术就很失败,观众就不会买账。在这样反复的练习中,作为魔术师的 GAN 扮演的是生成模型的角色,目的是要不断地提高自己的魔术水平,从而变出更活灵活现的兔子;而观众扮演的是一种判别模型的角色,目的是考察和激励魔术师提高自己的水平。但是这种激励是通过批评或者惩罚的方式完成的。

严格来说, 一个 GAN 框架,最少(但不限于)拥有两个组成部分,一个是生成模型 G,一个是判别模型 D。在训练过程中,会把生成模型生成的样本和真实样本随机地传送一张(或者一个 batch)给判别模型 D。判别模型 D 的目标是尽可能正确地识别出真实样本(输出为“真”,或者1),和尽可能正确地揪出生成的样本,也就是假样本(输出为“假”,或者0)。 这两个目标分别对应了下方的目标函数的第一和第二项。 而生成模型的目标则和判别模型相反,就是尽可能最小化判别模型揪出它的概率。这样 G 和 D 就组成了一个 min-max game,在训练过程中双方都不断优化自己,直到达到平衡——双方都无法变得更好,也就是假样本与真样本完全不可区分。

通过这样的巧妙设计,GAN 就拥有了一个非常吸引人的性质。GAN 中的 G 作为生成模型,不需要像传统图模型一样,需要一个严格的生成数据的表达式。这就避免了当数据非常复杂的时候,复杂度过度增长导致的不可计算。同时,它也不需要 inference 模型中的一些庞大计算量的求和计算。它唯一的需要的就是,一个噪音输入,一堆无标准的真实数据,两个可以逼近函数的网络。

但是天下没有免费的午餐,这样简单的要求使得 GAN 的自由度非常大。换句话说,GAN 的训练就会很容易失去方向,变得野蛮生长。于是,早期的 GAN 经常出现如下让人崩溃的现象:

这些现象其实是 GAN 中存在的三个难点或者说问题交织导致的。个人觉得, 首当其中的难点一就是,深度神经网络自身的难训练和不稳定。 虽然原始 GAN 的理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数就可以。但是这恰好是深度神经网络擅长的事情嘛,所以大家就都用神经网络作为 G 和 D 了。但是神经网络的选择、设计和训练还充满了艺术的惊喜与生活的不确定性,这也直接为 GAN 的训练带来了困难。加之本来 GAN 就缺乏指导,所以就有了一系列可以被归结为解决这一方向问题的工作。我将这类工作概括为 Partial Guidance, Fine-Grained Guidance 和 Special Architecture。

先来看,Partial Guidance。Partial Guidance 中我概括的几个重要工作,都是为原始 GAN 加上一些显式的外部信息,比如用户的额外输入,比如类别信息等等。包含的工作有:

Conditional GAN[15],也叫 CGAN,几乎是原始 GAN[2] 后的第一份工作 ,想法非常简单,既然你的信息不够,我就把你原始的生成过程变成基于某些额外信息的生成。这样就相当于给你提供了一些 hint,所以公式如下:

可以看到,D 和 G 去拟合的分布都变成了条件概率分布。在 CGAN 的工作中,这个额外的 y 信息,是通过在输入层直接拼接样本与 y 信息的向量而实现的。具体使用的 y 信息有 one-hot vector,也有图像(也就是基于另一个图像去生成)。这个 y 信息的选择其实十分灵活,在后期的工作中也依然很常见,毕竟是一种非常直观有效的加入 label 信息的方式。

第二个这方面的工作是由 OpenAI 提出的 Improved GAN [19],其中重点提出了两个训练 GAN 的技巧,feature matching 和 minibatch discrimination。feature matching 是指,既然 G 和 D 的训练不够稳定,常常 D 太强,G 太弱,那么不如就把 D 网络学到的特征直接“传”给 G,让 G 不仅能知道 D 的输出,还能知道 D 是基于什么输出的。所以就有了如下的新的目标函数:

也就是说,现在的 D 直接就是神经网络的某一个中间层了。这个方法在实验中发现对于训练的稳定度提升非常有帮助。与此同时,他们还提出了第二个方法,叫 minibatch discrimination:

这其实是让 D 在判断当前传给它的样本是真是假的同时,不要只关注当前的,也要关注其他的样本。这会增加 D 判断样本时候的多样性,从而增加了 G 生成样本的多样性,因为它不再会只基于一种“逼真”样本的方向来改进自己。

第三个工作是来自 UC Berkeley 的 iGAN/GVM [24],也是开篇介绍 GAN 应用中的解放灵魂画手的工作。他们的工作中蕴含了两种指导信息,一个是用户的输入,比如蓝色的笔触,比如绿色的线条,比如图像改变的方向和程度(拉伸、变形)。但是如果只利用这样的信息,生成的图像往往比较模糊,比如鞋子的纹理变得不够清晰。为此它们的解决办法是为在生成的鞋子的形状上“贴”上原始真实图片中的高清纹理。所以难点就是如何让“贴”的过程变得可靠,不能“贴”出区域,也不能“贴”少了。他们在此利用了差值空间中的光场信息,从而能捕捉到相邻差值空间中的点对点映射关系,也就可以基于这样的映射,迭代“贴”上纹理,直到最后一步:

iGAN 的工作之后,他们又继续做了 pix2pix 的工作 [21],用于生成一些图像两两之间的“变换”。也就是开篇介绍的,“从分割图变成真实照片,从黑白图变成彩色图,从线条画变成富含纹理、阴影和光泽的图”,还有第一个 zi2zi 的字体变换,也是基于这个 pix2pix 的工作[21]。pix2pix 里,将 D 的输出从一张图片变成了一对图片,所以 D 的任务就变成了去判断当前的两张图片是否是一个“真实”的“变换”。比如我们的需求是给一个黑白的 Hello Kitty 上色,那么 pix2pix 的框架大概如下:

而 Partial Guidance 中的最后一个重要任务就是非常新的 GP-GAN[25] ,目标是将直接复制粘贴过来的图片,更好地融合进原始图片中,做一个 blending 的事情。

这个过程非常像 iGAN,也用到了类似 iGAN 中的一些约束,比如 color constraint。另一方面,这个工作也有点像 pix2pix,因为它是一种有监督训练模型,在 blending 的学习过程中,会有一个有监督目标和有监督的损失函数。

除了 Partial Guidance 这种非常显式的“半监督”(不是严格意义上的半监督)信息,过去也有很多工作 让 GAN 的生成过程拆解到多步,从而实现“无监督”的 Fine-grained Guidance 。个人总结了以下一些重要工作:

第一篇 LAPGAN 是来自 Facebook[16],是第一篇将层次化或者迭代生成的思想运用到 GAN 中的工作。在原始 GAN[2] 和后来的 CGAN[15] 中,GAN 还只能生成 16*16, 28*28, 32*32 这种低像素小尺寸的图片。而这篇工作[16] 是首次成功实现 64*64 的图像生成。思想就是,与其一下子生成这么大的(包含信息量这么多),不如一步步由小转大,这样每一步生成的时候,可以基于上一步的结果,而且还只需要“填充”和“补全”新大小所需要的那些信息。这样信息量就会少很多:

而为了进一步减少信息量,他们甚至让 G 每次只生成“残差”图片,生成后的插值图片与上一步放大后的图片做加法,就得到了这一步生成的图片。

第二篇 Fine-grained Guidance 方面的工作[18]讨论的是从 Text 生成 Image,比如从图片标题生成一个具体的图片。这个过程需要不仅要考虑生成的图片是否真实,还应该考虑生成的图片是否符合标题里的描述。比如要标题形容了一个黄色的鸟,那么就算生成的蓝色鸟再真实,也是不符合任务需求的。为了捕捉或者约束这种条件,他们提出了 matching-aware discriminator 的思想,让本来的 D 的目标函数中的两项,扩大到了三项:

第三篇这方面的工作[20] 可以粗略认为是 LAPGAN[16] 和 matching-aware[18] 的结合。 他们提出的 StackGAN [20] 做的事情从标题生成鸟类,但是生成的过程则是像 LAPGAN 一样层次化的,从而实现了 256*256 分辨率的图片生成过程。StackGAN 将图片生成分成两个阶段,阶段一去捕捉大体的轮廓和色调,阶段二加入一些细节上的限制从而实现精修。这个过程效果很好,甚至在某些数据集上以及可以做到以假乱真:

最后一个这方面的工作[26],当时也因为效果逼真和工作夯实,引发了社交网络上和学术圈的广泛关注,那就是 去年年底的 PPGN[26],现在已被 CVPR 2017 接收 。PPGN 也主张不要一次生成一张完整的图片,而是要用一个迭代过程不断地调整和完善。与 LAPGAN 和 StackGAN 不同的是,PPGN 使用了 Denoising AutoEncoder(DAE)的过程实现迭代,并在其网络结构中也多次体现了迭代和层次化的思想。

针对 GAN 的第一大难点,也就是神经网络本身训练的不稳定和难调参,也有许多工作提出了一些特殊结构,来改善这些情况。

将 GAN 成功从 MNIST 的多层感知机(MLP)结构扩展到卷积神经网络结构的 就是 DCGAN 这篇工作 [17]。这篇工作中,他们提出了一组卷积神经网络,不仅使得可以 GAN 可以在 celebA 和 LSUN 这种现实世界的真实大规模数据集上训练,还使得 batchnorm 等 trick 也被成功运用。

虽然 DCGAN 的一度成为了 GAN 工作的标准,统治了大半年的江湖。 但是随后出现的效果非常惊艳的 pix2pix [21] 中却指出了 U-Net 结构的优势。pix2pix 中 G 和 D 使用的网络都是 U-Net 结构,是一种 encoder-decoder 完全对称的结构,并且在这样的结构中加入了 skip-connection 的使用。

这个结构对于生成效果至关重要,其也被后续的一些工作采用[9][11] 。skip-connection 不仅使得梯度传导更通畅,网络训练更容易,也因为这类工作多数是要学习图片之间的映射,那么让 encoder 和 decoder 之间一一对应的层学到尽可能匹配的特征将会对生成图片的效果产生非常正面的影响。类似的讨论可以见 [11]。

最后要指出的也是刚才就提到的 GP-GAN [25] 的工作。在这个工作中,它们提出了 blending GAN 的模块,虽然也是基于 encoder-decoder 的结构,但是略有不同的地方是,在两者中间加入了一个 fully-connected layer:

这个全连接层的特殊之处在于,并不是卷积神经网络中的 channel-wise FCN,而是彻底全连接。这样的好处是可以传递更多的全局信息,使得有监督学习变得更加有效。

以上就是本次分享中的上半部分,GAN 的基础和 GAN 的难点一、以及对应的解决方案。关于 GAN 的难点二、三,和对应解决方案,会在文字版(下)中整理完毕。

最后再次附上这份文字版干货对应的完整 slides 和回顾视频。 只要关注“程序媛的日常”微信公众号,回复“原理篇”就可以获取126页完整 PDF 和分享视频啦!

[1] Arjovsky and Bottou, “Towards Principled Methods for Training Generative Adversarial Networks”. ICLR 2017. 

[2] Goodfellow et al., “Generative Adversarial Networks”. ICLR 2014. 

[3] Che et al., “Mode Regularized Generative Adversarial Networks”. ICLR 2017. 

[4] Zhao et al., “Energy-based Generative Adversarial Networks”. ICLR 2017. 

[5] Berthelot et al., “BEGAN: Boundary Equilibrium Generative Adversarial Networks”. arXiv preprint 2017. 

[6] Sønderby, et al., “Amortised MAP Inference for Image Super-Resolution”. ICLR 2017. 

[7] Arjovsky et al., “Wasserstein GANs”. ICML 2017. 

[8] Villani, Cedric. “Optimal transport: old and new”, volume 338. Springer Science & Business Media, 2008.

[9] Jun-Yan Zhu*, Taesung Park*, Phillip Isola, Alexei A. Efros. “Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks”. arXiv preprint 2017. 

[10] Taeksoo Kim, Moonsu Cha, Hyunsoo Kim, Jung Kwon Lee, Jiwon Kim. “Learning to Discover Cross-Domain Relations with Generative Adversarial Networks”. ICML 2017. 

[11] Zili Yi, Hao Zhang, Ping Tan, Minglun Gong. “DualGAN: Unsupervised Dual Learning for Image-to-Image Translation”. arXiv preprint 2017. 

[12] Jeff Donahue, Philipp Krähenbühl, Trevor Darrell. “Adversarial Feature Learning”. ICLR 2017. 

[13] Vincent Dumoulin, Ishmael Belghazi, Ben Poole, Olivier Mastropietro, Alex Lamb, Martin Arjovsky, Aaron Courville. “Adversarially Learned Inference”. ICLR 2017. 

[14] Ishaan Gulrajani, Faruk Ahmed, Martin Arjovsky, Vincent Dumoulin, Aaron Courville. “Improved Training of Wasserstein GANs”. arXiv preprint 2017.

[15] Mehdi Mirza, Simon Osindero. “Conditional Generative Adversarial Nets”. arXiv preprint 2014. 

[16] Emily Denton, Soumith Chintala, Arthur Szlam, Rob Fergus. “Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks”. arXiv preprint 2015. 

[17] Alec Radford, Luke Metz, Soumith Chintala. “Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks”. ICLR 2016.

[18] Scott Reed, Zeynep Akata, Xinchen Yan, Lajanugen Logeswaran, Bernt Schiele, Honglak Lee. “Generative Adversarial Text to Image Synthesis”. ICML 2016. 

[19] Tim Salimans, Ian Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, Xi Chen. “Improved Techniques for Training GANs”. arXiv preprint 2016. 

[20] Han Zhang, Tao Xu, Hongsheng Li, Shaoting Zhang, Xiaolei Huang, Xiaogang Wang, Dimitris Metaxas. “StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks”. arXiv preprint 2016. 

[21] Phillip Isola, Jun-Yan Zhu, Tinghui Zhou, Alexei A. Efros. “Image-to-Image Translation with Conditional Adversarial Networks”. CVPR 2017.

[22] Yaniv Taigman, Adam Polyak, Lior Wolf. “Unsupervised Cross-Domain Image Generation”. ICLR 2017. 

[23] Ian J. Goodfellow, Jean Pouget-Abadie, Mehdi Mirza, Bing Xu, David Warde-Farley, Sherjil Ozair, Aaron Courville, Yoshua Bengio. “Generative Adversarial Nets”. NIPS 2014. 

[24] Jun-Yan Zhu, Philipp Krähenbühl, Eli Shechtman and Alexei A. Efros. “Generative Visual Manipulation on the Natural Image Manifold”, ECCV 2016. 

[25] Huikai Wu, Shuai Zheng, Junge Zhang, Kaiqi Huang. “GP-GAN: Towards Realistic High-Resolution Image Blending”. arXiv preprint 2017. 

[26] Anh Nguyen, Jeff Clune, Yoshua Bengio, Alexey Dosovitskiy, Jason Yosinski. “Plug & Play Generative Networks: Conditional Iterative Generation of Images in Latent Space”. CVPR 2017.

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章