注意力评分函数

最近有学习李沐老师讲解的注意力评分函数,根据自己的理解,记录一下学习过程,有错误的地方还恳请大家提出来。

目录

引言

1.注意力评分函数

2.推导过程

2.1.计算评分

2.2.应用指数函数

2.3.归一化评分

2.4.计算加权和

2.5.需要注意的点

2.5.1 注意力评分函数

2.5.2 注意力权重

3.加性注意力机制

4.总结


引言

在深度学习中,注意力评分函数是注意力机制的核心,它决定了在序列任务中每个部分的重要性。这一机制在自然语言处理(NLP)和图像识别等领域被广泛应用。接下来,我们将详细介绍注意力评分函数的工作原理,并通过加性注意力机制的例子进行说明。

1.注意力评分函数

注意力评分函数,简称评分函数,是一种计算查询(Query)与键(Key)之间相似度的函数。其输出通常是一个实数值,这个值经过进一步的处理(如softmax函数)后,可以解释为权重,指示了在注意力机制中对每个值(Value)的关注程度。该图是我从李沐老师讲义中截图的,链接:注意力评分函数

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

  • 键(Key): 键是用来与查询进行比较的元素。在注意力机制中,键的作用是为了计算注意力权重。每个键与一个值相关联,并且查询与键之间的匹配程度决定了相应值的权重。

  • 值(Value): 与每个键相关联的值决定了在计算加权和时每个元素的贡献。值的权重是由查询与对应键之间的关联程度决定的。

数学语言描述:

f(\mathbf{q}, (\mathbf{k}_1, \mathbf{v}_1), \ldots, (\mathbf{k}_m, \mathbf{v}_m)) = \sum_{i=1}^{m} \alpha(\mathbf{q}, \mathbf{k}_i) \mathbf{v}_i

这个函数f产生了一个输出向量,它是所有值向量{v}_i的加权和,每个值向量{v}_i的加权和的权重\alpha(\mathbf{q}, \mathbf{k}_i)由查询q和对应的\mathbf{k}_i通过一个注意力评分函数a确定。

\alpha(\mathbf{q}, \mathbf{k}_i) = \text{softmax}(a(\mathbf{q}, \mathbf{k}_i)) = \frac{\exp(a(\mathbf{q}, \mathbf{k}_i))}{\sum_{j=1}^{m} \exp(a(\mathbf{q}, \mathbf{k}_j))}

每个权重\alpha(\mathbf{q}, \mathbf{k}_i)是通过softmax函数得到的,这个函数的输入是所有a(\mathbf{q}, \mathbf{k}_i)的评分,softmax 函数将这些评分转换成概率分布,使得所有的权重相加等于 1,且每个权重都是正数。这个计算过程如下:

2.推导过程

给定一个查询 q 和一组键k_{1}, ... , k_{m}我们可以使用评分函数a为每个键计算一个分数。这个分数表示查询和每个键之间的相似度或匹配程度。

2.1.计算评分

S_i = a(\mathbf{q}, \mathbf{k}_i)

这里S_i 是查询 与第 i个键k_i 的匹配评分。

2.2.应用指数函数

e^{s_i} = \exp(s_i) \quad_{}

对每个评分应用指数函数,确保所有的评分都是正数

2.3.归一化评分

\quad \alpha(\mathbf{q}, \mathbf{k}_i) = \frac{e^{s_i}}{\sum_{j=1}^{m} e^{s_j}}

在这里,所有的e^{s_i}被它们的总和归一化,得到了qk_i之间的注意力权重\quad \alpha(\mathbf{q}, \mathbf{k}_i)

2.4.计算加权和

f(\mathbf{q}, (\mathbf{k}_1, \mathbf{v}_1), \ldots, (\mathbf{k}_m, \mathbf{v}_m)) = \sum_{i=1}^{m} \alpha(\mathbf{q}, \mathbf{k}_i) \mathbf{v}_i

