分享

万字长文震撼来袭!揭秘Transformer——吐血解读自注意力机制的革命性突破

 汉无为 2024-04-13 发布于湖北

图片

万字长文深度解读Transformer:《Attention is All You Need》——揭秘自注意力机制的革命性突破。

图片

《Attention is All You Need》

五大重点内容:

  • Abstract(摘要):提出全新的Transformer模型架构,该模型完全基于注意力机制,摒弃了循环和卷积操作。

  • Introduction(引言):Transformer创始八子:聚是一团火,散是满天星。

  • Background(背景):强调了Transformer在模型设计上的创新性和自注意力机制的重要性。

  • Model Architecture(模型架构):编码器与解码器堆叠、注意力机制、位置相关的前馈神经网络、嵌入与Softmax、位置编码。

  • Why Self-Attention(为什么使用自注意力机制):高效处理长序列、易于学习长期依赖关系以及提高模型的可解释性。


Abstract(摘要)

图片

Abstract

摘要

目前主流的序列转换模型都基于复杂的循环神经网络RNN卷积神经网络CNN,包含编码器和解码器两部分。表现最好的模型还通过注意力机制将编码器和解码器连接起来。我们提出了一种全新的简单网络架构——Transformer,它完全基于注意力机制,摒弃了循环和卷积操作。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更易于并行化,且训练时间大大减少。我们的模型在WMT 2014英语到德语的翻译任务上达到了28.4的BLEU分数,比现有最佳结果(包括集成模型)高出2 BLEU以上。在WMT 2014英语到法语的翻译任务上,我们的模型在8个GPU上训练了3.5天后,创下了单模型新的最佳BLEU分数记录,达到了41.0分,这仅为文献中最佳模型训练成本的一小部分。

敲黑板,划重点

引出了新的Transformer模型架构,该模型完全基于注意力机制,摒弃了循环和卷积操作。

  • 传统序列转换模型:基于复杂的循环神经网络(RNN)或卷积神经网络(CNN),包含编码器和解码器。

  • 注意力机制高性能模型通过注意力机制连接编码器解码器,提升性能。

  • Transformer模型提出:作者提出全新的Transformer模型,完全基于注意力机制,摒弃循环和卷积。

  • Transformer模型优势:该模型质量优越,易于并行化,训练时间大幅减少。

  • 实验结果卓越:

    • 在英语到德语的翻译任务上,Transformer模型达到比现有最佳结果更高的BLEU分数。

    • 在英语到法语的翻译任务上,Transformer模型创下新的单模型最佳BLEU分数记录。

  • 训练成本降低:相比传统模型,Transformer模型的训练成本更低,训练效率更高。

1 Introduction(引言)

图片

图片

图片

Introduction

1 引言

循环神经网络RNN)、特别是长短时记忆网络(LSTM)[12]和门控循环单元网络(GRU)[7],已经在序列建模和转换问题中牢固确立了其作为最先进方法的地位,这些问题包括语言建模和机器翻译[29, 2, 5]。自那以来,众多研究持续努力拓展循环语言模型和编码器-解码器架构的边界[31, 21, 13]。这些研究不仅提高了模型的性能,还进一步探索了模型在不同任务中的适用性和效率。这些成果为自然语言处理和其他序列建模领域的发展提供了重要推动力。

*注:贡献均等。名单顺序是随机的。Jakob提出了用自注意力机制替换RNN的想法,并开始努力评估这一想法。Ashish与Illia一起设计并实现了第一个Transformer模型,并在这项工作的各个方面都发挥了关键作用。Noam提出了缩放点积注意力、多头注意力和无参数位置表示,并几乎参与了这项工作的每一个细节。Niki在我们的原始代码库和tensor2tensor中设计、实现、调优和评估了无数模型变体。Llion也尝试了新型模型变体,负责我们最初的代码库,以及高效推理和可视化。Lukasz和Aidan花费了无数漫长的时间设计和实现了tensor2tensor的各个部分,取代了我们早期的代码库,极大地改进了结果,并大大加速了我们的研究。

*注:在Google Brain工作时完成的工作。

*注:在Google Research工作时完成的工作。

循环模型通常沿着输入和输出序列的符号位置进行计算。通过将位置与计算时间步骤对齐,它们生成一个隐藏状态序列ht,该序列是前一个隐藏状态ht-1和位置t的输入的函数。这种固有的顺序性质排除了训练样本内的并行化,这在序列长度较长时变得至关重要,因为内存限制会限制跨样本的批处理。最近的工作通过因式分解技巧[18]和条件计算[26]在计算效率方面取得了显著改进,同时在后者的情况下也提高了模型性能。然而,顺序计算的基本约束仍然存在。

注意力机制已经成为各种任务中强大序列建模和转换模型的重要组成部分,允许模型在不考虑输入或输出序列中距离的情况下建模依赖关系[2,16]。然而,在大多数情况下[22],这种注意力机制是与循环网络结合使用的

