详解注意力机制(Attention Mechanism),自注意力(Self-Attention),多头注意力(MultiHeadAttention)

一、注意力机制(Attention Mechanism)

注意力机制(Attention Mechanism)是深度学习领域的一个重要概念,最初在自然语言处理(NLP)中被引入,用于改进序列到序列(seq2seq)模型的性能,特别是在机器翻译任务中。这种机制允许模型在处理输入序列的不同部分时,能够“关注”或“聚焦”于其中更重要的部分,而不是平等地对待所有输入元素。


参考资料

  1. 书籍

    • Z. Li, A. Gan, et al., “动手学深度学习 第二版,” 电子工业出版社, 2021.
  2. 网络文章


1. 引入(生物学中的注意力提示)

注意力是如何应用于视觉世界的呢?让我们从一种流行的双组件框架开始探讨,该框架可以追溯到19世纪90年代的威廉·詹姆斯,他是被誉为“美国心理学之父”的人物(James, 2007)。在这个框架中,人们根据非自主性自主性的线索来选择性地引导注意力。

非自主性线索依赖于环境中的物体的显著性和可见性。想象一下,你面前有五样东西:一份报纸、一篇研究论文、一杯咖啡、一本笔记本和一本书,就像下图所示。所有的纸质物品都是黑白的,但是咖啡杯是红色的。换句话说,在这样的视觉场景中,咖啡杯显得格外醒目和引人注目,自然而然地吸引了我们的注意力。因此,我们会将视线最集中的地方放在咖啡上,如下图所示。

在这里插入图片描述

喝完咖啡后,我们可能会感到精神焕发,想要阅读书籍。于是,我们会转动头部,重新调整视线,然后专注于看书,就像下图所描绘的一样。与上图中因突出性而做出的选择不同,这次选择书籍是由我们的认知和意识控制的,所以我们在依据自主性线索做决策时会更加慎重。因为这是出于个人意愿的选择,所以它的影响力更大。

在这里插入图片描述

2. 查询、键和值

了解了自主性和非自主性注意力提示之后,我们可以探索如何运用这两种提示来构建注意力机制的神经网络框架。

首先,假设我们仅使用非自主性提示。为了偏重于感官输入的选择,我们可以简单地采用参数化的全连接层,或者甚至是非参数化的最大汇聚层或平均汇聚层。

那么,“是否包含自主性提示”就成为了区分注意力机制与其他全连接层或汇聚层的关键因素。在注意力机制的语境下,自主性提示被称为查询。对于任意查询,注意力机制通过注意力汇聚来引导选择至感官输入(比如中间特征表示)。在注意力机制中,这些感官输入被称为值。更直观地说,每个值都会与一个键相匹配,可以将其视为感官输入的非自主性提示。

如下图所示,我们可以通过设计注意力汇聚的方式来实现查询(自主性提示)与键(非自主性提示)之间的匹配,这样就能找到最匹配的值(感官输入)。

在这里插入图片描述

总结

  1. 受试者使用非自主性和自主性提示有选择性地引导注意力。前者基于突出性,后者则依赖于意识。
  2. 注意力机制与全连接层或者汇聚层的区别源于增加的自主提示。
  3. 由于包含了自主性提示,注意力机制与全连接的层或汇聚层不同。
  4. 注意力机制通过注意力汇聚使选择偏向于值(感官输入),其中包含查询(自主性提示)和键(非自主性提示)。键和值是成对的。

3. 注意力评分函数

下图说明了 如何将注意力汇聚的输出计算成为值的加权和, 其中 a a a 表示注意力评分函数。 由于注意力权重是概率分布, 因此加权和其本质上是加权平均值。

在这里插入图片描述

