学习生成对抗网络?从这里开始吧

机器能否思考——这一想法比计算机本身出现得还要早。数学家、逻辑学家以及计算机科学家艾伦•图灵(Alan Turing),或许是凭借在破译密码机方面做出的贡献而广为人知的,但他于1950年撰写的《计算机器与智能》(Computing machinery and intelligence)这篇论文也足以使他的名字永载后世。

在这篇文章中,图灵提出了一种叫作模仿游戏的测试。今天,人们更习惯称之为图灵测试。在这个假设的测试场景中,一个不知情的观察者与位于一扇紧闭的门后的两个“对应者”交谈:一个是人类,另一个是计算机。图灵认为,如果观察者不能分辨出哪个是人、哪个是机器,那么必须承认通过该测试的计算机是智能的。

试过与自动聊天机器人或智能语音助手进行对话的人都知道,要通过这个看似简单的测试,计算机还有很长的路要走。然而,在其他类型的任务中,计算机不仅能与人类的表现相媲美,在一些领域甚至超越了人类——即使是一些在最近还被认为最智能的算法都无法企及的领域,例如,计算机在人脸识别中已经能做到超越人类的精确度,还能不需人类经验即可掌握围棋技能。

机器学习算法非常擅长识别已有数据中的模式,并将这种洞察能力用于诸如分类(为样本分配正确类别)和回归(根据一系列的输入进行数值估算)等任务中。但是当被要求生成新数据时,计算机就显得力不从心了。算法可以击败国际象棋大师,估计股价走势,并能分辨信用卡交易是否可能是欺诈,但相比之下,任何与Amazon的Alexa或Apple的Siri进行闲聊的尝试却往往注定失败。事实上,人类最基本和最重要的能力——例如一次愉快的对话或者一件原创作品的制作——都足以使最先进的超级计算机束手无策。

但这一切在2014年发生了改变,当时还是加拿大蒙特利尔大学博士生的伊恩•古德费勒(Ian Goodfellow)发明了GAN,这项技术使得计算机能够利用两个独立的神经网络生成真实的数据。GAN并不是第一个用于生成数据的计算机程序,但其出色的效果和多功能性使得它脱颖而出。GAN已经取得了惊人的成果,而这些成果长期以来被认为是几乎不可能通过人工系统实现的,比如,生成栩栩如生的伪图像,将涂鸦手绘变成照片风格的图像,或者将视频片段中奔跑的骏马变成黑白相间的斑马——利用GAN,这些都不需要大量精心标注的训练数据即可实现。

由于GAN的出现,机器数据生成技术取得了长足的进步,图1.1所示的人脸合成就是一个很好的例子。就在GAN被发明出来的2014年,机器生成的最好效果只是一张模糊的脸——这在当时已被认为是突破性的成就了。仅仅3年后的2017年,GAN技术的进步就让计算机能够生成以假乱真的高分辨率人脸了!在本书中,我们将深入探究让这一切成为可能的算法——GAN。

学习生成对抗网络?从这里开始吧

 

(来源:The Malicious Use of Artificial Intelligence: Forecasting, Prevention, and Mitigation, by Miles Brundage et al., 2018.)
图1.1 人脸生成的进展

什么是GAN

GAN是一类由两个同时训练的模型组成的机器学习技术:一个是生成器,训练其生成伪数据;另一个是鉴别器,训练其从真实数据中识别伪数据。

生成(generative)一词预示着模型的总目标——生成新数据。GAN通过学习生成的数据取决于所选择的训练集,例如,如果我们想用GAN合成一幅看起来像达•芬奇作品的画作,就得用达•芬奇的作品作为训练集。

对抗(adversarial)一词则是指构成GAN框架的两个动态博弈、竞争的模型:生成器和鉴别器。生成器的目标是生成与训练集中的真实数据无法区分的伪数据——在刚才的示例中,这就意味着能够创作出和达•芬奇画作一样的绘画作品。鉴别器的目标是能辨别出哪些是来自训练集的真实数据,哪些是来自生成器的伪数据。也就是说,鉴别器充当着艺术品鉴定专家的角色,评估被认为是达•芬奇画作的作品的真实性。这两个网络不断地“斗智斗勇”,试图互相欺骗:生成器生成的伪数据越逼真,鉴别器辨别真伪的能力就要越强。