使用这些权重\quad \alpha(\mathbf{q}, \mathbf{k}_i)作为系数,将所有值的v_i加权求和,得到最终输出的向量。

这个过程就能够很好的解释了如何将注意力汇聚的输出计算成为值的加权和。

2.5.需要注意的点

还有一个点需要注意的是,上述公式中的\alphaa容易弄混,在注意力机制中,\alpha(通常称为注意力权重)和 a(注意力评分函数)是两个关键的组成部分,它们在确定如何分配注意力时起着中心作用。下面我将详细解释它们:

2.5.1 注意力评分函数
  • 评分函数 : a 是一个计算特定查询q与特定键 k_i 之间相似度或兼容性的函数。这个函数的输出是一个实数值,我们称之为“评分”。
  • 评分 反映了查询对于每个键的关注度。如果一个键与查询更“相似”或更“兼容”,那么它的评分就会更高。

例如,如果我们使用简单的点积来作为评分函数 a ,那么评分会是这样计算的:

a(\mathbf{q}, \mathbf{k}_i) = \mathbf{q} \cdot \mathbf{k}_i

在这个例子中,点积直接衡量了查询向量和键向量之间的相似度。

2.5.2 注意力权重
  • 注意力权重 a(\mathbf{q}, \mathbf{k}_i) = \mathbf{q} \cdot \mathbf{k}_i是一个归一化的值,用于量化当计算加权和时每个值 v_i 的相对重要性。
  • 归一化 意味着所有的注意力权重加起来等于 1,这样它们就可以被解释为概率分布。

注意力权重是通过 softmax 函数从评分 a获得的:

\alpha(\mathbf{q}, \mathbf{k}_i) = \frac{\exp(a(\mathbf{q}, \mathbf{k}_i))}{\sum_{j=1}^{m} \exp(a(\mathbf{q}, \mathbf{k}_j))}

这个公式确保了每个权重都是正的,并且所有键的权重之和为 1。这样,更高的评分会转化为更大的权重 α,意味着对应的键-值对对于最终输出的贡献也更大。

给大家举个例子说明一下,假设我们有一个查询\mathbf{q}和三个键值对(\mathbf{k}_1, \mathbf{v}_1), (\mathbf{k}_2, \mathbf{v}_2), (\mathbf{k}_3, \mathbf{v}_3),评分函数a产生了以下评分:

a(\mathbf{q}, \mathbf{k}_1) = 2, \quad a(\mathbf{q}, \mathbf{k}_2) = 3, \quad a(\mathbf{q}, \mathbf{k}_3) = 1

应用到softmax函数中,我们得到了每个键的注意力权重:

\alpha(\mathbf{q}, \mathbf{k}_1) = \frac{\exp(2)}{\exp(2) + \exp(3) + \exp(1)}

\quad \alpha(\mathbf{q}, \mathbf{k}_2) = \frac{\exp(3)}{\exp(2) + \exp(3) + \exp(1)}

\quad \alpha(\mathbf{q}, \mathbf{k}_3) = \frac{\exp(1)}{\exp(2) + \exp(3) + \exp(1)}

这些权重 α 随后用来计算值的加权和,这样权重最大的 v_2在最终结果中的贡献最大,因为它对应的键 k_2与查询 q的评分最高。

\text{Output} = \alpha(\mathbf{q}, \mathbf{k}_1) \mathbf{v}_1 + \alpha(\mathbf{q}, \mathbf{k}_2) \mathbf{v}_2 + \alpha(\mathbf{q}, \mathbf{k}_3) \mathbf{v}_3

3.加性注意力机制

在这种注意力机制中,查询qk_i首先被线性变换,然后连接或相加,并通过一个非线性激活函数(通常是tanh)。这个过程涉及以下步骤:

首先是线性变换:

  • 查询一个q通过矩阵W_{q}被变换,其中W_{q}是一个可学习的权重。
  • 同样,键k_{i}通过另一个W_k被变换。