在这项工作中,我们提出了Transformer模型架构,它摒弃了循环结构,转而完全依赖注意力机制来建立输入和输出之间的全局依赖关系。Transformer模型允许更多的并行化,并且在八个P100 GPU上仅训练十二小时后,即可达到翻译质量的新水平。

敲黑板,划重点

  1. 循环神经网络及其变体如LSTMGRU已成为序列建模和转换任务(如语言建模和机器翻译)中的最先进方法,并持续推动该领域的发展。

  2. 循环模型因其固有的顺序性质,在处理长序列时受到内存和计算效率的限制。尽管最近的研究通过因式分解和条件计算等方法提高了效率,但这一基本约束仍然是一个待解决的问题。

图片

循环神经网络

  1. 注意力机制在序列建模中解决了依赖关系,但大部分情况与循环网络结合使用

图片

注意力机制结合循环神经网络

  1. 引出了新的Transformer模型架构,该模型摒弃了循环结构,完全依赖注意力机制,从而实现了更高的并行化和优异的翻译质量。

图片

Transformer架构

  1. Transformer创始八子:聚是一团火,散是满天星。

  • Jakob:提出用自注意力机制替换RNN的想法,并开始评估。

  • Ashish与Illia:设计并实现了第一个Transformer模型,并在工作中发挥了关键作用。

  • Noam:提出了缩放点积注意力、多头注意力和无参数位置表示,并深入参与工作细节。

  • Niki:在原始代码库和tensor2tensor中设计、实现、调优和评估模型变体。

  • Llion:尝试新型模型变体,负责初始代码库,以及高效推理和可视化。

  • Lukasz和Aidan:设计和实现tensor2tensor,取代早期代码库,改进结果,加速研究。

图片

Transformer八子

2 Background(背景)

图片

Background

2 背景

减少顺序计算的目标也是Extended Neural GPU[20]、ByteNet[15]和ConvS2S[8]等模型的基础,它们都使用卷积神经网络作为基本构建块,为所有输入和输出位置并行计算隐藏表示。在这些模型中,将两个任意输入或输出位置的信号关联起来所需的操作数随位置之间的距离增长,对于ConvS2S是线性增长,对于ByteNet是对数增长。这使得学习远距离位置之间的依赖关系更加困难[11]。在Transformer中,这被减少到恒定数量的操作,尽管由于平均了注意力加权的位置而降低了有效分辨率,但我们通过第3.2节描述的多头注意力来抵消这一影响

自注意力(有时也称为内部注意力)是一种注意力机制,它关联单个序列中不同位置的信息,以计算序列的表示。自注意力已成功应用于多种任务中,包括阅读理解、抽象摘要、文本蕴含和学习与任务无关的句子表示[4,22,23,19]。

端到端记忆网络基于循环注意力机制,而非序列对齐的循环,已被证明在简单的语言问答和语言建模任务中表现良好[28]。

据我们所知,Transformer是第一个完全依赖自注意力来计算输入和输出表示的转换模型,不使用序列对齐的RNN或卷积。在后续章节中,我们将描述Transformer模型,阐述自注意力的动机,并讨论其相对于如[14, 15]和[8]等模型的优势。

敲黑板,划重点

  1. 引出了Multi-Head Attention:减少顺序计算是Extended Neural GPU、ByteNet和ConvS2S等模型的基础,它们利用卷积神经网络并行计算隐藏表示,但关联远距离位置的操作数随距离增长,Transformer则通过多头注意力将操作数减少到恒定,以高效学习依赖关系。

  2. 引出了Self-Attention:自注意力是一种关联单个序列不同位置以计算其表示的注意力机制,已成功应用于多种任务,如阅读理解、摘要和文本蕴含等。

  3. 引出了传统的循环注意力机制RNN+ Attention):强调了端到端记忆网络通过采用循环注意力机制,在简单的语言处理任务中展现出了良好的性能。

  4. 强调了Transformer在模型设计上的创新性和自注意力机制的重要性,并预告了后续章节将深入探讨这些内容。

3 Model Architecture(模型架构)

图片

Transformer架构

图片

Model Architecture

3 模型架构

大多数具有竞争力的神经序列转换模型都具有编码器-解码器结构[5,2,29]。在这里,编码器将符号表示的输入序列(x1,...,xn)映射到一系列连续表示z =(z1,...,zn)。给定z,解码器然后一次生成一个符号元素,从而生成输出序列(y1,...,ym)。在每个步骤中,模型是自回归的[9],在生成下一个符号时,会将先前生成的符号作为额外的输入。Transformer遵循这种总体架构,使用堆叠的自注意力机制和逐点、全连接层,分别用于编码器和解码器,如图1的左半部分和右半部分所示

图片

图1: The Transformer - model architecture

敲黑板,划重点

  1. 大多数具有竞争力的神经序列转换模型都具有编码器-解码器结构。

图片

编码器-解码器结构

  1. Transformer也遵循这种总体架构

