第3章 生成对抗网络:生成形状和数字

本章内容

在GAN中从零开始构建生成器网络和判别器网络

使用GAN生成能形成形状(如指数增长曲线)的数据点

用5的倍数生成整数序列

训练、保存、加载和使用GAN

评估GAN的性能并决定何时停止训练

本书所涉及的生成模型,有近一半属于生成对抗网络(GAN)。这种方法由伊恩·古德费洛(Ian Goodfellow)等人于2014年首次提出。[1]


[1] GOODFELLOW I. J, POUGET-ABADIE J, MIRZA M, et al. Generative adversarial nets[C]//Proceedings of the 27th International Conference on Neural Information Processing Systems, MIT Press, 2014:2672-2680.

GAN因易于实现和具有通用性等特点而备受赞誉,即使对深度学习仅有粗浅了解的人也能借此从零开始构建自己的模型。GAN这个名字中的“对抗”一词指的是两个神经网络在零和博弈框架下相互竞争。生成网络试图创建与真实样本无异的数据实例;与之相对的,判别网络则试图从真实样本中识别出生成的样本。从几何形状和数字序列到高分辨率彩色图像,甚至接近指定音乐家风格的音乐作品,这种多用途模型可以生成各种格式的内容。

本章将简要介绍生成对抗网络背后的理论,随后将展示如何在PyTorch中实现这些理论知识。读者将学习从零开始构建GAN,这样所有的细节都会变得简单明了。为了让例子更贴近生活,可以想象把1美元存入一个年利率为8%的储蓄账户,然后根据投资年数计算账户余额。在这背后,真正的关系其实是指数增长曲线。我们将学习使用GAN生成数据样本,即形成这种指数增长曲线的一对值(x, y),其数学关系为y = 1.08x。掌握这项技能后,就可以生成能模仿任何形状的数据,如正弦曲线、余弦曲线、二次曲线等。

本章的第二个项目将使用GAN生成一串数字,并让这些数字都是5的倍数。但其实也可以将模式改为2、3、7……的倍数或其他模式。在此过程中,我们将从零开始创建生成器网络和判别器网络,还将训练、保存和使用GAN。此外,我们将通过对生成器网络生成的样本进行可视化呈现,或通过测量生成的样本分布与真实数据分布之间的差异来评估GAN的性能。

假设我们需要数据来训练一个机器学习(ML)模型,以预测(x, y)这对值之间的关系。然而,手工准备训练数据集既费钱又费时。在这种情况下,GAN就非常适合用于生成数据:虽然生成的xy值通常符合数学关系,但这些数据中也存在噪声。当生成的数据用于训练ML模型时,噪声可以有效防止过拟合。

本章的主要目标并不一定是生成最实用的新颖内容。相反,我是想告诉读者如何训练和使用GAN,从零开始创建各种格式的内容。在这个过程中,读者将深入理解GAN的内部运作原理。以此为基础,后续章节生成高分辨率图像或接近指定音乐家风格的音乐等其他内容时,读者就可以专注于GAN的其他更高级的地方(例如卷积神经网络,或如何将一段音乐表示为一个多维对象)。