然后是非线性激活:

  • 变换后的查询和键被相加:W_qq+W_kk_i
  • 对这个相加的结果应用tanh函数,以引入非线性,得到的结果是一个中间向量。

最后进一步变换:

  • 这个中间向量再被一个权重w(通常是一个行向量)进一步变换。
  • 最终我们对这个结果取转置w^{T},得到一个标量值。

评分函数a的加性版本可以写成:

a(\mathbf{q}, \mathbf{k}_i) = \mathbf{w}^\top \tanh(\mathbf{W}_q \mathbf{q} + \mathbf{W}_k \mathbf{k}_i)

  • w 是一个可学习的权重向量。
  • W_{q}W_k是可学习的权重矩阵。
  • tanh是双曲正切激活函数,它将输入映射到 −1 和 1 之间。

这个评分函数的输出是一个实数值,表示查询和键之间的兼容性。这个值随后用于计算注意力权重 α,就像前面解释的那样。

下面举一个简单的例子:

假设我们有一个简单的NLP任务,我们的模型需要决定再给定的查询词,比如:apple,在这个词上应该关注哪些上下文词,我们有一个简化的上下文,其中三个词(fruit,book,company),分别对应三个键向量K_1,K_2,K_3, 下面来展示如何使用加性注意力机制计算每个上下文词相关的注意力权重。

1.初始化

  • 查询向量Q表示词"apple"。
  • 键向量K_1,K_2,K_3分别表示"fruit", "book", "company"。
  • 假设QK_1,K_2,K_3都已经是通过某种方式编码后的向量。

2. 定义权重矩阵和向量

  • 权重矩阵 W_{q}用于变换查询向量。
  • 权重矩阵 W_k​ 用于变换键向量。
  • 权重向量 w 用于最后的评分计算。

3. 线性变换:

  • {Q}'=W_q\cdot Q
  • {K_i}'=W_k\cdot K_i  对于每个i\epsilon{\left \{ 1,2,3 \right \}}

4.应用非线性激活函数

  • S_i = tanh({Q}'+{K_i}') 对于每个i\epsilon{\left \{ 1,2,3 \right \}}

5.计算评分

  • a_i = w^T\cdot S_i 对于每个i\epsilon{\left \{ 1,2,3 \right \}}

6.应用softmax归一化

  • a_i = \frac{exp(a_i)}{\sum_{i=1}^{3}exp(a_j)} 对于每个i\epsilon{\left \{ 1,2,3 \right \}}

7. 计算最终的加权

output = \sum_{i=1}^{3}a_i\cdot V_i其中V_i是与K_i相关联的值向量。

假设我们已经有了嵌入好的向量和学习好的权重,我们可以进行以下计算:

  • 假设Q: [1,0], K_1:[0, 1], K_2:[1,1],K_3:[0,0].
  • 权重矩阵W_q,W_k都是2×2的矩阵,权重向量w是[1,1].

