李沐65_注意力分数——自学笔记

embedded/2024/9/23 11:04:02/

Additive Attention

等价于将key和value合并起来后放入到一个隐藏大小为h输出大小为1的单隐藏层

总结

1.注意力分数是query和key的相似度,注意力权重是分数的softmax结果

2.两种常见的分数计算:

(1)将query和key合并起来进入一个单输出单隐藏层的MLP

(2)直接将query和key做内积

注意力打分函数

python">!pip install d2l
python">import math
import torch
from torch import nn
from d2l import torch as d2l

masked_softmax函数 实现了这样的掩蔽softmax操作(masked softmax operation), 其中任何超出有效长度的位置都被掩蔽并置为0。

python">def masked_softmax(X, valid_lens):"""通过在最后一个轴上掩蔽元素来执行softmax操作"""# X:3D张量,valid_lens:1D或2D张量if valid_lens is None:return nn.functional.softmax(X, dim=-1)else:shape = X.shapeif valid_lens.dim() == 1:valid_lens = torch.repeat_interleave(valid_lens, shape[1])else:valid_lens = valid_lens.reshape(-1)# 最后一轴上被掩蔽的元素使用一个非常大的负值替换,从而其softmax输出为0X = d2l.sequence_mask(X.reshape(-1, shape[-1]), valid_lens,value=-1e6)return nn.functional.softmax(X.reshape(shape), dim=-1)

考虑由两个2X4
矩阵表示的样本, 这两个样本的有效长度分别为2
和3
。 经过掩蔽softmax操作,超出有效长度的值都被掩蔽为0。

python">masked_softmax(torch.rand(2, 2, 4), torch.tensor([2, 3]))
tensor([[[0.3505, 0.6495, 0.0000, 0.0000],[0.5069, 0.4931, 0.0000, 0.0000]],[[0.2469, 0.4668, 0.2863, 0.0000],[0.2865, 0.3008, 0.4127, 0.0000]]])

同样,也可以使用二维张量,为矩阵样本中的每一行指定有效长度。

python">masked_softmax(torch.rand(2, 2, 4), torch.tensor([[1, 3], [2, 4]]))
tensor([[[1.0000, 0.0000, 0.0000, 0.0000],[0.2102, 0.3264, 0.4634, 0.0000]],[[0.4785, 0.5215, 0.0000, 0.0000],[0.1783, 0.1803, 0.3615, 0.2800]]])

additive attention

python">class AdditiveAttention(nn.Module):"""加性注意力"""def __init__(self, key_size, query_size, num_hiddens, dropout, **kwargs):super(AdditiveAttention, self).__init__(**kwargs)self.W_k = nn.Linear(key_size, num_hiddens, bias=False)self.W_q = nn.Linear(query_size, num_hiddens, bias=False)self.w_v = nn.Linear(num_hiddens, 1, bias=False)self.dropout = nn.Dropout(dropout)def forward(self, queries, keys, values, valid_lens):queries, keys = self.W_q(queries), self.W_k(keys)# 在维度扩展后,# queries的形状:(batch_size,查询的个数,1,num_hidden)# key的形状:(batch_size,1,“键-值”对的个数,num_hiddens)# 使用广播方式进行求和features = queries.unsqueeze(2) + keys.unsqueeze(1)features = torch.tanh(features)# self.w_v仅有一个输出,因此从形状中移除最后那个维度。# scores的形状:(batch_size,查询的个数,“键-值”对的个数)scores = self.w_v(features).squeeze(-1)self.attention_weights = masked_softmax(scores, valid_lens)# values的形状:(batch_size,“键-值”对的个数,值的维度)return torch.bmm(self.dropout(self.attention_weights), values)

用一个小例子来演示上面的AdditiveAttention类, 其中查询、键和值的形状为(批量大小,步数或词元序列长度,特征大小), 实际输出为(2,1,20)
、(2,10,2)
和(2,10,4)
。 注意力汇聚输出的形状为(批量大小,查询的步数,值的维度)。

python">queries, keys = torch.normal(0, 1, (2, 1, 20)), torch.ones((2, 10, 2))
# values的小批量,两个值矩阵是相同的
values = torch.arange(40, dtype=torch.float32).reshape(1, 10, 4).repeat(2, 1, 1)
valid_lens = torch.tensor([2, 6])attention = AdditiveAttention(key_size=2, query_size=20, num_hiddens=8,dropout=0.1)
attention.eval()
attention(queries, keys, values, valid_lens)
tensor([[[ 2.0000,  3.0000,  4.0000,  5.0000]],[[10.0000, 11.0000, 12.0000, 13.0000]]], grad_fn=<BmmBackward0>)

管加性注意力包含了可学习的参数,但由于本例子中每个键都是相同的, 所以注意力权重是均匀的,由指定的有效长度决定

python">d2l.show_heatmaps(attention.attention_weights.reshape((1, 1, 2, 10)),xlabel='Keys', ylabel='Queries')

在这里插入图片描述

缩放点积注意力

(scaled dot-product attention)评分函数

python">class DotProductAttention(nn.Module):"""缩放点积注意力"""def __init__(self, dropout, **kwargs):super(DotProductAttention, self).__init__(**kwargs)self.dropout = nn.Dropout(dropout)# queries的形状:(batch_size,查询的个数,d)# keys的形状:(batch_size,“键-值”对的个数,d)# values的形状:(batch_size,“键-值”对的个数,值的维度)# valid_lens的形状:(batch_size,)或者(batch_size,查询的个数)def forward(self, queries, keys, values, valid_lens=None):d = queries.shape[-1]# 设置transpose_b=True为了交换keys的最后两个维度scores = torch.bmm(queries, keys.transpose(1,2)) / math.sqrt(d)self.attention_weights = masked_softmax(scores, valid_lens)return torch.bmm(self.dropout(self.attention_weights), values)

为了演示上述的DotProductAttention类, 我们使用与先前加性注意力例子中相同的键、值和有效长度。 对于点积操作,我们令查询的特征维度与键的特征维度大小相同。

python">queries = torch.normal(0, 1, (2, 1, 2))
attention = DotProductAttention(dropout=0.5)
attention.eval()
attention(queries, keys, values, valid_lens)
tensor([[[ 2.0000,  3.0000,  4.0000,  5.0000]],[[10.0000, 11.0000, 12.0000, 13.0000]]])

与加性注意力演示相同,由于键包含的是相同的元素, 而这些元素无法通过任何查询进行区分,因此获得了均匀的注意力权重。

python">d2l.show_heatmaps(attention.attention_weights.reshape((1, 1, 2, 10)),xlabel='Keys', ylabel='Queries')

在这里插入图片描述


http://www.ppmy.cn/embedded/19688.html

相关文章

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义&#xff1a;项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点&#xff1a; 独特性&#xff1a;独一无二&#xff0c;无法简单重复过去的做法。 临时性&#xff1a;项目有明确的起点和终点&…

探索树与二叉树:从基础到应用的完整指南

目录 一.树的基本概念 二.二叉树的概念 三.二叉树的遍历和线索二叉树 四.树和森林 五.树与二叉树的应用 六.实际案例 七.总结 一.树的基本概念 树是一种非线性的数据结构&#xff0c;由节点和边组成的有限集合。树的结构类似于自然界中的树&#xff0c;从根部开始&#xff…

python Django中管理用户权限内置用户认证系统用户模型(User)、权限模型(Permission)和组模型(Group)

在Django中管理用户权限通常涉及到Django的内置用户认证系统&#xff0c;该系统提供了用户模型&#xff08;User&#xff09;、权限模型&#xff08;Permission&#xff09;和组模型&#xff08;Group&#xff09;。下面是如何使用Django来管理用户权限的基本步骤&#xff1a; …

Windows安装Elasticsearch 7.9.2

1 下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-windows-x86_64.zip 2 配置 进入config目录&#xff0c;打开elasticsearch.yml文件&#xff0c;给集群和节点配置名称。 cluster.name: my-es node.name: node-1 3 启动 打开bin目录&am…

Node.js在前端的妙用:打造更出色的Web体验

在Web开发领域&#xff0c;Node.js早已成为一种不可或缺的技术。尽管Node.js最初是作为服务器端技术而闻名&#xff0c;但是在前端开发中&#xff0c;它同样有着令人惊叹的应用。本文将探讨Node.js在前端的各种用途&#xff0c;并展示如何利用它来提升Web应用的性能、可维护性和…

Eureka 详解:构建高可用微服务架构

目录 引言 一.Eureka 简介 二.关键概念和组件 1.服务注册 2.服务发现 3.Eureka 服务器 4.服务注册表 5.续约 6.负载均衡 7.故障转移和容错 8.集群和复制 9.服务元数据 三.Eureka 的工作原理 四.Eureka 的优势 五.实例&#xff1a;使用 Eureka 的微服务架构 步骤…

深度学习基础:循环神经网络中的长期依赖问题

循环神经网络中的长期依赖问题 在深度学习中&#xff0c;循环神经网络&#xff08;RNN&#xff09;是一种经典的模型&#xff0c;用于处理序列数据&#xff0c;如自然语言处理、时间序列预测等任务。然而&#xff0c;传统的RNN存在着一个长期依赖问题&#xff0c;即在处理长序…

c#开发vs2022安装地址

C#学习visual Studio 2022安装与配置详细过程_vs2022怎么配置c#环境-CSDN博客