深度学习理论基础(六)Transformer多头注意力机制

目录

  • 一、自定义多头注意力机制
    • 1. 缩放点积注意力(Scaled Dot-Product Attention)
      • ● 计算公式
      • ● 原理
    • 2. 多头注意力机制框图
      • ● 具体代码
  • 二、pytorch中的子注意力机制模块

  
  深度学习中的注意力机制(Attention Mechanism)是一种模仿人类视觉和认知系统的方法,它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制,神经网络能够自动地学习并选择性地关注输入中的重要信息,提高模型的性能和泛化能力。
  下图 展示了人类在看到一幅图像时如何高效分配有限注意力资源的,其中红色区域表明视觉系统更加关注的目标,从图中可以看出:人们会把注意力更多的投入到人的脸部。文本的标题以及文章的首句等位置。而注意力机制就是通过机器来找到这些重要的部分。
在这里插入图片描述

一、自定义多头注意力机制

1. 缩放点积注意力(Scaled Dot-Product Attention)

  缩放点积注意力(Scaled Dot-Product Attention)是注意力机制的一种形式,通常在自注意力(self-attention)机制或多头注意力机制中使用,用于模型在处理序列数据时关注输入序列中不同位置的信息。这种注意力机制常用于Transformer模型及其变体中,被广泛用于各种自然语言处理任务,如机器翻译、文本生成和问答系统等。
在这里插入图片描述

● 计算公式

在这里插入图片描述

● 原理

假设输入:给定一个查询向量(query)、一组键向量(keys)和一组值向量(values)。

(1)Dot-Product 计算相似度:通过计算查询向量query与键向量keys之间的点积,得到每个查询与所有键的相似度分数。然后将这些分数进行缩放(scale)–除以根号下d_k,以防止点积的值过大,从而导致梯度消失或梯度爆炸。
(2)Mask 可选择性 目的是将 padding的部分 填充负无穷,这样算softmax的时候这里就attention为0,从而避免padding带来的影响.
(3)Softmax归一化:对相似度分数进行softmax归一化,得到每个键的权重,这些权重表示了对应值向量的重要程度。
加权求和:使用这些权重对值向量进行加权求和,得到最终的注意力输出。
在这里插入图片描述

2. 多头注意力机制框图

  多头注意力机制是在 Scaled Dot-Product Attention 的基础上,分成多个头,也就是有多个Q、K、V并行进行计算attention,可能侧重与不同的方面的相似度和权重。
在这里插入图片描述

● 具体代码

import torch
import torch.nn as nn
import numpy as np
import torch.nn.functional as Fclass MultiHeadAttention(nn.Module):#embedding_dim:输入向量的维度,num_heads:注意力机制头数def __init__(self, embedding_dim, num_heads):super(MultiHeadAttention, self).__init__()self.num_heads = num_heads       #总头数self.embedding_dim = embedding_dim   #输入向量的维度self.d_k= self.embedding_dim// self.num_heads  #每个头 分配的输入向量的维度数self.softmax=nn.Softmax(dim=-1)self.W_query = nn.Linear(in_features=embedding_dim, out_features=embedding_dim, bias=False)self.W_key = nn.Linear(in_features=embedding_dim, out_features=embedding_dim, bias=False)self.W_value = nn.Linear(in_features=embedding_dim, out_features=embedding_dim, bias=False)self.fc_out = nn.Linear(embedding_dim, embedding_dim)#输入张量 x 中的特征维度分成 self.num_heads 个头,并且每个头的维度为 self.d_k。def split_head(self, x, batch_size):x = x.reshape(batch_size, -1, self.num_heads, self.d_k)return x.permute(0,2,1,3)   #x  (N_size, self.num_heads, -1, self.d_k)def forward(self, x):batch_size=x.size(0)  #获取输入张量 x 的批量(batch size)大小q= self.W_query(x)  k= self.W_key(x)  v= self.W_value(x)#使用 split_head 函数对 query、key、value 进行头部切分,将其分割为多个注意力头。q= self.split_head(q, batch_size)k= self.split_head(k, batch_size)v= self.split_head(v, batch_size)##attention_scorce = q*k的转置/根号d_kattention_scorce=torch.matmul(q, k.transpose(-2,-1))/torch.sqrt(torch.tensor(self.d_k, dtype=torch.float32))attention_weight= self.softmax(attention_scorce)## output = attention_weight * Voutput = torch.matmul(attention_weight, v)  # [h, N, T_q, num_units/h]output  = out.permute(0,2,1,3).contiguous() # [N, T_q, num_units]output  = out.reshape(batch_size,-1, self.embedding_dim)output  = self.fc_out(output)return output

  

