前言
最近恰好有空,所以就科学上网学习了一篇著名的论文《Attention Is All You Need》打算写下篇学习笔记提升自己对Transformer的理解。
原文链接:Attention Is All You Need
书接上回,我们聊完了Transformer的摘要部分,并补充了一点前置知识,那么我们就趁热打铁继续来好好研究一下这篇论文吧!
Introduction
Recurrent neural networks, long short-term memory and gated recurrent neural networks in particular, have been firmly established as state of the art approaches in sequence modeling and transduction problems such as language modeling and machine translation .
循环神经网络(RNN)及其变体是当前的序列转导任务的主流方法
Recent work has achieved significant improvements in computational efficiency through factorization tricks and conditional computation , while also improving model performance in case of the latter. The fundamental constraint of sequential computation, however, remains. RNN的局限性根本原因在于递归计算、顺序计算导致训练过程无法有效并行化
Attention mechanisms have become an integral part of compelling sequence modeling and transduction models in various tasks, allowing modeling of dependencies without regard to their distance in the input or output sequences. In all but a few cases, however, such attention mechanisms are used in conjunction with a recurrent network.
注意力机制的引入让它能够捕捉序列中任意位置的依赖关系,而不依赖于递归计算的顺序性,但是在绝大多数情况下,它仅仅作为一种增强,还是把它和RNN一同使用。它没有抛弃这种顺序网络计算的结构。
In this work we propose the Transformer, a model architecture eschewing recurrence and instead relying entirely on an attention mechanism to draw global dependencies between input and output.
而本文提出的Transformer结构模型直接抛弃了RNN,它完全依赖于注意力机制,不再基于递归网络RNN。
Background
The goal of reducing sequential computation also forms the foundation of the Extended Neural GPU, ByteNet and ConvS2S , all of which use convolutional neural networks as basic building block, computing hidden representations in parallel for all input and output positions In these models,the number of operations required to relate signals from two arbitrary input or output positions grows in the distance between positions, linearly for ConvS2S and logarithmically for ByteNet. This makes it more difficult to learn dependencies between distant positions. In the Transformer this is reduced to a constant number of operations, albeit at the cost of reduced effective resolution due to averaging attention-weighted positions, an effect we counteract with Multi-Head Attention as described in section.
为了解决顺序计算的难题,一些模式引入了卷积神经网络(CNN)来支持并行计算,但是这些模型还是有着难以捕捉远距离依赖的问题。而Transformer通过注意力机制彻底的解决了以往的所有问题。
Self-attention, sometimes called intra-attention is an attention mechanism relating different positions of a single sequence in order to compute a representation of the sequence.
自注意力机制是一种把单个序列的不同位置关联起来用来计算该序列表示的注意力机制。
End-to-end memory networks are based on a recurrent attention mechanism instead of sequencealigned recurrence and have been shown to perform well on simple-language question answering and language modeling tasks.
端到端记忆网络基于循环注意力机制,而非序列对齐循环也已经被证明在简单语言问答和语言建模任务中表现良好。
To the best of our knowledge, however, the Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequencealigned RNNs or convolution.
最后总结下来,Transformer是首个完全基于自注意力并不使用RNN或CNN序列建模模型。
Model Architecture
Transformer + Self-attention的设计思想主要是想解决串行计算的问题,那么串行计算发生在哪里?我们先回到注意力机制那里的编码器-解码器,正常我们要编译一段数据,所处后面的数据是要等到在它之前的数据被编码完成后才轮到它编码。但是实际上机器学习的训练我们是能有答案的,在最开始的时候,我们让正确的数据一个作为输入一个作为预期输出,都会被我们送进模型之中进行训练。所以,实际上是没有必要去等待,在理论上模型是有上下文的信息,只是说原来这个生成的方式强迫他们去等待(RNN想要模拟时序的输入),那么我们现在让他们无需等待,我们采用另外一种方式编码和解码。在编码的时候,我们会把每一个词都转换成一个向量。在Transformer中,它是一个512维的向量(是因为实验得出这个维度比较好用,所以大家都采用这个维度)。在编码的"人"的时候,我们可以让它以一个全局的视角去看到整个上下文的信息,也就是其他所有词的信息,然后把这些信息都编码到"人"这个语义向量上面去。对于其他所有的token都做完全相同的操作并且这件事情是在同一时刻发生的。这是一个完全可以并行处理的过程,这就很好的让大家都无需等待。由于我们这种编码方式不像循环神经网络一样可以自然的去把这个时序信息、位置顺序信息传递过去,所有还需要通过另外一种额外的编码去把每一个token这个位置信息也编码进入这个向量里面。经过这样一系列的操作,我们得到了一个非常全面的一个矩阵。
对于解码器的工作也是非常类似的,我们手里有预期输出,把目标句子直接一起给模型。所以,我们可以直接让它看到前面生成的信息,自己的位置留个空白,后面的信息直接遮挡。这样的话,就可以让它根据前面已知的前文和已知的输入编码好的上下文结果去做留给它空位的预测。那么对于每个位置都是一样的,我可以通过这样方式同时的去让模型在训练过程中去给每个位置做预测,这样也就避开了前面发生串行化计算的问题。
当然目前所讨论的情况只是在训练的时候同时给每个位置上做编码,同时在每个位置上做生成。但是在我们实际使用已经训练好的Transformer的过程中,我们自然没有这个预期答案了。所以我们还是要一个一个按顺序的去生成这个结果,因为模型不可能在输入的这一瞬间它就知道这一整个句子是什么东西。
以上就是模型的整体设计,我们接着来看看模型的整个结构以及训练的一个工作过程。
在Inputs处就是我们的输入,Outputs处就是我们预期输出的位置,Output Probabilities处是模型最终生成的预测,这个并不完全和我们预期输出的结果完全一致。我们需要不断的训练去优化它预测的输出。
模型左边的是编码器,右边的是解码器,它的结构和之前的RNN彻底不一样了。
首先把Inputs输入经过Input Embedding词嵌入将每一个词都转换成机器可以理解的向量的形式。Embedding的方式有各种各样,但是经过实践的检验发现往往Embedding方式和模型一起训练处理的效果是最好的。接着就是Positional Encoding去给Embedding后的向量叠加上位置信息。在Multi-Head Attention前面有三个方向(query,key,value)的输入方向,每个链路上都有不同的权重矩阵。现在我们Embedding的向量上有语义信息和位置信息,就差把给每一个词编码上它的上下文信息叠加进去原始的向量里去。
为什么会有三个方向呢?三个方向也对应了我们需要给向量加入的三个信息。语义信息就是让一个个词转成向量,位置信息就是该词在这个数据中所处的位置,上下文信息就是这个词在上下文中的含义。相同的词所在不同的数据中经过这三个编码所得到的向量应该是不一样的。
前面我们聊的这一个过程就是单头注意力机制,而我们的Transformer架构有着自己的创新,即多头注意力机制。多头注意力机制在前面经过三个方向的运算后降低了矩阵的维度增加了矩阵的数量,然后再把生成的这一堆矩阵经过一个线性层再进行融合成和单头注意力机制一样规模的矩阵。在高维空间中,我们可以划分的更加仔细。把它降维后形成一个小范围的语义子空间。
那么我们为什么要使用多个头?在单头中都是以512进行计算,而我们多头就把它映射成了8组64维的向量再进行后续计算,所以每个头能关注的重点信息是不一样的,这样就能让模型学到更丰富更详细的表示。
目前我们已经得到了一个包含输入原始的语义信息、位置编码和上下文信息的矩阵,接下来就是要Add(残差连接)和Norm(归一化),Add把前面的输入加上第一个模块得到的结构进行简单相加,这样就不管第一个模型输出的结构怎么样,我们还是可以把前面的信息往下传递,Norm就是为了让数值更加趋于稳定,方便我们后续的训练。
再往后就是FNN,增加了模型的非线性的表达能力,引入看更多的参数去给它训练,再经过一次Add和Norm就结束了编码器的整个流程。
解码器的流程和编码器是类似的,唯一要注意的是解码器的是Masked Mulit-Head Attention,这是一个带掩码的多头注意力机制。前面我们提到想要并行的进行训练,要让机器去预测语句的一个词,我可以让它看到在它之前的词,我可以让它看到前面编码好的上下文信息,但是我不能让它看到预期输出的它自己,也不能让它看到后文的信息,因为后文的信息还没有生成。
在解码器中也有三个方向,其中query是来自下面Outputs中输出的输入,而key和value是来自我们编码器编码好的结果。
解码器流程结束后就是要经过Linear和Softmax层。在Linear层会把前面得到的向量映射到到一个很大的向量中,每个位置就代表它在这个词上面的得分。Softmax就是把前面的得分映射成一个概率,统一的把它标准化了,那么最后拿概率的最大值的索引去查词表,这样就得到了最终位置上的词到底是什么。
Why Self-Attention
为什么这样的创新能够带来这样突破性的改变呢?
One is the total computational complexity per layer. Another is the amount of computation that can be parallelized, as measured by the minimum number of sequential operations required.
The third is the path length between long-range dependencies in the network. Learning long-range dependencies is a key challenge in many sequence transduction tasks. One key factor affecting the ability to learn such dependencies is the length of the paths forward and backward signals have to traverse in the network. The shorter these paths between any combination of positions in the input and output sequences, the easier it is to learn long-range dependencies.
首先就是Self-Attention Layer的每层的计算总复杂度是要低于以前的这些神经网络,其次就是它有着并行计算的能力彻底的解决了RNN的这个串行计算的问题,这个瓶颈的突破是非常重要的。再者就是解决了模型内部长距离依赖的能力,在注意力模块中它把句子不管有多长都可以把上下文这些信息编码进去。
Ending
在论文的后面就是Tranining、Results、Conclusion的部分,主要就讲了一下Transformer模型的训练过程以及训练效果之类的。
以上就是我对Transformer架构学习的主要内容了,这篇对架构的流程核心内容讲解更加多些。看完上篇和本篇,相信你一定已经对Transformer有了个基本的了解。