机器背后的数学:深入剖析Transformer架构

Transformer architecture

变压器结构

变压器结构是由Vaswani和Google团队的研究人员在论文“Attention is All You Need”中引入的。在该论文中,他们展示了如何使用这种新颖的结构,在没有循环和卷积的情况下实现了机器翻译的最先进性能。尽管变压器最初是为了解决自然语言处理问题而设计的,但目前它们也代表了计算机视觉领域的最先进技术(视觉变压器)。

ViT achieving SOTA on imageNet

在深入了解之前,让我们对架构进行高层次概述。Transformer包括两个主要组件:编码器和解码器。编码器包括多头自注意力,层归一化,前馈网络和残差连接。解码器与编码器几乎相似,只是它使用了两个注意力块:掩蔽多头自注意力和多头交叉注意力。

这篇博文以机器翻译任务的背景下展示了Transformer,提供了其每个关键组件的演示。

数据预处理

添加特殊的标记:

机器翻译是一种序列到序列的任务,它涉及将一种语言(源语言)的一系列文本翻译成另一种语言(目标语言)。这个任务的一个特点是输入序列(源语言)的长度和输出序列(目标语言)的长度可能会有所不同。

所以作为预处理步骤,我们在源序列和目标序列中添加两个特殊标记,。这些标记帮助模型理解输入和输出序列的结构。特殊标记用于向编码器发送信号,表明已收到完整的源序列;另一方面,标记对解码器来说具有更高的重要性,因为它有助于生成长度可变的序列。解码器将发出标记,以通知我们它在发出标记后完成,如果没有标记,我们就无法知道解码器何时完成发出标记。

注意,解码器是自回归的, 标记表示解码器开始生成下一个标记。添加这些标记会将目标序列向右移动一个单位。下面的示例演示了如何向序列附加特殊标记。

编码器输入:你好,你好吗?

解码器输入: 你好,你好吗?

目标预测:南斯卡尔,你好吗?

2. 词条化和词条嵌入

变压器不能直接处理文本。因此,为了这个目的,源句子和目标句子被分解为标记。

例如,空格分词器通过查找空格来分割输入文本流,而子词分词器在词级和基于字符的分词之间插值。以下是在GPT-2中使用的字节对编码(BPE)分词器的示例。

在给定的例子中,源句"Hello, how are you?"被分解为6个标记。注意,前缀"Ġ"表示标记之前存在一个空格。然后,每个标记被分配一个唯一的数字标记ID。每个标记ID被映射到一个向量空间(512维),使得相似的标记彼此靠近,向量的每个维度代表标记的某种语义含义。这些向量被称为嵌入。

注意:这些嵌入不是word2vec或GLOVE嵌入,如果是的话,嵌入层将会是一个查找表!每个令牌的嵌入是随机生成的,然后在训练期间通过反向传播进行调整。

特征工程

变压器一次性接收源序列和目标序列,但语言功能是按顺序运行的!因此,我们必须找到一种将顺序详细信息合并到令牌嵌入中的方法。

好的,这似乎很容易,对吧?我们试试看给索引为“i”的标记的标记嵌入中添加一个包含值“i + 1”的512维向量。所以,我们给第一个标记嵌入添加一个包含值1的512维向量。这是一种将顺序信息添加到标记嵌入的朴素方法,但你看到这里的问题了吗?

对于索引为50的令牌,由于位置值的支配作用,我们将完全失去令牌嵌入表示。因此,这并不太有帮助!使用位置编码可以解决这个问题。

位置编码:

Positional encoding for both source and target sentence

作者采用了一种巧妙的技巧来融入顺序信息,即位置编码。但在深入研究之前,先让我们了解一些术语。在这里,'pos'表示令牌的位置;在我们的示例中,'Hello'位于0处,','位于1处,依此类推。'i'表示令牌嵌入向量上的索引,'d_model'设置为512。

假设d_model的值为128,最大位置为60。下面是位置编码的可视化表示。

每行在上述图中表示对应索引处的位置编码。但是为了真正理解PE,我们需要看一下PE矩阵的余弦相似度矩阵。下面就是它!

Cosine similarity of positional embeddings

仔细观察,特定位置“p”上的位置编码的余弦相似度与其相邻标记的位置编码最高,表明与其周围标记更相似。在原始论文中,作者指出,

