AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


另一种可视化方式介绍Transformer模型
发布日期:2024-10-08 20:40:20 浏览次数: 1532


自Ashish Vaswani等人在2017年引入Transformer模型以来,它已经成为任何大规模自然语言处理任务事实上的标准。从2018年开创性的GPT模型到现在的ChatGPT,甚至Stable Diffusion这样的文生图像合成模型,都是基于或受Transformer的启发。

鉴于它在NLP和ML领域的全面突破意义,介绍Transformer的原始论文却只提供了对其架构的有限解释。最关键的是,Transformer背后的齿轮是如何转动的,以及它们为什么工作得这么好。本文旨在填补这一空白,通过直观的、可视化的方式提供一个全面的、有启发性的Transformer图例,“解码”其令人难以置信的语言理解能力。

为什么是Transformer?

随着Transformer模型的诞生,带来了一种革命性的基于序列的建模方法:自注意力机制(self-attention)。以前,语言建模任务主要由基于递归的技术(如RNN、GRU和LSTM)主导,这些技术难以在较长的序列中保留来自较早时间步长的信息,导致涉及长距离依赖关系的任务性能不佳。Transformer架构通过允许同时处理整个输入序列来避开这些限制,从而使其具有完美的记忆和显著提高的计算速度。另一方面,自注意力概念是Transformer之前引入的注意机制的扩展,它使得模型关注输入的某些部分,对一个部分给予比另一个部分更多的“注意”。

本文将深入研究Transformer架构和大多数序列到序列(sequence-to-sequence)建模的基本方法:编码器和解码器。这将作为剖析Transformer模型和深入了解其内部工作的跳板。

编码器-解码器概念

Transformer模型依赖于两个独立的、较小模型间的交互:编码器和解码器。编码器接收输入,而解码器输出预测。自2014年以来,实现编码器和解码器来处理序列到序列的数据已经成为相对标准的实践,首先应用于基于递归的模型,然后用在Transformer。

在编码器-解码器架构之前,预测基于序列的问题仅仅基于整个输入序列的累积知识,这些知识被“压缩”到一个样本的表示值中。尽管LSTM和GRU等架构试图改善长距离依赖问题,但都并没有完全解决RNN的根本问题,即无法充分预测携带长序列的信息。

在编码器-解码器模式中,编码器接收整个输入序列。它将其转换成一个向量化表示,其中包含每个时间步长的输入序列的累积知识。然后将输入序列的整个向量化表示送入解码器,解码器“解码”编码器收集的信息并尝试做出有效的预测。

在Transformer模型的上下文中,可以将编码器和解码器类比为提出想法和发现答案的研究人员。把编码器想象成一个研究人员,挑出输入的关键方面,如句子结构、语法和语义。然后,编码器将输入中学到的见解传递给解码器。像程序员一样,解码器根据编码器获得的见解进行“编程”实用。

在对编码器提供的信息进行解码之前,解码器会收到一个单独的输入序列。就是说,解码器的预测不仅基于原始输入序列,还基于之前的输出。它本质上是自回归的。每次解码器进行预测时,它都会产生一个单词,然后将其与模型在之前的时间步长中预测的单词连接起来。这个预测循环一直持续,直到达到最大输出数(通常是用户指定的超参数),或者模型推断它已经达到句子或短语的自然结尾。

架构总览

在深入了解Transformer模型的具体细节前,先得知道信息如何流经模型的各个组件,以及这些组件为何对理解语言的基本结构至关重要,并产生正确的输出。下图来自Transformer模型的原始论文。

让我们看看这些组件是如何组合在一起的。

 编码器

Transformer的编码器负责将输入序列转换为机器可读的表示形式。这种表示捕捉单词之间的相似性及其在序列中的相对位置。输入序列首先通过输入嵌入(embedding)和位置编码层传递。这些操作将输入序列转换成适合编码器层处理的形式。

