1.1 生成式人工智能和PyTorch简介

本节将介绍生成式人工智能的定义,以及它与判别模型(discriminative model)等非生成式人工智能模型的区别。生成式人工智能是一类技术,具备生成各种新内容的能力,例如生成文本、图像、音频、视频、源代码和其他复杂模式的内容。生成式人工智能可以创造出包含新颖和创新内容的全新世界,ChatGPT就是一个很好的例子。相比之下,判别模型更侧重于已有内容的识别和分类。

1.1.1 生成式人工智能

生成式人工智能是一种通过从现有数据中学习数据所蕴含的模式,进而生成新的文本、图像、音乐等内容的人工智能技术。与生成模型不同,判别模型专门用于辨别不同数据实例之间的差异并学习不同类别之间的界限。图1.1对比了生成模型与判别模型之间的差异。例如,当面对一系列以狗和猫为主体的图像时,判别模型通过捕捉几个能够区分猫和狗的关键特征(如猫有小鼻子和尖耳朵)来确定每张图像描绘的到底是狗还是猫。如图1.1上半部分所示,判别模型将数据作为输入,得出不同标签的概率——这些标签的概率可以用Prob(dog)和Prob(cat)来表示,随后即可根据最高的预测概率对输入进行标注。

相比之下,生成模型具有生成新数据实例的独特能力。在我们的猫和狗的例子中,生成模型深入理解这些图像的定义特征,从而合成代表猫或狗的新图像。如图1.1下半部分所示,生成模型以任务描述(例如潜空间中不同的值,这些值会导致所生成的图像包含不同的特征,相关内容参见第46章)作为输入,生成了全新的猫和狗的图像。

从统计学角度来看,当数据示例具备描述输入的特征X和多种相应的标签Y时,判别模型就会承担预测条件概率的任务,具体来说就是计算概率Prob(Y | X)。与此相反,生成模型则踏上了一条不同的路,生成模型会试图学习输入特征X和目标变量Y的联合概率分布,即Prob(X,Y)。凭借这些知识,生成模型从分布中采样,从而生成X的新实例。

图1.1 生成模型与判别模型的对比。判别模型将数据作为输入,得出不同标签的概率,用Prob(dog)和Prob(cat)表示。相比之下,生成模型深入理解这些图像的定义特征,从而合成代表猫或狗的新图像

生成模型有很多不同的类型,不同类型的模型是为生成特定类型的内容量身定制的。本书主要关注生成对抗网络(generative adversarial network,GAN)和Transformer(尽管我们也会涵盖变分自编码器和扩散模型)。生成对抗网络中的“对抗”一词指的是两个神经网络在零和博弈框架下相互竞争:生成网络(generative network)试图创建与真实样本无异的数据实例,而判别网络(discriminative network)则试图从真实样本中识别出生成的样本。两个网络之间的竞争会促进两者的共同进步,最终使生成器能够创建出高度逼真的数据。Transformer则是一种深度神经网络,可以高效解决序列到序列(sequence-to-sequence)预测任务,本章后半部分会对其进行更详细的介绍。

GAN因易于实现和多功能性而闻名。即使对深度学习仅有初步了解的人,也能从零开始构建生成模型。这些多功能模型可以生成大量的创作内容,从几何形状和复杂图案(见第3章)到高质量的彩色图像(如人脸,见第4章)不一而足。此外,GAN还能转换图像内容,例如将金发的人脸图像无缝转换为黑发的人脸图像(见第6章)。不仅如此,GAN还将创作能力扩展到音乐领域,可以生成听起来非常接近指定音乐家风格的音乐作品(见第13章)。

与图形、数字或图像生成相比,文本生成面临着巨大挑战,这主要是因为文本信息有顺序,即各个字符或单词的顺序和排列都蕴含着重要意义。为应对这种复杂性,我们使用Transformer,这是一种能够熟练处理序列到序列预测任务的深度神经网络。与循环神经网络(recurrent neural network,RNN)或卷积神经网络(convolutional neural network,CNN)等“前辈”不同,Transformer更擅长在输入序列和输出序列中捕获固有的、错综复杂的长程依赖(long-range dependency)关系。另外,Transformer还有一个重要特点,它的并行训练能力(一种分布式训练方法,能在多个设备上同时训练同一个模型)可以大幅缩短训练耗时,使得我们可以用海量数据来训练Transformer。

Transformer革命性的架构同时也是ChatGPT、BERT、DALL·E和T5等大语言模型(large language model,LLM,即具有大量参数并在大型数据集上训练获得的深度神经网络)诞生的基础。ChatGPT和其他生成式预训练Transformer(generative pretrained Transformer,GPT)模型的推出引发了最近的人工智能的迅猛进步,Transformer这一变革性架构成为这种进步的基石。

在后续章节中,我将深入探讨这两项开创性技术的内部运作原理,包括它们的底层机制及其蕴含的无限潜力。

1.1.2 Python编程语言

本书假设读者已经对Python有一定的了解。要学习本书内容,读者需要了解Python的基础知识,如函数、类、列表、词典等。如果尚不了解,网上有很多免费资源可以帮助读者入门。按照附录A中的说明安装Python,然后为本书创建一个虚拟环境,并安装Jupyter Notebook作为本书项目的计算环境。

