深入研究迄今为止最复杂的神经网络。

图片来源

开始阅读本文之前的先决条件:

  1. RNN/LSTM 的基础知识,从这里开始。

  2. Seq2Seq架构,来自这里

  3. 注意力机制,从这里开始。

介绍

Transformer 是当今大多数尖端 NLP 应用程序(例如BERT MUMGPT-3) 中的主要架构。在本文中,我将详细解释变压器架构。

当我们提出一个叫做 Transformers 的东西时,就开发了定序器数据的游戏规则改变者部分,而这篇论文是基于一个叫做“注意力”的概念的。

根据维基百科,Transformer是一种深度学习模型,采用注意力机制,差异化地衡量输入数据各部分的重要性。它主要用于自然语言处理(NLP)和计算机视觉(CV)领域。

变压器是使用编码器和解码器构建的,两者都由可以多次相互通信的模块组成。因此,输入和输出首先嵌入到 n 维空间中,因为我们不能直接使用它。因此,无论我们提供什么,我们显然都必须对输入进行编码。该模型的一个微小但重要的部分是不同单词的位置和编码。由于我们没有能够记住如何将序列输入到模型中的循环神经网络,因此我们需要以某种方式为序列中的每个单词或部分提供一个相对位置,因为序列取决于元素的顺序。这些位置被添加到每个单词的嵌入表示中。

与 RNN/LSTM 一样,Transformers 是一种架构,用于将一个序列转换为解毒剂,同时帮助编码器和解码器等其他两个部分,但它与前面描述的序列模型的序列不同,因为它不像 GRU 那样工作。所以它没有实现循环神经网络。迄今为止,循环神经网络是捕获序列微小依赖性的最佳方法之一。然而,提出这篇论文“Attention Is All You Need”的团队证明,仅具有不使用 RNN 的注意力机制的架构可以改善其在翻译任务和其他 NLP 任务中的结果。

然而,与 RNN/LSTM 不同,Transformer 不一定按顺序处理数据。相反,注意力机制为输入序列中的任何位置提供上下文。例如,如果输入数据是自然语言句子,则变压器不需要在结尾之前处理句子的开头。相反,它确定了赋予句子中每个单词含义的上下文。此功能允许比 RNN 更多的并行化,因此减少了训练时间。

变形金刚有什么作用?

Transformer 是当前处理序列的最先进的模型类型。也许这些模型最突出的应用是在文本处理任务中,其中最突出的是机器翻译。事实上,Transformer 及其概念后代已经渗透到自然语言处理 (NLP) 的几乎所有基准排行榜中,从问题回答到语法纠正。在许多方面,Transformer 架构正在经历快速发展,类似于我们在 2012 年 ImageNet 竞赛之后看到的卷积神经网络 (CNN),无论好坏

变压器可以从三个组成部分来理解:

  1. 将输入序列编码为状态表示向量的编码器。

  2. 一种注意力机制,使我们的 Transformer 模型能够专注于顺序输入流的正确方面。这在编码器和解码器中重复使用,以帮助它们将输入数据置于上下文中。

  3. 解码,解码状态表示向量以生成目标输出序列。

变压器架构

变压器架构。制作人员

简而言之,Transformer 架构左半部分的编码器的任务是将输入序列映射到连续表示序列,然后将其输入解码器。

解码器位于该架构的右半部分,接收编码器的输出以及前一个时间步的解码器输出,以生成输出序列。

编码器