二、pytorch中的子注意力机制模块

  nn.MultiheadAttention是PyTorch中用于实现多头注意力机制的模块。它允许你在输入序列之间计算多个注意力头,并且每个头都学习到了不同的注意力权重。
  创建了一些随机的输入数据,包括查询(query)、键(key)、值(value)。接着,我们使用multihead_attention模块来计算多头注意力,得到输出和注意力权重。
  请注意,你可以调整num_heads参数来控制多头注意力的头数,这将会影响到模型的复杂度和表达能力。

import torch
import torch.nn as nn# 假设我们有一些输入数据
# 输入数据形状:(序列长度, 批量大小, 输入特征维度)
input_seq_length = 10
batch_size = 3
input_features = 32# 假设我们的输入序列是随机生成的
input_data = torch.randn(input_seq_length, batch_size, input_features)# 定义多头注意力模块
# 参数说明:
#   - embed_dim: 输入特征维度
#   - num_heads: 多头注意力的头数
#   - dropout: 可选,dropout概率,默认为0.0
#   - bias: 可选,是否在注意力计算中使用偏置,默认为True
#   - add_bias_kv: 可选,是否添加bias到key和value,默认为False
#   - add_zero_attn: 可选,是否在注意力分数中添加0,默认为False
multihead_attention = nn.MultiheadAttention(input_features, num_heads=4)# 假设我们有一个query,形状为 (查询序列长度, 批量大小, 输入特征维度)
query = torch.randn(input_seq_length, batch_size, input_features)# 假设我们有一个key和value,形状相同为 (键值序列长度, 批量大小, 输入特征维度)
key = torch.randn(input_seq_length, batch_size, input_features)
value = torch.randn(input_seq_length, batch_size, input_features)# 计算多头注意力
# 返回值说明:
#   - output: 注意力计算的输出张量,形状为 (序列长度, 批量大小, 输入特征维度)
#   - attention_weights: 注意力权重,形状为 (批量大小, 输出序列长度, 输入序列长度)
output, attention_weights = multihead_attention(query, key, value)# 输出结果
print("Output shape:", output.shape)
print("Attention weights shape:", attention_weights.shape)

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

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

相关文章

Pillow教程09:图片格式(png,jpg,ico等)批量转换+批量修改图片尺寸

---------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁…

rust 面向对象编程特性、模式与模式匹配、高级特征

面向对象编程OOP 学习了结构体、枚举,它们可以包含自定义数据字段,也可以定义内部方法,它们提供了与对象相同的功能。 面向对象的四大特征:封装、继承、多态 通过pub标记为公有的结构体,在其他模块中可以访问使用这…

Java数据结构队列

队列(Queue) 概念 队列的使用 注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。 import java.util.LinkedList; import java.util.Queue;public class Test {public static void main(String[]…

敏感信息泄露漏洞

法律声明 参与培训需要遵守国家法律法规,相关知识只做技术研究,请勿用于违法用途,造成任何后果自负与本人无关。 中华人民共和国网络安全法(2017年6月1日起施行) 第二十二条 任何个人和组织不得从事入侵他人网络、干扰…

基于SpringBoot+Vue的OA管理系统

一、项目背景介绍: 办公自动化(Office Automation,简称OA),是将计算机、通信等现代化技术运用到传统办公方式,进而形成的一种新型办公方式。办公自动化利用现代化设备和信息化技术,代替办公人员…

LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果

安装依赖 pip install --upgrade --quiet langchain-core langchain-community langchain-openai编写代码 from langchain_core.prompts import ChatPromptTemplate from langchain_community.utilities import SQLDatabase from langchain_core.output_parsers import StrO…

python 02字符串

字符串可能是用到最多的数据类型了,所有标准序列操作(索引、切片、乘法、成员资格检查、长度、最小值和最大值)都适用于字符串 但别忘了字符串是不可变的,因此所有的元素赋值和切片赋值都是非法的。 1.居中效果 默认为空格 可…

Redis集群三种模式

一、Redis集群的三种模式 Redis有三种模式,分别是主从复制、哨兵模式、cluster 主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障…

基于springboot的社区医疗服务系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

JavaScript实现全选、反选功能(Vue全选、反选,js原生全选、反选)

简介: 在JavaScript中,实现全选和反选通常是通过操作DOM元素和事件监听来实现; 全选功能:当用户点击一个“全选”复选框时,页面中所有具有相同类名的复选框都将被选中; 反选功能:用户点击一个…

2024.4.2-[作业记录]-day07-CSS 盒子模型(显示模式、盒子模型)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.2 学习笔记CSS标签元素显示模式1 块元素2 行内元素3 行内块元素4…

C++从入门到精通——初步认识面向对象及类的引入

初步认识面向对象及类的引入 前言一、面向过程和面向对象初步认识C语言C 二、类的引入C的类名代表什么示例 C与C语言的struct的比较成员函数访问权限继承默认构造函数默认成员初始化结构体大小 总结 前言 面向过程注重任务的流程和控制,适合简单任务和流程固定的场…