网络(network)一词表示最常用于生成器和鉴别器的一类机器学习模型:神经网络。依据GAN实现的复杂程度,这些网络包括从最简单的前馈神经网络(第3章)到卷积神经网络(第4章)以及更为复杂的变体(如第9章的U-Net)。

学习生成对抗网络从《GAN实战》这本书开始

学习生成对抗网络?从这里开始吧

 

本书旨在引导对生成对抗网络(GAN)有兴趣的人从头开始学习。本书从最简单的例子开始,介绍一些最具创新性的GAN的实现和技术细节,进而对这些研究进展做出直观的解释,并完整地呈现所涉及的一切内容(不包括最基本的数学和原理),让最前沿的研究变得触手可及。

本书的最终目标是提供必要的知识和工具,让你不仅能全面了解对GAN迄今为止取得的成就,还能有能力*选择开发新的应用。生成对抗这一模式充满潜力,等着像你这样怀有进取心、想在学术研究和实际应用中做出点成就的人去挖掘!欢迎你加入我们的GAN之旅。

读完《GAN实战》的内容概要,你就会知道这本书都写了哪些内容

本书分为三部分

第一部分 生成对抗网络(GAN)与生成模型导论

第一部分将带你步入生成对抗网络(Generative Adversarial Network,GAN)的世界,欣赏几种最为典型的GAN变体的实现。

第1章介绍GAN的基础知识,让你在此基础上对GAN的工作原理有一个直观的认识。

第2章介绍自编码器的相关内容,让你更全面地了解生成模型。自编码器是GAN在理论和实践上最为重要的前身,且至今仍在广泛使用。

你可能想知道为什么选择在书中插入这一章。主要原因有以下3个。

(1)生成模型对大多数人来说是一个全新的领域。大多数人一开始接触到的往往都是机器学习中的分类任务——也许因为它们更为直观;而生成模型试图生成看起来很逼真的新样本,所以人们对它了解甚少。考虑到自编码器(最接近GAN的前身)丰富的资源和研究,本书决定在探讨GAN之前增加一章,在一个更简单的环境介绍生成模型。如果你想直奔令人兴奋的新话题,请略过这部分内容。

(2)生成模型非常具有挑战性。由于生成模型代表性不足,大多数人不知道典型的生成模型的结构是什么样子的,也不知道面临何种挑战。尽管自编码器在许多方面与最常用的模型相近(例如,有一个明确的目标函数),但它们仍然展现出许多GAN也面临的挑战,如评估生成样本质量有多困难。我们将在第5章更深入地讨论这一问题。

(3)生成模型是当前文献中的研究热点。正如我们将在本章中讨论的,自编码器本身有它自己的用途。自编码器也是一个活跃的研究领域,甚至在某些领域是最前沿的并且被许多GAN模型显式地采用。其他GAN架构也隐式地受其启发或者模型包含自编码器这种思维——比如我们将在第9章中介绍的CycleGAN。

第3章将深入探讨GAN和对抗性学习背后的理论,在此基础上引导你搭建并训练第一个功能完整的GAN。

本章将探讨GAN背后的基础理论,然后介绍一些如果深入研究这个领域可能会遇到的常用数学表示。这些描述要么是你在更侧重于理论的出版物中看到的,要么是在关于这个主题的许多学术论文中看到的。本章也为后续章节提供了背景知识,特别是第5章。

但从严格的实用角度来看,你不必为这些形式担心,就像不需要知道发动机如何运转就可以驾车一样。用如Keras和TensorFlow这样的机器学习库提取出基础数学知识,并巧妙地把它们打包成可导入的代码行。

这将是本书中反复出现的主题,在机器学习和深度学习中也是如此。如果你愿意直接进入实践部分,也可以粗略浏览理论部分并跳到代码教程部分。

第4章介绍DCGAN的相关内容。DCGAN在初始GAN的基础上,创新性地使用卷积神经网络,以提高生成图像的质量。