计算加性注意力:

  1. {Q}' = W_q\cdot Q=[1,0]
  2. {K_1}'=W_k\cdot K_1 = [0,1], {K_2}'=[1,1], {K_3}'=[0,0]
  3. S_1=tanh({Q}' + K_1)=tanh[1,1],S_2,S_3计算类似
  4. a_1=w^T\cdot S_1a_2,a_3 计算类似
  5. 最终softmax归一化得到 \alpha_1,\alpha_2, \alpha_3

最终我们可以得到上下文词对应的注意力权重,这些权重表明模型应该在多大程度上关注每个词

下面给大家演示一下计算过程:

import torch
import torch.nn.functional as F

# 假设的词向量
Q = torch.tensor([1, 0], dtype=torch.float32)
K1 = torch.tensor([0, 1], dtype=torch.float32)
K2 = torch.tensor([1, 1], dtype=torch.float32)
K3 = torch.tensor([0, 0], dtype=torch.float32)

# 假设的权重矩阵和向量,这里我们使用单位矩阵和一个简单的向量
Wq = torch.eye(2)
Wk = torch.eye(2)
w = torch.tensor([1, 1], dtype=torch.float32)

# 计算变换后的查询和键
Q_prime = torch.matmul(Wq, Q)
K1_prime = torch.matmul(Wk, K1)
K2_prime = torch.matmul(Wk, K2)
K3_prime = torch.matmul(Wk, K3)

# 应用非线性激活函数
S1 = torch.tanh(Q_prime + K1_prime)
S2 = torch.tanh(Q_prime + K2_prime)
S3 = torch.tanh(Q_prime + K3_prime)

# 计算评分
a1 = torch.dot(w, S1)
a2 = torch.dot(w, S2)
a3 = torch.dot(w, S3)

# 应用 softmax 归一化
scores = torch.tensor([a1, a2, a3])
alpha = F.softmax(scores, dim=0)

alpha  # 注意力权重


RESULT
tensor([0.3716, 0.4549, 0.1735])

在我们的例子中,计算得到的注意力权重 α 为:

  • 对于第一个键("fruit"),权重是约 0.3716
  • 对于第二个键("book"),权重是约 0.4549
  • 对于第三个键("company"),权重是约 0.1735

这些权重表明模型在给定查询“apple”时,会更多地关注“book”,其次是“fruit”,而对“company”关注最少。这个结果可能反映了模型学习到的上下文信息,即“apple”与“book”和“fruit”更相关,这可以基于上下文的不同而变化。这个简化的例子展示了加性注意力在计算关注度时的基本逻辑。在实际应用中,这些权重会用于计算最终的输出,通常是值(V)的加权和。

4.总结

加性注意力机制是一个强大而灵活的工具,它可以根据任务的需要被调整和优化。通过上述的例子,我们展示了如何从头到尾计算加性注意力,从而为理解这一机制的工作原理提供了深刻的洞见。这种机制的优势在于它的普遍适用性和在处理长序列时的有效性。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
蓝桥杯大赛,全称是蓝桥杯全国软件和信息技术专业人才大赛,是由中华人民共和国工业和信息化部人才交流中心主办,国信蓝桥教育科技(北京)股份有限公司承办的计算机类学科竞赛。这是一个全国高校参加的赛事,累计参赛人数已经超过40万人,旨在推动软件和信息技术产业的发展,促进软件和信息技术专业技术人才培养,向软件和信息技术行业输送具有创新能力和实践能力的高端人才,提升高校毕业生的就业竞争力,全面推动行业发展及人才培养进程。 蓝桥杯大赛的考试范围涵盖了基本数据类型及类型转换、变量与常量、字符与字符串、数组、赋值运算符、算数运算符逻辑运算符、关系运算符,顺序结构、分支结构、循环结构程序设计,函数定义和使用,变量的作用域,递归函数,简单算法,基本数据结构,指针,基本算法等。 蓝桥杯大赛的难度相对于ACM和程序设计竞赛而言题目要简单一些,比赛形式为个人赛,一共有十道题目,题目难度顺序一般按照由易到难。前面几道题目一般是给出题面问一个特定的答案,只需要在本地计算然后提交答案。中间会有程序填空题,根据题意填空。后面的题目就是需要提交代码,跑通给定的案例。题目完全为客观题型,选手所提交作答的运行结果为主要评分依据,比赛不能携带纸质资料。 蓝桥杯大赛已被列入中国高等教育学会发布的“全国普通高校学科竞赛排行榜”,成为高校教育教学改革和创新人才培养的重要竞赛项目。对于学生而言,参与蓝桥杯大赛不仅有助于提升个人的编程和解决问题的能力,还可以在奖学金评定、升学考研等方面带来一定的助益。 请注意,蓝桥杯大赛的赛制、考试范围等可能会根据每年的具体情况有所调整,建议访问蓝桥杯大赛官网或关注相关新闻报道,以获取最新和最准确的信息。
卷积神经网络(Convolutional Neural Network, CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,它在计算机视觉、语音识别、自然语言处理等多个领域都有广泛应用。CNN的核心设计理念源于对生物视觉系统的模拟,尤其是大脑皮层中视觉信息处理的方式,其主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。以下是CNN技术的详细介绍: ### **1. 局部感知与卷积操作** **卷积层**是CNN的基本构建块,它通过使用一组可学习的滤波器(或称为卷积核)对输入图像进行扫描。每个滤波器在图像上滑动(卷积),并以局部区域(感受野)内的像素值与滤波器权重进行逐元素乘法后求和,生成一个输出值。这一过程强调了局部特征的重要性,因为每个滤波器仅对一小部分相邻像素进行响应,从而能够捕获图像中的边缘、纹理、颜色分布等局部特征。 ### **2. 权重共享** 在CNN中,同一滤波器在整个输入图像上保持相同的权重(参数)。这意味着,无论滤波器在图像的哪个位置应用,它都使用相同的参数集来提取特征。这种权重共享显著减少了模型所需的参数数量,增强了模型的泛化能力,并且体现了对图像平移不变性的内在假设,即相同的特征(如特定形状或纹理)不论出现在图像的哪个位置,都应由相同的滤波器识别。 ### **3. 池化操作** **池化层**通常紧随卷积层之后,用于进一步降低数据维度并引入一定的空间不变性。常见的池化方法有最大池化和平均池化,它们分别取局部区域的最大值或平均值作为输出。池化操作可以减少模型对微小位置变化的敏感度,同时保留重要的全局或局部特征。 ### **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起,形成深度网络结构。随着网络深度的增加,每一层逐渐提取更复杂、更抽象的特征。底层可能识别边缘、角点等低级特征,中间层识别纹理、部件等中级特征,而高层可能识别整个对象或场景等高级语义特征。这种层级结构使得CNN能够从原始像素数据中自动学习到丰富的表示,无需人工设计复杂的特征。 ### **5. 激活函数与正则化** CNN中通常使用非线性激活函数(如ReLU、sigmoid、tanh等)来引入非线性表达能力,使得网络能够学习复杂的决策边界。为了防止过拟合,CNN常采用正则化技术,如L2正则化(权重衰减)来约束模型复杂度,以及Dropout技术,在训练过程中随机丢弃一部分神经元的输出,以增强模型的泛化性能。 ### **6. 应用场景** CNN在诸多领域展现出强大的应用价值,包括但不限于: - **图像分类**:如识别图像中的物体类别(猫、狗、车等)。 - **目标检测**:在图像中定位并标注出特定对象的位置及类别。 - **语义分割**:对图像中的每个像素进行分类,确定其所属的对象或背景类别。 - **人脸识别**:识别或验证个体身份。 - **图像生成**:通过如生成对抗网络(GANs)等技术创建新的、逼真的图像。 - **医学影像分析**:如肿瘤检测、疾病诊断等。 - **自然语言处理**:如文本分类、情感分析、词性标注等,尽管这些任务通常结合其他类型的网络结构(如循环神经网络)。 ### **7. 发展与演变** CNN的概念起源于20世纪80年代,但其影响力在硬件加速(如GPU)和大规模数据集(如ImageNet)出现后才真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构在图像识别竞赛中取得突破性成果,推动了CNN技术的快速发展。如今,CNN已经成为深度学习图像处理领域的基石,并持续创新,如引入注意力机制、残差学习、深度可分离卷积等先进思想。 综上所述,卷积神经网络通过其独特的局部感知、权重共享、多层级抽象等特性,高效地从图像数据中提取特征并进行学习,已成为解决图像和视频处理任务不可或缺的工具,并在众多实际应用中取得了卓越的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书奇真的苟@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值