用数学语言描述,假设有查询 q ∈ R q q \in \mathbb{R}^q qRq m m m 个“键-值”对 ( k 1 , v 1 ) , … , ( k m , v m ) (k_1, v_1),\ldots,(k_m, v_m) (k1,v1),,(km,vm), 其中 k i ∈ R k k_i \in \mathbb{R}^k kiRk, v i ∈ R v v_i \in \mathbb{R}^v viRv。注意力汇聚函数 f f f 就被表示成值的加权和:
f ( q , ( k 1 , v 1 ) , … , ( k m , v m ) ) = ∑ i = 1 m α ( q , k i ) v i ∈ R v f(q, (k_1, v_1),\ldots,(k_m, v_m)) = \sum_{i=1}^{m}\alpha(q, k_i)v_i \in \mathbb{R}^v f(q,(k1,v1),,(km,vm))=i=1mα(q,ki)viRv其中查询 q q q 和键 k i k_i ki 的注意力权重(标量) 是通过注意力评分函数 a a a 将两个向量映射成标量, 再经过softmax运算得到的:
α ( q , k i ) = s o f t m a x ( a ( q , k i ) ) = exp ⁡ ( a ( q , k i ) ) ∑ j = 1 m exp ⁡ ( a ( q , k j ) ) ∈ R \alpha(q, k_i) = softmax(a(q, k_i)) = \frac{\exp(a(q, k_i))}{\sum_{j=1}^{m}\exp(a(q, k_j))} \in \mathbb{R} α(q,ki)=softmax(a(q,ki))=j=1mexp(a(q,kj))exp(a(q,ki))R

正如上图所示,选择不同的注意力评分函数 a a a 会导致不同的注意力汇聚操作。

3.1 掩蔽softmax操作

掩蔽 softmax 操作是 softmax 函数的一种变种,它在某些情况下用于避免 softmax 操作中不合理的元素影响最终的概率分布。在标准的 softmax 函数中,给定一个向量 z,其计算方式如下:
softmax ( z ) i = exp ⁡ ( z i ) ∑ j = 1 n exp ⁡ ( z j ) \text{softmax}(z)_i = \frac{\exp(z_i)}{\sum_{j=1}^{n}\exp(z_j)} softmax(z)i=j=1nexp(zj)exp(zi)

其中, z i z_i zi 是向量中的第 i i i 个元素,而 n n n 是向量的长度。这个函数确保了输出是一个概率分布,即所有元素的和等于 1。

然而,在某些应用中,比如自然语言处理中的注意力机制,我们可能希望忽略向量中的某些元素,因为它们对应于不应该考虑的选项(例如,序列中的填充符号)。这时,我们就可以使用掩蔽 softmax 操作。

掩蔽 softmax 操作的基本思路是在计算 softmax 之前,将一个掩蔽向量与原始向量进行逐元素相加。这个掩蔽向量通常是与原始向量同尺寸的向量,其中对于要排除的元素位置,掩蔽向量的值设置为一个非常小的数(例如, − i n f t y -infty infty 或一个很大的负数),而对于应该考虑的元素,掩蔽向量的值则为0。

例如,假设有一个向量 z = [ 1 , 2 , 3 ] z = [1, 2, 3] z=[1,2,3] ,并且掩蔽向量为 m = [ 0 , 0 , − ∞ ] m = [0, 0, -\infty] m=[0,0,] ,那么掩蔽后的向量为 z + m = [ 1 , 2 , − ∞ ] z + m = [1, 2, -\infty] z+m=[1,2,] 。在计算softmax时, − ∞ -\infty 对应的元素将被赋予几乎为 0 的概率,因此实际上从概率分布中被排除出去。

掩蔽 softmax 操作确保了在生成概率分布时,模型不会考虑无效或无关的输入,这对于保持模型的准确性和效率是非常重要的。在实践中,使用一个非常大的负数(如 − 1 e 9 -1e9 1e9)来代替 − ∞ -\infty ,因为大多数数值计算库并不支持直接操作无穷大。

3.2 加性注意力

一般来说,当查询和键是不同长度的矢量时,可以使用加性注意力作为评分函数。给定查询 q ∈ R q q \in \mathbb{R}^q qRq 和 键 k ∈ R k k \in \mathbb{R}^k kRk,加性注意力(additive attention)的评分函数为
a ( q , k ) = w v ⊤ t a n h ( W q q + W k k ) ∈ R a(q, k) = w_v^\top tanh(W_q q + W_k k) \in \mathbb{R} a(q,k)=wvtanh(Wqq+Wkk)R