编码器中的层是编码器的核心,大部分“魔法”都发生在这里。在原始论文中,建议将编码器堆叠六层。不过,可以根据情况进行调整。编码器由单个多头注意力块组成,然后是一个前馈神经网络,在两个(多头注意力块和前馈神经网络)的输出后都有残差连接和规范化层。

多头注意力块能发现单词之间的复杂关系,并确定每个单词对于输入序列的含义有何贡献。这让编码器以一种类似于人类分析语言的方式深入理解输入序列。之后,前馈神经网络进一步变换输入序列,为下一编码器层做准备。一旦编码处理完成,编码器获得的积累知识(最后一个编码器层的输出)被传递给解码器,解码器使用它来生成最终的输出序列。

 解码器

解码器接收由编码器产生的累积知识,如下图所示。

通常在第一个“预测周期”中,因为没有“先前”输出,解码器输入一个“句首”token。解码器的层与编码器的层相似,因为它使用相同的概念来分析来自编码器和先前预测的组合信息。解码器首先仅根据其预测知识获得见解。然后,将数据与编码器输出相结合,进一步处理和分析。最后,下一个时间步长的预测被输出为一个概率,这个概率表示所选择的单词作为输出序列中的下一个单词的可能性有多大。

词嵌入

词嵌入的目的是将给定的输入序列转换为机器可读的表示形式。一种方法是使用one-hot编码,其中每个单词由一个大的稀疏向量表示,在向量空间中,单词对应的索引处的值为非零。然而,这种方法既不有效也不优雅,因为它会产生巨大的向量,其中99%是零值,可能会因维度诅咒而对模型性能产生负面影响。此外,对于如此庞大的向量,它所能传达的信息少得可怜——一个单词的唯一标识符。

词嵌入将从大型语料库学习到的进一步转换给稀疏的one-hot编码向量,生成了密集的、相对低维度的单词表示,同时保留了上下文信息。例如,在“the cat is brown and furry while the refrigerator is a lifeless, silver-colored machine”这句话中,“cat”的词嵌入与“refrigerator”的词嵌入相去甚远,因为这两个词传达的意思完全不同。另一方面,单词“brown”和“silver”会有相似的嵌入,因为这两个词都用来描述颜色。通常,余弦相似度(cosine similarity)算法用于计算两个词嵌入向量间的距离。

可以将词嵌入任务看作是语言模型的预训练技术。如果不使用词嵌入,模型将不得不在训练期间学习每个词的上下文信息。词嵌入预先完成了这一点,可以将更多信息输入到模型中。

为了有效地生成密集包裹的词嵌入,出现了各种方法和预训练算法。Transformer将词嵌入附加到模型上,并且从零开始训练。使用没有预先初始化参数的词嵌入,模型根据输入数据的上下文和整体模型结构学习嵌入表示。词嵌入是Transformer中的第一个组件;one-hot编码的输入与通过整个Transformer模型的反向传播训练的权重矩阵相乘。

权重矩阵有一个shape(唯一单词的数量,嵌入的维度)。为了保持一致性,使用Transformer原始论文中的术语,并将词嵌入的维度称为“d_model”。Transformer论文的作者将d_model设为512。

词嵌入可以被视为一个查找表,它将输入的one-hot编码向量映射到shape为(序列长度, d_model)的低维空间。这种降维是通过输入向量和权重矩阵的乘法实现的。这些嵌入能够捕获词之间的依赖关系并提供上下文信息。一个常见的例子是从"king"中减去"man"的嵌入向量,得到一个与"queen"的嵌入向量相似的向量,暗示了这三个词之间的内在关系。

词嵌入可能为输入序列注入有用的见解;但它无法为模型提供每个词相对于输入序列的位置线索。这就得位置编码发挥作用了。

位置编码

回顾下,Transformer模型放弃了使用基于递归的网络,而是依赖自注意力机制来处理输入序列。虽然可以更快地训练和更好地处理长距离依赖关系,但它本质上并未提供任何关于输入中词相对位置的信息。

