一文搞懂自注意力(PyTorch)

PyTorch注意力机制 文章目录 1.注意力机制 1.1 注意力机制 1.1.1 非参注意力池化层 1.1.2 Nadaraya-Watson核回归 1.1.3 参数化的注意力机制 1.1.4 注意力汇聚:Nadaraya-Watson核回归的代码实现 2 注意力分数 2.1 加性注意力 2.2 缩放点积注意力 2.3 注意力打分函数代码实现 3 使用注意力机制的seq2seq 4 多头注意力 5 自注意力 5.1 比较卷积神经网络、循环神经网络和自注意力 5.2 位置编码 5.2.1 绝对位置信 阅读详情

自注意力机制是Transformer模型的核心组件,它允许模型在处理序列数据时,通过计算序列中不同位置元素之间的相关性得分,动态地调整对每个元素的关注程度,从而捕捉到序列内部的复杂依赖关系。

一、自注意力机制 

自注意力机制(Self- Attention)是什么?自注意力机制能够动态地捕捉序列中不同位置元素之间的依赖关系,并根据这些依赖关系生成新的序列表示。

它之所以被称为“自注意力”,是因为它在单一序列中通过计算序列元素之间的相互依赖关系来生成新的特征表示。这与传统的注意力机制有所不同,后者通常涉及两个序列之间的交互。

自注意力机制的查询和键来自同一组元素,即查询和键都是同一序列(如一句话中的词元或同一张图像中的不同patch)的特征,彼此之间进行注意力计算。

二、注意力分数 

如何实现注意力机制?在自注意力机制中,通过缩放点积计算注意力得分,并利用这些得分对值向量进行加权求和,从而实现了自注意力机制,它能够捕捉序列内部元素之间的依赖关系。 

 

import torch
import torch.nn as nn
import torch.nn.functional as F
class SelfAttention(nn.Module):
    def __init__(self, embed_dim):
        super().__init__()
        self.embed_dim = embed_dim
        self.query = nn.Linear(embed_dim, embed_dim)
        self.key = nn.Linear(embed_dim, embed_dim)
        self.value = nn.Linear(embed_dim, embed_dim)
    def forward(self, x):
        # x shape: (batch_size, seq_len, embed_dim)
        Q = self.query(x)
        K = self.key(x)
        V = self.value(x)
        # 计算注意力分数
        scores = torch.matmul(Q, K.transpose(-2, -1)) / (self.embed_dim ** 0.5)
        attention = F.softmax(scores, dim=-1)
        # 加权求和
        output = torch.matmul(attention, V)
        return output

 注意力分数是什么?注意力分数用来量化注意力机制中某一部分信息被关注的程度,反映了信息在注意力机制中的重要性。在注意力机制中,模型会根据注意力分数来决定对不同输入信息的关注程度。

Q(Query)、K(Key)、V(Value)通过映射矩阵得到相应的向量,通过计算Q与K的点积相似度并经过softmax归一化得到权重,最后使用这些权重对V进行加权求和得到输出。 

 

Q、K、V计算过程是什么?对于输入序列的每个单词,通过计算其Query与所有单词Key的点积得到注意力分数,经Softmax归一化后得到注意力权重,再用这些权重对Value向量进行加权求和,以得到包含丰富上下文信息的新单词表示。

import torch
def compute_attention_scores(Q, K, V):
    """
    计算自注意力分数
    输入:
        Q: Query矩阵, 形状为 [batch_size, seq_len, d_k]
        K: Key矩阵, 形状为 [batch_size, seq_len, d_k]
        V: Value矩阵, 形状为 [batch_size, seq_len, d_v]
    输出:
        output: 加权后的结果 [batch_size, seq_len, d_v]
        attention_weights: 注意力权重 [batch_size, seq_len, seq_len]
    """
    # 1. 计算Q与K的点积(相似度)
    scores = torch.matmul(Q, K.transpose(-2, -1))  # [batch_size, seq_len, seq_len]
    # 2. 缩放:除以sqrt(d_k)防止梯度消失
    d_k = K.size(-1)
    scores = scores / (d_k ** 0.5)
    # 3. 归一化:Softmax得到注意力权重
    attention_weights = torch.softmax(scores, dim=-1)
    # 4. 用权重对V加权求和
    output = torch.matmul(attention_weights, V)  # [batch_size, seq_len, d_v]
    return output, attention_weights