其中可学习的参数是 W q ∈ R h × q W_q \in \mathbb{R}^{h \times q} WqRh×q W k ∈ R h × k W_k \in \mathbb{R}^{h \times k} WkRh×k w v ∈ R h w_v \in \mathbb{R}^h wvRh。将查询和键连结起来后输入到一个多层感知机(MLP)中,感知机包含一个隐藏层,其隐藏单元数是一个超参数 h h h。通过使用tanh作为激活函数,并且禁用偏置项。

3.3 缩放点积注意力

使用点积可以获得计算效率更高的评分函数,但点积操作要求查询和键具有相同的长度 d d d 。假设查询和键的所有元素都是独立的随机变量,并且满足零均值和单位方差,则两个向量的点积的均值为 0,方差为 d d d 。为了确保无论向量长度如何,点积的方差在不考虑向量长度的情况下仍然是 1,我们需要将点积除以 d \sqrt{d} d 。这就是缩放点积注意力(scaled dot-product attention)评分函数:
a ( q , k ) = q ⊤ k d a(q, k) = \frac{q^\top k}{\sqrt{d}} a(q,k)=d qk在实践中,我们通常从小批量的角度来考虑提高效率,例如基于 n n n 个查询和 m m m 个键-值对计算注意力,其中查询和键的长度为 d d d ,值的长度为 v v v 。查询矩阵 Q ∈ R n × d Q \in \mathbb{R}^{n \times d} QRn×d 、键矩阵 K ∈ R m × d K \in \mathbb{R}^{m \times d} KRm×d 和值矩阵 V ∈ R m × v V \in \mathbb{R}^{m \times v} VRm×v 的缩放点积注意力是:
softmax ( Q K ⊤ d ) V ∈ R n × v \text{softmax}\left( \frac{QK^\top}{\sqrt{d}} \right)V \in \mathbb{R}^{n \times v} softmax(d QK)VRn×v

二、自注意力(Self-Attention)

当我们谈论深度学习中的注意力机制时,就像是在说一个超级英雄团队里的协调员。这个协调员能够帮助团队成员聚焦于任务的关键部分,而不是浪费精力在不那么重要的事情上。在自然语言处理(NLP)领域,注意力机制帮助模型关注句子中最重要的词,而不是平等地对待每一个词。

注意力机制

想象一下,你正在阅读一篇长文章,要回答一个关于某段落的问题。通常情况下,你不会从头到尾逐字阅读,而是会快速浏览并找到与问题最相关的部分,对这部分给予更多的注意力。注意力机制在机器学习中做的是类似的事情:它让模型能够“看”到输入数据的全局,并从中挑选出最重要的信息来做出决策。

在传统的序列模型中,如循环神经网络(RNNs),信息是按顺序传递的,每一个时刻的状态都依赖于前一时刻的状态。这种结构在处理长序列时效率不高,因为重要信息可能会在序列的另一端,而模型需要通过很长的链条才能“记住”它。注意力机制打破了这种限制,让模型能够直接访问序列中的任何位置,从而更高效地提取关键信息。

自注意力机制

自注意力(Self-Attention)机制是注意力机制的一种变体,特别设计用于处理序列数据,如文本。它允许序列中的每个元素都能独立地关注到序列中的其他元素,而不仅仅是依赖于固定的上下文窗口或前一状态。

在自注意力中,每个词不仅知道它自己是什么,还能“看到”整个句子中的所有其他词。这就像在一个派对上,每个人都可以环视四周,看看谁在场,而不仅仅局限于和旁边的人交流。这种方法使得模型能够捕捉到词语之间的复杂关系,无论它们在句子中的位置如何。

自注意力 vs 一般注意力

一般的注意力机制可能依赖于外部的“键值对”,比如在机器翻译中,编码器产生的向量可以被视为键值对,解码器则使用这些键值对来生成目标语言的翻译。但是,在自注意力中,没有外部的键值对,所有的键、值和查询都是来自输入序列本身,这就是为什么它被称为“自”注意力。

