1.3 Transformer

Transformer是一种深度神经网络,擅长处理序列到序列预测问题,例如接收输入的句子并预测最有可能出现的下一个单词。本节将介绍Transformer的关键创新:自注意力机制(self-attention mechanism)。随后将讨论Transformer的架构及不同类型的Transformer。最后,还将讨论Transformer的一些最新进展,如多模态模型(不仅可以输入文本,还可输入音频和图像等其他数据类型的Transformer)和预训练LLM(用大量文本数据训练的模型,可执行各种下游任务)。

在谷歌的一群研究员于2017年发明Transformer架构之前,[5]自然语言处理(natural language processing,NLP)和其他类型的序列到序列预测任务主要由循环神经网络(recurrent neural network,RNN)处理。然而RNN是按顺序处理输入的,这意味着模型每次只能按顺序处理一个输入,不能同时处理整个序列。事实上,RNN会沿着输入序列和输出序列的符号位置进行计算,因此无法并行训练,这使得训练速度非常缓慢。反过来,这也导致无法用庞大的数据集训练模型。此外,当循环模型处理序列时,模型会逐渐丢失序列中早期元素的信息,这些因素使得此类模型无法成功捕捉序列中的长程依赖关系。即使是长短期记忆(long short term memory,LSTM)网络这样的高级RNN变体可以处理更长程的依赖关系,在处理极长程的依赖关系时也存在不足。


[5] VASWANI A, SHAZEER N, PARMAR N, et al. Attention is all you need[C]//Advances in Neural Information Processing Systems, 2017: 5998-6008.

自注意力机制是Transformer的一项重大创新,这种机制擅长捕捉序列中的长程依赖关系。此外,由于输入数据在模型中不是按顺序处理的,因此Transformer可以并行训练,这大幅缩短了训练时间。更重要的是,并行训练使得用大量数据训练Transformer成为可能,从而让LLM(基于其处理和生成文本、理解上下文和执行各种语言任务的能力)变得智能和知识渊博。这一切引发了ChatGPT等LLM的兴起及当前的人工智能热潮。

1.3.1 注意力机制简介

注意力机制(attention mechanism)会根据一个元素与序列中所有元素(包括这个元素本身)的关系来分配权重。权重越高,两个元素间的关系就越密切。这些权重是在训练过程中从大量训练数据中学来的。因此,训练好的LLM(如ChatGPT)能够找出句子中任何两个词之间的关系,从而理解人类语言。

有人可能会问:注意力机制如何为序列中的元素分配分数,从而捕捉长程依赖关系?注意力权重的计算是通过将输入传递给3个神经网络层获得查询Q、键K和值V(见第9章)。使用查询、键和值来计算注意力的方法其实来自检索系统。例如,想在公共图书馆找一本书,可以先在图书馆的搜索引擎中输入一些内容,如“金融领域的机器学习”。此时,查询Q就是“金融领域的机器学习”,键K是书名和书籍描述等。图书馆的检索系统会根据查询和键之间的相似性为我们推荐图书列表(值V)。当然,书名或描述中包含“机器学习”“金融”,或同时包含这两个短语的书会排在最前面,而书名或描述中不包含这两个短语的书会排在列表的最后面,因为这些书的匹配分数较低。

在第9章和第10章中,我会进一步介绍有关注意力机制的更多细节。不仅如此,我们还将从零开始实现注意力机制,从而构建并训练一个能将英语翻译成法语的Transformer。

1.3.2 Transformer架构简介

Transformer最初是在设计机器语言翻译(如英译德或英译法)模型时提出的,其架构如图1.6所示,左侧部分为编码器,右侧部分为解码器。

图1.6 Transformer架构。Transformer的编码器“学习”输入序列的含义,并将其转换为表示该含义的抽象表示(向量),然后将这些向量传递给解码器。解码器根据序列中前一个单词和编码器输出的抽象表示(向量),每次预测一个单词,从而构建输出(如英语句子的法语译文)

Transformer中的编码器“学习”输入序列(如英语句子“How are you?”)的含义,并将其转换为表示该含义的抽象表示(向量),然后将这些向量传递给解码器。解码器根据序列中前一个单词和编码器输出的抽象表示(向量),每次预测一个单词,从而构建输出(如英语句子的法语译文)。在第9章和第10章中,我们将从零开始创建这样一个Transformer,并训练它将英语翻译成法语。