我们在第3章实现了一个GAN,其生成器和鉴别器是具有单个隐藏层的简单前馈神经网络。尽管很简单,但GAN的生成器充分训练后得到的手写数字图像的真实性有些还是很具说服力的。即使是那些无法被识别为人类手写数字的字符,也具有许多手写符号的特征,例如可辨认的线条边缘和形状,特别是与用作生成器原始输入的随机噪声相比,更是如此。

想象一下,如果使用更强大的网络架构可以实现什么?本章中的生成器和鉴别器都将使用卷积神经网络(CNN,或ConvNet),而不再是简单的双层前馈网络。这种GAN架构称为深度卷积生成对抗网络(Deep Convolutional GAN,DCGAN)。

在深入探讨DCGAN实现的细节之前,我们先在本章介绍ConvNet的关键概念,回顾开发DCGAN背后的历史,并介绍使DCGAN这样复杂的架构在实践中变为可行的关键性突破之一:批归一化(batch normalization)。

第二部分 GAN的前沿主题

第二部分探讨了GAN中的一些前沿主题。以第一部分的基本概念为基础,这部分旨在加深对GAN的理论解释,并扩展实现GAN的实用工具包。

第5章涉及训练GAN的诸多理论,并介绍了实践上的障碍以及克服这些障碍的方法。

像“如何训练你的DRAGAN”这样的论文既证明了机器学习研究人员的恶搞能力越来越强,也体现了很好地训练生成对抗网络是非常困难的。专注于改进GAN 训练的arXiv论文多达几十篇,并且在*学术会议上(包括NIPS[1],著名的机器学习会议之一),针对GAN训练的各个方面举办了无数场研讨会。

但是,GAN的训练是一个不断发展的挑战,因此许多资源(包括论文和会议发表的)现已需要进行一定程度的更新。本章提供了最全面、最新的训练技术概述,其中有很多涉及数学理论的内容,但是没有超出必要要求。

作为本书第二部分的第1章,本章内容相当丰富。建议你尝试一些带有多个参数的模型后再回到本章,那样不仅对GAN每个部分的功能有了深刻的理解,还切身体验了训练它们所面临的挑战。

本章不但教读者如何去训练,而且提供了至少在未来几年内都有用的参考。这里总结了人们的经验、博客文章以及相关论文中的训练技巧和窍门。(如果你以后不会选择学术道路,现在可以拿出涂鸦笔在脚注上乱涂乱画了。)我们将本章视为一个短暂的学术中场休息,它将清晰地描绘出现在和未来GAN所有令人惊叹的发展。

我们希望以一些基本工具武装你的头脑,以帮助你理解今后可能出现的新论文。在许多书中,训练技巧会以利弊清单的形式出现,这样并不能使你有全面而高层次的理解。由于GAN是一个新兴领域,学术文献尚未就某些方面给出结论,就更不可能有简单的技巧清单。GAN领域的发展如此之快,我们更希望授人以渔而不是授人以鱼——授予你找到正确方法的能力,而不是简单提供很快就过时的信息。

解释完本章目的后,你需要再次明确GAN所处的位置。图5.1在第2章的图上进行了扩展并展示了模型的分类,让你可以了解到有哪些其他生成技术以及它们之间的不同与相似之处。

学习生成对抗网络?从这里开始吧

 

(来源:Generative Adversarial Network (GAN), by Ian Goodfellow, NIPS 2016 tutorial.)
图5.1 GAN应置于何处

图5.1有如下两个关键要点。

(1)所有这些生成模型最终都源自最大似然(maximum likelihood),至少隐式地是这样。 (2)第2章介绍的变分自编码器位于树的显式部分。还记得有一个明确的损失函数(重建损失)吗?有了GAN就没有这个函数了,不过现在有两个相互竞争的损失函数,稍后我们将更深入地讨论。但这样系统就没有了单一的解析解。

如果你了解一些图中其他技术,那就太好了。图中展示的关键在于训练正在从显式和易驾驭的方法转向隐式的方法。如果没有显式的损失函数(尽管在3.2.1节中含蓄地提到了两种不同的损失),如何去评估GAN呢?如果正在进行并行的大规模的实验,那又该怎么办呢?

为了消除可能的混乱,我们在此说明图5.1中的技术并非都来自深度学习,当然你也不需要了解除VAE和GAN之外的技术。