编码器:将输入序列映射为连续表示

  • 输入处理:编码器接收一个由符号(如单词、字符等)表示的输入序列(x1,...,xn)。

  • 连续表示映射:编码器将这些符号表示的输入序列转换为一个连续的内部表示序列z =(z1,...,zn)。这个转换通常通过多层神经网络实现,可以捕捉输入序列中的语义和上下文信息。

解码器根据连续表示以自回归的方式生成输出序列

  • 自回归生成:解码器以自回归的方式工作,即它会在生成每个符号时考虑之前已经生成的符号作为额外的输入。这种机制使得解码器能够基于已生成的序列内容来预测下一个符号。

  • 输出序列生成:通过逐步生成符号,解码器最终输出一个完整的符号序列(y1,...,ym)。这个过程是迭代的,每次迭代解码器都会基于当前状态和前一个生成的符号来预测下一个符号,直到生成完整的输出序列为止。

图片

Transformer编码器-解码器结构

Transformer模型通过词嵌入、位置编码、多头注意力、残差连接和前馈网络等组件,实现了对输入序列的高效编码和输出序列的生成。

图片

  1. 编码器的初始输入是输入序列的集成(即词嵌入,它是文本在n维空间中的分布式表示),而解码器的初始输入是输出的集成。

    1. 解释:编码器和解码器是Transformer模型的两个主要组件。编码器将输入序列(通常是单词序列)转换为词嵌入,并捕获其中的语义信息。解码器则使用这些信息来生成输出序列。在Transformer中,解码器的初始输入可能是一个特殊的起始标记或编码器的某些输出,而不是传统意义上的“输出集成”。

  2. 序列的顺序(句子中单词的位置)信息非常重要。由于没有循环(因为在RNN中,单词是一个接一个处理的,处理是顺序的,所以我们可以知道单词的位置,而Transformer是并行和非顺序的),这个序列中绝对(或相对)位置的信息是通过使用正弦/余弦“位置编码”来表示的。

    1. 解释:由于Transformer模型是并行处理的,它不像RNN那样依赖顺序处理来捕捉位置信息。因此,需要添加位置编码来确保模型能够理解序列中单词的顺序。

  3. 多头注意力方法允许从不同头计算和捕获相关信息,也就是说,输入句子中所有单词的注意力分数都被计算出来。

    1. 解释:多头注意力是Transformer的一个关键组成部分,它允许模型同时关注输入序列中的多个不同位置。这有助于捕获更丰富的上下文信息。

  4. 残差连接是将输入添加到子网输出以优化深度网络的一种简单方法,整个网络使用残差连接,并在层上应用加法和归一化(使用层归一化)

    1. 解释:残差连接有助于解决深度神经网络在训练过程中的梯度消失或爆炸问题,从而提高模型的性能。

  5. 掩蔽多头自注意力与多头注意力相同,但注意力仅针对输出句子、当前预测的单词以及输出句子的前一个单词进行计算(在RNN中,输出句子的单词是一个接一个预测的,这是解码器的本质)。这个将在后面详细解释。

    1. 解释:这里描述的是解码器在生成输出序列时使用的自注意力机制的一个特定方面,即它如何关注当前预测的单词和之前已经生成的单词。

  6. 编码器和解码器的每一层都包含一个全连接前馈网络(ffn)。这由两个线性变换组成,这两个变换之间有一个ReLU激活函数。在基本的Transformer中,输入和输出的维度是dmodel = 512,隐藏层的维度是dff = 2048。

    1. 解释:前馈网络增加了模型的非线性,有助于捕获更复杂的模式。在Transformer中,这些前馈网络被添加到多头注意力机制之后,进一步增强了模型的表示能力。

3.1 Encoder and DecoderStacks(编码器与解码器堆叠)

图片

图片

Encoder and Decoder Stacks

3.1 编码器与解码器堆叠

编码器:编码器由N=6个相同的层堆叠而成。每一层包含两个子层。第一个子层是多头自注意力机制,第二个子层是一个简单的、位置相关的全连接前馈网络。我们在每个子层周围使用残差连接[10],之后是层归一化[1]。也就是说,每个子层的输出是 LayerNorm(x + Sublayer(x)),其中 Sublayer(x) 是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层都产生维度为 dmodel = 512 的输出。

解码器:解码器也是由N=6个相同的层堆叠而成。除了编码器层中的两个子层之外,解码器还插入了第三个子层,该子层对编码器堆叠的输出执行多头注意力机制。与编码器类似,我们在每个子层周围使用残差连接,之后是层归一化。我们还修改了解码器堆叠中的自注意力子层,以防止位置注意到后续位置。这种遮蔽操作,加上输出嵌入的位置偏移一个单位,确保位置i的预测只能依赖于小于i位置的已知输出。

图片

Encoder and Decoder Stacks