我们选择这个功能是因为我们假设它能让模型更容易学习通过相对位置来关注。

编码器块

步骤1:多头注意力(MHA):

Multi-Head self-attention

注意力是Transformer架构的核心,而MHA机制在我们的硬件上证明非常高效。编码器对输入令牌进行自注意力(缩放点积注意力),以理解令牌之间的关系。MHA通过使用多个注意力头并行计算注意力来扩展这个想法,以更好地理解上下文。这使得模型能够同时关注输入序列的不同方面,捕捉数据中的复杂关系和依赖关系。

缩放的点积注意力

SDA

对于输入张量,训练了三个不同的全连接神经网络(我们称为Wq、Wk和Wv)来学习3个矩阵。这些矩阵分别被称为查询(Q)、关键字(k)和值(V)矩阵。

在继续之前,让我们先了解形状。

点积(输入,Wq)= 查询(Q)

点积(输入,Wk) = 关键字(K)

点乘(Input, Wv) = 值(V)

现在关注度得分计算如下,

在这里,square_root(d_k)代表的是密钥(k)的维度。同时,需要注意的是,softmax是沿矩阵的水平轴(按行)应用的。

但是这些Q,K和V矩阵是什么呢?学习这三个矩阵的意义是什么呢?

计算这三个矩阵的灵感来自检索系统。例如,当你在YouTube上搜索视频时,搜索引擎会将你的查询(q)(一个文本字符串)映射到一组关键字(k),这些关键字可以是视频标题、描述、评论框等等。然后搜索引擎会用最佳匹配值(v)呈现给你。把Q、K和V想象成如下。

问题:其他令牌与我有多密切的关联?

K:我与其他某些令牌有多密切的关系?

V:包含所有令牌的信息。

注意,注意分数是对数值(V)矩阵进行加权的。

让我们现在谈谈多头注意力。多头注意力是一种将一群缩放的点积注意力机制分组以更好地理解上下文的方式。首先,使用这些Wq、Wk和Wv来计算Q、K和V矩阵,然后这3个矩阵在最后一个维度上被分成H个头部。注意,对于这个过程,嵌入维度必须能够被H整除。

对于每个头部,计算并连接缩放的点积注意力。整个过程可并行化,并且帮助模型更好地理解上下文,因为每个头部都能让模型学习某种特定的上下文。

作者指出,多头注意力允许模型同时关注不同位置的不同表示子空间的信息。使用单个注意力头进行平均会抑制这种能力。数学上可以表示为多头注意力如下。

第二步:残差连接和层归一化:

Residual connections and layer norm in encoder

输入流通过MHA块,输出张量与输入大小相同。输出与MHA块的输入张量通过残差连接相加。这有助于模型减轻梯度消失的问题,但不仅仅如此!残差连接提醒变换器有关原始输入表示,这意味着它向模型指示标记表示的上下文嵌入最好地表示了输入标记。

记住,我们在标记嵌入中添加了位置编码,我们不希望在注意力计算过程中丢失这些信息。在残差连接之后,我们使用层归一化来规范化表示。

第三步:前馈网络

Feed forward layer

多头注意力将值(V)矩阵加权,使重要的标记具有高值,而其他标记则被抑制。然而,我们希望编码器输出上下文的全局表示。为了实现这一目标,将通过前一层规范化块的输出张量再次传递给一个前馈网络,该网络学习捕捉输入标记的全局关系,帮助模型学习给定输入的最佳表示。

步骤四:编码器的堆叠 [6x]

Encoder stack

而不是使用一个编码器,transformer 使用一堆编码器。每个编码器的输入张量和输出逻辑回归具有相同的尺寸,因此即使我们堆叠多个编码器,计算也变得简单。在原始实现中,他们堆叠了 6 个这样的编码器。

堆叠层是深度学习模型强大的原因,仅使用一个编码器,转换器将无法捕捉到建模整个语言所需的复杂性。堆叠编码器使模型能够理解语言中的复杂模式,从而提高准确性。

解码器块

解码器是自回归的。目标标记通过在开头添加一个标记和在末尾添加标记来进行修改,这样将目标标签向右移动一位。移动的原因是在推理过程中,当给出标记时,向解码器发出开始生成预测的信号。