例如,“I pet my dog”和“The dog pet me”这两句话由于“dog”的位置不同,表达了不同的意思。尽管如此,在这两种情况下,“dog”的词嵌入是相同的。基于递归的模型按顺序处理信息,因此每个词的位置已经被暗示,但Transformer需要额外的信息来区分句子中的两个“dog”。

为了解决这个问题,位置编码出现了,它为每个词嵌入向量添加一个长度为d_model的独特向量。这个位置编码向量由词在输入序列中的位置决定。这允许模型可提取输入中词的相对位置,并将此信息合并处理。

在下面的等式中,“pos”表示词在输入序列中的位置,而“i”是词嵌入中每个值的位置。应用两个位置编码函数,为每个“i”值生成两个唯一值。因此,要输出长度为d_model的向量,“i”值是从0到d_model的一半范围。例如,在句子“How are you?”中,嵌入词“you”的pos值为3,而它的“i”值范围从0到255,因为d_model(嵌入维度)为512。

正弦位置编码有几个优点:

  • 在原始论文中已经指出,Transformer能够使用位置编码函数“推断出比训练期间遇到的序列长度更长的序列”。

  • 词之间的相对位置可以推测出来,因为对于位置相近的单词,它们的位置编码向量也相似。

在位置编码部分完成后,其shape(序列长度,d_model)的输出将被传递到由自注意力块和前馈神经网络组成的第一编码器层。

注意,同样的预处理方案(词嵌入和位置编码)也用于解码器的输入序列,我们将在后面讨论。

自注意力背后的玄机

在进入自注意力技术细节之前,对算法背后的原因和方法有一个普遍的直观认识至关重要。

一般来说,注意力或全局注意力是成功的自然语言处理模型最重要的部分。注意力背后的基本思想是,模型可以根据与上下文的相关性,更多地关注某些输入词。换句话说,模型对每个输入词分配不同程度的“关注”,更重要的词得到更多的关注。

例如,考虑下面的句子:“My dog has black, thick fur as well as an active personality. I also have a cat with brown fur. What is the breed of my dog?”如果不加注意,模型会将关于cat和dog的信息同等重视,这可能得出不正确或误导性的答案。然而,有了注意力,一个训练有素的语言模型会对词组“brown fur”分配更少的注意力,因为它与被问到的问题无关。这种选择性地关注重要词的能力是语言学习的关键,有助于提高自然语言处理模型的性能。

Transformer采用了一种称为“缩放点积注意力”的自注意力机制。全局注意力考虑的是每个词相对于整个输入序列的重要性,而自注意力则是破译序列中词之间的依赖关系。例如,句子“I went to the store and bought tons of fruits along with some furniture. They tasted amazing.”人类读者会推断,“they”指的是fruits,而不是furniture。使用全局注意力的模型可能会在不理解这些词之间的关系的情况下,给“fruits”、“furniture”和“amazing”分配更高的注意力值。相比之下,自注意力,将输入序列中的每个词与其他词进行比较,将能发现“they”的预期含义。

理解自注意力如何分配注意力值或权重的一个有用方法是,通过输入序列中的每个元素与序列中的每个其他元素来构建一个相关矩阵进行比较。

自注意力是一种类似于Google搜索等信息检索系统的机制。在自注意力中,有三个组成部分:查询、键和值。在信息检索系统中,查询就像你在搜索栏中输入的搜索条件,键就像数据库中网站的标题,值就像网站本身。当你输入搜索查询时,系统会将其与数据库中的键进行比较,并根据键与查询的相似程度对值进行排序。虽然实际的Google搜索引擎比这复杂得多,但这个简单的示例说明了查询、键和值在自注意力中的作用。

查询、键和值的概念,以及它们之间的相互作用,都被自注意力所模仿。每个词的矢量表示被投影到三个较小的向量中,分别表示词的键、值和查询。