自注意力的一个显著优点是它的并行性。由于每个位置都可以独立地计算其注意力权重,因此可以同时处理整个序列,这在训练大型模型时极大地提高了效率。

总结来说,自注意力机制是注意力机制的一种特殊形式,它使模型能够同时关注输入序列的所有部分,而不仅仅依赖于局部或历史信息,从而更有效地理解和处理序列数据。

1. 单个输出

针对输入是一组向量,输出也是一组向量,输入长度为 N(N 可变化)的向量,输出同样为长度为 N 的向量。

在自注意力(Self-Attention)中,我们有一个输入序列,比如一组词向量 a 1 a_1 a1, a 2 a_2 a2, a 3 a_3 a3, a 4 a_4 a4。对于每一个输入向量 a i a_i ai ,我们会得到一个对应的输出向量 b i b_i bi 。这个输出向量 b i b_i bi 不是简单地依赖于 a i a_i ai 自身,而是考虑到了序列中的所有其他向量对 a i a_i ai 的影响。

在下图中,针对 a 1 a_1 a1 你可以看到一系列虚线箭头从 a 1 a_1 a1 指向其他输入向量( a 2 , a 3 , a 4 a_2, a_3, a_4 a2,a3,a4)。这些箭头代表了输入向量 a 1 a_1 a1 与其他输入向量的关系。自注意力机制会计算每个输入向量与其他向量的相关性,然后根据这些相关性来决定每个输出向量应该包含哪些信息。

换句话说,对于每个 a i a_i ai ,我们都会问一个问题:“这个输入向量与其他向量有关吗?”如果答案是肯定的,那么这个向量会对输出产生更大的影响。这样,我们就可以得到一个全新的序列 b 1 , b 2 , b 3 , b 4 b_1, b_2, b_3, b_4 b1,b2,b3,b4 ,其中每个 b i b_i bi 都综合考虑了序列中所有其他向量对 a i a_i ai 的重要性。

所以,当你有多个输入向量时,自注意力机制会为每个输入向量生成一个输出向量,这个输出向量包含了序列中所有其他向量对当前向量的影响。

在这里插入图片描述

对于每一个输入向量 a,经过蓝色部分 self-attention 之后都输出一个向量 b,这个向量 b 是考虑了所有的输入向量对 a 1 a_1 a1 产生的影响才得到的,这里有四个词向量 a 对应就会输出四个向量 b。

在自注意力(Self-Attention)中,我们需要衡量序列中各个向量与特定向量的相关性。这里以输出向量 b 1 b_1 b1 为例,说明两种不同的计算方式。

  1. 点积法(Dot-product)

    点积法是最常用的计算相关性的方法之一,也被用于 Transformer 模型中。在这个方法中,我们首先将输入向量 a 1 a_1 a1 a 2 a_2 a2 分别乘以不同的权重矩阵 W q W_q Wq W k W_k Wk ,得到新的向量 q q q k k k 。接着,我们计算 q q q k k k 的点积,得到一个标量 α \alpha α ,这个标量表示了这两个向量之间的相关性。

    在图左中,绿色方块代表输入向量 a 1 a_1 a1 a 2 a_2 a2 ,灰色的矩形框表示权重矩阵 W q W_q Wq W k W_k Wk 。通过将 a 1 a_1 a1 乘以 W q W_q Wq 得到 q q q ,将 a 2 a_2 a2 乘以 W k W_k Wk 得到 k k k ,然后计算 q ⋅ k q \cdot k qk 得到 α \alpha α 。这个 α \alpha α 值越大,说明 a 1 a_1 a1 a 2 a_2 a2 越相关。

  2. 加性模型(Additive)

    另一种计算相关性的方法是加性模型。在这种方法中,我们同样将输入向量 a 1 a_1 a1 a 2 a_2 a2 分别乘以权重矩阵 W q W_q Wq W k W_k Wk ,但这次我们不再直接计算点积,而是将这两个向量相加,然后通过 tanh 激活函数投射到一个新的函数空间。最后,我们再次乘以另一个权重矩阵,得到最终的结果。

    在图右中,展示的就是加性模型的过程。首先, a 1 a_1 a1 a 2 a_2 a2 分别乘以 W q W_q Wq W k W_k Wk ,然后相加。接着,这个和通过 tanh 函数进行非线性变换,最后再乘以另一个权重矩阵得到结果。