autoregressive decoder

解码器与编码器有许多重叠的组件,除了一些差异以外。它使用了遮蔽多头自注意力和多头交叉注意力,而编码器没有。让我们逐步了解解码器内部的数据流是如何发生的。

Step-1: 多头注意力屏蔽

Masked MHA

在编码器中使用的多头注意力块与解码器中使用的相同。唯一的区别在于在计算多头注意力机制中的 Softmax 之前添加了一个掩码。

但是为什么我们需要蒙版?

在推理过程中,转换器解码器以自回归的方式运行,从左到右预测标记,每个标记的预测都受到前面标记的影响。然而,在训练过程中,输入序列和目标序列同时提供给模型,以并行方式进行训练。为了在训练过程中保持自回归现象,关键在于防止解码器注意到未来的标记。

以下是MHA块中数据流的过程。掩码被广播以匹配维度。

批处理大小

E = 嵌入维度

num_heads = 8 头的数量 = 8

head_dimension = E // num_heads 头维度 = E // num_heads

SL = 序列长度

解码器逐个解码令牌。在训练过程中,它无法访问尚未存在的令牌。此处使用的掩码称为因果掩码。

简而言之,蒙面-MHA实际上是对目标序列进行自注注意力,并采用因果性屏蔽,以便解码器无法访问未来的标记。

第二步:使用层标准化的残差连接

[类似于编码器中使用的步骤]

步骤3:多头注意力 [交叉注意力,解码器]

机器翻译是一项复杂的任务,模型必须学习源语言和目标语言标记之间的关系以进行翻译。为了实现这一点,解码器具有一个交叉注意力块,其中Q矩阵来自目标语言标记,而其余的两个(K, V)来自上一个编码器块。

其余的一切保持不变,除了注意力矩阵再次被屏蔽,以便模型不会关注未来的标记。这种屏蔽是属于掩码式多头自注意力机制和编码器填充掩码的组合。我们不希望模型关注未来的标记和填充。交叉注意力还使模型具有可解释性,可以通过可视化交叉注意力权重来理解推断过程中源标记和目标标记之间的关系。

步骤4:线性层和Softmax

解码器的输出是大小为[Batch_size,sequence_length,d_model]的标量。线性层将输出标量转换为[Batch_size,sequence_length,vocab_size]的形状。理解vocab_size是目标序列中所有唯一标记的数量。

softmax函数在词汇大小维度上执行,以获取概率分数,类标签通过torch.argmax()函数计算。

步骤五:解码器堆栈 [6x]

类似于编码器,解码器也采用堆叠的方式来学习源序列和目标序列之间的复杂模式。堆叠会增加权重的数量,但减少模型的偏差。

最后一步:计算分类交叉熵损失。

该模型最小化了分类交叉熵损失,其中每个独特的标记都被视为模型力图预测的单独类别。因此,目标序列越多样化和多变,类别数量就越多。这就像变形金刚在猜谜游戏中,每个可能的结果(标记)都是一个类别。分类交叉熵损失告诉模型其猜测与实际目标序列的差距有多大,并在时间推移中促使模型变得更好。

为什么变压器被认为优于循环神经网络(RNN)?

与RNN不同的是,Transformer中没有循环结构。相反,整个源和目标标记集同时输入模型。通过计算交叉熵损失,再进行反向传播来调整权重。训练过程非常高效,这种效率使得Transformer能够轻松地进行扩展,这是它的显著优势之一。除此之外,与RNN相比,Transformer能够更有效地处理长距离依赖关系。

请观看下面的视频,Andrey Karpathy以直观的方式解释了Transformer。

参考资料:

  1. Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... Polosukhin, I. (2017). "注意力是你所需的一切." 神经信息处理系统的进展, 30. Curran Associates, Inc. 从https://arxiv.org/abs/1706.03762v1检索.
  2. “Transformer(机器学习模型)”。维基百科。获取自https://zh.wikipedia.org/wiki/Transformer_(machine_learning_model)。
  3. 不同关于Transformer模型的讨论。 (无日期)。 AI堆栈交换。 检索自https://ai.stackexchange.com/questions/tagged/transformer

2024-01-17 04:14:11 AI中文站翻译自原文