将输入序列中每个词的键向量(包括其本身)与每个词的查询进行比较,以确定最佳匹配。因此,输入序列生成如下所示的注意力矩阵,矩阵中的每个值代表特定词组合的“注意力权重”。对于每个词,它们的注意力权重依赖于输入序列(即注意力矩阵整行中的注意值)作为权重,计算其对应值向量的加权和。每个词都要这样做。将这些元素作为其内容创建一个新的矩阵。这本质上是重新创建输入序列的词嵌入表示,但带有注意力信息。

自注意力背后的数学

回想一下,位置编码的输出是shape(序列长度, d_model),其中d_model可以解释为嵌入维度。这个矩阵是编码器层的输入。对于第一个编码器层之后的编码器层,它们的输入将是前一个编码器层的输出。

输入矩阵通过三个独立的权重矩阵线性投影到三个较小的矩阵中,表示查询、键和值。这些矩阵具有shape(序列长度,64),其中维数64是论文作者选择的任意值。查询、键和值的权重矩阵分别称为WQ、WK和WV。这些权重矩阵与整个模型一起通过反向传播进行训练。为矩阵的维度选择64,是为不影响自注意力的计算。

查询、键和值矩阵中的每个条目对应于词的查询、键和值。查询矩阵和键矩阵被点在一起,以产生如上所示的“相关矩阵”。

要理解为什么在查询和键矩阵之间进行点积会产生词之间的相似性分数,是因为查询矩阵中的条目对应于查询中词的向量化表示,而键矩阵中的条目对应于键中词的向量化表示。

二维空间中两个向量之间的点积可以被看作是两个向量之间余弦相似性的度量,用它们的大小的乘积进行缩放。举个例子,考虑一下这个句子,“The man walks down the busy road carrying some books he just bought; where could he be coming from?”为了更形象,让我们假设模型的维数(d_model)等于2,以便查询和键向量可以投影到二维空间中。

在本例中,让我们使用词“man”和“busy”的查询向量,以及词“books”和“road”的键向量。我们期望“man”和“books”的查询和键向量有较大的余弦相似度,因为单词“books”描述了“man”。类似地,我们期望“busy”和“road”的查询和关键向量也有较大的余弦相似度。

然而,对于人类来说,“busy”和“road”之间的关系可能不像“man”和“books”之间的关系那样与句子中所问的问题相关。换句话说,短语“busy road”在推断这个人来自哪里时可能不如“man”和“books”之间的关系有用,后者暗示他可能来自图书馆。

为了说明这种差异,“busy”和“road”的查询和键权重矩阵产生的查询和键向量的相对值将小于“man”和“books”。由于点积不仅测量余弦相似度,而且还测量向量大小的乘积,因此最终的点积将赋予“man”与“books”之间的关系比“busy”与“road”之间的关系更多的权重。

由查询矩阵和键矩阵的点积生成的注意力矩阵具是shape(序列长度×序列长度)。注意矩阵中的每个值都除以键、查询和值矩阵大小的平方根(在本例中为8)。此步骤用于在训练过程中稳定梯度。然后将注意力矩阵通过softmax函数传递,该函数将其值归一化为0到1之间,并确保矩阵中每一行的值之和为1。

如前所述,将注意力值和值向量进行加权求和。将注意力得分归一化使其总和为1,使得这种加权和操作成为可能。最后,将归一化的注意力矩阵与值矩阵点乘,生成大小为(序列长度,64)的矩阵,该矩阵可以看作是带有注意力信息的输入序列的较小的矢量化表示。

输出矩阵的第一行是值矩阵中行向量的加权和,权重是输入序列中第一个词相对于所有其他单词的注意力值。