在这里插入图片描述

这两种方法的目的都是为了衡量序列中不同向量之间的相关性,以便在生成输出向量时考虑到这些关系。点积法更快且更容易优化,但在某些情况下,加性模型可能表现更好。

在自注意力(Self-Attention)中,我们可以计算每个输入向量与其他向量之间的相关性,这个相关性可以用一个标量值表示,叫做注意力得分(attention score),记作 α \alpha α 。在这个例子中,我们有四个输入向量 a 1 , a 2 , a 3 , a 4 a_1, a_2, a_3, a_4 a1,a2,a3,a4 ,我们想要计算 a 1 a_1 a1 与其他向量的相关性。

首先,我们需要将每个输入向量转换成查询(query)和键(key)。查询 q q q 和键 k k k 是由输入向量乘以不同的权重矩阵得到的。在这个图中, q q q a 1 a_1 a1 乘以权重矩阵 W q W_q Wq 得到,而 k k k 由其他向量 a 2 , a 3 , a 4 a_2, a_3, a_4 a2,a3,a4 乘以权重矩阵 W k W_k Wk 得到。

然后,我们计算查询 q q q 和每个键 k k k 的点积,得到注意力得分 α \alpha α 。例如, α 1 , 2 \alpha_{1,2} α1,2 q 1 q_1 q1 k 2 k_2 k2 的点积, α 1 , 3 \alpha_{1,3} α1,3 q 1 q_1 q1 k 3 k_3 k3 的点积,以此类推。这些点积告诉我们 a 1 a_1 a1 和其他向量的相关性有多强。

在这里插入图片描述

所以,我们可以说,自注意力机制让我们能够计算每个输入向量与其他向量的注意力得分,这个得分反映了它们之间的联系强度。

在自注意力(Self-Attention)中,除了计算每个输入向量与其他向量的相关性外,我们还可以计算每个向量与其自身的相关性,并通过Softmax函数将这些相关性归一化,形成一个注意力分布。这个分布告诉我们哪个向量最相关。

首先,我们计算每个向量与其他向量的注意力得分 α \alpha α ,包括其自身的得分。例如, α 1 , 1 \alpha_{1,1} α1,1 表示 a 1 a_1 a1 与自身的相关性, α 1 , 2 \alpha_{1,2} α1,2 表示 a 1 a_1 a1 a 2 a_2 a2 的相关性,依此类推。

然后,我们把这些注意力得分送入 Softmax 函数,Softmax 函数的作用是将这些得分转化为概率分布。具体来说,Softmax 函数会把每个得分转换为一个介于 0 和 1 之间的数,使得所有得分之和等于 1。这样,我们就得到了一个归一化的注意力分布,可以直观地理解为每个向量相对于 a 1 a_1 a1 的重要性。

这个归一化后的注意力分布告诉我们,哪些向量与 a 1 a_1 a1 最相关。分数越高,说明该向量与 a 1 a_1 a1 的关系越密切。因此,通过这种方式,我们可以更准确地了解序列中每个向量与其他向量的关系。

在自注意力(Self-Attention)中,一旦我们有了归一化的注意力得分 α ′ \alpha' α ,接下来要做的就是基于这些得分提取重要信息。这一步骤被称为“注意力池化”。

首先,我们需要计算每个向量的值(Value),值 v v v 与键(Key) k k k 一样,也是由输入向量 a a a 乘以权重矩阵 W v W_v Wv 得到的。例如, v 1 v_1 v1 a 1 a_1 a1 乘以 W v W_v Wv 得到, v 2 v_2 v2 a 2 a_2 a2 乘以 W v W_v Wv 得到,以此类推。

然后,我们将每个值 v v v 与相应的注意力得分 α ′ \alpha' α 相乘。如果 a 1 a_1 a1 a 2 a_2 a2 的关联性很高,那么 α 1 , 2 ′ \alpha'_{1,2} α1,2 就会很大。这意味着 v 2 v_2 v2 在输出向量 b 1 b_1 b1 中的贡献会更大。