根据《经济学人》(The Economist)的报道,自2018年下半年以来,Python已成为全球最受欢迎的编程语言。[3]Python不仅免费供所有人使用,还允许其他用户创建和修改各种库。Python拥有一个由社区驱动的庞大生态系统,我们可以很容易地从其他Python爱好者那里找到自己需要的资源和帮助。此外,Python程序员喜欢分享他们的代码,因此我们无须重复“造轮子”,可以导入现成的库,也可以在Python社区分享自己的库。


[3] 参考Data Team在《经济学人》(The Economist)杂志上发表的文章“Python is becoming the world’s most popular coding language”(2018)。

无论我们使用的是Windows、macOS还是Linux系统,Python都能满足我们的需求。它是一种跨平台语言,尽管安装软件和库的过程可能会因操作系统的不同而略有差异。但读者也不用担心,我会在附录A中给出安装方法。一旦设置好环境,同一段Python代码在不同系统中的运行表现会完全相同。

Python是一种表达丰富的语言,适用于常规应用开发。它的语法简单易懂,人工智能爱好者可以轻松理解和使用。如果在使用本书提到的Python库时遇到任何问题,读者可以搜索Python论坛或访问Stack Overflow等网站寻求帮助。

最后,Python提供了大量库,可以(相对于C++或R语言)进一步简化生成模型的创建过程。本书将用PyTorch作为人工智能框架,接下来我将解释为什么选择它而非TensorFlow等竞争对手。

1.1.3 使用PyTorch作为人工智能框架

既然决定在本书中用Python作为编程语言,接下来还要为生成模型选择一个合适的人工智能框架。PyTorch和TensorFlow是基于Python的两个最流行的人工智能框架。本书将选择PyTorch而非TensorFlow,强烈建议读者都这样做,因为PyTorch更易用。

PyTorch是Meta的人工智能研究实验室开发的开源机器学习库。它基于Python编程语言和Torch库构建,旨在为创建和训练深度学习模型提供一个灵活、直观的平台。作为PyTorch的前身,Torch是一个用于在C语言中使用Lua封装器构建深度神经网络的机器学习库,但现已停止开发。打造PyTorch的目的是通过提供一种更易用、适应性更强的深度学习项目框架,满足研究人员和开发者的各类需求。

计算图(computational graph)是深度学习中的一个基本概念,它在高效计算复杂数学运算,尤其是涉及多维数组或张量(tensor)的运算中发挥着至关重要的作用。计算图是一种有向图(directed graph),其中的“节点”代表数学运算,“边”代表在这些运算之间流动的数据。计算图的一个主要用途是在实现反向传播和梯度下降算法时计算偏导数。利用图结构,我们可以在训练过程中高效计算更新模型参数所需的梯度。与TensorFlow等框架中的静态图不同,PyTorch能够在运行过程中创建并修改图,这是一种动态计算图。这使得PyTorch更适应不同的模型架构,并简化调试。此外,与TensorFlow一样,PyTorch可以通过GPU训练提供加速计算,与使用CPU训练相比,可以大幅缩短训练时间。

PyTorch的设计与Python契合度很高。它的语法简洁易懂,无论新手或是有经验的开发者都能轻松使用。研究人员和开发者都非常欣赏PyTorch的灵活性。PyTorch的动态计算图和简单易用的界面使我们能够快速尝试新想法。在快速发展的生成式人工智能领域,这种灵活性不可或缺。PyTorch还有一个快速成长的社区,社区成员积极为PyTorch的发展作出贡献。这就形成了一个由库、工具和资源组成的广泛的生态系统,供开发者使用。

PyTorch也很适合用于迁移学习(transfer learning),这是一种针对一般任务设计,并围绕特定任务进行微调的预训练模型技术。研究人员和从业者可以轻松利用预训练模型,从而节省时间和计算资源。在预训练LLM时代,这一特性尤为重要,它允许我们将LLM用于分类、文本摘要和文本生成等下游任务。

PyTorch也可以兼容NumPy、Matplotlib等Python库。这种互操作性使数据科学家和工程师能够将PyTorch无缝集成到自己现有的工作流程中,从而提高工作效率。PyTorch还以致力于社区驱动的开发而著称。它发展迅速,可根据实际使用情况与用户反馈定期更新和增强,因此始终处于人工智能研究和开发的最前沿。

附录A提供了在计算机上安装PyTorch的详细说明。按照说明在虚拟环境中安装PyTorch。如果读者所用的计算机未配备支持计算统一设备体系结构(compute unified device architecture,CUDA)的GPU,本书中的所有程序也兼容CPU训练。此外,本书的GitHub代码库中提供训练好的模型,以便读者直接使用。第2章将深入介绍PyTorch,首先介绍PyTorch中的数据结构张量,它用于保存数字和矩阵,并提供用于执行操作的函数。随后,我将介绍如何使用PyTorch执行端到端深度学习项目。具体来说,我们将在PyTorch中创建一个神经网络,并使用服装图像和相应的标签来训练网络。完成后,我们会用训练好的模型将服装分类为10种不同的标签。完成这个项目,可以为我们使用PyTorch构建和训练各种生成模型做好准备。