Transformer蓝图:Transformer 神经网络架构的综合指南——万字长文、20多个图片介绍大语言模型主流架构Transformer的发展历史、现状和未来结果
CMU的工程人工智能硕士学位的研究生Jean de Nyandwi近期发表了一篇博客,详细介绍了当前大语言模型主流架构Transformer的历史发展和当前现状。这篇博客非常长,超过了1万字,20多个图,涵盖了Transformer之前的架构和发展。此外,这篇长篇介绍里面的公式内容并不多,所以对于害怕数学的童鞋来说也是十分不错。本文是其翻译版本,欢迎大家仔细学习。
本文博客原文地址:https://deeprevision.github.io/posts/001-transformer/
介绍
2017年首次在开创性论文《Attention is All You Need》(Vaswani等人,2017)中提出的Transformers模型,已经成为深度学习和可以说是整个计算机科学的一项革命性贡献。起初是用于神经机器翻译的工具,它已经被证明具有深远的影响,将其适用性扩展到自然语言处理(NLP)以外的领域,并巩固了其作为多功能和通用的神经网络架构的地位。
在这份全面的指南中,我们将深入剖析Transformers模型,从其注意机制到其编码器-解码器结构,彻底探讨每个关键组成部分。不仅仅停留在基础层面,我们还将探索利用Transformers的力量的大型语言模型的领域,深入研究它们独特的设计属性和功能。进一步拓宽视野,我们将探讨Transformers模型在NLP之外的应用,探讨这一有影响力的架构当前面临的挑战和潜在的未来方向。此外,我们还提供了一份经过筛选的开源实现和补充资源列表,供那些想进一步探索的人使用。
没有花哨的废话,让我们开始吧!

Transformers之前的神经网络
Transformers神经架构的设计者们希望找到一种适用于序列到序列建模的架构。并不是没有现有的序列建模架构,只是它们存在许多缺点。还有哪些类型的神经网络可以用于序列建模?它们的缺点是什么?让我们在激发Transformers的过程中寻找这些问题的答案。
多层感知器(MLPs)
让我们从多层感知器(MLPs)开始,这是一种经典的神经网络方法之一。MLPs本身并不是非常强大,但你会发现它们几乎集成在任何其他架构中(令人惊讶的是,甚至在Transformers中也有)。MLPs基本上是一系列线性层或全连接层。

MLPs长期以来一直用于建模不同类型的数据,在AI社区找到各种模态的最佳架构之前就已经存在,但有一点是肯定的,它们不适用于序列建模。由于它们的前馈设计,它们无法保留序列中信息的顺序。当数据的顺序丢失时,序列数据失去了意义。因此,MLPs无法保留信息顺序的能力使它们不适合序列建模。此外,MLPs需要大量的参数,这是神经网络不应具备的不受欢迎的属性之一。
卷积神经网络(Convolutional Neural networks)
卷积神经网络(CNNs或ConvNets)是一类神经网络架构,以处理图像和其他模态(如文本和视频)而闻名。

迄今为止,ConvNets在小规模和大规模视觉识别方面取得了成功,但在序列建模方面并不太成功。它们易于并行化(对于GPU很好),由于其局部性(计算捆绑在输入数据的局部部分中),它们需要许多层来处理长期依赖性。与具有固定长度的图像不同,大多数序列数据具有可变长度,这是ConvNets或MLPs都无法处理的东西。
循环神经网络(Recurrent Neural Networks)
与MLPs或ConvNets不同,循环神经网络(RNNs)的设计考虑到了序列。RNNs的设计中包含反馈循环,这是它们模拟序列数据的能力的关键元素之一。RNNs的另一个可取之处是它们可以处理可变长度的数据。
RNNs的连接方式存在根本性问题。首先,由于它们的顺序设计,它们对于长期序列可能会不稳定。其次,它们无法并行化,这限制了它们在现代机器学习加速器(如GPU)上的可伸缩性。

循环网络有许多变体。其中一个著名的版本是长短时记忆(LSTMs)。LSTMs可以处理长期序列。它们有一个细胞状态(下图中的水平直线)和门,它们都平滑了信息的流动。

LSTMs的另一个略微高效的版本是门控循环单元(GRUs)。LSTMs在基本的序列建模问题上效果很好,但它们在某些方面仍然受限。正如我们之前所说,它们无法并行化,这意味着它们无法扩展。而且,即使它们可以保留信息的顺序,但它们无法推断出它们正在处理的数据的全局上下文。上下文很重要。以机器翻译为例(基本上给我们带来了Transformers),正在翻译的句子的上下文与顺序一样重要。
总的来说,我们一直在激发Transformers。到目前为止,我们已经看到以前的神经网络要么不适合序列建模,要么不可并行化,要么不稳定,要么在上下文长度方面受限,这些都是序列神经架构的主要理想特征。
既然我们有了正确的背景,让我们深入研究Transformers架构。
Transformers架构
Transformers是一种神经网络架构,可以处理文本、音频、视频和图像等序列数据(作为图像块的序列)。Transformers不使用任何循环或卷积层。它的基本层被称为注意力层。它还包含其他基本层,如全连接层、规范化层(主要是LayerNorm)(Ba,Kiros和Hinton,2016)、嵌入层和位置编码层。我们将在接下来的部分中看到这些层的各自功能。