Transformer有3种类型: 仅编码器Transformer(encoder-only Transformer)、仅解码器Transformer(decoder-only Transformer)和编码器-解码器Transformer(encoder-decoder Transformer)。仅编码器Transformer没有解码器,能够将序列转换为抽象表示,随后用于各种下游任务,如情感分析、命名实体识别和文本生成。仅解码器Transformer只有解码器而没有编码器,非常适合文本生成、语言建模和创意写作。GPT-2(ChatGPT的前身)和ChatGPT都是仅解码器Transformer。在第11章中,我们将从零开始创建GPT-2,然后从Hugging Face(人工智能社区,围绕ML模型、数据集和应用提供托管和合作服务)中提取训练好的模型权重。我们将把权重加载到GPT-2模型中,然后开始生成文本。

编码器-解码器Transformer是复杂任务(如可以处理文生图任务或语音识别任务的多模态模型)所需要的。编码器-解码器Transformer结合了编码器和解码器的优点。编码器能有效处理和理解输入的数据,而解码器则擅长生成输出。这种组合使模型能高效地理解复杂的输入(如文本或语音),并生成复杂的输出(如图像或转录的文本)。

1.3.3 多模态Transformer和预训练LLM

生成式人工智能的最新发展催生了各种多模态模型(multimodal model)。对于这种模型,Transformer不仅可以使用文本,还可以使用音频和图像等其他类型的数据作为输入。文生图Transformer(text-to-image Transformer)就是这样一个例子。DALL·E 2、Imagen和Stable Diffusion都是文生图模型,由于它们能根据文本提示生成高分辨率图像,因此备受媒体关注。文生图Transformer采用了扩散模型(diffusion model)原理,即通过一系列转换来逐渐提高数据的复杂性。在讨论文生图Transformer之前,我们先了解扩散模型。

假设想使用基于扩散的模型生成高分辨率的花朵图像。首先,我们需要准备一组高质量的花朵图像训练集,然后,要求模型逐渐向花朵图像中添加噪声(所谓的扩散过程),直到花朵图像变成完全随机的噪声。最后,我们训练模型从充满噪声的图像中逐渐去除噪声,生成新的数据样本。扩散过程如图1.7所示。最左侧一列包含4张原始花朵图像。随着向右推进,在每一时间步中都会在图像中添加一些噪声,直到最右侧一列的4张图像变成纯随机噪声。

图1.7 扩散模型会在图像中添加越来越多的噪声,并学习重建图像。最左侧一列包含4张原始花朵图像。随着向右推进,在每一时间步中都会在图像中添加一些噪声,直到最右侧一列的4张图像变成纯随机噪声。然后,利用这些图像训练一个基于扩散的模型,从充满噪声的图像中逐渐去除噪声,生成新的数据样本

有人可能会好奇:文生图Transformer与扩散模型有什么关系?文生图Transformer可将文本提示作为输入,生成与文本描述相符的图像。文本提示是一种条件,而模型会使用一系列神经网络层将文本描述转换为图像。与扩散模型一样,文生图Transformer也采用了多层分级架构,每一层都会逐步增加所生成图像的细节。在扩散模型和文生图Transformer中,对输出结果进行迭代改进的核心概念是相似的,我将在第15章中解释。

扩散模型能提供稳定的训练并生成高质量图像,因此越来越受欢迎,其性能也优于GAN和变分自编码器(variational autoencoder,VAE)等其他生成模型。第15章将使用Oxford Flower数据集训练一个简单的扩散模型,还将介绍多模态Transformer背后的基本思想,并编写一个Python程序,借此让OpenAI的DALL·E 2通过文本提示生成图像。例如,当输入“an astronaut in a space suit riding a unicorn”(穿着宇航服的宇航员骑乘独角兽)作为提示词时,DALL·E 2将生成如图1.8所示的图像。

图1.8 使用“an astronaut in a space suit riding a unicorn”作为提示词用DALL·E 2生成的图像

在第16章中,我将介绍如何访问预训练LLM(如ChatGPT、GPT4和DALL·E 2)。这些模型是在大量文本数据上训练出来的,它们从数据中学到了一般知识,可以执行各种下游任务(如文本生成、情感分析、问题解答和命名实体识别)。由于预训练LLM往往是根据几个月前的信息训练的,因此无法提供最近一两个月新出现的事件的相关信息,更不用说天气状况、航班状态或股票价格等实时信息了。我们将使用LangChain库(一个用于使用LLM构建应用的Python库,提供提示词管理、LLM链接和输出解析等工具)将LLM与Wolfram Alpha和Wikipedia API链接,从而创建一个“全能”的个人助理。