注意,输出矩阵的shape是(序列长度,64)而不是(序列长度,512)。原因将在下一节中说明,下一节将讨论多头自注意力和提升“注意力词嵌入”的过程。重要的是,输出矩阵应该具有与原始词嵌入相同的大小,因为它将用作下一个编码器层的输入,在第一个编码层的情况下,该编码器层期望词嵌入作为输入。

多头自注意力

多头自注意力顾名思义:将多个“注意力头”应用于同一序列。精确的自注意力机制被平行地应用于相同的输入序列8次。对于每个注意头,它的查询、键和值权重矩阵被随机初始化,希望每个注意力头能够从输入序列中获得不同类型的信息。

每个注意头产生shape(序列长度,64)的矩阵;然后沿着它们的二维空间将它们连接起来,创建一个shape(序列长度,8*64)的。在这个矩阵上执行线性投影,以“组合”所有注意力头的知识。用于线性投影的权重矩阵与模型的其余部分一起通过反向传播进行训练。

总而言之,对于那些喜欢用数字说话的读者来说,多头注意力机制可以这样表示:

在Transformer的原始论文中,作者使用了8个注意力头。然而,后来的研究表明,这可能是不必要的。Elena Voita等人在《分析多头自注意力:专门的头承担主要工作,其余的可以修剪》中提出,在8个注意头中,有3个“专门的”注意头做了大部分的工作。具体来说,这些专门的注意头的角色被假设为:

  • 位置头:该注意力头负责发现词的相对位置之间的关系。通常,每个词的最高注意力得分指向相邻的token。

  • 语法头:该注意力头负责分析单词之间的语法关系。

  • 罕见词:该注意力头会过滤掉在输入序列中不经常出现的词,表明它们可能比更常见的词(如“the”“a”)更重要。

残差连接(Add)、规范化(Norm)和前馈神经网络

多头注意力块的输出通过层规范化组件传递,该组件对编码器层的输入进行规范化。通过确保输入具有一致的分布,这种规范化有助于提高transformer模型训练的稳定性和速度。它还有助于减少梯度消失的影响,这可能会减慢训练速度。

批处理规范化和层规范化的关键区别在于它们用于规范化输入的方法。在批处理规范化中,每个特征在整个批处理中独立规范化;而在层规范化中,每个样本在整个批处理中独立规范化。

层规范化组件还有残差连接,它使得输入可以直接添加到规范化层的输出。这种残差连接有助于在训练过程中通过模型改善梯度流动,从而进一步提高训练的稳定性和速度。

在输出被规范化后,输出将穿过一个浅三层前馈神经网络,该网络处理输出并生成输入序列的最终编码表示。前馈神经网络由两个线性变换组成,中间有一个ReLU激活函数,有助于捕获数据中的复杂关系。

这就完成了transformer模型编码层的最后一步。特别是输入和输出都有d_model神经元,即原文中的512个,中间隐藏层有2048个神经元。在浅三层前馈神经网络之后,又进行了一层规范化和残差连接。

编码器输出

最后一个编码器层的输出通过反向传播学习的另一组线性投影,类似于在自注意块中执行的那些,产生一个键和一个值矩阵给到解码器。

在解释了编码器之后,再深入研究解码器。

解码器训练和推理方案

解码器处理输入的方式与编码器相同——首先进行词嵌入,然后再位置编码。简要来说信息通过解码器,首先向它提供一个“句首”token。然后,解码器在序列中生成下一个输出,该输出随后被用作输入串接到之前输入。

这个迭代过程一直持续,直到解码器产生“句末”token或达到用户指定的限制。这种方法使得解码器自回归地生成输出。注意,解码器还接收由编码器在每个预测时间步长的每个解码器层产生的相同键值矩阵。

在训练时,可以借助访问完整目标序列的便利。与自回归解码器不同,每个时间步长的解码器输入是从序列开始到前一个时间步长的预期输出。

这样,解码器根据已知序列而不是自己的预测进行预测,可以提高模型的整体性能。这种训练技巧被称为Teacher Forcing。Teacher Forcing也可并行化,因为每个时间步长的输出可独立计算。