正如我们一开始所提到的,Transformers最初是为机器翻译而引入的,这是一个需要处理两个序列的任务(输入和输出都是序列)。因此,Transformers模型分为两部分:编码器用于处理输入,解码器用于生成输出。关于编码器、解码器和其他层的更多信息将在下面讨论。
编码器(Encoder)
编码器是Transformers架构的主要模块之一,位于输入序列的输入处。编码器将输入序列转换为压缩表示。在原始Transformers架构中,编码器重复了6次(这取决于架构的总体大小,可以更改)。每个编码器块都有3个主要层,即多头注意力(MHA)、层归一化和MLPs(或根据论文中的说法,前馈)。
多头注意力和MLPs在Transformers论文中被称为子层。在子层之间,有层归一化、丢弃和残差连接(请参考图表以获取这些层的正确流程)。
先前已经说过,编码器层的数量为6。编码器层的数量越多,模型就越大,模型也越有可能捕捉输入序列的全局上下文,因此在任务泛化方面表现更好。
解码器(Decoder)
解码器与编码器几乎相同,除了额外的多头注意力,它在编码器的输出上操作。解码器的目标是将编码器输出与目标序列融合,并进行预测(或预测下一个令牌)。
在解码器中,接受目标序列的注意力被掩盖,以防止当前令牌(正在处理的令牌)关注目标序列中的后续令牌。如果解码器可以访问完整的目标序列,这基本上是作弊,可能导致模型无法在训练数据之外泛化。
解码器通常也会像编码器一样重复相同的次数。在原始的Transformers中,解码器块的数量也是6个块。
注意力(Attention)
什么是注意力?
注意力是Transformers架构的主要元素。本质上,注意力是一种机制,可以使神经网络更关注包含有意义信息的输入数据的部分,而对输入的其他部分关注较少。
在引入Transformers架构之前,注意力机制已经在各种任务中使用。注意力的概念首次出现在神经机器翻译(NMT)方法中,该方法使用注意力来找到输入句子中最相关信息集中的位置(Bahdanau,Cho和Bengio 2014)。因为他们基于注意力的NMT能够同时对齐和翻译,出人意料地表现得比以前的方法好。如下图所示,该网络能够找到翻译句子中单词的正确顺序,这是以前的神经机器翻译方法难以实现的成就。

上面的图像中发生了什么?你能发现什么吗?翻译后的句子中的单词顺序在目标语言中有意义的地方被颠倒了。因此,在翻译句子时,注意力可以使模型不仅能够正确翻译句子,还能根据目标语言的上下文正确翻译句子的顺序。简而言之,注意力可以在将一种语言翻译成另一种语言时识别并保留上下文。
另一个早期使用注意力的工作出现在神经图像字幕生成中(Xu等人,2015)。在这项工作中,作者使用卷积神经网络进行特征提取,并使用具有注意力机制的循环神经网络生成与输入图像最匹配的字幕。下图(摘自论文)显示了该模型大致关注的位置。

从全局角度看,在图像字幕模型中集成注意力机制可以帮助模型在生成字幕时关注输入图像的有意义部分。

上面我们使用的两个示例展示了注意力的有效性。注意力真的是一种神奇的机制,它使神经网络能够专注于包含有意义信息的输入数据部分,减少对输入数据的其他部分的关注。
现在我们了解了注意力,让我们看看Transformers架构中注意力函数的输入:查询(query)、键(keys)和值(values)。
注意力函数:查询、键、值(Query, Key, Value)
直观地说,注意力实际上是“关注输入数据中最重要的部分”。从技术上讲,注意力度量两个向量之间的相似性并返回加权相似性分数。标准的注意力函数接受三个主要输入,即查询(query)、键(key)和值(value)向量。在分解注意力函数之前,让我们尝试理解键、值和查询是什么意思。
查询、键和值是在搜索引擎和数据库系统中常用的术语。为了理解这些术语,让我们举一个简单的例子。假设您正在搜索基于ArXiv上的注意力的论文。查询理想情况下是您将放入搜索框中的内容。在内部,ArXiv可能会按一组预定义的键来组织论文。在ArXiv将所请求的论文返回给您之前,它将比较您的查询与这些预定义的键,然后返回与查询和键对应最佳的论文。值仅仅是数据库中的所有论文。作为免责声明,我们使用这个示例来理解搜索和数据库系统上的查询、键和值的含义,而不是尝试展示ArXiv系统的工作原理。

有了这种对查询、键和值在搜索和数据库系统上的直观理解,让我们转向注意力函数的数学表示。
Attention(Q,K,V)=Softmax(\frac{QK^T}{\sqrt{d_k}})V
从上面的函数中,Q、K、V分别是查询矩阵、键矩阵和值矩阵。我们计算查询和键的点积,并除以缩放因子\sqrt{d_k}。缩放因子用于避免大的QK^T值导致小的梯度。然后,我们将点积规范化为softmax(这基本上给我们加权求和),通过将其与值相乘,我们得到加权值。

上面描述的注意力类型称为缩放点积注意力,是修改过的点积注意力(Luong,Pham和Manning 2015)。还有其他类型的注意力,如加法注意力(Bahdanau,Cho和Bengio 2014)、基于内容的注意力(Graves,Wayne和Danihelka 2014)、基于位置的注意力(Bahdanau,Cho和Bengio 2014)和一般注意力(Luong,Pham和Manning 2015)。每种注意力类型都可以应用在全局(整个输入数据)或局部(输入数据的子部分)上,因此分别称为全局注意力和局部注意力。
您可能听说过Transformers可以进行并行化,您可能想知道这是从哪里来的。Transformers的并行化来自于注意力函数。只要查询、键和值都是矩阵,就可以执行注意力操作,只需进行两个主要的矩阵乘法,因此不涉及循环或任何递归操作。对于GPU来说,计算注意力是相对较快的。对于更大的模型(参数数量以十亿计)和大规模的训练数据(标记数量以十亿/万亿计),由于每个令牌都与其他令牌有关,注意力计算可能会很昂贵,因为它具有二次时间复杂度。
如果查询、键和值来自同一源,那么应用于它们的注意力称为自注意力。如果它们来自不同的源,我们称之为交叉注意力。
多头注意力(Multi-Head Attention)
上面描述的是单个注意力层。在实践中,通常不仅使用一个注意力层就能得到良好的结果。相反,人们倾向于并行计算多个注意力层,并将结果串联起来。简而言之,这就是多头注意力。多头注意力基本上是在线性投影的QKV向量上计算的多个独立的注意力。在下图的多头注意力中,串联的注意力值被线性投影到模型维度。

