NLP自然语言处理:Trasformer详解 - 论文《Attention is All You Need》总结

发布时间:2026/7/28 18:47:59
NLP自然语言处理:Trasformer详解 - 论文《Attention is All You Need》总结
论文《Attention is All You Need》地址:https://arxiv.org/abs/1706.03762英文原版Trasformer详解:https://jalammar.github.io/illustrated-transformer/在本文中,将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。目录一、宏观理解Trasformer二、自注意力机制2.1从宏观视角看自注意力机制2.2 从微观视角看自注意力机制2.2.1计算自注意力的第一步2.2.2计算自注意力的第二步2.2.3计算自注意力的第三、四步2.2.3计算自注意力的第五、六步2.3 通过矩阵运算实现自注意力机制2.4 “多头”注意力(“multi-headed” attention)三、使用位置编码表示序列的顺序四、残差模块五、解码组件六、最终的线性变换和Softmax层七、训练部分总结八、损失函数一、宏观理解Trasformer首先将这个模型看成是一个黑箱操作。在机器翻译中,就是输入一种语言,输出另一种语言。黑箱 = 编码组件+解码组件。它们连接组成。编码组件由一堆编码器(encoder)构成(论文中是将6个编码器叠在一起——数字6没有什么神奇之处,你也可以尝试其他数字)。解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的。所有的编码器在结构上都是相同的,但它们没有共享参数。每个解码器都可以分解成两个子层。从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。我们将在稍后的文章中更深入地研究自注意力。自注意力层的输出会传递到前馈(feed-forward)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)。解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。接下来我们看看Transformer的一个核心特性,在这里输入序列中每个位置的单词都有自己独特的路径流入编码器。在自注意力层中路径之间存在依赖关系。而前馈(feed-forward)层没有这些依赖关系。因此在前馈(feed-forward)层时可以并行执行各种路径。然后我们将以一个更短的句子为例,看看编码器的每个子层中发生了什么。一个编码器接收向量列表作为输入,接着将向量列表中的向量传递到自注意力层进行处理,然后传递到前馈神经网络层中,将输出结果传递到下一个编码器中。输入序列的每个单词都经过自编码过程。然后,他们各自通过前向传播神经网络——完全相同的网络,而每个向量都分别通过它。二、自注意力机制宏观上大致了解了Trasformer机构设置,我们来谈谈自注意力机制,能更好的了解Trasformer2.1从宏观视角看自注意力机制不要被我用自注意力这个词弄迷糊了,好像每个人都应该熟悉这个概念。其实我之也没有见过这个概念,直到读到Attention is All You Need 这篇论文时才恍然大悟。让我们精炼一下它的工作原理。例如,下列句子是我们想要翻译的输入句子:The animal didn't cross the street because it was too tired这个“it”在这个句子是指什么呢?它指的是street还是这个animal呢?这对于人类来说是一个简单的问题,但是对于算法则不是。当模型处理这个单词“it”的时候,自注意力机制会允许“it”与“animal”建立联系。随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。如果你熟悉RNN(循环神经网络),回忆一下它是如何维持隐藏层的。RNN会将它已经处理过的前面的所有单词/向量的表示与它正在处理的当前单词/向量结合起来。而自注意力机制会将所有相关单词的理解融入到我们正在处理的单词中。当我们在编码器#5(栈中最上层编码器)中编码“it”这个单词的时,注意力机制的部分会去关注“The Animal”,将它的表示的一部分编入“it”的编码中。请务必检查Tensor2Tensor notebook ,在里面你可以下载一个Transformer模型,并用交互式可视化的方式来检验。2.2 从微观视角看自注意力机制首先我们了解一下如何使用向量来计算自注意力,然后来看它实怎样用矩阵来实现。2.2.1计算自注意力的第一步计算自注意力的第一步就是从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。可以发现这些新向量在维度上比词嵌入向量更低。他们的维度是64,而词嵌入和编码器的输入/输出向量的维度是512. 但实际上不强求维度更小,这只是一种基于架构上的选择,它可以使多头注意力(multiheaded attention)的大部分计算保持不变。