最后,我们将所有乘过注意力得分的值相加,得到输出向量 b 1 b_1 b1 。这个过程就像一个过滤器,它根据注意力得分选择序列中最相关的向量,让它们在输出中占据更大的比重。所以,如果 a 1 a_1 a1 a 2 a_2 a2 高度相关,那么 b 1 b_1 b1 可能会更接近于 v 2 v_2 v2 ,因为它的注意力得分高。这就是为什么我们说注意力得分决定了每个向量在结果中的分量大小。

2. 矩阵形式

在自注意力(Self-Attention)中,我们可以通过矩阵运算来生成查询(Query)、键(Key)和值(Value)。

第一步,我们计算查询、键和值。对于每个输入向量 a i a_i ai ,我们将其乘以三个不同的权重矩阵 W q W_q Wq W k W_k Wk W v W_v Wv ,得到对应的查询 q i q_i qi 、键 k i k_i ki 和值 v i v_i vi

这个过程可以表示为:
q i = W q ⋅ a i k i = W k ⋅ a i v i = W v ⋅ a i q^i = W^q \cdot a^i \\k^i = W^k \cdot a^i \\v^i = W^v \cdot a^i qi=Wqaiki=Wkaivi=Wvai

现在,我们将这些公式写成矩阵形式。假设我们有一组输入向量 I = [ a 1 , a 2 , . . . , a n ] I = [a_1, a_2, ..., a_n] I=[a1,a2,...,an] ,那么查询、键和值的生成可以表示为:

Q = W q ⋅ I K = W k ⋅ I V = W v ⋅ I Q = W^q \cdot I \\ K = W^k \cdot I \\ V = W^v \cdot I Q=WqIK=WkIV=WvI

这里的 Q Q Q K K K V V V 分别是查询、键和值的矩阵,而 I I I 是输入向量的矩阵。通过这样的矩阵运算,我们可以同时处理整个序列的所有向量,而不是单独处理每个向量。

我们可以将多个输入向量组合在一起,形成一个大的矩阵,然后一次性计算查询、键和值。

首先,我们将所有的输入向量 a 1 , a 2 , a 3 , a 4 a_1, a_2, a_3, a_4 a1,a2,a3,a4 拼接成一个矩阵,这个矩阵有四列,每一列对应一个输入向量。然后,我们将这个大矩阵分别乘以三个权重矩阵 W q W_q Wq W k W_k Wk W v W_v Wv ,得到查询矩阵 Q Q Q 、键矩阵 K K K 和值矩阵 V V V

这三个权重矩阵 W q W_q Wq W k W_k Wk W v W_v Wv 是我们需要学习的参数,它们决定着查询、键和值的具体形式。通过这样的操作,我们可以一次处理多个输入向量,提高计算效率。

在这里插入图片描述

第二步,我们需要计算每个输入向量与其他向量的相关性,也就是注意力得分(Attention Score) α \alpha α 。这里,我们通常采用点积的方法来衡量这种相关性。

首先,我们拿查询矩阵 Q Q Q 和键矩阵 K K K 进行内积运算。对于第一个查询向量 q 1 q_1 q1 ,我们将其与键矩阵 K K K 相乘,得到一个新的矩阵。这个新矩阵的每个元素都是 q 1 q_1 q1 与相应键向量的点积,比如 α 1 , 1 \alpha_{1,1} α1,1 q 1 q_1 q1 k 1 k_1 k1 的点积, α 1 , 2 \alpha_{1,2} α1,2 q 1 q_1 q1 k 2 k_2 k2 的点积,以此类推。

这个过程可以看作是计算每个查询向量与其他键向量之间的相似度。通过这种方法,我们可以知道每个向量对其他向量的影响程度。

在这里插入图片描述

同样,我们可以通过矩阵运算来计算注意力得分(Attention Score)。

公式为: α i , j = ( q i ) T ⋅ k j \alpha_{i,j} = (q^i)^T \cdot k^j αi,j=(qi)Tkj