如Transformers架构的设计者所解释的,同时计算多个注意力允许模型“同时关注来自不同表示子空间的信息和不同位置的信息。”(Vaswani等人,2017)。关于多头注意力的一个令人惊讶的事情是,它不会增加总体计算成本,因为每个头的维度都是模型维度的一部分(即基本Transformers中的头数为8)。因此,如果模型的维度(论文中的
)为512,多头注意力中的头数为8,那么每个头的维度就是
。
多头注意力可以看作是ConvNets中的深度可分离卷积(Chollet 2017)。深度可分离卷积是一种特殊类型的卷积,它将输入张量分成多个通道,独立地对每个通道进行操作,将各个输出连接在一起,然后将结果馈送到点卷积(1x1卷积,等效于线性投影)。
多层感知器(MLPs)
多层感知器(MLP)是Transformers中编码器和解码器的两个子层中的一个。Transformers中的MLP由两个线性层组成,它们之间有ReLU激活,并且它们独立且相同地应用于每个位置。
嵌入和位置编码层(Embeddings and Positional Encoding Layers)
Transformers架构包含两个嵌入层:一个用于编码器以处理输入或源序列,另一个用于解码器以处理目标或输出序列。这些嵌入层将输入或输出令牌转换为固定大小的密集向量,本质上将序列中的每个令牌映射到特定的密集向量。利用嵌入是语言建模中的标准实践,因为它们提供语义深度。通过这些嵌入的令牌向量,具有相似语义含义的令牌往往会在相同的方向上对齐。
基本Transformers中嵌入的大小为512(这是整个模型的维度)。值得注意的是,Transformers架构在整个网络中保持相同的维度,对于基本模型,维度为512。这就是之前提到的
。
位置编码在Transformer模型的编码器和解码器的初始阶段作为整体组件起着重要作用。它们用于保留序列中令牌的顺序。人们可能会质疑这些位置编码的必要性。这源于注意力机制的固有置换不变性,其中修改令牌的顺序不会改变输出的加权值
。因此,注意力机制本身缺乏对令牌顺序的认识。由于Transformers架构不包含任何其他重复方法,因此引入位置编码以赋予模型对序列中的令牌位置的认识。本质上,没有位置编码,Transformer确实会表现出置换不变性。然而,在大多数NLP任务中,序列顺序都具有重要意义,这种设计将不足以胜任。
为了在序列中编码位置信息,Transformers的设计者使用了不同频率的正弦函数。他们还尝试了学习的位置嵌入,但结果并没有改变。
残差连接、层归一化和丢失(Residual Connections, Layer Normalization, and Dropout)
残差连接是神经网络设计的核心,它是现代深度学习中的一个流行要素之一。自从深度残差网络在计算机视觉中取得了显著的性能(He等人,2016)之后,残差连接已经在几乎所有神经网络中使用,不仅在视觉领域,还在其他模态中。事实上,现在几乎不可能看到一个神经网络模型不使用残差连接。残差连接减轻了不稳定的梯度问题,并帮助模型更快地收敛。
Transformers的一位作者Ashish Vaswani曾经说过:“残差连接将位置信息传递到更高层,以及其他信息。”看一下下面的图像!

层归一化(Ba,Kiros和Hinton 2016)也是现代神经网络中最常用的归一化技术之一。层归一化通过使用层均值和方差来规范化层的激活,显著减少了训练时间。与批量归一化(Ioffe和Szegedy 2015)不同,批量归一化会在小批量上计算均值和方差,层归一化只会使用每个激活的均值和方差进行规范化。层归一化在训练和测试阶段都保持类似的行为,而批量归一化在这两个阶段表现出不同的行为。
在Transformers架构中有两种放置层归一化的方式。第一种选择称为后层归一化(Post-LN),其中层归一化位于残差块之间(或在每个子层(多头注意力和MLP)之后,但在加法之后)。第二种选择称为前层归一化(Pre-LN),其中层归一化位于残差块内的每个子层之前。标准的Transformers架构使用Post-LN,但在训练原始Transformers的更新代码库中,发现了Pre-LN。论文和代码之间的这种不匹配使得很难追溯层归一化的实际位置在最初的Transformers中,但从提交历史来看,似乎后来使用了Pre-LN。作者可能没有更新论文,但他们可能并不在意,因为没有人知道这将成为神经网络设计中具有影响力和参考价值的论文之一。

