注意力机制详解

一文读懂注意力机制 - 知乎一、注意力机制是什么假设有一天热爱绘画的你决定去户外写生,你来到一片山坡上,极目远去,心旷神怡。头顶一片蔚蓝,脚踩一席草绿,远处山川连绵,眼前花草送香,暖阳含羞云后,轻风拂动衣襟,鸟啼虫鸣入耳,美景…https://zhuanlan.zhihu.com/p/393940472

一、注意力机制是什么:

让你在某一时刻将注意力放到某些事物上,而忽略另外的一些事物,这就是注意力机制(Attention Mechanism)

在深度学习领域,模型往往需要接收和处理大量的数据,然而在特定的某个时刻,往往只有少部分的某些数据是重要的,这种情况就非常适合Attention机制发光发热。

其中encoder端对"who are you"进行编码,然后将整句话的信息传递给decoder端,由decoder解码出"我是谁"。在这个过程中,decoder是逐字解码的,如果在每次解码的过程中接收信息过多,可能会导致模型的内部混乱,从而导致错误结果的出现。我们可以使用Attention机制来解决这个问题,在生成"你"的时候和单词"you"关系比较大,和"who are"关系不大,所以在这个过程中使用Attention机制,将更多注意力到"you"上,而不太多关注"who are",从而提高整体模型的表现。

二、经典注意力机制:

2.1 用机器翻译带你看Attention机制的计算

什么是机器翻译?以中译英为例,机器翻译是将一串中文语句翻译为对应的英文语句,如所示。

下图展示了一种经典的机器翻译结构Seq-to-Seq,并且向其中添加了Attention计算

Seq-to-Seq结构包含两个部分:Encoder和Decoder。其中Encoder用于将中文语句进行编码,这些编码后续将提供给Decoder进行使用;Decoder将根据Encoder的数据进行解码。

其中,生成单词"machine"时的计算方式是:首先将Decoder前一个时刻的输出状态q2与Encoder的输出进行Attention计算,得到一个当前时刻的 context,用公式可以这样组织:

解释一下,这里的 s(qi,hj) 表示注意力打分函数,它是个标量其大小描述了当前时刻在这些Encoder的结果上的关注程度,这个函数在后边会展开讨论。然后用softmax对这个结果进行归一化,最后使用加权求和获得当前时刻的上下文向量 context。这个 context 可以解释为:截止到当前已经有了"I love",在此基础上下一个时刻应该更加关注源中文语句的那些内容。这就是关于Attention机制的一个完整计算。 最后,将这个 context 和上个时刻的输出"love"进行融合作为当前时刻RNN单元的输入。

2.2 注意力机制的正式引入

前边2.1还有点小尾巴(注意力打分函数的计算)没有展开。在讲这个函数之前,我们先来对上边的Attention机制的计算做个总结,下图详细地描述了Attention机制的计算原理

假设现在我们要对一组输入 H=[h1,h2,h3,...,hn] 使用Attention机制计算重要的内容,这里往往需要一个查询向量 q (这个向量往往和你做的任务有关,比如机器翻译中用到的那个 q2 ) ,然后通过一个打分函数计算查询向量 q 和每个输入 hi 之间的相关性,得出一个分数。接下来使用softmax对这些分数进行归一化,归一化后的结果便是查询向量 q 在各个输入 hi 上的注意力分布 a=[a1,a2,a3,...,an] ,其中每一项数值和原始的输入 H=[h1,h2,h3,...,hn] 一一对应。以 ai 为例,相关计算公式如下:

以 ai 为例,相关计算公式如下:

最后根据这些注意力分布可以去有选择性的从输入信息 $H$​ 中提取信息,这里比较常用的信息提取方式,是一种"软性"的信息提取(上图展示的就是一种"软性"注意力),即根据注意力分布对输入信息进行加权求和,最终的这个结果 context​ 体现了模型当前应该关注的内容:

现在我们来解决之前的小尾巴打分函数,它可以使用以下几种方式来计算:

以上公式中的参数 、和W、U和v 均是可学习的参数矩阵或向量, D 为输入向量的维度。下边我们来分析一下这些分数计算方式的差别。

  1. 加性模型引入了可学习的参数,将查询向量 q 和原始输入向量 $h$ 映射到不同的向量空间后进行计算打分。
  2. 显然相较于加性模型,点积模型具有更好的计算效率。另外,当输入向量的维度比较高的时候,点积模型通常有比较大的方差,从而导致Softmax函数的梯度会比较小。
  3. 因此缩放点积模型通过除以一个平方根项来平滑分数数值,也相当于平滑最终的注意力分布,缓解这个问题。
  4. 最后,双线性模型可以重塑为 s(hi,q)=hTWq=hT(UTV)q=(Uh)T(Vq) ,即分别对查询向量 q 和原始输入向量 $h$进行线性变换之后,再计算点积。相比点积模型,双线性模型在计算相似度时引入了非对称性。

三、 注意力机制的一些变体

3.1 硬性注意力机制