第6章介绍一种开创性的训练方法——渐进式增长GAN(Progressive GAN),它使GAN以前所未有的分辨率合成高质量图像。

在本章中,我们提供了一个实践教程,使用TensorFlow和TensorFlow Hub(TFHub)构建渐进式增长生成对抗网络(Progressive GAN,PGGAN或ProGAN)——一种能够生成全高清的具有照片级真实感图像的前沿技术。这项技术在*机器学习会议ICLR 2018上提出时引起了轰动,以至于谷歌立即将其整合为TensorFlow Hub中的几个模型之一。这项技术被深度学习的鼻祖之一Yoshua Bengio称赞为“好得令人难以置信”,在其发布后,立即成为学术报告和实验项目的最爱。

建议使用TensorFlow 1.7或更高版本来完成本章。本书使用的版本是1.8+。

建议使用不高于0.4.0版本的TensorFlow Hub,以后的版本因与TensorFlow 1.x的兼容性问题无法导入。阅读本章后,你将能够实现PGGAN的所有关键改进。本章涉及4个创新点,它们分别为高分辨率层的渐进式增长和平滑、小批量标准偏差、均衡学习率和像素级特征归一化。

本章将给出如下两个主要例子。

(1)PGGAN的关键创新部分的代码,具体来说,就是平滑地增大高分辨率层以及前面列出的其他3个创新点。PGGAN其余部分的实现所需篇幅实在太长,无法在本书中展示。

(2)谷歌在TFHub上提供了一个预训练好的且易于下载的实现。TFHub是一个用于机器学习模型的新的集中式仓库,类似于Docker Hub或Conda以及PyPI。此复现能够进行潜在空间插值以控制生成样本的特征。这会简要涉及生成器潜在空间中的种子向量,以便获得想要的图片(第2章和第4章)。

这里使用TFHub而不是像其他章那样从头开始实现PGGAN,原因有如下3个。

(1)尤其是对于从业人员,我们希望确保你(至少从一章里)了解到可以加快工作流程的软件工程最佳实践。想尝试快速用GAN解决问题吗?使用TFHub上的其中一种实现即可。与最初编写本章时相比,TFHub现在有更多的实现,包括许多参考实现(如第12章中的BigGAN和第5章中的NS-GAN)。希望你能接触到易于使用的最先进的例子,因为这就是机器学习的发展方式——尽可能地使机器学习自动化,这样我们就可以专注于最重要的事情:产生影响。谷歌的Cloud AutoML和亚马逊的SageMaker是这种趋势的主要例子,甚至Facebook最近都推出了PyTorch Hub,所以两种主要机器学习框架现在都有一个仓库了。

(2)NVIDIA研究人员花了一到两个月的时间来运行最初的PGGAN。任何人想独自运行它都是不切实际的,特别是在进行实验或出现错误情况下。[1] TFHub也提供了一个完全可训练的PGGAN,因此,如果想利用做计算的日子来做其他事,你也可以从头训练!

(3)我们仍然想在这里展示PGGAN最重要的创新。但是要很好地解释这些内容(包括代码),即使是用Keras编写的,也无法将所有实现细节都放在一章中,因为太过庞大了。TFHub使我们可以跳过无关紧要的样板代码,而专注于实现重要的想法。

第7章介绍GAN在半监督学习(只用一小部分带标签样本训练分类器的方法)中的应用,这在实践中具有重要意义。

到现在为止,我们不仅了解了GAN定义和功能,还运行了两个最典型的实现:原始GAN和奠定大多数高级GAN变体(包括第6章介绍的PGGAN)基础的DCGAN。

但和很多领域一样,当你认为开始真正掌握它的时候,你会发现这个领域比最初想象的要大得多,也复杂得多,看似很透彻的理解也不过是冰山一角。

GAN也不例外,自发明以来,它一直是一个活跃的研究领域,每年都有无数的变化。被很贴切地命名为“The GAN Zoo”的非官方列表,试图囊括所有已有命名的GAN变体(每种GAN实现有不同的名称,由创造它们的研究人员命名)——在编写本书时已经增至300余个。原始GAN论文被引用了9000余次(截至2019年7月),成为近年来深度学习领域被引用最多的研究论文之一,由此可以推测研究人员发明的GAN变体的真实数量可能远远不止于此[1],如图7.1所示。