因此,层归一化应该放在哪里并不是很清楚,这是一个活跃的研究问题。最近对Pre-LN和Post-LN的影响进行的研究(Xiong等人,2020)显示,将层归一化放在多头注意力和MLP(Pre-LN)之前可以改善训练并更快地收敛,优于将层归一化放在多头注意力和MLP之后。该研究还声称,使用Pre-LN,您不需要聪明地选择学习率调度器,因为Pre-LN具有更好的初始化。Pre-LN和Post-LN都不是完美的。最近的一项研究引入了ResDual(Xie等人,2023),通过引入具有层归一化的附加残差连接来缓解Pre-LN和Post-LN的问题。
在哪里放置层归一化仍然是一个问题,但这应该不再是一个问题。正如许多人已经指出的,Transformers似乎是一种通用架构。原始的香草Transformers(带有像LN之类的小修补)仍然是大多数语言建模、视觉识别和多模式学习等领域的新颖工作的背后,尽管有数百万的工作声称改进了Transformers。因此,我们应该努力保持这种架构的通用性。我们将在文章末尾更详细地介绍高效Transformers。
在我们结束这一部分之前,让我们谈谈Transformers架构中的丢失(Srivastava等人,2014)。层归一化可以作为一个副作用来充当正则化器,但您仍然需要其他形式的网络正则化来处理过拟合问题。丢失应用于每个子层的输出(在添加和规范化之前)。它还应用于编码器和解码器堆栈中嵌入和位置编码的总和。有关训练Transformers和其他训练细节中使用的其他正则化技术,请查看论文以获取更多信息。
线性和Softmax层
解码器后面的线性层将解码的激活投影到词汇表的大小。这个线性层基本上会产生逻辑值(logits)。Softmax层将这些逻辑值接受并将它们转换为下一个令牌的概率。下一个预测的令牌基本上是softmax输出的argmax。
可视化注意力(Visualizing Attention)
注意力可以捕捉输入序列的整体上下文,通常会提高模型的性能。通过可视化注意力,我们可以看到输入序列的哪些部分对模型的输出有重大影响。这有助于我们更好地理解Transformer神经网络的内部工作方式。
上图显示了GPT-2(Radford等人,2019)的第8个层上的注意头。从图中可以清楚地看出,即使在Transformers的早期层中,大多数令牌仍然会相互关注。
随着时间的推移,已经发展出了许多工具,以帮助深度学习社区了解Transformers模型内部工作的情况。最著名的工具之一是BertViz(Vig,2019)6。我们用于制作上述可视化的ExBert也是一种在大多数基于Transformers的模型(如GPT-2和BERT)上可视化注意力的出色而简单的工具(Devlin等人,2019)。
注意力的优缺点
注意力机制在序列建模和其他可以被构建为序列的模态中引发了重大变革。与其他序列网络(如循环网络和一维卷积)相比,注意力提供了许多优势。以下是对这些优势的简要讨论:
长期依赖性: 传统的循环神经网络(RNN),包括变体如长短时记忆(LSTM)和门控循环单元(GRU),容易出现长期依赖性问题,即模型随时间保留信息的能力会减弱。注意力机制通过使模型能够直接访问输入序列中的任何点来减轻这个问题,从而保留了整体上下文。
并行化: 与需要顺序计算的RNN不同,基于注意力的模型(如Transformers架构)可以并行处理输入序列中的所有令牌。这使它们在计算上更高效,并且能够更好地适应当前的硬件加速器。
可解释性: 注意力提供一定程度的可解释性,因为它突出显示了模型认为生成特定输出所需的输入部分。”注意力图”可以帮助我们理解模型的”思维方式”。
全局上下文: 在卷积神经网络(CNNs)中,感受野通常是局部的,取决于核的大小,可能会导致更广泛上下文的丢失。然而,通过注意力,每个输出令牌可以考虑输入序列中的每个令牌的信息,从而保留了全局上下文。
改进的性能: 基于注意力的模型,特别是利用Transformers架构的模型,在许多NLP任务中取得了最先进的性能,在性能上超过了它们的RNN和CNN对应物。它们还推动了其他模态(如计算机视觉、语音识别、机器人技术、多模态学习等)的发展……
在下图中,我们总结了基于注意力的模型与其他深度神经网络架构的性质。

尽管它们提供了众多优点,就像生活中的一切一样,注意力机制也伴随着自己的挑战。例如,在多种类型的注意力中,内存消耗和计算成本都可能与序列长度呈二次方关系。已经提出了各种策略,如稀疏注意力或局部注意力,以缓解这些问题,但它们大多数在实际中很少使用(Tay等人,2020)。
尽管训练期间Transformers提供了并行化的优势,但由于推理过程的性质可能需要顺序方法,这取决于具体的任务。由于它们的自回归性质,Transformers逐令牌生成输出,继续这个迭代过程,直到完全生成所需的输出序列。
此外,尽管注意力提供了一定程度的可解释性,但它远非完美。虽然它提供了一些关于模型运作方式的见解,但仅仅依靠注意力图来完全解释复杂模型几乎是一项艰巨的任务,如果不是几乎不可能的任务。
大型语言Transformer模型(Large Language Transformer Models)
LLM的演化
大型语言模型(LLMs)已经彻底改变了人与机器学习系统的互动方式。自然语言界面,例如ChatGPT和Bard,都由强大的LLMs提供支持。这些模型为在-fly或通过零-shot学习执行自然语言下游任务铺平了道路。在过去,这些任务通常需要收集下游或特定任务的数据集。
在这些LLMs的核心是一个Transformers模型,我们已经看到它在一些地方进行了一些小的调整。在本节中,我们将深入探讨大型语言模型的演化过程。此外,我们将探讨为特定应用程序而设计和微调的垂直LLMs的发展。
Transformers基础模型有65M个参数,但从那以后,语言模型变得越来越大(以数十亿为单位),因此称为大型语言模型。下面是一些流行的大型语言模型的快速概述。

大多数大型语言模型(LLMs)的训练过程都遵循大致相似的模式。在初始的预训练阶段,LLMs会接触到来自各种材料的大量策划文本数据,这些材料包括书籍、文章、代码片段和网站等。这个庞大的数据集对于模型获得对世界的全面理解至关重要,使它们能够创建丰富的表示并生成具有上下文相关性的响应。普通公众对LLMs在各个领域的性能寄予了很高的期望。为了满足这些期望,预训练数据必须涵盖广泛的主题和学科(J. Yang等人,2023)。
LLMs的实际训练是以无监督的方式进行的,重点是自监督学习(SSL)。这种方法消除了标记数据的需求,这是一个关键特性,考虑到标记整个在线内容几乎不可能。