经典注意力机制章节我们使用了一种软性注意力的方式进行Attention机制,它通过注意力分布来加权求和融合各个输入向量。而硬性注意力(Hard Attention)机制则不是采用这种方式,而是根据注意力分布选择输入向量中的一个作为输出。这里有两种选择方式:

  • 选择注意力分布中,分数最大的那一项对应的输入向量作为Attention机制的输出
  • 根据注意力分布进行随机采样,采样结果作为Attention机制的输出。

硬性注意力通过以上两种方式选择Attention的输出,这会使得最终的损失函数与注意力分布之间的函数关系不可导,导致无法使用反向传播算法训练模型,硬性注意力通常使用强化学习进行训练。

因此,一般深度学习算法会使用软性注意力的方式进行计算!!

3.2 键值对注意力机制

假设我们的输入信息不再是前边所提到的 H=[h1,h2,h3,...,hn] ,而是更为一般的键值对(key-value pair)形式 (K,V)=[(k1,v1),(k2,v2),...,(kn,vn)] ,相关的查询向量仍然为 q 。这种模式下,一般会使用查询向量 q 和相应的 ki 进行计算注意力权值 ai 。

计算出在输入数据上的注意力分布之后,利用注意力分布和键值对中的对应进行加权融合计算:

显然,当键值相同的情况下 k=v ,键值对注意力就退化成了普通的经典注意力机制!

3.3 多头注意力机制

多头注意力(Multi-Head Attention)是利用多个查询向量 Q=[q1,q2,...,qm] ,并行地从输入信息 (K,V)=[(k1,v1),(k2,v2),...,(kn,vn)] 中选取多组信息。在查询过程中,每个查询向量 qi 将会关注输入信息的不同部分,即从不同的角度上去分析当前的输入信息。

假设 aij 代表第 i 个查询向量 qi 与第 j 个输入信息 kj 的注意力权重,contexti 代表由查询向量 qi 计算得出的Attention输出向量。其计算方式为:

 最终将所有查询向量的结果进行拼接作为最终的结果:

公式里的 ⊕ 表示向量拼接操作。

四、自注意力机制

在前边所讲的内容中,我们会使用一个查询向量 q 和对应的输入 H=[h1,h2,...,hn] 进行attention计算,这里的查询向量 q 往往和任务相关,比如基于Seq-to-Seq的机器翻译任务中,这个查询向量 q 可以是Decoder端前个时刻的输出状态向量

然而在自注意力机制(self-Attention)中,这里的查询向量可以使用输入信息进行生成而不是选择一个上述任务相关的查询向量。相当于模型读到输入信息后,根据输入信息本身决定当前最重要的信息。

自注意力机制往往采用查询-键-值(Query-Key-Value)的模式,不妨以BERT中的自注意力机制展开讨论,如下图所示。

其中,输入信息 H=[h1,h2] 其中蓝色矩阵中每行代表对应一个输入向量,另图中有Wq,Wk,Wv 3个矩阵,它们负责将输入信息 $H$​ 依次转换到对应的查询空间 Q=[q1,q2] 键空间 K=[k1,k2] 和值空间 V=[v1,v2] :

 在获得输入信息在不同空间的表达Q、K​和V​ 后,这里不妨以 h1 这个为例,去计算这个位置的一个attention输出向量 context1 ,它代表在这个位置模型应该重点关注的内容,如下图所示。 

  1. 可以看到在获得原始输入 H 在查询空间、键空间和值空间的表达 、和Q、K和V 后,计算q1在h1和h2的分数s11和s12 ,这里的分数计算采用的是点积操作
  2. 然后将分数进行缩放并使用softmax进行归一化获得h1 这个位置的注意力分布: a11和a12 ,它们代表模型当前在 h1 这个位置需要对输入信息和h1和h2 的关注程度
  3. 最后根据该位置的注意力分布对和v1和v2 进行加权平均获得最终 h1 这个位置的Attention向量 context1。
  4. 同理,你可以获得第2个位置的Attention向量 context2 ,或者继续扩展输入序列获得更多的 contexti ,原理都是一样的。

假设当前输入信息 H=[h1,h2,...,hn] ,我们使用自注意力机制获取每个位置的输出 :

context=[context1,context2,...,contextn] 。

首先,需要将原始输入映射到查询空间 Q 、键空间 K 和值空间 V ,相关计算公式如下:

接下来,我们将去计算每个位置的注意力分布,并且将相应结果进行加权求和

其中 s(qi,kj) 是经过上述点积、缩放后分数值。

最后为了加快计算,这里可以使用矩阵计算,一次算出所有位置的Attention输出向量:

恭喜,看到这里相信你已经非清楚自注意力机制的原理了嘻嘻嘻!!