敲黑板,划重点

  1. 编码器和解码器通过堆叠特定子层的层结构实现功能。

  • 编码器和解码器都采用了堆叠的层结构,每层包含特定的子层以实现不同的功能。

  • 残差连接和层归一化是模型稳定训练的关键组件。

  • 解码器中特定的自注意力子层修改确保了预测的正确性,只依赖于已知的输出。

  • 固定的输出维度确保了模型内部的一致性和残差连接的有效性。

图片

Transformer Encoder-Decoder

  1. 编码器

  • 编码器由6个相同的层堆叠而成,每层包含两个子层:多头自注意力机制和位置相关的全连接前馈网络。

  • 每个子层使用残差连接和层归一化,确保模型训练时的稳定性和效率。

  • 所有子层和嵌入层产生固定维度(dmodel = 512)的输出,便于残差连接。

  1. 解码器

  • 解码器同样由6个相同的层堆叠而成,除了编码器中的两个子层外,还增加了第三个子层,用于对编码器输出的多头注意力。

  • 解码器中的自注意力子层进行了修改,防止位置注意到后续位置,确保预测只基于已知的输出。

  • 解码器也使用残差连接和层归一化来提升模型性能。

图片

编码器与解码器堆叠

编码器与解码器堆叠-工作流程

Transformer的编码器由多个包含多头自注意力层和前馈神经网络的层堆叠而成,负责处理输入序列;解码器则由多个包含掩蔽自注意力层、编码器-解码器注意力层和前馈神经网络的层堆叠构成,负责生成输出序列,二者均通过残差连接和层归一化优化信息流通。

  1. Encoder编码器

  • Transformer中的编码器部分一共6个相同的编码器层组成。

  • 每个编码器层都有两个子层,即多头自注意力层(Multi-Head Attention)层和前馈神经网络(Feed-Forward Network)。

  • 在每个子层后面都有残差连接(图中的虚线)和层归一化(LayerNorm)操作,二者合起来称为Add&Norm操作。

图片

Encoder(编码器)架构

  1. Decoder解码器

  • Transformer中的解码器部分同样一共6个相同的解码器层组成。

  • 每个解码器层都有三个子层,掩蔽自注意力层(Masked Self-Attention)、Encoder-Decoder注意力层、前馈神经网络(Feed-Forward Network)。

  • 同样,在每个子层后面都有残差连接(图中的虚线)和层归一化(LayerNorm)操作,二者合起来称为Add&Norm操作。

图片

Decoder(解码器)架构