矩阵形式: A = K T ⋅ Q A = K^T \cdot Q A=KTQ

我们使用查询矩阵 Q Q Q 和键矩阵 K K K 进行内积运算。具体来说,我们拿查询矩阵 Q Q Q 与键矩阵 K K K 的转置 K T K^T KT 相乘,得到一个新的矩阵。这个新矩阵的每个元素都是查询向量与键向量的点积,也就是注意力得分。

在这里插入图片描述

这个过程可以表示为矩阵乘法,其中 A A A 是原始注意力得分矩阵, A ′ A' A 是归一化后的注意力得分矩阵, K T K^T KT 是键矩阵的转置。通过这样的运算,我们可以快速计算出所有向量之间的注意力得分。

第三步,我们要根据注意力得分(Attention Score)抽取关键信息

公式为: b i = ∑ j = 1 n v i ⋅ α i , j ′ b_i = \sum^n_{j=1} v_i \cdot \alpha'_{i, j} bi=j=1nviαi,j

矩阵形式: O = V ⋅ A ′ O = V \cdot A' O=VA

首先,我们从归一化后的注意力得分矩阵 A ′ A' A 和值矩阵 V V V 中获取每个输入向量的信息。具体来说,我们拿每个值向量 v i v_i vi 乘以其对应的注意力得分 α i , j ′ \alpha'_{i,j} αi,j ,然后将所有结果相加,得到输出向量 b i b_i bi

这个过程可以用矩阵运算表示,其中 O O O 是输出矩阵, V V V 是值矩阵, A ′ A' A 是归一化后的注意力得分矩阵。通过这样的运算,我们可以得到每个输入向量对应的输出向量。

小结:在自注意力(Self-Attention)中,我们通过以下步骤抽取关键信息

  1. 生成查询、键和值:给定一组输入向量,我们将其乘以三个权重矩阵 W q W_q Wq W k W_k Wk W v W_v Wv ,得到查询矩阵 Q Q Q 、键矩阵 K K K 和值矩阵 V V V 。这些权重矩阵是我们需要学习的参数。

  2. 计算注意力得分:我们拿查询矩阵 Q Q Q 与键矩阵 K K K 的转置 K T K^T KT 相乘,得到注意力得分矩阵 A A A 。然后,我们对这个矩阵进行 Softmax 归一化,得到新的注意力得分矩阵 A ′ A' A

  3. 抽取信息:我们拿值矩阵 V V V 与归一化后的注意力得分矩阵 A ′ A' A 相乘,得到输出矩阵 O O O 。这个输出矩阵包含了每个输入向量的关键信息。

在这里插入图片描述

通过这样的流程,我们可以理解文本中的上下文关系,并从中抽取最重要的信息。

三、多头注意力(MultiHeadAttention)

在多头自注意力(Multi-head Self-Attention)中,我们考虑了多种类型的相关性。

首先,我们有一个输入向量 a i a_i ai ,它会生成多个查询向量 q 1 i q^{i}_{1} q1i, q 2 i q^{i}_{2} q2i 等。这些查询向量由不同的权重矩阵 W q ( 1 ) W_q^{(1)} Wq(1), W q ( 2 ) W_q^{(2)} Wq(2) 生成,用于捕捉不同类型的相关性。
q 1 i = W q ( 1 ) q i q 2 i = W q ( 2 ) q i q_1^{i} = W_q^{(1)}q^i \\q_2^{i} = W_q^{(2)}q^i q1i=Wq(1)qiq2i=Wq(2)qi 在这个例子中,我们有两个头(Head),每个头都有自己的查询、键和值。这样做的目的是让模型能够关注到不同类型的语义信息。

在这里插入图片描述

我们不仅有多个查询向量,还有多个键向量和值向量。

首先,我们有一个输入向量 a i a_i ai ,它会生成多个查询向量 q 1 i q^{i}_{1} q1i, q 2 i q^{i}_{2} q2i 等。然后,我们会生成多个键向量 k 1 i k^{i}_{1} k1i, k 2 i k^{i}_{2} k2i 和多个值向量 v 1 i v^{i}_{1} v1i, v 2 i v^{i}_{2} v2i 。这些向量都由不同的权重矩阵生成,用于捕捉不同类型的相关性。