然而,在无标签数据上训练模型需要巧妙地实施训练目标,因为没有参考的基本事实。因此,大多数LLMs通常使用下一个令牌预测(NTP)作为常见的训练目标。实质上,LLMs被教导准确预测序列中的下一个令牌,逐渐增强它们的理解和生成能力。另一个常用的训练目标是掩码语言建模(MLM)。掩码语言模型被训练以预测序列中的一个掩码令牌。这个目标是由BERT(Devlin等人,2019)广泛使用的。
在预训练阶段之后,模型可以使用技术来生成文本,比如零-shot学习或少-shot学习。在零-shot学习中,模型被提示执行任务(或回答给定的问题),而不需要演示如何执行任务。在少量示范学习中,模型会在执行任务之前接受多次演示如何执行任务。零-shot学习和少-shot学习是上下文学习的示例。上下文学习(ICL)是指LLMs使用语义先验知识(Jerry Wei等人,2023)生成连贯文本的能力,并且不需要参数更新(Akyürek等人,2023)。提示大型语言模型(也称为提示工程)本身是一个相对较新的领域,还有其他提示工程技术,如思维链(CoT)(Jason Wei、Nye和Liang,2022)等。
上下文学习往往在被认为简单的任务上表现出色,但对于无法轻松描述的任务来说则不足够。复杂的任务需要比聪明的提示更多的东西。用Karpathy的话来说,“达到顶级性能(对于复杂任务)将包括微调,特别是在具有明确定义的任务的应用程序中,可以收集大量数据并进行“实践”。”7。因此,为了使LLMs在数学、医学、科学领域(如化学)等专业任务上获得良好的性能,人们通常会在下游数据集上对基本LLMs进行微调。我们将在垂直LLMs的部分看到这方面的示例。
现在,我们已经简要介绍了大型语言模型(LLMs),是时候来看一些最流行的LLMs,特别关注它们的设计选择:它们是否作为编码器、解码器运行,或者采用组合编码器-解码器架构。
编码器、解码器和编码器-解码器语言模型(Encoder, Decoder, Encoder-decoder LLMs)
标准的Transformer模型包括编码器和解码器,这与它的任务有关,该任务是机器翻译,需要处理输入句子和其目标翻译。自从Transformer模型出现后,AI研究社区为不同任务提出了不同变种的架构。根据任务的不同,一些Transformer模型保持编码器-解码器结构,一些只使用解码器或编码器。让我们从后者开始。
只有编码器的语言模型(Encoder-only LLMs)
只有编码器的语言模型使用标准Transformer模型的编码器部分。通常,只有编码器的语言模型用于自然语言处理的判别性任务,如文本分类和情感分析。
BERT(Devlin等人,2019)是最流行的只有编码器的语言模型之一。BERT是最早的研究之一,表明您可以在大规模未标记的文本数据集上对Transformer(编码器)进行预训练,然后使用附加的任务特定头部对各种下游任务进行微调。BERT的预训练目标包括遮蔽语言建模(MLM)和下一句预测(NSP)8。在遮蔽语言建模中,我们遮蔽给定百分比(如论文中所述的15%)的输入标记,目标是预测遮蔽的标记。在下一句预测中,对于构成输入序列的两个句子对,目标是随机预测两个句子是否按正确顺序排列。

BERT是一项真正革命性的技术,它在许多自然语言处理下游任务上改进了最先进的性能。它还启发了其他高效的双向架构,用于自然语言处理的预训练,例如RoBERTa(刘等人,2019),代表着鲁棒性优化的BERT方法。RoBERTa引入的主要设计选择之一是不使用下一句预测任务。
只有解码器的语言模型(Decoder-only LLMs)
只有解码器的语言模型基于标准Transformer的解码器部分。在Transformer架构中,解码器与编码器非常相似,只是解码器的自注意力在生成当前标记时被屏蔽,以防止模型查看后续标记。
解码器语言模型是根据下一个标记预测任务进行训练的9。因此,它们只能逐个标记地或自回归地生成一个标记。总体而言,解码器模型用于生成性任务。
最流行的解码器模型是GPT(生成预训练Transformers)模型家族,特别是GPT-3(Brown等人,2020)和GPT-4(OpenAI 2023)。GPT-3和GPT-4是早期GPT模型(Radford等人,2018)的直接扩展。与任何其他大型语言模型一样,GPT模型在大规模未标记数据上进行训练(数量在数十亿到数万亿个标记的数量级)。由于大规模的预训练和合适的训练目标,GPT模型具有令人印象深刻的上下文学习能力,可以在零样本或少样本设置下(Brown等人,2020)仅通过提示模型来执行文本分类、摘要、问答等任务。这种在上下文中学习的显着能力常常被称为大型语言模型的“新兴能力”(Jason Wei等人,2022)。
GPT模型不是基于解码器的唯一模型。事实上,大多数著名的语言模型都是解码器。示例包括PaLM(Chowdhery等人,2022),BLOOM(Le Scao等人,2022),Chinchilla(Hoffmann等人,2022),LLaMA(Touvron等人,2023)等等。
编码器-解码器语言模型(Encoder-Decoder LLMs)
编码器-解码器语言模型看起来与标准Transformer相似。它们通常用于需要处理两个序列(即,输入和目标都是序列)的任务,例如机器翻译。与我们所见过的其他模型样式相比,编码器-解码器样式的使用不太广泛。这种类型的最著名的模型是T5(Raffel等人,2019),BART(Lewis等人,2019),UL2(Tay等人,2022),FlanT5(Chung等人,2022),mT5(Xue等人,2021),等等…
编码器-解码器样式还用于多模式学习,特别是视觉语言预训练(VLP)。诸如SimVLM(Z. Wang等人,2021)和PaLI-X(X. Chen等人,2023)之类的作品使用编码器来学习图像和文本表示,并使用解码器生成输出。
垂直语言模型(Vertical LLMs)
我们上面概述的大多数语言模型通常被称为基础或前沿语言模型。基础模型通常是通过自我监督在大规模数据上进行训练的,它们可以进行广泛的下游任务微调(Bommasani等人,2022)。
垂直语言模型是一类适用于特定应用的语言模型。基础语言模型可以推广到简单的任务,如情感分析,但它们在复杂任务或需要领域专业知识的任务上表现不佳。例如,基础语言模型不太可能在医学问题回答任务上表现良好,因为它缺乏医学方面的专业知识。更多例子:基础语言模型不太可能在法律问题回答任务上表现良好,因为它缺乏法律方面的专业知识。在其他领域,如金融、物理、化学等领域,情况也是如此…垂直语言模型旨在解决这个问题。它们在特定领域进行训练,可以在需要该领域专业知识的任务上表现良好。基础模型旨在成为通才,但大多数时候,我们关心的是能够很好地执行一项任务的模型。
最近的垂直语言模型示例包括MedPaLM(Singhal等人,2022)和Med-PaLM 2,ClinicalGPT(G. Wang等人,2023),FinGPT(H. Yang,Liu和Wang,2023),BloombergGPT(Wu等人,2023),Galactica(Taylor等人,2022),Minerva(Lewkowycz等人,2022)等等。