学习生成对抗网络?从这里开始吧

 

(来源: The GAN Zoo, Avinash Hindupur, 2017.)
图7.1 此图大致描述了从2014年GAN的发明到2018年的前几个月,研究人员发布的GAN数目的逐月累积统计。生成对抗学习领域自诞生以来呈指数级增长,而且这种兴趣和流行的增长简直看不到尽头

值得注意的是,并非GAN变体都与原始GAN截然不同。它们中的许多与原始GAN模型在很大程度上非常相似(如第4章中的DCGAN),甚至许多复杂的创新,如Wasserstein GAN(第5章),也主要关注于如何提高原始GAN模型或其类似模型的性能和稳定性。

本章和接下来的两章将重点讨论与原始GAN模型非常不同的GAN变体模型——不同之处不仅表现在模型实现的架构和基础数学描述上,还表现在动机和目标上。特别要说明的是,我们将介绍3种GAN模型:SGAN(本章)、CGAN(第8章)和CycleGAN(第9章)。

通过本章给出的概念和具体示例,你会了解到每一个GAN变体的目标、动机、模型架构以及它们的网络如何训练和工作。这些主题将通过概念和具体例子进行介绍。我们将提供教程,提供这些模型的完整工作实现,以便你可以亲自上手体验。

第8章介绍条件GAN(conditional GAN),这是一种在训练生成器和鉴别器时,使用标签(或其他条件信息)来引导生成目标数据的技术。

我们在第7章介绍了SGAN,由此引入了在GAN训练中使用标签的想法。GAN使用标签将鉴别器训练为功能强大的半监督分类器。本章将介绍条件生成对抗网络(Conditional GAN,CGAN)——它使用标签来训练生成器鉴别器。正是由于这项创新,CGAN才能够引导生成器合成我们想要的伪样本。

第9章探讨CycleGAN,这是一种用于图像到图像转换的通用技术,可以将一个图像(如苹果)转换为另一个图像(如橙子)。

这是一项具有普遍吸引力的技术突破,似乎谁都喜欢把苹果变作橙子,我们在本章中将学会如何实现它!但这不是一件容易的事,所以需要至少两个鉴别器和两个生成器来实现。这显然使架构变得复杂了,因此本章不得不花更多的时间去讨论,但至少这是一个开始以面向对象的编程(OOP)方式思考的好时机。

第三部分 何去何从

第三部分探讨了一些实际应用案例,并探索了一些可以应用第一、二部分中关于GAN及其实现相关知识的领域。

第10章讨论对抗样本(通过故意欺骗来使分类器犯错误),这是一个具有重要实践和理论意义的领域。

在学习本书的过程中,读者已经把GAN理解为一个直观的概念。但是在2014年,对于那些不熟悉对抗样本这个新兴领域的人,GAN以及Ian Goodfellow和其他人在该领域的工作[1],似乎可以看作一次信仰上的飞跃。本章将深入探讨对抗样本,尤其是那些使用其他分类算法会灾难性地失败的特殊构造的样本。

本章还讨论了对抗样本与GAN的联系,以及对抗学习为何和如何成为机器学习中仍未能解决的难题——现有方法的一个重要但很少被讨论的缺陷。即使对抗样本在机器学习的鲁棒性、公平性和(网络)安全性中起着重要作用,这也是毋庸置疑的事实。

在过去5年中,机器学习的确在赶上和超越人类表现的能力上取得了长足进步,例如在计算机视觉分类任务以及游戏上。[2] 但是,仅看指标和ROC曲线[3]不足以了解神经网络做出的决定的依据(如何起作用的)以及容易犯哪些错误。本章将略微提及前者,然后深入研究后者。尽管本章几乎只涉及计算机视觉领域的问题,但是在诸如文本处理以及其他领域中也可以找到对抗样本。

