NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

Transformer正在席卷自然语言处理领域。 这些令人难以置信的模型正在打破多项 NLP 记录并推动最先进的技术发展。 它们被用于许多应用程序,如机器语言翻译、会话聊天机器人,甚至为更好的搜索引擎提供动力。

Transformer在当今深度学习领域风靡一时,但它们是如何工作的呢? 为什么它们优于以前的序列数据模型,如递归神经网络、GRU 和 LSTM? 你可能听说过不同的著名Transform模型,例如 BERT、GPT 和 GPT2。 在这篇文章中,我们将重点关注开启这一切的一篇论文,“Attention is all you need”

1、注意力机制

要了解Transformer,我们首先必须了解注意力(Attention)机制。 注意力机制使 transformer 具有极长的记忆力。 Transformer模型可以“参与”或“关注”之前生成的所有token。

让我们来看一个例子。 假设我们想写一部带有生成式transformer的短篇科幻小说。 使用 Hugging Face 的 Write With Transformer 应用程序,我们可以做到这一点。 我们将用我们的输入来启动模型,模型将生成其余的内容。

我们的输入是:“当外星人进入我们的星球时”。

Transformer则输出:“并开始殖民地球,一群外星人开始通过他们对一定数量的精英的影响来操纵我们的社会,以保持和铁腕控制民众。”

好吧,故事有点黑暗,但有趣的是模型是如何生成它的。 当模型逐字生成文本时,它可以“注意”或“关注”与生成的字词相关的字词。 知道要添加什么词的能力也是在训练期间通过反向传播学习的。

递归神经网络 (RNN) 也能够查看以前的输入。 但是注意力机制的强大之处在于它不会受到短期记忆的影响。 RNN 的参考窗口较短,因此当故事变长时,RNN 无法访问序列中较早生成的单词。 这对于门控循环单元 (GRU’s) 和长短期记忆 (LSTM’s) 网络仍然适用,尽管它们具有更大的容量来实现长期记忆,因此具有更长的参考窗口。 理论上,注意力机制在提供足够的计算资源的情况下,有一个无限的窗口可供参考,因此能够在生成文本时使用故事的整个上下文。

2、Attention Is All You Need — 分步演练

注意力机制的力量在论文“Attention Is All You Need”中得到了证明,作者在论文中介绍了一种名为 Transformers 的新型神经网络,它是一种基于注意力的编码器-解码器类型架构。

在高层次上,编码器将输入序列映射到一个抽象的连续表示中,该表示包含该输入的所有学习信息。 然后,解码器采用该连续表示并逐步生成单个输出,同时还提供先前的输出。

让我们来看一个例子。 该论文将 Transformer 模型应用于神经机器翻译问题。 在这篇文章中,我们将演示它如何用于对话式聊天机器人。

我们的输入:“Hi how are you”

Transformer输出:“I am fine”

3、输入嵌入

第一步是将输入馈送到词嵌入层。 词嵌入层可以被认为是一个查找表,用于获取每个词的学习向量表示。 神经网络通过数字进行学习,因此每个单词都映射到一个具有连续值的向量来表示该单词。

4、位置编码

下一步是将位置信息注入到嵌入中。 因为 Transformer 编码器没有像循环神经网络那样的循环,所以我们必须在输入嵌入中添加一些关于位置的信息。 这是使用位置编码完成的。 作者想出了一个使用 sin 和 cosine 函数的巧妙技巧。

我们不会深入探讨位置编码的数学细节,但这里谈一下基本思路。 对于输入向量上的每个奇数索引,使用 cos 函数创建一个向量。 对于每个偶数索引,使用 sin 函数创建一个向量。 然后将这些向量添加到它们相应的输入嵌入中。 这成功地为网络提供了每个向量位置的信息。 串联选择 sin 和 cosine 函数是因为它们具有模型可以轻松学习注意的线性属性。

5、编码器

现在我们有了编码器层。 编码器层的工作是将所有输入序列映射到一个抽象的连续表示中,该表示包含整个序列的学习信息。 它包含 2 个子模块,多头注意力模块,后面是一个全连接网络。 两个子层中的每一个都存在残差连接,然后进行层归一化。

为了对此进行分解,让我们首先看一下多头注意力模块。

查询、键和值向量

为了实现自注意力,我们将输入馈送到 3 个不同的全连接层以创建查询(Q)、键(K)和值(V)向量。

这些向量到底是什么? 我在stack exchange网站找到了一个很好的解释......

“查询键和值的概念来自检索系统。 例如,当你键入查询以在 Youtube 上搜索某个视频时,搜索引擎会将你的查询映射到与数据库中候选视频关联的一组键(视频标题、描述等),然后为你呈现最匹配的视频(值)。

查询和键的点积

在通过线性层提供查询、键和值向量后,查询和键进行点积矩阵乘法以产生得分矩阵。

得分矩阵决定了一个词应该在多大程度上关注其他词。 所以每个词都会有一个对应于时间步中其他词的分数。 分数越高越专注。 这就是查询映射到键的方式。

降低注意力分数

然后,通过除以查询和键维度的平方根来缩小分数。 这是为了允许更稳定的梯度,因为相乘的值会产生爆炸效应。

缩放后得分值的 Softmax

接下来,你使用缩放得分值的 softmax 来获得注意力权重,这会为你提供介于 0 和 1 之间的概率值。通过执行 softmax,较高的分数会提高,而较低的分数会降低。 这使模型对要关注的单词更有信心。

将 Softmax 输出与值向量相乘

然后你把注意力权重乘以值向量得到一个输出向量。 softmax 分数越高,模型学习到的词的价值就越重要。 较低的分数会淹没不相关的词。 然后将其输出输入线性层进行处理。

