当前位置: 首页 > news >正文

注意力机制

import torch
import torch.nn.functional as F# 一个形状为 (batch_size, seq_len, feature_dim) 的张量(矩阵) x
# 两个样本, 每个样本3 个词语长度,每个词语编码为4维
x = torch.randn(2, 3, 4)  # (batch_size, seq_len, feature_dim)# 定义头数和每个头的维度
num_heads = 2
head_dim = 2# feature_dim 必须是 num_heads * head_dim 的整数倍
assert x.size(-1) == num_heads * head_dim# 定义线性层用于将 x 转换为 Q, K, V 向量
# Wq Wk Wv
linear_q = torch.nn.Linear(4, 4) # 每次创建全链接层,随机参数
linear_k = torch.nn.Linear(4, 4)
linear_v = torch.nn.Linear(4, 4)# 通过线性层计算 Q, K, V
Q = linear_q(x)  # (batch_size, seq_len, feature_dim)
K = linear_k(x)  # (batch_size, seq_len, feature_dim)
V = linear_v(x)  # (batch_size, seq_len, feature_dim)# 将 Q, K, V 分割成 num_heads 个头
def split_heads(tensor, num_heads):# (batch_size, seq_len, feature_dim)  -》 (batch_size, num_heads, seq_len, feature_dim)batch_size, seq_len, feature_dim = tensor.size()head_dim = feature_dim // num_headsoutput = tensor.view(batch_size, seq_len, num_heads, head_dim).transpose(1, 2)# view 维度转换# transpose 维度交换# (batch_size, num_heads, seq_len, feature_dim)return outputQ = split_heads(Q, num_heads)  # (batch_size, num_heads, seq_len, head_dim)
K = split_heads(K, num_heads)  # (batch_size, num_heads, seq_len, head_dim)
V = split_heads(V, num_heads)  # (batch_size, num_heads, seq_len, head_dim)# 计算 Q 和 K 的点积,作为相似度分数 , 也就是自注意力原始权重
# 第i行第j列:第i个词对第j个词的关注程度
raw_weights = torch.matmul(Q, K.transpose(-2, -1))  # (batch_size, num_heads, seq_len, seq_len)# transpose(-2, -1) -》 (batch_size, num_heads, head_dim, seq_len)# 对自注意力原始权重进行缩放, 防止梯度爆炸
scale_factor = K.size(-1) ** 0.5 # 根号 head_dim

scaled_weights = raw_weights / scale_factor  # (batch_size, num_heads, seq_len, seq_len)# 对缩放后的权重进行 softmax 归一化,得到注意力权重
# 归一化操作 / 激活函数
attn_weights = F.softmax(scaled_weights, dim=-1)  # (batch_size, num_heads, seq_len, seq_len)# 将注意力权重应用于 V 向量,计算加权和,得到加权信息
# 每个词的输出 = 该词对所有Value的加权平均
attn_outputs = torch.matmul(attn_weights, V)  # (batch_size, num_heads, seq_len, head_dim)def combine_heads(tensor, num_heads):batch_size, num_heads, seq_len, head_dim = tensor.size()feature_dim = num_heads * head_dimoutput = tensor.transpose(1, 2).contiguous().view(batch_size, seq_len, feature_dim)return output  # (batch_size, seq_len, feature_dim)
attn_outputs = combine_heads(attn_outputs, num_heads)  # (batch_size, seq_len, feature_dim)# 对拼接后的结果进行线性变换
linear_out = torch.nn.Linear(4, 4)
attn_outputs = linear_out(attn_outputs)  # (batch_size, seq_len, feature_dim)
print(" 加权信息 :", attn_outputs)

 

http://www.jsqmd.com/news/1283714/

相关文章:

  • 领导力全球EMBA:企业家择校选择指南
  • 5分钟快速搭建私有搜索引擎:SearXNG Docker完整指南
  • Bash Shell命令详解:从基础操作到高级脚本编写
  • Adomate 自动化营销全流程落地指南
  • colorific:终极图像色彩提取工具,3行代码实现自动调色板检测
  • 大模型应用开发工程师:学习路线与职业发展指南
  • Matlab实现分布式储能容量优化模型的关键技术
  • 2026年钢格栅厂家选择指南:鑫诺帆等企业核心特点盘点 - 比奇堡111
  • 2026年7月跨省寄大件快递推荐:谁才是真正的便宜之王? - 快递物流资讯
  • 权限日志没做好,大模型项目上线就崩?数据工程师的转型实战复盘
  • 2026重庆ai全媒体培训公司哪里有精选指南 - 谁都没有我好看
  • Python+Scrapy构建艺术作品数据库的技术实践
  • AU-48双模拟麦模块:USB回环参考路径与低阻抗直驱输出的电路设计
  • pytest与Allure集成:解决@step与attach步骤不显示的实战指南
  • 2026年Q3调节阀与特种阀门行业优质供应商综合观察 - 优企名品
  • AI课程笔记如何从混乱到体系化:3步构建可复用、可检索、可进化的知识图谱
  • 网络资源审计:Azure Orphaned Resources如何检测孤立公网IP和负载均衡器?
  • 智能健身APP开发:Android传感器与机器学习实践
  • itc保伦股份麒麟无纸化会议系统实现会务全流程数字化,开启智慧办公新时代! - 品牌速递
  • 金镶玉、金镶翡翠的金能单独回收吗?永康老金黄金回收 - 回收测评
  • Zephyr学习 第四章 - 1:从 DEVICE_DT_DEFINE 到 struct device
  • 计算机毕业设计之Bbs网站管理平台
  • AI赋能价值投资:NLP与知识图谱在量化分析中的应用
  • 小白程序员必看:通用大模型 VS 行业AI,如何为企业创造真正价值?
  • Jellium Desktop启动基础:启动入门
  • 上海奉贤全街镇空压机维修|24 小时上门、无隐形消费、合规维 - 起跑123
  • 如何快速掌握GBFR-Logs:面向《碧蓝幻想:Relink》玩家的完整数据指南
  • 从“被动养生”到“主动健康”:树鹊磁电王用户真实分享 - 优企甄选
  • TSharding注解详解:ShardingOrderPara如何优雅实现参数路由
  • Bioinformatics Data Skills 配套资源大揭秘:如何高效利用gh_mirrors/bd/bds-files提升数据分析能力