当谈论神经网络的性能时,我们经常看到它们在大型ImageNet数据集上的错误率低于人类。这种经常被引用的统计数据(最开始是学术上的玩笑)掩盖了隐藏在该平均值背后的性能差异。人类的错误率通常是由于他们无法辨认在此数据集中的不同品种的狗,机器学习的犯错的原因则更为不详。经过进一步研究,对抗样本就产生了。

与人类不同,CV(计算机视觉)算法会纠结于性质非常不同的问题,这个问题可能更倾向于是训练数据导致的。因为算法必须为任何可能出现的图像做出预测,所以即使有很多训练数据,它也必须为完全不同于已经在训练数据中见过的个别样本进行推断。

当训练了如Inception V3和VGG-19之类的网络后,我们发现了一种效果惊人的图像分类方法,它在与训练数据接近的细流形(thin manifold)上有很好的效果。但是人们试图在这些算法的分类能力找漏洞时,发现了一个巨大缺陷——当前的机器学习算法很容易被很微小的失真所愚弄。迄今为止,几乎所有成功的主流机器学习算法在一定程度上受到该缺陷的影响,于是有人开始质疑机器学习究竟能不能起作用。

第11章探讨GAN在医学和时尚领域中的实际应用,其实现用到了本书中介绍的GAN变体。

除了生成手写数字和把苹果变橙子这些吸引人的应用,GAN还可以用于更多领域。本章将探索一些实际应用。毫无疑问,本章重点讨论现实中已经使用过GAN的领域,因为本书主要目标之一是提供必要的知识和工具,不仅希望让读者了解迄今为止GAN在各个领域所取得的成就,更希望帮读者找到自己感兴趣的新应用场景。要开始这段旅程,没有比看看几个成功的例子是更好的起点了。

读者已经看到了几个创新用例——Progressive GAN不仅能创造出逼真的人脸图像,还能创造出更具实用价值的数据样本(如乳腺X线图像),CycleGAN通过将视频游戏中的片段转换成电影般的场景来创建逼真的模拟虚拟环境,然后将其用于自动驾驶汽车的训练。

我们在本章详细回顾了GAN的已有应用,并将探讨促成这些应用的动机,是什么使它们恰恰从GAN所带来的进步中受益,以及它们是如何实现的。

具体来说,我们将着眼于GAN在医学和时尚领域的应用。选择这两个领域的原因如下。

(1)它们不仅展示了GAN的学术价值,更展示了其商业价值,体现了GAN的研究者如何利用学术进展解决现实世界的问题。

(2)它们使用了可以通过本书中涉及的工具和技术来理解的GAN模型。我们不会引入新的概念,而是着重介绍如何将前面已经实现的模型用于MNIST以外的应用。

(3)它们是不需要专业知识即可理解的,例如GAN在化学和物理领域的应用对于没有相关专业背景的人来说,是很难完全明白的。

此外,所选场景和示例说明了GAN的通用性。医学领域展示了GAN如何在数据有限的情况下发挥作用,时尚领域展示了另一个极端——在有大量数据集可用的场景中探索GAN的应用。即使读者对医学或时尚不感兴趣,你在本章中了解到的工具和方法也适用于无数其他场景。

遗憾的是,由于训练数据往往是专有的或难以获得的,将要回顾的实际应用几乎无法在代码教程中再现,本书只能提供GAN模型及选择此模型原因的详细说明,而无法像其他章节那样提供完整的代码。到本章结束时,你应该完全有能力实现本章中的任何应用——只需对我们在前面实现的GAN模型进行小小的修改,并提供给定例子或类似的数据集即可。好了,让我们开始吧!

第12章概述GAN及其应用的道德伦理考量,还提到了一些新兴的GAN技术,以供想继续探索本书以外知识的读者参考。

在最后一章,我们想简单阐述一下对GAN伦理问题的看法,还会讨论一些有可能在未来变得更重要的创新。我们会谈到期望能够定义GAN未来发展的一些最新思路,但不会给出代码。我们希望你已准备好迎接即将到来的GAN之旅——即使是撰写本书时尚未发表的进展。最后,请允许我们总结全书并做个依依不舍的道别吧!

上一篇:社保系统也没躲过******,恶意软件开始篡改个人电脑数据


下一篇:岂止能给黑白老照片上色,你甚至可以用这个开源项目致富