Transformer算法——总结

发布时间:2023-01-28 19:30

目录

简介:

详解一——宏观黑盒:

详解二——拆分组件:

详解三——编码器和解码器:

编码器:

解码器:

 详解四——引入张量:

 详解五——观察编码器:

详解六——查询向量、键向量、值向量

 详解七——通过矩阵运算实现自注意力机制 

详解八——自注意力的矩阵运算形式

讲解九——残差模块

 详解十——Decode整体动态图


简介:

        算法出处想必大家都熟悉了,源于论文《Attention is All You Need》,代码部分可以从GitHub获取,其作为Tensor2Tensor包的一部分。(注:目前也实现了一个基于PyTorch的版本

        来看一下算法的总体结构,稍后从更容易理解的角度分析:

Transformer算法——总结_第1张图片


详解一——宏观黑盒:

        都说卷积神经网络可以看作一个黑盒子,其实Transformer算法模型也是一个黑箱操作,看图理解:在机器翻译中,很明显,输入一种语言,经过算法模型得到另一种语言的输出。

Transformer算法——总结_第2张图片

        从全局的角度看完之后,咱们来看局部的算法模型,其实它是由编码组件、解码组件和它们之间的连接组成 。如下图:

Transformer算法——总结_第3张图片


详解二——拆分组件:

        编码组件部分:由一堆编码器(encoder)构成。

        解码组件部分:由相同数量(与编码器对应)的解码器(decoder)组成。

Transformer算法——总结_第4张图片


详解三——编码器和解码器:

        所在的编码器在结构上都是相同的,但它们没有共享参数。每个解码器都可以分解成两个子层。

Transformer算法——总结_第5张图片

编码器:

        输入——>经过一个自注意力(self-attention)层(帮助编码器在对每个单词编码时关注句子的其他单词)——>前馈(feed-forward)神经网络中(每个位置的单词对应的前馈神经网络都完全一样或者说是一层窗口为一个单词的一维卷积神经网络

Transformer算法——总结_第6张图片

解码器:

        除了具有编码器的自注意力层和前馈神经网络层以外,这两层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。 


 详解四——引入张量:

        在图景中我们了解了模型,那么各种向量和张量是怎么样在模型的不同部分中,将输入转化为输出的呢?

        1、首先将每个输入单词通过词嵌入算法转换为词向量。

        2、每个单词都被嵌入为512维的向量,用上图的方框代替这些向量。

         3、词嵌入过程只发生在最底层的编码器中。所有编码器接收一个向量列表,列表中那个的每个向量大小为512维。在底层(最开始)编码器中它就是词向量,但是在其他编码器中,它就是下一层编码器的输出。(向量列表大小是我们可以设置的超参数——一般是我们训练集中最长句子的长度)。

Transformer算法——总结_第7张图片

        Transformer算法的一个核心特性:在这里输入序列中每个位置的单词都有自己独特的路径流入编码器。在自注意力层中,这些路径之间存在依赖关系。而前馈层没有这些依赖关系。因此在前馈层时可以并执行各种路径。 


 详解五——观察编码器:

        向量列表(输入)——>自注意力层——>前馈神经网络层——>输出结果——>下一个编码器中

        随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。

目的:了解如何使用向量来计算自注意力,看它怎么样用矩阵来实现。

        ①从每个编码器地输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。 X_{1}W^{Q} 权重矩阵相乘得到q_{1},就是与这个单词相关的查询向量。最终使得输入序列的每个单词的创建一个查询向量、一个键向量和一个值向量。

Transformer算法——总结_第8张图片


详解六——查询向量、键向量、值向量

        ②计算自注意力的第二步是计算得分。假设我们在这个例子的第一个词“Thinking”计算自注意力向量,我们需要输入句子中的每个单词对"Thinking"打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其他部分。

        这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1和k1的点积,第二个分数是q1和k2的点积。

Transformer算法——总结_第9张图片

        ③是将分数除以8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值),然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。

Transformer算法——总结_第10张图片

        ④这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词也会有帮助。

        ⑤是将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词。

        ⑥是对加权值向量求和(译注:自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。),然后即得到自注意力层在该位置的输出。

Transformer算法——总结_第11张图片

       

        那么Query,Key,Value是什么意思呢?它们在Attention的计算中扮演着什么角色呢?我们先看一下Attention的计算方法,整个过程可以分成7步:

        1、如上文,将输入单词转化成嵌入向量;
        2、根据嵌入向量得到 q , k , v 三个向量;
        3、为每个向量计算一个score: score=q*k ;
        4、为了梯度的稳定,Transformer使用了score归一化,即除以 sqrt(q_k) ;
        5、对score施以softmax激活函数;
        6、softmax点乘Value值 v ,得到加权的每个输入向量的评分 v ;
        7、相加之后得到最终的输出结果 z : z=sum(v) 

        实际计算过程中是采用基于矩阵的计算方式,那么论文中的Q,V,K的计算方式如:

        Transformer算法——总结_第12张图片

        Q,V,K的矩阵表示:[n, e] * [e, d^q] = [n, d^q]    其中n表示当前输入的batch个句子的最大词个数(max_seq_len=512),e表示词embedding维度,d^q/d^k/d^v都表示输出维度。

        总结为下面的矩阵形式:

         Transformer算法——总结_第13张图片

         Self-Attention的矩阵表示:([n, d^q] *[d^k, n] ) * [n, d^v] = [n, d^v]

        Note: 多头的实现不是循环的计算每个头,而是通过 transposes and reshapes,用矩阵乘法来完成的。这样Multi-Head Attention时间复杂度(同如果只使用单头)也是 

        这样自注意力的计算就完成了。得到的向量就可以传给前馈神经网络。然而实际中,这些计算是以矩阵形式完成的,以便算得更快。那我们接下来就看看如何矩阵实现的。 


 详解七——通过矩阵运算实现自注意力机制 

        ①计算查询矩阵、键矩阵和值矩阵。为此,我们将输入句子的词嵌入装进矩阵X中,将其乘以我们训练的权重矩阵W^{Q}W^{K}W^{V})。

        ②X矩阵中的每一行对应于输入句子中的每个单词。我们再次看到词嵌入向量(512,或图中的4个格子)和q/k/v向量(64,或图中的3个格子)的大小差异。

        ③最后,由于我们处理的是矩阵,我们可以将步骤2到步骤6合并为一个公式来计算自注意力层的输出。 