# 示例测试
if __name__ == "__main__":
    # 生成随机数据
    batch_size = 2
    seq_len = 3
    d_k = 4  # Q和K的维度
    d_v = 6  # V的维度
    Q = torch.randn(batch_size, seq_len, d_k)
    K = torch.randn(batch_size, seq_len, d_k)
    V = torch.randn(batch_size, seq_len, d_v)
    # 计算注意力
    output, weights = compute_attention_scores(Q, K, V)
    print("输入形状:")
    print(f"Q: {Q.shape}, K: {K.shape}, V: {V.shape}\n")
    print("输出形状:")
    print(f"加权结果: {output.shape}")
    print(f"注意力权重: {weights.shape}\n")
    print("注意力权重示例(第一个样本):")
    print(weights[0].detach().numpy().round(2))

  • 生成Q、K、V向量:对于输入序列中的每个单词,都会生成对应的Query(查询)、Key(键)和Value(值)向量。这些向量通常是通过将单词的嵌入向量(Embedding Vector)输入到一个线性变换层得到的。

  • 计算Q、K的点积(注意力分数):计算Query向量与序列中所有单词的Key向量之间的点积,得到一个分数。这个分数反映了Query向量与每个Key向量之间的相似度,即每个单词与当前位置单词的关联程度。

  • Softmax函数归一化(注意力权重):这些分数会经过一个Softmax函数进行归一化,得到每个单词的注意力权重。这些权重表示了在理解当前单词时,应该给予序列中其他单词多大的关注。

  • 注意力权重加权求和(加权和向量):这些注意力权重与对应的Value向量进行加权求和,得到一个加权和向量。这个加权和向量会被用作当前单词的新表示,包含了更丰富的上下文信息。


PyTorch——自注意力(self-attention)机制实现(代码详解) 参考链接 https://www.bilibili.com/video/BV1JE411g7XF?p=54 https://arxiv.org/abs/1706.03762 https://blog.csdn.net/qq_36653505/article/details/83375160 简述自注意力机制(self-attention) self-attention可以视为一个特征提取层,给定输入特征a1,a2,⋅⋅⋅ana^{1},a^{2},\cdot \cdot \cdot a^{n}a1,a2 阅读详情

相关推荐

通俗理解自注意力机制

具体来说,在自注意力机制中,对于输入序列中的每个元素,会计算出三个表示:查询向量(query vector)、键向量(key vector)和值向量(value vector)。通过对查询向量和键向量之间的相似度计算,可以得到每个元素与其他元素之间的相关性权重,然后利用这些权重对值向量进行加权求和,得到最终的输出表示。总的来说,自注意力机制的使用包括计算 Query、Key、Value,计算相关性权重,加权求和等步骤,通常结合神经网络结构一起使用,以实现对序列数据的建模和信息整合。

游泳的鱼的专栏 1901

PyTorch——实现自注意力机制(self-attention)

文章目录1 原理简述 1 原理简述   Self-Attention Layer 一次检查同一句子中的所有单词的注意力,这使得它成为一个简单的矩阵计算,并且能够在计算单元上并行计算。 此外,Self-Attention Layer 可以使用下面提到的 Multi-Head 架构来拓宽视野,也就是多头注意力机制。Self-Attention Layer 基本结构如下: 对于每个输入 x\boldsymbol{x}x,首先经过 Embedding 层对每个输入进行编码得到 a1,a2,a3,a4\boldsy

weixin_53598445的博客 2万+

【Pytorch】BERT+LSTM+多头自注意力(文本分类)

【Pytorch】BERT+LSTM+多头自注意力(文本分类) 2018年Google提出了BERT[1](Bidirectional Encoder Representations from Transformers)预训练模型,刷新了11项NLP任务的精度,在NLP领域掀起一波预训练(pre-training)模型热潮。通过对BERT、RoBERTa、GPT等预训练模型微调(fine-tuning)或者作为文本的特征提取器进行迁移学习成为当时直到现在最流行的情感分析方法。

weixin_42419611的博客 2万+

(多头)自注意力机制的PyTorch实现

用于学习和复习的两份自注意力机制实现代码。 自注意力 使用了缩放点积作为打分函数,因此key和query的维数是一样的,实现很简单。 from math import sqrt import torch import torch.nn as nn class SelfAttention(nn.Module): dim_in: int dim_k: int dim_v: int def __init__(self, dim_in, dim_k, dim_v):

ZZXN的博客 1万+

管道机器人手臂机械结构设计cad【8张】+三维图+设计说明书+绛重

履带式管道机器人适用于各种管道环境,包括直管道、弯曲管道、水平管道、垂直管道等,其灵活性和适应性使得它可以应对不同形状和尺寸的管道,完成全面的检测和维护工作。管道机器人研究具有重要的现实意义和深远的社会影响,通过提高工作效率、降低人员风险、提升服务质量、节约成本资源和促进科技创新等方面的作用,为现代工程技术领域的发展和进步做出了积极的贡献。管道机器人是一种能够在管道内部执行各种任务的智能机器人,而管道机器人的机械臂对于管道机器人在管道内执行任务的灵活性、稳定性和效率至关重要。

