当前位置:   article > 正文

机器学习--自注意力机制3 进阶_多头自注意力机制 高效运算

多头自注意力机制 高效运算

一、进阶!多头注意力

自注意力有一个进阶的版本——多头自注意力(multi-head self-attention)。多头自注意力的使用是非常广泛的,在翻译、语音识别,用比较多的头可以得到比较好的结果。至于需要用多少的头,这个又是另外一个超参数(需要我们自己设置与调节)
在使用自注意力计算相关性的时候,就是用 q 去找相关的 k。相关有很多种不同的形式,所以可以有多个 q,不同的 q 负责不同种类的相关性,这就是多头注意力。
在这里插入图片描述

如图所示,先把 a 乘上一个矩阵得到 q,接下来再把 q 乘上另外两个矩阵,分别得到q1、q2。用两个上标,qi,1 跟 qi,2 代表有两个头,i 代表的是位置,1 跟 2 代表是这个位置的第几个 q,这个问题里面有两种不同的相关性,所以需要产生两种不同的头来找两种不同的相关性
既然 q 有两个,k ,v 也就要有两个。怎么从 q 得到 q1、q2,其实就是把 q、k、v 分别乘上两个矩阵,得到不同的头。对另外一个位置也做一样的事情,另外一个位置在输入 a j以后,它也会得到两个 q、两个 k、两个 v。
做自注意力的方法跟之前讲的操作是一模一样的,只是现在 1 那一类的一起做,2 那一类的一起做。就是 q1 在算这个注意力的分数的时候,它就只管 k1 就好。qi,1 分别与 ki,1、kj,1 算注意力,在做加权和的时候也只需要看vi,1 跟 vj,1 就好,把注意力的分数乘 vi,1 和 vj,1,再相加得到 bi,1。

在这里插入图片描述

如上图所示,我们可以使用另外一个头做相同的事情。q2 只对 k2 做注意力,在做加权和的时候,只对 v2 做加权和得到 bi,2。如果有更多头,操作也是一样的。

如下图所示,得到 bi,1 跟 bi,2,可能会把 bi,1 跟 bi,2 接起来,再通过一个变换,即再乘上一个矩阵然后得到 bi,再送到下一层去,这就是自注意力的变形——多头自注意力。
在这里插入图片描述

二、位置编码

自注意力层少了一个也许很重要的信息,即位置的信息。
对一个自注意力层而言,每一个输入是出现在序列的最前面还是最后面,它是完全没有这个信息的。 1、2、3、4 是作图的时候,为了帮助大家理解所标上的一个编号。
对自注意力而言,位置 1、2 、3、4 没有任何差别,这四个位置的操作是一模一样的。对它来说,1 跟 4 的距离并没有特别远,2 跟 3 的距离也没有特别近,对它来说就是天涯若比邻,所有的位置之间的距离都是一样的,没有谁在整个序列的最前面,也没有谁在整个序列的最后面。

然而位置的信息被忽略了,位置的信息很重要时就可能出现问题。

举个例子,在做词性标注的时候,我们知道动词比较不容易出现在句首,如果某一个词汇它是放在句首的,它是动词的可能性就比较低,位置的信息往往也是有用的。因此做自注意力的时候,如果我们觉得位置的信息很重要,需要考虑位置信息时,就要用到位置编码(positional encoding)

如下图所示,位置编码为每一个位置设定一个向量,即位置向量(positional vector)。位置向量用 ei 来表示,上标 i 代表位置,不同的位置就有不同的向量,不同的位置都有一个专属的 e,把 e 加到 ai 上面就结束了。这相当于告诉自注意力位置的信息,即现在出现的位置应该是在 i 这个位置。
在这里插入图片描述
最早的 Transformer 论文 “Attention Is All You Need” 用的 ei 如下图所示。图上面每一列就代表一个 e,第一个位置就是 e1,第二个位置就是 e2,第三个位置就是 e3,以此类推。每一个位置的 a 都有一个专属的 e。模型在处理输入的时候,它可以知道现在的输入的位置的信息,这个位置向量是人为设定的。人为设定就会出现向量长度和序列不匹配的问题。
在这里插入图片描述
在最早的 “Attention Is All You Need” 论文中,其位置向量是通过正弦函数和余弦函数所产生的,如下左图,避免了人为设定向量固定长度的尴尬。

如下右图,位置编码还可以使用循环神经网络生成。

位置编码可通过各种不同的方法来产生。目前还不知道哪一种方法最好,这是一个尚待研究的问题

在这里插入图片描述

三、截断自注意力

自注意力的应用很广泛,在自然语言处理(Natural Language Processing,NLP)领域,但自注意力不是只能用在自然语言处理相关的应用上,它还可以用在很多其他的问题上。比如在做语音的时候,也可以用自注意力。不过将自注意力用于语音处理时,可以对自注意力做一些小小的改动。

之前已近举过例子了,如果要把一段声音信号表示成一组向量,这排向量可能会非常长。在做语音识别的时候,把声音信号表示成一组向量,而每一个向量只代表了 10 毫秒的长度而已。所以随便一段声音信号,通过向量序列描述它的时候,这个向量序列的长度是非常大的。

而在计算注意力矩阵的时候,其复杂度(complexity)是长度的平方。假设该矩阵的长度为 L,计算注意力矩阵 A′ 需要做 L × L 次的内积,如果 L 的值很大,计算量就很可观,并且需要很大内存(memory)才能够把该矩阵存下来。
所以如果在做语音识别的时候,我们讲一句话,这一句话所产生的这个注意力矩阵可能会太大,大到不容易处理,不容易训练。

截断自注意力(truncated self-attention)可以处理向量序列长度过大的问题。截断自注意力在做自注意力的时候不要看一整句话,就只看一个小的范围就好,这个范围是人设定的。

在做语音识别的时候,如果要辨识某个位置有什么样的音标,这个位置有什么样的内容并不需要看整句话,只要看这句话以及它前后一定范围之内的信息,就可以判断。

在做自注意力的时候,也许没有必要让自注意力考虑一整个句子,只需要考虑一个小范围就好,这样就可以加快运算的速度。这就是截断自注意力。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/368401
推荐阅读
相关标签
  

闽ICP备14008679号