解码器注意力mask

码器层在结构上与编码器层相似,但它包含两个注意块而不是一个,并且每个注意块的工作原理与编码器的略有不同。

第一个注意力块是mask后的多头自注意力。除了计算注意力矩阵外,这种注意力机制的工作方式与编码器的自注意力相同。由于该注意力组件计算自注意力,因此它不从编码器接收键值矩阵,这是下一个注意力块的内容。

第一个解码器自注意块使用隐藏来防止模型在推理过程中注意到序列中的未来单词。为了理解为什么怎么做,考虑一下自注意力矩阵。在矩阵的第一行,每个单元格(除第一个单元格)表示第一个词如何处理序列中未来的单词。在推理过程中,模型只能访问自己的输出,因此这些单词不一定是正确的。

为了防止模型在推理过程中关注输出序列中未来的token,对注意力矩阵进行mask,以遮盖每行在当前时间步长之前的注意力值。这有助于模型专注于目前所生成的单词,并改进其预测。

考虑句子“fruits are delicious”。注意力矩阵用于计算句子中每个词与序列中其余词之间的关系。在现实场景中,当模型计算第一个词“fruits”和句子其余部分之间的关系时,它不应访问正确的输出单词“are”和“delicious”。

只有当模型达到词“delicious”时,才会根据序列中的其他词计算注意力,因为它们出现在句子的前面。然后我们可以假设这些早期的词是由模型“预测”的,就像在推理过程中一样。

为了根据矩阵来制定mask,mask本质上是对注意力矩阵的右上方部分应用三角形mask,即将这些值设置为-inf,从而防止模型使用该信息。查询、键值矩阵的计算方式仍然与编码器自注意中的计算方式相同,mask只在softmax操作之前起作用,其中注意力矩阵的右上角三角形部分被设置为-inf。一旦通过softmax操作,这些值将被“压缩”为0,从而消除它们的影响。

在推理/预测阶段,mask在推理期间被移除,因为模型仅基于其先前时间步长的输出进行预测。与编码器自注意相比,多头注意、残差和层规范化的其他一切都保持相同的机制。

解码器交叉注意力

解码器交叉注意力块是transformer模型的关键部分。在多头自注意块mask、残差和层规范化之后,解码器使用另一个注意力块将编码器的输出与自己的输入结合。解码器根据自己的输入计算查询矩阵,而键值矩阵来自编码器的输出。

然后,像之前一样执行注意力,但这一次的重点是寻找输入序列和目前为止由解码器生成的输出之间的关系。这一步,解码器考虑整个输入序列与已经输出的内容之间的关系,并使用该信息对序列中的下一个词做出更准确的预测。

解码器交叉注意力机制可以被认为是一种重建解码器输入的“词嵌入”表示的方式,但它不是使用自注意力信息,而是使用来自输入序列的信息。从本质上讲,新生成的解码器“词嵌入”中的每一行都是来自编码器的值向量的加权和,权重由输入序列中每个词与解码器输入的给定词的关系决定。

前馈神经网络的功能与编码器层中的网络相同。在原论文中,解码器层也堆叠了六层。

线性解码器和Softmax

transformer解码器的最后一层产生一个矩阵(序列长度,d_model)。该输出可以解释为原始词嵌入的增强版本,包含来自六个编码器和六个解码器层的见解。然后通过学习的线性变换进行输出,该变换将矩阵映射到长度等于词数量的向量。然后通过softmax函数传递此向量以将值转换为概率。向量的每个索引表示一个唯一的词,概率最高的索引是模型对序列中下一个词的预测。

后记

虽然本文提供了Transformer的关键组件及其工作原理的详细概述,但对于这个模型,还有很多东西需要探索和学习。


原文链接:https://deepgram.com/learn/visualizing-and-explaining-transformer-models-from-the-ground-up


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询