【PyTorch][chapter 26][李宏毅深度学习][attention-2]

前言:

   Multi-Head Attention 主要作用:将Q,K,V向量分成多个头,形成多个子语义空间,可以让模型去关注不同维度语义空间的信息


目录:

  1. attention 机制
  2.  Multi-Head Attention 

一 attention 注意力

       Self-Attention(自注意力机制):使输入序列中的每个元素能够关注并加权整个序列中的其他元素,生成新的输出表示,不依赖外部信息或历史状态。

       将查询Query,键Key,值Value 映射 到输出。

       查询Query,键Key, 值Value  都是向量.

       其输出为 值的加权求和。

   

   1.1 mask 作用

1.2 scale 作用

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 16 11:21:33 2024@author: chengxf2
"""
import torch
import mathdef attention(query,key ,value, mask=None):#[batchSize, seq_num, query_dim]d_k = query.size(-1)print(d_k)attentionMatrix = torch.matmul(query, key.transpose(-2,-1))scores = attentionMatrix/math.sqrt(d_k)if mask is not None:scores = scores.mask_fill(mask==0, -1e9)p_attn = torch.softmax(scores, dim=-1)out = torch.matmul(p_attn, value)return outseq_len = 5
hid_dim = 10
out_len =3query = torch.rand((seq_len,hid_dim))
key =  torch.rand_like(query)
value = torch.rand((seq_len, out_len))attention(query, key, value)

二 Multi-Head Attention 

          多头注意力机制的理论基础之一是信息多元化处理的思想。通过将输入向量投影到不同的子空间,每个子空间执行自注意力操作,这样模型能够并行地学习不同类型的特征或依赖关系,增强了模型的表达能力。

2,1  第一步:查询Q、键K 和值V 矩阵的 生成

         输入:

                 张量A 

                 shape: [batch, seq_len, input_dim]

         输出:

                Q,K,V

                shape:[batch,seq_len, query_dim]

            

        (下面以输入seq_len=2 ,为例)

     

       

            

        Q=AW_Q 

        K=AW_K

        V=AW_V

       其中下面三个矩阵是需要学习的矩阵:

      W_Q,W_K,W_V的shape 为【input_dim, query_dim]

2.2  第二步:子空间投影

      Q,K V 乘以对应的Head 矩阵,得到对应的mulite-head  Q,K,V

  

以 Query张量为例: 实现的时候先乘以Head 矩阵 O=QW_H,然后再通过View 功能

分割成子空间。

第三步: 对不同Head 的Q,K,V

    做self-attention,得到不同Head 的 b^i

第四步: concate 

import torch
from torch import nn
 
# 假设我们有一些查询、键和值的张量
query = torch.rand(10, 8, 64)  # (batch_size, n_query, d_model)
key = value = query  # 为了示例,我们使用相同的张量作为键和值
 
# 实例化多头注意力层
multihead_attn = nn.MultiheadAttention(embed_dim=64, num_heads=4)
 
# 执行多头注意力操作
output, attention_weights = multihead_attn(query, key, value)
 
print(output.shape)  # 输出: torch.Size([10, 8, 64])
print(attention_weights.shape)  # 输出: torch.Size([10, 4, 8, 8])

# -*- coding: utf-8 -*-
"""
Created on Wed Jul 17 09:46:40 2024@author: chengxf2
"""import torch
import torch.nn as nn
import copy
import math
from torchsummary import summary 
import netron
def clones(module, N):"生成N 个 相同的层"layers = nn.ModuleList([copy.deepcopy(module)  for _ in range(N)])return layersdef attention(query, key ,value):#输出[batch, head_num, seq_len,query_dim ]seq_num = query.size(-1)scores = torch.matmul(query, key.transpose(-2,-1))scores = scores/math.sqrt(seq_num)p_attn = torch.softmax(scores, dim=-1)out = torch.matmul(p_attn, value)print("\n out.shape",out.shape)return out, p_attnclass  MultiHeadedAttention(nn.Module):def __init__(self, head_num, query_dim):super(MultiHeadedAttention, self).__init__()self.head_num = head_numself.sub_query_dim = query_dim//head_numself.linears = clones(nn.Linear(query_dim,query_dim), 4)self.attn = Nonedef forward(self, query, key, value):#query.shape [batch, seq_num,query_dim]batchSz = query.size(0)#[batchsz, seq_num, head_num, query_dim]query, key, value = \[net(x).view(batchSz, -1, self.head_num, self.sub_query_dim).transpose(1, 2)for net, x in zip(self.linears, (query, key, value))]#输出[batch, head_num, seq_len,sub_query_dim ]x, self.attn = attention(query, key, value)print("\n attn ",self.attn)x = x.transpose(1,2).contiguous().view(batchSz,-1,self.head_num*self.sub_query_dim)out = self.linears[-1](x)print(out.shape)return outif __name__ == "__main__":batchSz=1seq_num =2out_dim=query_dim =9head_num =3#下面这三个矩阵是需要学习的矩阵query = torch.randn((batchSz, seq_num, query_dim))key =  torch.rand_like(query)value =torch.randn((batchSz, seq_num, out_dim))model = MultiHeadedAttention(head_num,query_dim)model(query,key,value)print("\n 模型参数 \n ")input_size = (seq_num, query_dim)summary(model,[input_size,input_size,input_size])# 创建一个输入样本input_dict = {"x1": query, "x2": key, "x3":value}# 导出模型为ONNX格式torch.onnx.export(model,               # 模型实例(query,key,value),                   # 模型输入"model.onnx")netron.start('model.onnx') 


https://zhuanlan.zhihu.com/p/626820422

The Annotated Transformer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是im即时通讯?WorkPlus im即时通讯私有化部署安全可控

IM即时通讯是Instant Messaging的缩写,指的是一种实时的、即时的电子信息交流方式,也被称为即时通讯。它通过互联网和移动通信网络,使用户能够及时交换文本消息、语音通话、视频通话、文件共享等信息。而WorkPlus im即时通讯私有化部署则提供…

防火墙--双机热备

目录 双击热备作用 防火墙和路由器备份不同之处 如何连线 双机 热备 冷备 VRRP VGMP(华为私有协议) 场景解释 VGMP作用过程 主备的形成场景 接口故障的切换场景 整机故障 原主设备故障恢复的场景 如果没有开启抢占 如果开启了抢占 负载分…

对红酒品质进行数据分析(python)

http://t.csdnimg.cn/UWg2S 数据来源于这篇博客,直接下载好csv文件。 这篇内容均在VScode的jupyter notebook上完成,操作可以看我的另一篇博客:http://t.csdnimg.cn/69sDJ 一、准备工作 1. 导入数据库 #功能是可以内嵌绘图,并…

纯硬件一键开关机电路的工作原理

这是一个一键开关机电路: 当按一下按键然后松开,MOS管导通,VOUT等于电源电压; 当再次按一下按键然后松开,MOS管关闭,VOUT等于0; 下面来分析一下这个电路的工作原理。上电后,输入电压通过R1和R2给电容充电,最…

继承和多态常见的面试问题

文章目录 概念问答 概念 下面哪种面向对象的方法可以让你变得富有( A) A: 继承 B: 封装 C: 多态 D: 抽象 (D )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关, 而对方法的调用则可以关联于具体的对象。 A: 继承 B: 模板 C: 对象的…

如何让公众号文章排版变的高大上?

有的时候,你可能会疑惑,为什么你写的文章没人看?明明投入很多精力在标题和文章内容上,但收效甚微。 有一个关键性的因素可能被你忽略了,那就是排版,文章没有排版,无论你的内容再怎么精彩&#x…

力扣622.设计循环队列

力扣622.设计循环队列 通过数组索引构建一个虚拟的首尾相连的环当front rear时 队列为空当front rear 1时 队列为满 (最后一位不存) class MyCircularQueue {int front;int rear;int capacity;vector<int> elements;public:MyCircularQueue(int k) {//最后一位不存…

智能化革新:智能AI如何助力生产力发展的未来与应用

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 前言 在当今这个科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了推动生产力发展的重要力量。AI技…

2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)

RC-u1 热҈热҈热҈ 分数 10 全屏浏览 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 热҈热҈热҈……最近热得打的字都出汗了&#xff01; 幸好某连锁餐厅开启了气温大于等于 35 度即可获得一杯免费雪碧的活动。但不知为何&#xff0c;在每个星期四的时候&#x…

React的usestate设置了值后马上打印获取不到最新值

我们在使用usestate有时候设置了值后&#xff0c;我们想要更新一些值&#xff0c;这时候&#xff0c;我们要想要马上获取这个值去做一些处理&#xff0c;发现获取不到&#xff0c;这是为什么呢&#xff1f; 效果如下&#xff1a; 1、原因如下 在React中,当你使用useState钩子…

基于STC89C51单片机的烟雾报警器设计(煤气火灾检测报警)(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于STC89C51单片机的烟雾报警器设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 摘要 原理图 实物图 仿真图 元件清单 代码 系统论文 资源下载 摘要 随着现代家庭用火、…

navicat15已连接忘记密码

1.导出链接 2.使用文本打开 connections.ncx UserName"root" PasswordXXXX 3.复制加密密码&#xff0c;在线解密 代码在线运行 - 在线工具 php解密代码 <?php class NavicatPassword {protected $version 0;protected $aesKey libcckeylibcckey;protected…

C语言学习笔记[26]:循环语句do...while①

do...while语句 do...while的语法格式 do循环语句; while(表达式); 用do...while语句实现打印0~10 #include <stdio.h>int main() {int i 0;do{printf("%d\n", i);i;} while (i < 10);return 0; } do...while是先进行一次循环以后&#xff0c;再进行判…

R语言包AMORE安装报错问题以及RStudio与Rtools环境配置

在使用R语言进行AMORE安装时会遇到报错&#xff0c;这时候需要采用解决办法&#xff1a; AMORE包安装&#xff0c;需要离线官网下载安装包&#xff1a; Index of /src/contrib/Archive/AMORE (r-project.org)https://cran.r-project.org/src/contrib/Archive/AMORE/ 一、出现…

[C++初阶]list的模拟实现

一、对于list的源码的部分分析 1.分析构造函数 首先&#xff0c;我们一开始最先看到的就是这个结点的结构体&#xff0c;在这里我们可以注意到这是一个双向链表。有一个前驱指针&#xff0c;一个后继指针。然后在有一个存储数据的空间 其次它的迭代器是一个自定义类型&#x…

图片太大怎么压缩变小?交给这4个方法就能行

在钱塘江畔&#xff0c;一场罕见的“蝴蝶潮”翩然而至&#xff0c;不仅带来了自然奇观&#xff0c;也预示着好运的降临。然而&#xff0c;当我们将这份美好瞬间分享给更多人时&#xff0c;却遇到了一个小小难题——高分辨率的照片占据了大量的存储空间&#xff0c;上传至社交平…

HBuilderX打包流程(H5)?HBuilder如何发布前端H5应用?前端开发怎样打包发布uniapp项目为h5?

打包步骤&#xff1a; 1、打开hbuilder x》发行》网站-PC Web或手机H5(仅适用于uni-app)(H) 2、面板里的所有信息都可以不填&#xff0c;也不用勾选》直接点击【发行】即可 3、打包成功&#xff1a; 4、部署 按照打包后的路径&#xff0c;找到打包好的文件夹&#xff0c;把文…

【5G Sub-6GHz模块】专为IoT/eMBB应用而设计的RG520NNA、RG520FEB、RG530FNA、RG500LEU 5G模组

推出全新的5G系列模组&#xff1a; RG520NNADB-M28-SGASA RG520NNADA-M20-SGASA RG520FEBDE-M28-TA0AA RG530FNAEA-M28-SGASA RG530FNAEA-M28-TA0AA RG500LEUAA-M28-TA0AA ——明佳达 1、5G RG520N 系列——专为IoT/eMBB应用而设计的LGA封装模块 RG520N 系列是一款专为 IoT…

使用 ABBYY FineReader PDF 15 在创建或转换 PDF 时自动生成书签

使用 ABBYY 为 PDF 文件添加书签&#xff0c;可以帮助快速定位文档中的主要内容&#xff0c;也能更方便的梳理出一份文档大纲。 有很多 PDF 文件在创建时并没有编辑书签&#xff0c;这里介绍使用 ABBYY FineReader PDF 15&#xff08;Win 系统&#xff09;在 PDF 中自动添加书…

知识分享:网贷大数据查询会影响个人征信吗?

随着人们对传统征信的认识不断加深和对个人征信的重视&#xff0c;部分网友就有一种疑问&#xff0c;那就是关于网贷大数据查询对征信有没有影响的问题&#xff0c;小易大数据小编就用本文就为大家详细讲解一下&#xff0c;希望对你了解网贷大数据有帮助。 首先网贷大数据与征信…