前 言

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

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

本书适合已经有一些机器学习和神经网络相关经验的读者阅读。下面列出了理想情况下读者应该提前知悉的内容。尽管本书尽力让内容显得通俗易懂,但你至少应该对下面70%的知识有信心。

能够运行书中的Python程序,不需要精通Python,但至少应该有两年的Python工作经验(最好有全职的数据科学家或软件工程师工作背景)。

了解面向对象的编程、如何使用对象以及如何找出它们的属性和方法;理解典型的Python对象(如Pandas DataFrame)和非典型对象(如Keras层)。

了解机器学习理论的基础知识,如训练集和测试集的分割、过拟合、权重和超参数,以及监督学习、无监督学习和强化学习。熟悉准确率和均方误差等指标。

了解基本的统计学和微积分的知识,如概率、密度函数、概率分布、微分和简单的优化。

了解基本的线性代数知识,如矩阵、高维空间,还应该了解主成分分析的概念。

了解深度学习的基础知识,如前馈网络、权重和偏置、激活函数、正则化、随机梯度下降和反向传播。

需要基本熟悉或自学基于Python 的机器学习库——Keras。

以上要求不是危言耸听,而是为了确保你能充分利用本书所讲的内容。当然,不管怎样,你都可以学习,但是之前了解的内容越少,需要你在线检索学习的内容就越多。如果你感觉上面的要求不足为惧,那就开始学习吧!

本书有许多包含源代码的示例,放在有编号的列表中或者内嵌在普通文本中。这两种情况下源代码的格式都是以等宽字体样式显示的。有时也用加粗样式突出显示代码,表示与先前所示代码不同(有所更改),例如向现有代码行中添加新功能。

本书对大部分源代码做了格式化,以适应本书页面的排版。此外,若正文中有对代码的解释说明,则通常会删除源代码中的注释。为了突出重要概念,清单都给出了注释。本书示例的代码可以从异步社区本书详情页的“配套资源”处下载。

本书使用数据科学教育的标准用具——Jupyter Notebook,所以你应先掌握这个工具的用法。这对于中级Python学习者来说应该不难。访问GPU或者使其所有功能正常运行有时候会遇到困难,特别是在Windows系统,所以有些章节提供了谷歌Colaboratory(缩写为Colab)Notebook。这是谷歌的免费平台,并预先封装了必要的数据科学工具以及有限时长内免费的GPU。你可以直接在浏览器中运行这些代码,也可以将其他章节的代码上传到Colab——它们是兼容的。

GAN是一个拥有良好(尽管是零散的)资源的活跃领域。有学术倾向的人可以在arXiv官方网站找到相关的最新论文。arXiv是康奈尔大学拥有和运营的学术论文电子预印本在线存储库。

本书作者都是 Medium 写作平台的活跃撰稿人(特别是以技术为核心的出版物 Towards Data ScienceHacker Noon),你可以在那里找到他们写的最新内容。

本书力求在理论和实践之间取得平衡。全书分为如下三部分。

第一部分生成对抗网络(GAN)与生成模型导论 这部分介绍生成学习和GAN的基本概念,并实现几种GAN最典型的变体。

第1章介绍了生成对抗网络(GAN),并在高层面上对其工作原理进行阐述。通过学习本章内容,你会了解到GAN是由两个独立的神经网络(生成器和鉴别器)组成的——它们通过动态竞争进行训练。掌握本章的知识可为理解本书其余部分的内容奠定基础。

第2章讨论了自编码器,它在许多方面被视为GAN的前身。鉴于生成学习的新颖性,增加这一章内容有助于将GAN置于更广阔的背景下。本章给出了第一个代码教程,用于构建一个自编码器来生成手写数字——我们在后面几章的GAN教程中也会探索相同的任务。如果你已经熟悉自编码器的相关内容或想直接研究GAN,可以跳过这一章。

第3章深入研究了GAN和对抗性学习背后的理论。本章解释了GAN和传统神经网络的主要区别,即讨论了它们的代价函数和训练过程上的差异。在本章结尾的代码教程中,我们将应用所学知识在Keras中实现GAN,并训练它生成手写数字。

第4章介绍了卷积神经网络和批归一化。本章实现了一种先进的GAN结构,它使用卷积网络作为其生成器和鉴别器,并利用批归一化处理来稳定训练过程。

第二部分 GAN的前沿主题

在第一部分的基础上,这部分深入研究了GAN的基础理论,并实现了一系列高级的GAN架构。

第5章讨论了许多训练GAN的理论和实践障碍以及克服这些障碍的方法。本章根据相关的学术论文和演讲全面概述了训练GAN的首选做法,还涵盖了用于评估GAN性能的选项以及需要担心这个问题的原因。

第6章探索了渐进式增长生成对抗网络(PGGAN),一种生成器和鉴别器的前沿训练方法。PGGAN通过在训练过程中添加新的层获得了非常好的图像质量和分辨率。本章给出了真实的代码示例,并使用TensorFlow Hub(TFHub)从理论上和实践上来解释它的作用原理。

第7章继续探索基于核心GAN模型的创新。你会了解到通过半监督学习仅使用一小部分带标签的训练样本就可提高分类准确率的巨大实际意义。使用本章实现了半监督生成对抗网络(SGAN),并解释了它是如何使用标签将鉴别器转换成一个健壮的多类分类器的。

第8章展示了另一种在训练中使用标签的GAN架构。通过在训练生成器和鉴别器时使用标签或者其他条件信息,条件生成对抗网络(CGAN)解决了生成器的主要缺点之一——无法明确指定要合成的样本。本章最后实现了一个CGAN,用于直接查看目标数据的生成。

第 9 章讨论了最有趣的 GAN 架构之一:循环一致性生成对抗网络(CycleGAN)。此技术可以将一幅图像转换成另一幅图像,例如将马的图像转换成斑马的图像。本章介绍了CycleGAN的架构并解释其主要组成和创新点,并在教程中用CycleGAN把苹果转换成了橙子(也可以将橙子转换成苹果)。

第三部分 何去何从

这一部分讨论了如何应用GAN和对抗学习以及在何处应用它们。

第10章介绍了对抗样本。对抗样本是一种故意欺骗机器学习模型使其犯错的技术。本章从理论和实际层面讨论了它们的重要性,并探讨了它们和GAN的关系。

第11章介绍了GAN的实际应用,探索了如何将前几章介绍的技术用于医学和时尚领域的实际用例:在医学领域,如何使用GAN来扩充小数据集以提高分类准确率;在时尚领域,GAN是如何推动个性化定制发展的。

第12章总结了迄今为止GAN的主要收获,讨论了GAN的相关道德伦理考量,并介绍了一些新兴的GAN技术。