Transformers模型在NLP之外的应用 - 视觉和其他模态
Transformer最初是为自然语言处理(NLP)领域引入的,更具体地说,是为神经机器翻译引入的。很快,Transformer在大多数NLP任务上超越了以前的神经网络,并迅速扩展到其他模态。在本节中,我们将简要讨论Transformer在视觉识别和其他模态中的出现。
视觉识别是最早受到Transformer显着影响的模态之一。长时间以来,卷积神经网络(ConvNets)在视觉识别方面一直处于领先地位。因此,有必要询问研究人员为什么关心替代ConvNets。ConvNets的主要缺点是它们的空间归纳偏差11。
将Transformer应用于图像处理的最早应用之一是Image Transformer(Parmar等人,2018),它将图像生成视为自回归问题,类似于文本生成。Image Transformer是标准Transformer应用于像素序列,经过自回归训练,直到生成完整的图像。这是一个很好的想法,但事实证明,图像通常具有较高的分辨率,因此,将自我注意力应用于例如256x256的图像是不可行的。有一些尝试将Transformer应用于图像领域的工作,但第一个成功的工作之一是Vision Transformer(Dosovitskiy等人,2021),它将Transformer编码器应用于图像块序列。通过图像块化的思想,ViT克服了自我注意力的计算复杂性,标志着将Transformer扩展到计算机视觉领域的重要一步。
正如我们之前所看到的,Transformer在NLP方面的成功的一个重要贡献是在大规模未标记数据上进行无监督预训练。Vision Transformer的成功也归因于数百万训练图像,JFT-300M(C. Sun等人,2017),尽管后来的作品,如MAE(He等人,2021)和(Steiner等人,2021),在传统计算机视觉基准测试中也取得了相当好的性能,如ImageNet。MAE是一种编码器-解码器自监督模型,遵循BERT预训练的目标,即预测随机遮蔽的块,而后者则探索了巧妙的增强和正则化方法来训练ViT。ViT已经被用作许多有影响力的论文的骨干,如CLIP(Radford等人,2021),DALLE•2(Ramesh等人,2022),稳定扩散(Rombach等人,2022),以及其他最近在视觉语言模型中的作品。除了使视觉和语言的联合建模成为可能,ViT还与卷积神经网络相结合,以在计算机视觉下游任务中获得两个领域的优势。ConvNets和Vision Transformer拓扑的重要作品包括DETR(Carion等人,2020),PatchConvNet(Touvron等人,2021),MobileViT(Mehta和Rastegari,2022)等等。
视觉和语言是人与计算机互动时最重要的两种模态之一,因此不足为奇,大多数涉及Transformer的工作都涉及到语言、视觉或视觉语言学习等领域。也就是说,Transformer已经在强化学习(L. Chen等人,2021)、机器人学(Brohan等人,2022)、语音识别
(Radford等人,2022)等其他模态中使用。最后,像Gato(Reed等人,2022)和ImageBind(Girdhar等人,2023)等作品更进一步地模拟了几乎所有模态。
Transformer已经确立自己作为一种通用架构,不同模态的最近作品证明了这一点,但仍然存在挑战。
Transformer:当前挑战和未来方向
高效Transformer
Transformer已经在各种模态中显示出显着的性能,例如语言、视觉、机器人和强化学习。Transformer神经网络架构具有一组特征,使其成为适用于这些领域的合适架构:它具有表现力,与当前的优化技术配合良好,并且可以进行并行处理。从这些特征中,可以说Transformer是一种高效的架构。然而,Transformer的效率随着自我关注的二次时间和内存复杂性的增加而伴随着巨大的计算成本。Transformer的计算需求限制了其可扩展性以及在低预算设备(如智能手机和微控制器)上的应用。
模型效率是在开发和部署机器学习系统时要考虑的重要因素,因为模型在推断期间的性能可能会影响用户体验(Dehghani等人,2022)。有成千上万的Transformer模型声称可以提高Transformer架构的效率(内存占用和计算成本),但这些模型通常倾向于针对特定基准或设备。声称可以减少自我关注的二次时间和内存复杂性的大多数新型Transformer模型都比标准Transformer慢得多,而且很少在实践中使用,它们也没有原始Transformer的通用性(Tay等人,2020)。
正如(Tay等人,2020)在《高效Transformer》的调查中很好地解释的那样,理想的xformer应该减少自我关注的二次时间复杂性,但应该保持通用性,并在所有任务和模态中表现良好。它还不应该在速度和内存之间进行权衡,不应该是硬件工程,应该保持简洁和简单。有关更多信息,建议阅读高效Transformer的调查论文。

