Self-Attention机制

Self-Attention介绍 本文我们来详细介绍Transformer中的self-attention机制,然后再来看看它是如何使用矩阵来实现的。
Self-Attention机制
文章图片

计算self-attention的第一步是利用Encoder的输入来创建3个向量,分别为Q、K和V,它们被作为一种抽象的向量,主要目的是用来做计算和辅助attention。对于每个单词,都分别要创建一个Query向量,一个Key向量和一个Value向量。这些向量是通过开始的Embedding分别乘以我们训练过程中创建的3个训练矩阵(WQ,WK,WV)以产生的。
这些新向量的维度远远小于嵌入向量的维度。在文章中,我们知道嵌入向量的维度为512,而这里的新向量的维度只有64维。假设我们inputs的维度是(m, 512),其中m代表了字的个数。所以输入向量与三个矩阵相乘之后得到的Q、K和V的维度就是(m, 64)。它们不一定要小,这是一种架构选择,可以使多头注意力计算(大多数)不变。
将x1乘以WQ得到Query向量 q1,同理得到 Key 向量 和, Value 向量。这三个向量对 attention 的计算有很重要的作用。
Self-Attention机制
文章图片

我们将乘以的权重矩阵得到新向量,既是“query”的向量。同理,最终我们可以对输入句子的每个单词创建“query”,
“key”,“value”的新向量表示形式。
假设我们要计算一个例子中第一个单词 “Thinking” 的 self-attention,就需要根据这个单词,对输入句子的每个单词进行评分,这个分数决定了对其他单词放置多少关注度。
分数的计算方法是,如果我们正在考虑 “Thinking” 这个词,就用它的 q1 去乘以每个位置的 ki,随后将得分加以处理再传递给 softmax,将得分除以维数的平方根(文中是8),以获得更稳定的梯度,然后通过Softmax计算, 其目的是使分数归一化。
这个 softmax 分数决定了每个单词在该位置表达的程度。相关联的单词将具有相应位置上最高的softmax分数。用这个得分乘以每个 value 向量,目的让我们想要关注单词的值保持不变,并通过乘以 一个很小的数字,来降低对不相关单词的关注度。
Self-Attention机制
文章图片

【Self-Attention机制】Self-Attention机制
文章图片

这个softmax的分数决定了当前单词在每个句子中每个单词位置的表示程度。很明显,当前单词对应句子中此单词所在位置的softmax的分数最高,但是,有时候attention机制也能关注到此单词外的其他单词,这很有用。
下图倒数第二行是将每个Value向量乘以softmax后的得分。这里实际上的意义在于保存对当前词的关注度不变的情况下,降低对不相关词的关注。
最后一部为累加加权值的向量。 这会在此位置产生self-attention层的输出(对于第一个单词)。
Self-Attention机制
文章图片

总结self-attention的计算过程,(单词级别)就是得到一个我们可以放到前馈神经网络的矢量。 然而在实际的实现过程中,该计算会以矩阵的形式完成,以便更快地处理。下面我们来看看Self-Attention的矩阵计算方式。
图示具体矩阵计算过程 Self-Attention机制
文章图片

X矩阵中的每一行对应于输入句子中的一个单词0向量。 我们看到的X每一行的方框数实际上是词嵌入的维度,按照论文中所说的,这个维度是512维,相应地,中间列的每一个W矩阵的列数是64位。
最后一步是self-attention层的输出,其矩阵运算形式如下:
Self-Attention机制
文章图片

multi-headed 注意力机制 为了进一步完善自注意力层,文章引入了“Multi-headed”机制。“Multi-headed”的主要特点如下:

  1. 它拓展了模型关注多个位置的能力。就比如上述中所提到的“it”指代的例子,就能起到一个很好的作用。
2.它为attention层提供了多个“representation subspaces”。由下图可以看到,在self attention中有多达8个Q、K、V权重矩阵。这些矩阵都是随机初始化的,经过训练之后,每个矩阵会将input embeddings 投影到不同的表示子空间中。
Self-Attention机制
文章图片

通过multi-headed attention,我们为每个“header”都独立维护一套Q/K/V的权值矩阵。然后我们还是如之前单词级别的计算过程一样处理这些数据。
如果对上面的例子做同样的self attention计算,而因为我们有8头attention,所以我们会分8次去计算这些不同的权值矩阵,因此最后结束时,我们会得到8个不同的矩阵。如下图:
Self-Attention机制
文章图片

这给我们带来了一点挑战。前馈层只需要一个矩阵(由每一个单词的表示向量组成)。所以我们需要一种方法把这八个矩阵压缩成一个矩阵。那该怎么做?由此使用了拼接技术,首先将这些矩阵拼接在一起,然后用一个附加的权重矩阵Wo与它们相乘。具体步骤如下图所示:
Self-Attention机制
文章图片

这样multi-headed self attention的全部内容就介绍完了。之前可能都是一些过程的图解,现在咱们用一个整体的框图来表示一下整个计算的过程,希望可以加深理解。
Self-Attention机制
文章图片

Self-Attention机制
文章图片

现在让我们重新审视我们之前的例子,看看例句中的“it”这个单词在不同的attention header情况下会有怎样不同的关注点。下图显示了在例句中,it 在不同的注意力 heads中所关注的位置,一个注意力的焦点主要集中在“animal”上,而另一个注意力集中在“tired”,换句话说,it 是 “animal”和“tired”的一种表现形式。
当然如果选了8个层,将所有注意力 heads 都添加到图片中,就有点难以解释了。如下两张图所示:
Self-Attention机制
文章图片

Self-Attention机制
文章图片

    推荐阅读