详解八——自注意力的矩阵运算形式

        通过增加一种叫做“多头"注意力(Multi-headed Attention)的机制,论文进一步完善了自注意力层,并在两方面提高了注意力层的性能:

        1、它扩展了模型专注于不同位置的能力。

        2、它给出了注意力层的多个”表示子空间“(representation subspaces)。接下来我们将看到,对于”多头“注意机制,我们有多个查询/键/值权重矩阵集(Transformer使用八个注意力头,因此我们对于每个编码器/解码器有八个矩阵集合)。这些集合中的每一个都是随机初始化的,在训练之后,每个集合都被用来将输入词嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。 

        在”多头“注意机制下,我们为每个头保持独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。和之前一样,我们拿X乘以W^{Q}/W^{K}/W^{V}矩阵来产生查询/键/值矩阵。

Transformer算法——总结_第14张图片

重大挑战:

         前馈神经网络层不需要8个矩阵,它只需要一个矩阵(由每一个单词的表示向量组成)。所以我们需要一种方法把这八个矩阵压缩成一个矩阵。那该怎么做?其实可以直接把这些矩阵拼接在一起,然后用一个附加的权重矩阵W^{0}与它们相乘。

Transformer算法——总结_第15张图片

以上基本上就是多头自注意力。对于这么多矩阵,我们试着把它们集中在一个图片上。

Transformer算法——总结_第16张图片


讲解九——残差模块

        编码器架构中的细节:在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接,并且都随着一个“层-归一化”步骤。

Transformer算法——总结_第17张图片

        在self-attention需要强调的最后一点是其采用了残差网络中的short-cut结构,目的当然是解决深度学习中的退化问题,得到的最终结果如图。 

Transformer算法——总结_第18张图片

        Self-Attention中的short-cut连接:注意layernorm(这个一般没有这个层);参数有共享的是:ffn(词层次的),但是参数在block或者说sub_layers之间不共享参数。 


 详解十——Decode整体动态图

        ①先通过encode生成一个词。

        ②再通过decode生成后续的词。

     

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号