图21:高效Transformer的分类,图片来源于(Tay等人,2020年)。
事实上,几乎所有修改过的Transformer模型都计算关注的近似值以减少成本。与这些方法相对的是一种关注方式,它计算确切的标准关注值,但速度更快。这种方法是FlashAttention(Dao等人,2022),我们将对其进行高层次的讨论。
FlashAttention是一种快速且内存高效的算法,用于计算确切的注意力。FlashAttention比标准注意力快2-4倍。它通过使用两种主要技术来实现计算效率的巨大提升:切片和重计算。切片发生在前向传递中,它涉及将注意力中的大矩阵(K键和V值)分成块。FlashAttention不是计算整个矩阵上的注意力,而是在块上计算注意力,然后连接生成的块,从而节省了大量内存。重计算发生在向后传递中,基本上是重新计算注意力矩阵,而不是在前向传递中存储它。FlashAttention的思想归结为改进内存而不是减少计算,因为现代GPU具有高理论FLOPs(浮点运算,意味着您希望将其最大化),但内存有限12(意味着内存的任何节省都可以提高训练速度)。HBM(高带宽存储器)通常很大,但不比芯片上的SRAM(静态随机存取存储器)快,因此在注意力块(K和V)上的计算发生在SRAM中(因为它更快),但所有完整的矩阵都存储在HBM中(因为它很大)。这种高层次的解释可能过于简化,因为FlashAttention是在GPU级别(使用CUDA软件)实现的,这实际上是为什么它具有IO感知性的原因,但希望这能解释这个快速算法的原理。
下面的图像显示了GPU中的内存层次结构、FlashAttention算法以及GPT-2注意力与FlashAttention之间的每个中间步骤所花费的时间(以毫秒为单位)。理想情况下,我们希望大多数计算由矩阵乘法(matmul)操作处理,但令人惊讶的是,在GPT-2注意力中,辍学、softmax和掩码(即GPT-2是解码器模型)最终占用了整个运行时间,因为它们是在整个矩阵上计算的。Matmuls的运行时间比其他操作少,因为GPU确实设计成在矩阵乘法上运行得很快(它们具有非常高的理论FLOPs,最大化FLOPs使用不会减少运行时间)。通过使用切片和重计算技术,FlashAttention的计算时间与标准注意力相比显着较低,如下图所示。

FlashAttention已经集成在PyTorch 2.0、Hugging Face Transformers、微软的DeepSpeed、MosaicML Composer库以及许多其他库中。您可以在论文中了解更多关于FlashAttention的信息,或观看核心作者制作的视频以及发布的博客文章。在撰写本节时,FlashAttention2(Dao 2023)也已发布,并且在多个数量级上比FlashAttention版本1更快。FlashAttention-2通过在序列长度维度而不是批处理大小和注意力头数上并行化,以及分割Q(查询)矩阵而不是K和V来提高并行性。这篇发布博客文章很好地解释了FlashAttention2在张量表上的改进。
具有有效长上下文的Transformers
处理长上下文长度是Transformers大型模型研究的主要活跃领域之一。由于注意力的二次时间和内存复杂度的直接结果,Transformers无法处理长上下文窗口。研究扩展Transformers架构上下文窗口的技术是一件重要的事情,因为上下文窗口决定了在推断期间可以适应Transformers内存中的信息量。像长对话、总结长文档和执行长期规划这样的任务可能需要支持长上下文窗口的模型(S. Chen等人,2023)。
已经有很多关于上下文窗口和扩展它们的研究,如(S. Sun等人,2021),但我想强调一个最近关于长上下文的研究发现。最近的语言模型(基于Transformers)可以处理更长的上下文,但长上下文是否真的有帮助还不清楚。正如(N. F. Liu等人,2023)所示,随着输入上下文长度的增加,语言模型的性能会下降。因此,即使对于具有扩展上下文长度的模型,它们的性能在更长的输入上下文中仍然会下降。此外,该研究还发现,当相关信息位于输入上下文的开头或结尾时,语言模型表现良好,而当相关信息位于中间时,性能显著下降,这表明语言模型是U形推理器。
上面的发现具有吸引力,并提供了广泛的影响,可以在设计微调数据集和在上下文学习期间应用,但重要的是要注意,鉴于“Transformers模型在长上下文窗口上的性能如何”仍然是一个活跃的研究领域,没有任何一个已经确立的理解。我们希望未来的Transformers模型将能够在长输入序列上运行,并且无论相关信息放在哪里都能表现良好。这实际上是大型语言模型的圣杯。