例如,在这张图中,我们有两个头(Head),每个头都有自己的查询、键和值。这样做的目的是让模型能够关注到不同类型的语义信息。

在这里插入图片描述

在多头自注意力(Multi-head Self-Attention)中,我们同时处理多个输入向量。

首先,我们对每个输入向量 a i a_i ai a j a_j aj 生成多个查询、键和值向量。然后,我们按照之前介绍的步骤计算注意力得分并抽取信息。但是,我们会在同一组查询、键和值向量之间进行计算,而不是跨组。

也就是说,我们会有两组注意力计算,一组是基于第一组查询、键和值向量,另一组是基于第二组。最后,我们会得到两个输出向量 b i b_i bi b j b_j bj ,这两个向量分别反映了两种不同类型的相关性。

在这里插入图片描述

算出来 q、k、v 之后,进行 self-attention 操作,将属于同一类别的 q、k、v 放在一起处理,分为两类进行计算,得到两个独立的结果 b。对于第一类,按照之前讲过的注意力机制过程计算出权重系数矩阵,再与对应的值v相乘得到输出 b i , 1 b^{i,1} bi,1

在这里插入图片描述

同理,对于第二类,得到输出 b i , 2 b^{i,2} bi,2

在这里插入图片描述

这是两个 head 的例子,有多个 head 过程也一样,都是分开算 b。最后,把 b i , 1 , b i , 2 b^{i,1}, b^{i,2} bi,1,bi,2 拼接成矩阵再乘权重矩阵 W,得到 b i b^i bi ,也就是这个 self- attention 向量 a i a_i ai 的输出,如下图所示:

在这里插入图片描述

四、位置编码

在训练 self attention 时,由于没有明确的位置信息,所以需要引入一个位置向量 e i e^i ei 来表示位置信息。每一个位置设置一个 vector,叫做 positional vector ,用 e i e^i ei 表示,不同的位置有一个专属的 e i e^i ei 。在训练过程中,可以将 e i e^i ei 加入到 a i a^i ai 中,这样就可以体现位置信息了。vector 长度是人为设定的,也可以从数据中训练出来。
在这里插入图片描述

注意力机制self-attention mechanism)是Transformer模型的核心之一,它允许模型在计算表示向量时关注输入序列中的不同部分,以便更好地建模序列之间的依赖关系。 自注意力机制的基本思想是,对于一个输入序列中的每个位置,计算该位置与序列中其他位置的相似度,并将相似度作为权重将这些位置的表示向量进行加权,以生成每个位置的新表示向量。 具体来说,假设输入序列为$x_1,x_2,\cdots,x_n$,每个位置的表示向量为$h_1,h_2,\cdots,h_n$。对于位置$i$,我们可以通过计算该位置与其他位置的相似度得到一个权重向量$w_i$,其中$w_{ij}$表示位置$i$和位置$j$之间的相似度。然后,我们可以将权重向量$w_i$应用于每个位置的表示向量$h_j$,并将加权的值相加,以得到位置$i$的新表示向量$h'_i$: $$h'_i=\sum_{j=1}^n w_{ij}h_j$$ 其中,权重向量$w_i$的计算可以通过先将输入序列中每个位置的表示向量进行线性变换得到查询向量$q_i$、键向量$k_j$和值向量$v_j$,然后计算查询向量$q_i$和键向量$k_j$之间的相似度,并将相似度归一化为概率分布,以得到每个位置的注意力权重。具体来说,权重向量$w_i$的计算公式为: $$w_{ij}=\frac{\exp(q_i\cdot k_j)}{\sum_{k=1}^n \exp(q_i\cdot k_k)}$$ 其中,$\cdot$表示向量之间的点积。 自注意力机制的优点在于,它能够捕捉输入序列中不同部分之间的依赖关系,从而更好地建模序列。此外,它还可以并行计算,因为每个位置的表示向量可以独立地计算。 总之,自注意力机制是一种非常强大的序列建模工具,已经在许多NLP任务中取得了出色的表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值