3.2 Attention(注意力机制

图片

Attention

3.2 注意力机制

注意力函数可以描述为一个将查询(query)和一组键值对(key-value pairs)映射到输出的过程,其中查询、键、值和输出都是向量。输出是通过对值的加权求和计算得出的,每个值所赋予的权重是由查询与相应键的兼容性函数计算得出的。

敲黑板,划重点

注意力机制的核心思想:通过计算查询与键之间的兼容性来分配权重,进而实现对值的加权求和,从而得到输出。这种机制允许模型在处理信息时,能够专注于与当前任务最相关的部分,提高了模型的效率和性能。

注意力机制-组成部分

注意力机制包括“缩放点积注意力机制”和“多头注意力机制”。

  1. 点积缩放注意力机制是一种常见的注意力机制,它通过对查询向量和键向量进行点积运算,得到注意力得分,并通过缩放系数对注意力得分进行调整。

  2. 多头注意力机制则是通过将输入同时进行多个线性变换,每个变换都有自己的Q、K、V矩阵,并分别计算自己的注意力得分,最后综合所有变换的输出得到最终的输出。因此,多头注意力机制可以学习到更加丰富和多样化的特征表示,更好的模型表现能力。

图片

图2:(左)Scaled Dot-Product Attention (右)Multi-Head Attention

图2说明:

  1. (左)缩放点积注意力(Scaled Dot-Product Attention):这是一种注意力机制的实现方式,其中通过计算查询(query)和键(key)之间的缩放点积来得到注意力权重。缩放因子通常用于防止点积结果过大,导致softmax函数进入梯度饱和区。

  2. (右)多头注意力(Multi-Head Attention):这是注意力机制的一种扩展形式,其中多个注意力层并行运行。每个头都会独立地计算注意力权重和输出,然后将所有头的输出拼接起来,并可能通过一个线性变换得到最终的输出。多头注意力机制能够允许模型在不同的表示子空间中共同关注信息,从而提高了模型的表示能力。

缩放点积注意力和多头注意力两个形象的比喻:

① 我们可以将点积缩放注意力机制比作一名学生,他通过思考和计算得到了某个问题的答案。而多头注意力机制则可以将这个问题交给多个学生来解决,每个学生都有自己独特的思考方式和解决方案,最后将所有方案综合起来,得到更加全面和准确的答案。

② 想象一下,你去看一部悬疑破案题材的电影,点积缩放机制相当于只看了一次,而多头注意力机制看了N次电影,如果您只看一次这部电影,你非常有可能错过一些重要的细节导致无法理解整个故事的全貌。而经过多次反复观看,你也许就能兼顾到不同的微小细节,就能顺理成章地推理出案情的发展走势。

3.2.1 Scaled Dot-Product Attention(缩放点积注意力)

图片

图片

Scaled Dot-Product Attention

3.2.1 缩放点积注意力

我们称特定的注意力机制为“缩放点积注意力”(如图2所示)。输入包括维度为dk的查询(queries)和键(keys),以及维度为dv的值(values)。我们计算查询与所有键的点积,每个点积结果都除以√dk,然后应用softmax函数,以得到值的权重。在实际操作中,我们同时对一组查询计算注意力函数,并将这些查询打包成一个矩阵Q。同样地,键和值也被打包成矩阵K和V。我们计算输出矩阵的公式如下:

图片

最常用的两种注意力函数是加性注意力[2]和点积(乘性)注意力。点积注意力与我们的算法相同,除了缩放因子1/√dk。加性注意力使用一个带有单个隐藏层的前馈网络来计算兼容性函数。虽然两者在理论复杂度上相似,但点积注意力在实践中更快且空间效率更高,因为它可以使用高度优化的矩阵乘法代码实现。

对于较小的dk值,两种机制表现相似,但对于较大的dk值,加性注意力在没有缩放的情况下优于点积注意力[3]。我们怀疑,对于较大的dk值,点积的幅度会变得很大,使得softmax函数进入梯度极小的区域。为了抵消这种影响,我们将点积缩放为1/√dk。

敲黑板,划重点

缩放点积注意力机制是一种高效的注意力计算方法,通过缩放点积和softmax函数得到值的权重,适用于大规模数据处理,并在实践中展现出优于加性注意力的性能。

  • 缩放点积注意力机制:这是一种特定的注意力机制,通过计算查询与键的点积,并除以√dk进行缩放,然后应用softmax函数得到值的权重。这种机制允许模型在生成输出时,专注于与特定查询最相关的输入部分。

  • 输入与输出:输入包括查询、键和值,它们的维度分别为dk和dv。输出是通过对值的加权求和得到的,权重由查询与键的兼容性函数计算得出。

  • 矩阵运算:在实际操作中,查询、键和值被打包成矩阵Q、K和V,以便同时进行多个查询的注意力计算。输出矩阵是通过矩阵乘法、缩放和softmax函数等运算得到的。

  • 注意力函数的类型:最常用的两种注意力函数是加性注意力和点积注意力。加性注意力使用一个前馈网络来计算兼容性函数,而点积注意力则直接计算查询与键的点积。虽然两者在理论复杂度上相似,但点积注意力在实践中更快且空间效率更高。

  • 缩放因子的作用:对于较大的dk值,点积的幅度可能会变得很大,导致softmax函数进入梯度极小的区域。缩放因子1/√dk的作用就是防止这种情况发生,确保softmax函数能够正常工作,并产生有意义的梯度。

  • 性能比较:对于较小的dk值,加性注意力和点积注意力性能相似。但对于较大的dk值,加性注意力在没有缩放的情况下表现更好。然而,由于点积注意力可以使用优化的矩阵乘法代码实现,它在实践中通常更受欢迎。

图片

缩放点积注意力-工作流程

缩放点积注意力通过计算每个token的查询向量与所有token的键向量的点积,并经过softmax归一化得到注意力权重,再将这些权重应用于值向量进行加权求和,从而生成每个token的自注意力输出表示。

  1. 每个token对应的Query向量与每个token对应的Key向量做点积

  • 对于输入序列中的每个token,我们都有一个对应的查询向量(Query Vector, Q)和键向量(Key Vector, K)。

  • 我们计算每个查询向量与所有键向量的点积。

  • 这个步骤是在所有token之间建立关系,表示每个token对其他token的“关注”程度。

图片

QK向量点积运算

  1. 将上述点积取softmax(得到0~1之间的值,即为Attention权重)点积的结果需要经过一个softmax函数,确保所有token的注意力权重之和为1。softmax函数将点积结果转换为0到1之间的值,这些值表示了每个token相对于其他所有token的注意力权重。

图片

计算Attention权重

  1. 计算每个token相对于所有其它token的Attention权重(最终构成一个Attention矩阵)

  • 经过softmax处理后的注意力权重构成了一个Attention矩阵。

  • 这个矩阵的每一行对应一个token,每一列也对应一个token,矩阵中的每个元素表示了对应行token对列token的注意力权重。

图片

构成Attention矩阵

  1. 每个token对应的value向量乘以Attention权重,并相加,得到当前token的Self-Attention value向量

  • 使用这个Attention矩阵来加权输入序列中的值向量(Value Vector, V)。

  • 具体来说,对于每个token,我们将其对应的值向量与Attention矩阵中该token所在行的所有权重相乘,并将结果相加。

  • 这个加权求和的结果就是该token经过自注意力机制处理后的输出表示。

图片

加权求和Value向量

  1. 将上述操作应用于每个token

  • 上述操作会应用于输入序列中的每个token,从而得到每个token经过自注意力机制处理后的输出表示。

  • 这些输出表示通常会被送入模型的下一个层进行进一步的处理。

图片

应用于每个token

3.2.2 Multi-Head Attention(多头注意力)

图片

图片

Multi-Head Attention

3.2.2 多头注意力

我们并没有使用单个dmodel维度的键、值和查询来执行单一的注意力函数,而是发现将查询、键和值分别通过h个不同的、学习得到的线性投影,线性映射到dk、dk和dv维度上是有益的。然后,我们在这些投影后的查询、键和值的每一个版本上并行执行注意力函数,得到dv维度的输出值。这些输出值被拼接起来,并再次进行投影,得到最终的输出值,如图2所示。

多头注意力允许模型在不同的表示子空间中联合关注不同位置的信息。使用单个注意力头时,平均操作会抑制这种能力。

图片

这里的投影是参数矩阵WiQ∈Rdmodel×dk,WiK∈Rdmodel×dk,WiV∈Rdmodel×dv和WO∈Rhdv×dmodel。

在这项工作中,我们使用了h=8个并行注意力层或“头”。对于每一个头,我们设置dk=dv=dmodel/h=64。由于每个头的维度降低了,所以总的计算成本与全维度的单头注意力相似。

敲黑板,划重点

多头注意力机制通过并行执行多个注意力函数,并在不同表示子空间中捕获信息,提高了模型的表达能力和性能。

  • 多头注意力机制:我们采用多头注意力机制,而不是单一的注意力函数。这意味着查询、键和值分别通过多个不同的线性投影进行映射,每个投影对应一个“头”。

  • 并行执行:在每个投影后的查询、键和值版本上,我们并行执行注意力函数,从而得到多个输出值。

  • 输出值处理:这些并行计算得到的输出值被拼接起来,并经过一次额外的线性投影,得到最终的输出值。

  • 参数矩阵:投影过程是通过一系列参数矩阵实现的,这些矩阵包括WiQ、WiK、WiV和WO,它们分别对应查询、键、值和输出的投影。

  • 头的数量与维度:在这项工作中,我们使用了8个并行的注意力头(h=8)。每个头的维度(dk和dv)被设置为模型维度(dmodel)除以头的数量,即64。

  • 计算成本:由于每个头的维度较低,尽管有多头并行处理,但总的计算成本与全维度的单头注意力相似。

  • 优势:多头注意力允许模型在不同的表示子空间中联合关注不同位置的信息,从而提高了模型的表达能力和性能。而使用单个注意力头时,平均操作可能会抑制这种能力。

多头注意力-工作流程

多头注意力将每个头得到向量拼接在一起,最后乘一个线性矩阵,得到 Multi-Head Attention 的输出。

  • 输入线性变换:对于输入的Query(查询)、Key(键)和Value(值)向量,首先通过线性变换将它们映射到不同的子空间。这些线性变换的参数是模型需要学习的。

  • 分割多头:经过线性变换后,Query、Key和Value向量被分割成多个头。每个头都会独立地进行注意力计算。

  • 缩放点积注意力:在每个头内部,使用缩放点积注意力来计算Query和Key之间的注意力分数。这个分数决定了在生成输出时,模型应该关注Value向量的部分。

  • 注意力权重应用:将计算出的注意力权重应用于Value向量,得到加权的中间输出。这个过程可以理解为根据注意力权重对输入信息进行筛选和聚焦。

  • 拼接和线性变换:将所有头的加权输出拼接在一起,然后通过一个线性变换得到最终的Multi-Head Attention输出。

图片

拼接和线性变换

3.2.3 Applications of Attention in our Model(注意力机制在我们模型中的应用)

图片

Applications of Attention in our Model

3.2.3 注意力机制在我们模型中的应用

Transformer使用多头注意力机制的三种不同方式如下:

  • 在“编码器-解码器注意力”层中,查询来自前一层解码器,而记忆键和值则来自编码器的输出。这使得解码器中的每个位置都能关注输入序列中的所有位置。这模仿了序列到序列模型(如[31, 2, 8])中典型的编码器-解码器注意力机制。

  • 编码器包含自注意力层。在自注意力层中,所有的键、值和查询都来自同一个地方,即编码器前一层的输出。编码器中的每个位置都可以关注编码器前一层中的所有位置。

  • 同样,解码器中的自注意力层允许解码器中的每个位置关注解码器中包括该位置在内的所有位置。我们需要防止解码器中的信息向左流动,以保持自回归属性。我们通过将softmax输入中对应非法连接的所有值掩盖掉(设为-∞)来实现这一点。请参阅图2。

敲黑板,划重点

Transformer模型利用三种方式应用多头注意力机制,包括编码器-解码器间的全局关注、编码器内部的自交互以及解码器的自回归关注

  • Transformer模型中的注意力应用:Transformer模型使用了多头注意力机制,并在三种不同的场景中应用:编码器-解码器注意力、编码器自注意力以及解码器自注意力。

  • 编码器-解码器注意力:这种注意力机制允许解码器中的每个位置关注输入序列中的所有位置。查询来自解码器的前一层,而键和值则来自编码器的输出。

  • 编码器自注意力:在编码器的自注意力层中,所有的键、值和查询都来自编码器前一层的输出。这使得编码器中的每个位置都能关注其前一层中的所有位置。

  • 解码器自注意力:解码器中的自注意力允许每个位置关注解码器中包括该位置在内的所有位置。但为了防止信息向左流动并保持自回归属性,会通过掩盖softmax输入中对应非法连接的值来实现。

3.3 Position-wise Feed-Forward Networks(位置相关的前馈神经网络

图片

Position-wise Feed-Forward Networks

3.3 位置相关的前馈神经网络

除了注意力子层之外,我们的编码器和解码器中的每一层都包含一个全连接的前馈神经网络,该网络分别且相同地应用于每个位置。这包括两个线性变换,并在它们之间使用ReLU激活函数。

前馈神经网络(FFN)的表达式为:FFN(x) = max(0, xW1 + b1)W2 + b2 (2)

尽管线性变换在不同位置上是相同的,但它们在不同层之间使用不同的参数。另一种描述方式是将其视为两个核大小为1的卷积操作。

输入和输出的维度为dmodel = 512,而内层的维度为dff = 2048。

图片

Position-wise Feed-Forward Networks

敲黑板,划重点

位置相关的前馈神经网络Transformer模型中每层的重要组件,通过线性变换ReLU激活函数处理数据,增强模型的表达能力。

  • 网络结构:位置相关的前馈神经网络(Position-wise Feed-Forward Networks)是Transformer模型编码器和解码器中每一层的重要组成部分,除了注意力子层之外,每个位置都独立且相同地应用了一个全连接的前馈神经网络。

  • 线性变换激活函数:前馈神经网络包含两个线性变换,并在它们之间使用ReLU激活函数。这种结构有助于模型捕获并转换输入数据的复杂特征。

  • 参数特性:尽管线性变换在不同位置上是相同的,但不同层之间使用不同的参数。这种设计使得模型能够在不同层次上学习并提取不同的特征信息。

  • 维度设置:输入和输出的维度被设定为dmodel = 512,而内层的维度为dff = 2048。这种维度设置有助于模型在保持一定复杂度的同时,有效地处理输入数据。

  • 卷积操作的类比:位置相关的前馈神经网络也可以被描述为两个核大小为1的卷积操作,这种类比有助于我们更直观地理解其工作原理和在网络中的功能。

图片

位置相关的前馈神经网络

3.4 Embeddings and Softmax(嵌入与Softmax)

图片

Embeddings and Softmax

3.4 嵌入与Softmax

类似于其他序列转换模型,我们使用学习到的嵌入(embeddings)将输入和输出标记转换为维度为dmodel的向量。同样,我们使用常见的线性变换和softmax函数将解码器输出转换为预测的下一个标记的概率。在我们的模型中,两个嵌入层与softmax前的线性变换共享相同的权重矩阵,这与[24]类似。在嵌入层中,我们将这些权重乘以√dmodel。

敲黑板,划重点

嵌入与SoftmaxTransformer模型的关键组件,通过学习嵌入转换输入和输出标记为向量,并使用softmax生成概率预测,同时采用权重共享和缩放策略优化模型性能。

  • 嵌入转换:在Transformer模型中,使用学习到的嵌入(embeddings)将输入和输出标记转换为维度为dmodel的向量。这有助于将离散的标记转换为模型可以处理的连续向量表示。

  • Softmax函数:模型使用softmax函数将解码器的输出转换为预测的下一个标记的概率分布。这使得模型能够生成概率上的预测,便于后续的处理和决策。

  • 权重共享:在Transformer模型中,两个嵌入层(输入嵌入和输出嵌入)与softmax前的线性变换共享相同的权重矩阵。这种权重共享有助于减少模型参数的数量,并可能促进更好的学习和泛化能力。

  • 权重缩放:在嵌入层中,权重矩阵被乘以√dmodel。这种缩放操作可能是为了平衡嵌入向量的规模,以确保模型在训练过程中的稳定性和性能。

图片

嵌入与Softmax

3.5 Positional Encoding(位置编码)

图片

图片

Positional Encoding

3.5 位置编码

由于我们的模型不包含循环和卷积,为了让模型利用序列的顺序信息,我们必须在序列中的标记上注入一些关于相对或绝对位置的信息。为此,我们在编码器和解码器堆栈的底部向输入嵌入添加“位置编码”。位置编码的维度与嵌入的维度dmodel相同,以便可以将两者相加。关于位置编码,有多种选择,包括学习得到的和固定的[8]。

在这项工作中,我们使用不同频率的正弦和余弦函数来生成位置编码:

图片

其中pos是位置,i是维度。也就是说,位置编码的每个维度对应于一个正弦波。波长从2π到10000·2π形成几何级数。我们选择这个函数是因为我们假设它能让模型轻松地学习根据相对位置进行关注,因为对于任何固定的偏移量k,PE(pos + k)都可以表示为PE(pos)的线性函数。

我们也尝试使用学习得到的位置嵌入[8],发现这两种版本产生了几乎相同的结果(参见表3中的行(E))。我们选择正弦波版本是因为它可能允许模型外推到比训练时遇到的更长的序列长度。

图片

Positional Encoding

敲黑板,划重点

位置编码是Transformer模型中用于注入序列位置信息的机制,通过正弦和余弦函数生成,使模型能够学习基于相对位置的注意力,提高序列处理性能。

  • 必要性:由于Transformer模型不包含循环和卷积机制,无法直接捕获序列中标记的相对或绝对位置信息。因此,需要向模型注入位置编码,以使其能够利用序列的顺序。

  • 实现方式:位置编码被添加到编码器和解码器堆栈底部的输入嵌入中。这些编码具有与嵌入相同的维度,因此可以直接相加。有多种方式可以实现位置编码,包括学习得到的和固定的方法。

  • 正弦与余弦函数:在本文所述的工作中,位置编码是通过使用不同频率的正弦和余弦函数生成的。每个维度的位置编码对应一个正弦波,且波长形成几何级数。这种设计假设能够使模型容易学习根据相对位置进行关注。

  • 实验结果:实验表明,使用正弦波版本的位置编码与使用学习得到的位置嵌入产生了几乎相同的结果。正弦波版本被选中是因为它可能允许模型外推到更长的序列长度,超出训练时遇到的长度。

图片

位置编码

4 Why Self-Attention(为什么使用自注意力机制)

图片

图片

4 为什么选择自注意力机制

在本节中,我们将比较自注意力层与常用于将一个可变长度的符号表示序列(x1,...,xn)映射到另一个等长序列(z1,...,zn)的循环和卷积层之间的各个方面,其中xi,zi ∈ Rd,例如典型序列转换编码器或解码器中的隐藏层。为了激发我们使用自注意力机制的动力,我们考虑了三个理想特性。

第一个特性是每一层的总计算复杂度。另一个特性是可以并行化的计算量,这可以通过所需的最小顺序操作数来衡量。

第三个特性是网络中长期依赖关系的路径长度。在许多序列转换任务中,学习长期依赖关系是一个关键挑战。影响学习这种依赖关系能力的一个关键因素是信号在网络中向前和向后传播所需经过的路径长度。输入和输出序列中任意组合位置之间的这些路径越短,学习长期依赖关系就越容易[12]。因此,我们还将比较由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。

图片

如表1所示,自注意力层通过恒定数量的顺序执行操作将所有位置连接起来,而循环层则需要O(n)个顺序操作。在计算复杂度方面,当序列长度n小于表示维度d时,自注意力层比循环层更快,这在机器翻译中先进模型所使用的句子表示中通常是这种情况,例如单词片段[38]和字节对[31]表示。为了提高涉及非常长序列的任务的计算性能,自注意力可以限制为仅考虑输入序列中以相应输出位置为中心的大小为r的邻域。这将使最大路径长度增加到O(n/r)。我们计划在未来的工作中进一步调查这种方法。

单个卷积层,如果其核宽度k < n,则不会连接所有输入和输出位置对。要做到这一点,在连续核的情况下需要堆叠O(n/k)个卷积层,或在扩张卷积的情况下需要O(logk(n))个卷积层[18],这会增加网络中任意两个位置之间的最长路径长度。卷积层通常比循环层更昂贵,高出k倍。然而,可分离卷积[6]可以大大降低复杂度,降至O(k · n · d + n · d^2)。即使k = n,可分离卷积的复杂度也等于我们模型中采用的自注意力层和逐点前馈层的组合。

作为附加好处,自注意力可能会产生更可解释的模型。我们检查了模型中的注意力分布,并在附录中呈现和讨论了示例。不仅单独的注意力头明显学会了执行不同的任务,而且许多注意力头似乎表现出与句子的句法和语义结构相关的行为。

敲黑板,划重点

使用自注意力机制的原因主要在于其高效处理长序列、易于学习长期依赖关系以及提高模型的可解释性。这些优势使得自注意力层在序列转换任务中成为一个有力的工具。

  • 高效处理长序列:自注意力机制通过直接连接所有位置,避免了循环层所需的顺序操作,提高了处理长序列的效率。

  • 学习长期依赖:自注意力机制能够更容易地捕获序列中的长期依赖关系,这对于许多序列转换任务至关重要。

  • 模型可解释性:自注意力机制使得模型更易于理解和解释,注意力分布可以揭示模型在决策过程中的依据。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多