多模态Transformers
神经网络设计的主要目标之一是设计一个单一的通用模型,可以有效地处理多种模态,而无需模态特定的编码器或预处理。事实上,Transformers模型已经广泛应用于各个领域,包括文本、图像、机器人和语音。然而,创建一个真正通用的Transformers,即一个可以在所有模态之间表现同样有效而无需特定调整的模型,仍然是一个挑战。这个挑战来自于数据类型和Transformers模型本身的固有差异和复杂性,这些差异和复杂性通常需要模态特定的修改。
例如,处理文本、图像和语音的过程都因其各自的特点而具有独特的考虑因素。Transformers在数据可以被构建为一系列标记的情况下表现出色,然而,将特定模态转化为这样一个序列的方法在不同模态之间有很大的不同。因此,挑战在于设计一种可以从所有数据类型中均匀提取有价值见解的单一架构,并具有可比较的效率。
实现这样一种架构的成功将标志着多模态学习领域的重大进展,为能够在不同类型的数据之间无缝切换的模型打开了新的探索途径,可能开辟了多模态表示学习的新领域。
几乎所有当前的多模态学习的最新技术都通常使用不同的分词器和编码器,针对每种模态,大多数也是为视觉语言学习而设计的。本节不深入探讨基于Transformers的当前多模态方法的具体细节,但我们为对此感兴趣的人提供了一些示例:Flamingo(视觉语言)(Alayrac等人,2022),Gato(Reed等人,2022),ImageBind(Girdhar等人,2023),OFA(P. Wang等人,2022),Unified-IO(Lu等人,2022),Meta-Transformer(Y. Zhang等人,2023),等等。
注意
几乎所有的Transformers挑战都源于其极端的计算和内存需求。像FlashAttention这样真正高效的Transformers有可能缓解这些挑战。
Transformers的开源实现
原始的Transformers模型是在Tensor2Tensor库13中实现的,但最近已经不再维护。Tensor2Tensor的继任者是基于JAX14的Trax。
有许多Transformers模型架构的开源实现。让我们简要介绍三种最流行的实现。HuggingFace Transformers库(Wolf等人,2020)可以说是最流行的Transformers实现之一。该库简化了NLP(和视觉)下游任务的推理流程,并可用于训练或微调基于Transformers的模型。HuggingFace Transformers库易于使用,清晰易懂,并拥有庞大的开发人员和贡献者社区。minGPT和nanoGPT由Andrej Karpathy开发,也是开源和研究社区中流行的实现。此外,x-transformers提供了各种Transformers模型的简洁和实验性实现,通常来自新的研究论文。
最后,您不太可能需要从头开始实现Transformers模型或其中的一部分,因为现代深度学习框架如PyTorch、Keras和JAX(通过Flax)提供了其作为层的实现,您可以像导入卷积或线性层一样轻松导入。
补充资源(Supplementary Resources)
这篇文章为理解Transformers神经网络架构的知识库增添了贡献。因此,我们不容忽视一些关于Transformers架构的宝贵资源,以下是对它们的简要介绍:
The Annotated Transformer(注释版Transformers):这是最好的实用资源之一。它提供了Transformers架构的逐行实现,附带完全可用的代码。最初的版本由Sasha Rush编写,最近的版本由Austin Huang及其同事编写。
Let’s Build GPT from Scratch by Andrej Karpathy(从头开始构建GPT):这可能是关于Transformers实现的最好的资源,尤其是关于GPT(生成预训练Transformers)。Karpathy从零开始构建和训练整个GPT,提供了每个步骤的合理解释。这里有一份讲座视频和相关的代码库(nanoGPT)。
Stanford CS25: Transformers United V2(斯坦福CS25:Transformers联合V2):旨在研究Transformers如何工作以及它们如何在不同领域应用,包括自然语言处理、计算机视觉、生物学、机器人等等。该课程包含来自研究人员的精彩演讲。最新版本课程的入门课程深入探讨了Transformers架构,由Karpathy主讲,他深刻理解神经网络的复杂性。
Formal Algorithms for Transformers(Transformers的正式算法):提供了各种Transformers架构的数学概述和正式算法。
Transformer Taxonomy(Transformers分类):提供了对Transformers模型的文献综述,从标准Transformers的提出以来的架构变化、预训练后技术和三种训练技术。
The Illustrated Transformer(图解Transformers):这是一篇出色的博客文章,将Transformers模型分解并直观地解释了每个部分。
Transformer and attention blog series by Lilian Weng(Lilian Weng的Transformers和注意力博客系列):提供了对Transformers和注意力机制的出色理解。相关的Lilian Weng博客的一个值得注意的例子是《Transformers家族版本》(还有第二版)和《注意?注意!》。
Attention is All You Need Video by Yannic Kilcher(“注意力就是你需要的一切”视频):Yannic Kilcher详细解释了这篇论文,对所有相关概念和相关工作进行了良好的讲解。
Transformer models: an introduction and catalog(Transformers模型:介绍和目录):这也是值得一提的资源。它提供了流行的Transformers模型的相当详细的目录。
结论
在深度学习和计算机科学领域,Transformers神经网络架构的重要性无法过分强调。Transformers模型最初用于神经机器翻译,已经发展成为一种多才多艺且通用的架构,在自然语言处理以外的其他多种领域展现出令人印象深刻的性能。
在本文中,我们深入研究了Transformers的核心机制及其基本组件 - 编码器和解码器结构、注意力机制、多头注意力、MLP、嵌入、位置编码层等等。我们探讨了自注意力的多个优点,以及潜在的缺点。通过分析注意力的可视化,我们更深入地理解了Transformers如何关注输入序列的不同部分以生成输出。
Transformers是大型语言模型(LLMs)的核心,这些模型最近在全球掀起了一股风潮。我们已经看到了LLMs的发展和它们不同的设计风格,以及Transformers在自然语言处理以外的应用。我们还讨论了它们当前面临的挑战,包括需要更高效的模型以及有效利用上下文窗口。这些挑战为未来的研究和改进提供了令人兴奋的机会。
随着深度学习领域的不断发展,Transformers架构仍然是现代机器学习系统的基础构建块。虽然有许多Transformers架构的变种,但不管Transformers的未来是什么,有一点是肯定的 - 注意力是你所需要的一切。保持好奇心,不断学习,始终保持关注!
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