编码器堆栈由 6 个相同层的堆栈组成(Encoder#1、Encoder#2、Encoder#3......Encoder#6)

一个单编码器块。制作人员

每层有两个子层。第一个是多头自注意力机制,第二个是简单的、按位置的全连接前馈网络。我们在两个子层周围采用残差连接,然后进行层归一化。

即每个子层的输出为:

LayerNorm(x + Sublayer(x)),

其中Sublayer(x)是子层本身实现的函数。

为了促进这些残差连接,模型中的所有子层以及嵌入层都会生成维度 dmodel = 512 的输出。

添加和归一化层获取多头注意力模块的输出,将它们加在一起,并使用层归一化对结果进行归一化。如果您听说过批量标准化,那么层标准化是类似的,但它不是跨批量维度标准化输入特征,而是跨所有特征标准化层的输入。

该模型的一个微小但重要的部分是不同单词的位置编码。由于我们没有可以记住序列如何输入模型的循环网络,因此我们需要以某种方式为序列中的每个单词/部分提供一个相对位置,因为序列取决于其元素的顺序。这些位置被添加到每个单词的嵌入表示(n 维向量)中。

位置编码块通过将不同波长/频率的正弦和余弦函数连接到这些向量来注入有关每个词向量位置的信息,如下面的等式所示。

正弦和余弦位置嵌入方程

考虑到上面的等式,如果我们考虑具有 10,000 个可能位置的输入,位置编码块将添加波长从 2𝝅 几何增加到 10000*2𝝅 的正弦和余弦值。这使我们能够以数学方式表示词向量的相对位置,以便神经网络可以学习识别位置差异。

解码器

解码器也是由 6 个相同层组成的堆栈(Decoder#1、Decoder#2、Decoder#3......Decoder#6)

一个单一解码器块。制作人员

除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围采用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种掩蔽与输出嵌入偏移一个位置的事实相结合,确保位置i的预测只能依赖于小于 II 的位置处的已知输出。

让我们只考虑单个编码器和解码器块:

编码器和解码器的单个块。制作人员

编码器中的自注意力查看输入序列并在每一步决定序列的哪些其他部分是重要的,而解码器中的编码器-解码器注意力有助于它关注输入序列的相关部分(与我们在seq2seq 模型)。

自我关注

假设以下句子是我们要翻译的输入句子:

“这只动物没有过马路,因为它太累了。”

这句话中的“它”指的是什么?它指的是街道还是动物?这对人类来说是一个简单的问题,但对算法来说就不那么简单了。

当模型处理“it”这个词时,自注意力使其能够将“it”与“动物”联系起来。

当模型处理每个单词(输入序列中的每个位置)时,自注意力使其能够查看输入序列中的其他位置以寻找有助于更好地编码该单词的线索。

如果您熟悉 RNN,请考虑维护隐藏状态如何允许 RNN 将其先前处理过的单词/向量的表示与当前正在处理的单词/向量合并起来。自注意力是 Transformer 用来将其他相关单词的“理解”融入到我们当前正在处理的单词中的方法。

当我们在编码器#5(堆栈中的顶部编码器)中对单词“it”进行编码时,注意力机制的一部分集中在“The Animal”上,并将其表示的一部分烘焙到“it”的编码中。制作人员

如何计算自注意力?

计算自注意力的第一步是从每个编码器的输入向量(在本例中为每个单词的嵌入)创建三个向量。因此,对于每个单词,我们创建一个查询向量、一个键向量一个值向量。

这些向量是通过将嵌入乘以我们在训练过程中训练的三个矩阵来创建的。

Q是一个矩阵,其中包含查询(序列中一个单词的向量表示),K是所有键(序列中所有单词的向量表示),

V是值,它们又是序列中所有单词的向量表示。

对于编码器和解码器、多头注意力模块,V由与Q相同的单词序列组成。然而,对于考虑编码器和解码器序列的注意力模块,V与Q表示的序列不同。

为了稍微简化一下,我们可以说V中的值与一些注意力权重a相乘并求和其中我们的权重定义为:

这意味着权重a由序列中的每个单词(由Q表示)如何受到序列中所有其他单词(由K表示)的影响来定义。此外,SoftMax 函数应用于权重a,使其分布在 0 和 1 之间。然后将这些权重应用于V中引入的序列中的所有单词(与编码器和解码器的Q相同的向量,但对于编码器和解码器而言不同)具有编码器和解码器输入的模块)。

制作人员

右图显示了多头注意力,它解释了如何将这种注意力机制并行化为可以并行使用的多个机制。注意力机制通过QKV的线性投影重复多次。这允许系统从 Q、K 和 V 的不同表示中学习,这对模型有利。这些线性表示是通过将 Q、K 和 V 乘以训练期间学习的权重矩阵 W 来完成的。

这些矩阵 Q、K 和 V 对于结构中注意力模块的每个位置都是不同的,具体取决于它们是在编码器、解码器中还是在编码器和解码器之间。原因是我们想要关注整个编码器输入序列或解码器输入序列的一部分。连接编码器和解码器的多头注意力模块将确保编码器输入序列与解码器输入序列一起考虑到给定位置。

在编码器和解码器中的多注意力头之后,我们有一个点前馈层。这个小型前馈网络的每个位置都有相同的参数,可以将其描述为给定序列中每个元素的单独、相同的线性变换。

Transformer 架构的更清晰表示

现在让我们看看解码器端:

顶部编码器的输出被转换为一组(K,V)注意力向量。它们作为编码器-解码器注意层中每个解码器的输入,这有助于解码器关注输入序列中的适当位置。

解码继续进行,直到达到<EOS> ,表示变压器解码器已完成其输出。每个步骤的输出在下一个时间步骤中被馈送到下一个解码器的底部,并且解码器像编码器一样冒泡其解码结果。就像我们在编码器输入中所做的那样,我们将位置编码嵌入并添加到这些解码器输入中以指示每个单词的位置。

解码器中的自注意力层的运行方式与编码器中的自注意力层的运行方式略有不同:

在解码器中,自注意力层只允许关注输出序列中较早的位置。这是通过在自注意力计算中的 softmax 步骤之前屏蔽未来位置(将它们设置为 -inf)来完成的。

“编码器-解码器注意力”层的工作方式与多头自注意力类似,只不过它从其下面的层创建查询矩阵,并从编码器堆栈的输出中获取键和值矩阵。

最后的线性和 Softmax 层

解码器堆栈输出浮点数的向量。我们如何将其转换为单词?这是由最后的线性层完成的,后面是 Softmax 层。

线性层是一个简单的全连接神经网络,它将解码器堆栈产生的向量投影到一个更大的向量中,称为logits 向量。

假设我们的模型知道从训练数据集中学习的 10,000 个独特的英语单词(我们模型的“输出词汇”)。这将使 logits 向量有 10,000 个单元格宽——每个单元格对应一个唯一单词的分数。这就是我们解释线性层模型输出的方式。

然后,softmax 层将这些分数转换为概率(全部为正,全部加起来为 1.0)。选择概率最高的单元格,并生成与其关联的单词作为该时间步的输出。

培训变压器

在训练期间,未经训练的模型将经历完全相同的前向传递。但由于我们是在标记的训练数据集上对其进行训练,因此我们可以将其输出与实际的正确输出进行比较。

为了形象化这一点,我们假设我们的输出词汇仅包含六个单词(“a”、“am”、“i”、“thanks”、“student”和“<eos>”(“句子结尾”的缩写)) 。

一旦我们定义了输出词汇表,我们就可以使用相同宽度的向量来表示词汇表中的每个单词。这也称为 one-hot 编码。例如,我们可以使用以下向量表示单词“am”:

在回顾之后,让我们讨论模型的损失函数——我们在训练阶段优化的指标,以形成经过训练的、希望非常准确的模型。

损失函数

假设我们正在训练我们的模型。假设这是我们训练阶段的第一步,我们正在用一个简单的例子来训练它——将“merci”翻译成“thanks”。

这意味着我们希望输出是表示“谢谢”一词的概率分布。但由于该模型尚未经过训练,因此目前还不太可能发生。

由于模型的参数(权重)都是随机初始化的,(未经训练的)模型会生成每个单元格/单词具有任意值的概率分布。我们可以将其与实际输出进行比较,然后使用反向传播调整所有模型的权重,以使输出更接近所需的输出。

如何比较两个概率分布?

我们简单地使用交叉熵和 Kullback-Leibler 散度。阅读此处

更现实的是,我们将使用比一个单词长的句子。例如 – 输入:“je suis étudiant”,预期输出:“我是一名学生”。这真正的意思是,我们希望我们的模型能够连续输出概率分布,其中:

每个概率分布由宽度 vocab_size 的向量表示(在我们的玩具示例中为 6,但更实际的是 30,000 或 50,000 等数字)

第一个概率分布在与单词“i”相关的单元格中具有最高概率

第二个概率分布在与单词“am”相关的单元格中具有最高概率

依此类推,直到第五个输出分布指示“<句子结束>”符号,该符号也有一个来自 10,000 个元素词汇表的与其关联的单元格。

在足够大的数据集上训练模型足够长的时间后,我们希望生成的概率分布如下所示:

现在,由于模型一次产生一个输出,因此我们可以假设模型从该概率分布中选择概率最高的单词,并丢弃其余的单词。这是一种方法(称为贪婪解码)。另一种方法是保留最上面的两个单词(例如“I”和“a”),然后在下一步中运行模型两次:一次假设第一个输出位置是单词“I”,另一次假设第一个输出位置是单词“a”,并且考虑到位置#1和#2,保留产生较少错误的版本。我们对位置 #2 和 #3 等重复此操作。这种方法称为“束搜索”,其中我们的示例中,beam_size 为 2(意味着在任何时候,内存中都会保留两个部分假设(未完成的翻译)),并且 top_beams 也是 2(意味着我们将返回两个翻译) 。这些都是您可以试验的超参数。

推理

使用这些模型进行推理与训练不同,这是有道理的,因为最终我们希望在没有德语句子的情况下翻译法语句子。这里的技巧是为输出序列的每个位置重新输入我们的模型,直到我们遇到句末标记。

一步一步的方法是:

  1. 输入完整的编码器序列(法语句子)并作为解码器输入,我们采用一个空序列,在第一个位置仅包含一个句子开头标记。这将输出一个序列,我们将只获取第一个元素。

  2. 该元素将填充到解码器输入序列的第二个位置,其中现在有一个句子开头标记和第一个单词/字符。

  3. 将编码器序列和新的解码器序列输入模型中。取出输出的第二个元素并将其放入解码器输入序列中。

  4. 重复此操作,直到您预测出句末标记,该标记标志着翻译的结束。

我们发现我们需要多次运行我们的模型来翻译我们的句子。

我希望这些描述能让每个从 Seq2Seq 和编码器-解码器结构开始的人更清楚 Transformer 架构。

参考

https://en.wikipedia.org/wiki/Transformer_(machine_learning_model)

https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf

https://medium.com/inside-machine-learning/what-is-a-transformer-d07dd1fbec04

https://jalammar.github.io/illusterated-transformer/

Transformer Neural Network In Deep Learning - Overview - GeeksforGeeks

Logo

更多推荐