<think>好的,用户想了解键值对注意力机制的应用和原理。首先,我需要回顾一下之前学过的注意力机制相关知识,尤其是键值对注意力部分。根据提供的引用,特别是引用3,里面提到键值对注意力在现代机器学习的NLP和CV中很重要,模拟人脑注意力,提升模型效率。 先整理概念部分。键值对注意力应该涉及到查询(Query)、键(Key)、值(Value)这三个组件。根据引用3,这三个可能来自同一个输入序列,但可能有不同的变换。需要解释这三个的作用,比如Query用来匹配Key,然后生成权重,再作用在Value上。 接下来是原理部分。可能需要描述计算步骤:首先计算Query和Key的相似度,比如点积或者缩放点积,然后应用softmax得到权重,再和Value相乘得到加权后的结果。这部分需要数学公式,按照用户的系统指令,行内公式用$...$,独立公式用$$...$$。例如,相似度计算可以用$e_{ij} = \frac{\mathbf{q}_i \cdot \mathbf{k}_j}{\sqrt{d_k}}$,权重是$\alpha_{ij} = \text{softmax}(e_{ij})$,然后输出是$\sum \alpha_{ij} \mathbf{v}_j$。 然后需要讨论应用场景。根据引用3,键值对注意力在序列到序列模型(如机器翻译)、图像描述生成中有用。可能还要提到自注意力和交叉注意力的区别,比如在Transformer中,自注意力是Q、K、V来自同一输入,而交叉注意力可能来自不同来源,比如编码器和解码器之间的。 实现部分需要给出代码示例。用户提供的示例中有Python代码,所以可能需要用类似的框架。例如,定义一个函数,计算Q、K、V的线性变换,然后计算注意力分数,应用softmax,最后得到输出。需要注意维度处理,比如缩放因子和矩阵乘法的顺序。 另外,用户提到的引用1和引用2可能也相关,但引用3更直接相关。要确保引用标识正确,比如在解释键值对注意力时引用[^3]。 可能还需要考虑用户的需求层次。用户可能不仅需要概念,还需要了解为什么有效,如何实现,以及实际应用中的例子。是否需要解释多头注意力?或者层归一化的位置?不过根据问题,可能先聚焦在基础原理和简单实现上。 最后,生成相关问题。用户的问题可能涉及键值对注意力的优化、与其他注意力机制的区别、具体应用案例等。需要确保问题有针对性,能够帮助用户进一步学习。 检查是否所有数学公式都正确使用$或$$,例如独立公式如softmax的应用是否单独成段。例如,计算权重的时候,用$$ \alpha_{ij} = \text{softmax}(e_{ij}) $$是否正确。 还要确保回答结构清晰,分点解释原理、应用、实现,每部分之间有逻辑连接。代码部分需要用正确的语法,可能需要使用PyTorch或TensorFlow示例,但用户示例中是Python,所以可能用numpy或简化的框架。 总结步骤:先介绍概念,然后分原理、应用、实现三个部分展开,最后生成相关问题。确保每个部分引用正确,公式正确,代码正确。</think>### 键值对注意力机制解析 #### 一、核心概念 键值对注意力(Key-Value Attention)是注意力机制的一种实现形式,其核心组件包括: 1. **查询(Query)**:表示当前需要关注的目标(如解码器的隐藏状态) 2. **键(Key)**:与查询进行匹配的标识(如编码器输出的特征) 3. **值(Value)**:最终用于生成输出的信息载体(通常与键相关联) 三者通过线性变换从输入数据中提取,例如: $$ \mathbf{Q} = \mathbf{X}\mathbf{W}_Q, \quad \mathbf{K} = \mathbf{X}\mathbf{W}_K, \quad \mathbf{V} = \mathbf{X}\mathbf{W}_V $$ 其中$\mathbf{X}$为输入序列,$\mathbf{W}_Q, \mathbf{W}_K, \mathbf{W}_V$为可学习参数矩阵。 --- #### 二、原理与计算 1. **相似度计算** 通过点积衡量查询与键的关联程度: $$ e_{ij} = \frac{\mathbf{q}_i \cdot \mathbf{k}_j}{\sqrt{d_k}} $$ 其中$d_k$为键向量的维度,用于防止梯度消失。 2. **权重分配** 使用softmax函数归一化相似度得分: $$ \alpha_{ij} = \text{softmax}(e_{ij}) $$ 3. **信息聚合** 加权求和值向量得到最终输出: $$ \mathbf{z}_i = \sum_j \alpha_{ij} \mathbf{v}_j $$ --- #### 三、应用场景 1. **机器翻译** 在Seq2Seq模型中,解码器通过键值对注意力选择编码器输出的关键信息 2. **图像描述生成** 视觉特征作为键值对,文本生成过程通过查询聚焦相关区域 3. **Transformer架构** 自注意力机制中,Q/K/V均来自同一输入序列,实现上下文感知 --- #### 四、代码实现(简化版) ```python import torch import torch.nn.functional as F def key_value_attention(Q, K, V): d_k = K.size(-1) scores = torch.matmul(Q, K.transpose(-2, -1)) / (d_k ** 0.5) weights = F.softmax(scores, dim=-1) return torch.matmul(weights, V) # 示例输入:batch_size=2, seq_len=3, dim=4 Q = torch.randn(2, 3, 4) K = torch.randn(2, 3, 4) V = torch.randn(2, 3, 4) output = key_value_attention(Q, K, V) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值