kejigongjiang的博客 943

手把手教你用smarteye搭建免费GB28181监控平台(含海康设备接入避坑指南)

本文提供了一份基于SmartEye搭建免费GB28181视频监控平台的实战指南。详细介绍了从服务器部署、GB28181协议核心配置,到海康威视等主流设备接入的完整流程,并重点分享了设备注册失败、无法预览等常见问题的深度排错方法,旨在帮助中小企业及开发者低成本实现多品牌监控设备的统一管理。

pz89012345的博客 326

一文搞懂 Transformer 中的三种注意力机制

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。《Attention is All You Need》3.2.3 注意力机制的应用Transformer使用多头注意力机制的三种不同方式如下:在“编码器-解码器注意力”层中,查询来自前一层解码器,而记忆键和值则来自编码器的输出。这使得解码器中的每个位置都能关注输入序列中的所有位置。

机器学习社区 6123

工控安全政策系列导读:国际标准IEC 62443标准系列

IEC 62443由ANSI/ISA提出,被ISO/IEC采纳,所以该标准会以不同的名字出现,包括:ANSI/ISA-99,ISA-99,ISA 62443,ISO/IEC 62443,ISO 62443,IEC 62443。其中IEC 62443-2-1已等同采纳为国标,于2016年10月发布,标准编号为GB/T 33007。 IEC 62443是在国...

weixin_34132768的博客 2622

三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力

自注意力机制自2017年在开创性论文《Attention Is All You Need》中被提出以来,已成为最先进深度学习模型的核心,尤其是在自然语言处理(NLP)领域。考虑到其广泛应用,深入理解自注意力的运作机制变得尤为重要。图1:原始Transformer架构在深度学习中,"注意力"概念的引入最初是为了改进递归神经网络(RNNs)处理长序列或句子的能力。例如,在机器翻译任务中,逐字翻译通常无法捕捉语言的复杂语法和表达方式,导致翻译质量低下。

deephub 7284

Proteus仿真——电压比较器

电压比较器是一种对输入信号进行鉴别与比较的电路,是组成非正弦波发生电路的基本单元电路。常用电压比较器有如下几种:单限比较器、滞回比较器、窗口比较器、集成电压比较器等。

weixin_58745307的博客 3376

车牌识别系统

随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 牌照自动识别是一

FPGA/MATLAB学习教程/源码/项目合作开发 2万+

Pytorch 自注意力和位置编码

环境使用 Kaggle 里免费建立的 Notebook教程使用李沐老师的 动手学深度学习 网站和 视频讲解小技巧:当遇到函数看不懂的时候可以按 查看函数详解。yi=f(xi,(x1,x1),…,(xn,xn))∈Rd \mathbf{y}_i = f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^d yi​=f(xi​,(x1​,x1​),…,(xn​,xn​

负负得正的博客 3527

从Raw图像到超分辨率:真实场景下的图像增强全流程指南

通过本文的学习,您已掌握了利用Raw图像实现真实场景超分辨率的完整技术链——从数据生成的“真实感模拟”,到双分支CNN的“细节+色彩”协同建模,再到模型的训练与落地。本文将带您从理论到实践,掌握利用Raw图像实现真实场景超分辨率的核心技术,让您的图像在细节和色彩上都能“更上一层楼”。是相机传感器直接输出的原始数据,保留了最完整的亮度、色彩信息(如Bayer阵列的原始采样),这为超分辨率提供了“富矿级”的信息基础。该分支以低分辨率RGB图像为参考,学习“色彩变换矩阵”,让恢复的细节拥有真实的色彩表现。

FJN110的博客 142

自注意力机制(self-attention)的理解与pytorch实现

attention机制,即自注意力机制,为了解决以往的RNN,LSTM等模型对于长距离的上下文分析能力不足的问题。

qq_41103479的博客 1万+

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项复赛模拟卷1:文末附答案)

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项复赛模拟卷1:文末附答案)

王老师青少年编程 1614

Python爬虫实战:模拟登录知乎 – 通过加密参数和验证码实现自动登录

通过本篇博客的讲解,我们学习了如何通过 POST请求 和 验证码识别,模拟登录知乎并爬取用户信息、问题数据。随着爬虫技术的发展,面对更复杂的反爬虫机制,我们可以不断调整策略,以绕过这些防护,实现数据的自动化抓取。

2201_76125261的博客 731
上一篇: 【附代码】登顶Nature,准备起飞!KAN-UNet又杀疯了
下一篇: 【转行分享】35+职场人破局AI领域,真的可行!
大模型星球
博客等级 码龄5年 1132粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值