计算多头注意力

为了使其成为多头注意力计算,你需要在应用自注意力之前将查询、键和值拆分为 N 个向量。 分裂向量然后单独经历自我关注过程。 每个self-attention过程称为一个head。 每个头产生一个输出向量,在通过最终线性层之前将其连接成一个向量。 理论上,每个头都会学到不同的东西,因此赋予编码器模型更多的表示能力。

总而言之,多头注意力是 transformer 网络中的一个模块,它计算输入的注意力权重并生成一个输出向量,其中包含关于每个单词应该如何关注序列中所有其他单词的编码信息。

残差连接、层归一化和前馈网络

多头注意输出向量被添加到原始位置输入嵌入中。 这称为剩余连接。 残差连接的输出经过一层归一化。

归一化残差输出通过逐点前馈网络进行投影以进行进一步处理。 逐点前馈网络是一对线性层,中间有 ReLU 激活。 然后将其输出再次添加到逐点前馈网络的输入并进一步归一化。

残差连接通过允许梯度直接流过网络来帮助网络训练。 层归一化用于稳定网络,从而大大减少所需的训练时间。 逐点前馈层用于投射注意力输出,可能为其提供更丰富的表示。

编码器总结

这包装了编码器层。 所有这些操作都是将输入编码为具有注意力信息的连续表示。 这将有助于解码器在解码过程中专注于输入中的适当单词。 您可以将编码器堆叠 N 次以进一步编码信息,其中每一层都有机会学习不同的注意力表示,因此有可能提高 transformer 网络的预测能力。

6、解码器

解码器的工作是生成文本序列。 解码器具有与编码器类似的子层。 它有两个多头注意层、一个逐点前馈层、残差连接以及每个子层之后的层归一化。 这些子层的行为类似于编码器中的层,但每个多头注意力层都有不同的工作。 解码器被一个充当分类器的线性层和一个用于获取单词概率的 softmax 所覆盖。

解码器是自回归的,它以一个开始标记开始,它将先前输出的列表作为输入,以及包含来自输入的注意力信息的编码器输出。 解码器在生成令牌作为输出时停止解码。

让我们来看看解码步骤。

解码器输入嵌入和位置编码

解码器的开头与编码器几乎相同。 输入通过嵌入层和位置编码层以获得位置嵌入。 位置嵌入被送入第一个多头注意力层,该层计算解码器输入的注意力分数。

第一个多头注意力层

这个多头注意力层的运作方式略有不同。 由于解码器是自回归的并且逐字生成序列,因此你需要防止它对未来的标记进行调节。 例如,在计算“am”这个词的注意力分数时,你不应该访问“fine”这个词,因为这个词是之后生成的未来词。 “am”这个词应该只能访问它自己和它前面的词。 对于所有其他单词都是如此,它们只能注意前面的单词。

我们需要一种方法来防止计算未来单词的注意力分数。 这种方法称为掩蔽。 为了防止解码器查看未来的标记,需要应用了一个前向掩码。 在计算 softmax 之前和缩放分数之后添加掩码。 让我们来看看这是如何工作的。

前向掩码

掩码是一个矩阵,其大小与注意力分数相同,填充了 0 和负无穷大的值。 当你将掩码添加到缩放的注意力分数时,你会得到一个分数矩阵,右上角的三角形充满负无穷大。

使用掩码的原因是因为一旦你采用掩码分数的 softmax,负无穷大就会被清零,从而为未来的标记留下零注意力分数。 正如在下图中看到的,“am”的注意力分数对它自己和它前面的所有单词都有值,但对单词“fine”的注意力分数为零。 这实质上告诉模型不要关注这些词。

这种掩蔽是第一个多头注意力层中注意力分数计算方式的唯一区别。 这一层仍然有多个头,蒙版被应用到这些头上,然后连接起来并通过线性层进行进一步处理。 第一个多头注意力的输出是一个屏蔽输出向量,其中包含有关模型应如何关注解码器输入的信息。

第二个多头注意和逐点前馈层

第二个多头注意层。 对于这一层,编码器的输出是查询和键,第一个多头注意层输出是值。 此过程将编码器的输入与解码器的输入相匹配,从而允许解码器决定哪个编码器输入与关注相关。 第二个多头注意力的输出通过逐点前馈层进行进一步处理。

输出概率的线性分类器和最终 Softmax

最后的逐点前馈层的输出通过最后的线性层,充当分类器。 分类器与你拥有的类别数量一样大。 例如,如果 10,000 个单词有 10,000 个类,则该分类器的输出大小为 10,000。 然后分类器的输出被送入 softmax 层,这将产生 0 到 1 之间的概率分数。我们采用最高概率分数的索引,这等于我们的预测词。

然后解码器获取输出,将其添加到解码器输入列表中,并继续解码直到预测到标记。 对于我们的案例,最高概率预测是分配给结束标记的最终类别。

解码器也可以堆叠 N 层高,每一层都从编码器和它之前的层接收输入。 通过堆叠层,该模型可以学习从其注意力头中提取和关注不同的注意力组合,从而有可能提高其预测能力。

7、结束语

就是这样! 这就是Transformer的机制。 Transformer利用注意力机制的力量做出更好的预测。 循环神经网络试图实现类似的事情,但因为它们受到短期记忆的影响。 变形金刚可以更好,特别是如果你想编码或生成长序列。 因为transformer架构,自然语言处理行业可以取得前所未有的成果。


原文链接:Illustrated Guide to Transformers- Step by Step Explanation

BimAnt翻译整理,转载请标明出处