Python 基于pytorch实现多头自注意力机制代码;Multiheads-Self-Attention代码实现

这篇具有很好参考价值的文章主要介绍了Python 基于pytorch实现多头自注意力机制代码;Multiheads-Self-Attention代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.Multiheads-Self-Attentiona简介

多头自注意力机制(Multi-Head Self-Attention)是一种注意力机制的变体,用于增强模型在处理序列数据时的建模能力。它在自注意力机制的基础上引入了多个头(Attention Head),每个头都可以学习到不同的注意力权重分布,从而能够捕捉到不同的关系和特征。

多头自注意力机制可以分为以下几个主要步骤:

1.1查询、键和值的线性变换

        首先,将输入的查询向量Q、键向量K和值向量V进行线性变换,得到多组查询、键和值。具体来说,将它们通过不同的线性变换矩阵分别投射到不同的低维空间中,得到多组变换后的查询向量Q'、键向量K'和值向量V'。

1.2多头注意力权重的计算

        在这一步骤中,针对每个注意力头,分别计算出对应的注意力权重。具体来说,对于每个头,将变换后的查询向量Q'与键向量K'进行点积操作,然后通过softmax函数将得分归一化为概率分布。这样就得到了多组注意力权重。

1.3多头上下文向量的计算

        针对每个注意力头,将对应的注意力权重与变换后的值向量V'进行加权求和,得到多组上下文向量。这些上下文向量将包含各个头所关注的不同信息。

1.4多头上下文的融合

        将多组上下文向量在特定维度上进行拼接或线性变换,将它们融合成最终的上下文向量。这样得到的上下文向量将包含从多个头中学到的不同特征和关系。

        多头自注意力机制的优势在于可以并行地学习多组不同的注意力权重,从而能够提取不同层次、不同类型的相关信息。通过引入多头机制,模型可以同时关注序列中的多个位置,并从不同的角度对序列进行编码,提高了模型的表达能力和泛化能力。

多头注意力机制pytorch,NLP,GPT,LLMs,python,注意力机制,transformer,多头注意力,人工智能

图中h就是代表头的数量,这个是transformer结构的一部分

多头注意力机制pytorch,NLP,GPT,LLMs,python,注意力机制,transformer,多头注意力,人工智能

2.代码实现Multi-heads-Self-Attentiona结构

import torch
import torch.nn.functional as F
# 一个形状为 (batch_size, seq_len, feature_dim) 的张量 x
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 向量
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 = tensor.size()
    head_dim = feature_dim // num_heads
    output = tensor.view(batch_size, seq_len, num_heads, head_dim).transpose(1, 2)
    return  output # 形状 (batch_size, num_heads, seq_len, feature_dim)
Q = 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 的点积,作为相似度分数 , 也就是自注意力原始权重
raw_weights = torch.matmul(Q, K.transpose(-2, -1))  # 形状 (batch_size, num_heads, seq_len, seq_len)
# 对自注意力原始权重进行缩放
scale_factor = K.size(-1) ** 0.5
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 向量,计算加权和,得到加权信息
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_dim
    output = 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)

多头注意力机制pytorch,NLP,GPT,LLMs,python,注意力机制,transformer,多头注意力,人工智能

在我的其它文章中详细介绍了transformer和gpt的结构,具体代码见此专栏的其他文章 

3.总结

        值得注意的是,多头自注意力机制通常还会引入一些线性变换和归一化操作,以增加模型的表达能力和稳定性。比如,可以通过将多个头输出的上下文向量进行线性变换并拼接,然后再通过另一个线性变换将其映射到目标空间。同时,为了保持变换前后的数值范围一致,常常会进行归一化操作,如层归一化(Layer Normalization)或批次归一化(Batch Normalization)。

        综上所述,多头自注意力机制通过引入多组注意力头,可以并行学习多个不同的注意力权重,从而能够提取不同层次、不同类型的相关信息,增强模型的表达能力和泛化能力。它是当前很多自然语言处理任务中常用的重要注意力机制之一。文章来源地址https://www.toymoban.com/news/detail-858344.html

到了这里,关于Python 基于pytorch实现多头自注意力机制代码;Multiheads-Self-Attention代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解

    注意力机制一直是一个比较热的话题,其实在很早之前就提出了,我们在学习图像分类时在SENet就见到过(直通车:经典神经网络论文超详细解读(七)——SENet(注意力机制)学习笔记(翻译+精读+代码复现))自从谷歌发表了《Attention Is All You Need》这篇论文后,注意力

    2024年02月06日
    浏览(55)
  • 【NLP】多头注意力概念(02)

    接上文:  【NLP】多头注意力概念(01)          将  Q 、K 和  V  拆分为它们的头部后,现在可以计算  Q  和  K  的缩放点积。上面的等式表明,第一步是执行张量乘法。但是, 必须先 转置 K。         展望未来,每个张量的 seq_length 形状将通过其各自的张量来识

    2024年02月16日
    浏览(27)
  • Bert基础(二)--多头注意力

    顾名思义,多头注意力是指我们可以使用多个注意力头,而不是只用一个。也就是说,我们可以应用在上篇中学习的计算注意力矩阵Z的方法,来求得多个注意力矩阵。让我们通过一个例子来理解多头注意力层的作用。以All is well这句话为例,假设我们需要计算well的自注意力值

    2024年02月21日
    浏览(35)
  • 【NLP】多头注意力概念(01)

            本文是“已实施的变压器”系列的一篇。它从零开始引入了多头注意力机制。注意力是变压器背后的支柱和力量,因为它为序列提供了上下文。         在变压器模型中,注意力为每个序列提供上下文。这有助于模型了解不同单词如何相互关联,以创建有意义

    2024年02月16日
    浏览(28)
  • MultiHeadAttention多头注意力机制的原理

    MultiHeadAttention多头注意力作为Transformer的核心组件,其主要由多组自注意力组合构成。 在NLP任务中,自注意力能够根据上下文词来重新构建目标词的表示,其之所以被称之为注意力,在于从上下文词中去筛选目标词更需要关注的部分,比如\\\"他叫小明\\\",\\\"他\\\"这个词更应该关注

    2023年04月21日
    浏览(28)
  • 多维时序 | MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测

    预测效果 基本介绍 MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测。 模型描述 MATLAB实现TSOA-TCN-Multihead-Attention凌日优化时间卷积神经网络融合多头自注意力机制的多变量时间序列预测,用于处理时间序列数据;适用平台:Matlab 2023及以上 1.data为数据集,格

    2024年02月05日
    浏览(33)
  • 【轴承RUL预测代码】基于TCN、TCN和多头注意力(TCN和Transformer的encoder结合)、Transformer模型的轴承RUL预测代码(精华)

    这里以PHM2012轴承特征数据集为例,采样频率为25.6kHz,采样持续时间是0.1s,采样点数是2560 原始特征集 类型 振动数据 2560维度 FFT预处理数据 1280维度 STFT预处理数据 1281维度 后续还可以将上述的原始特征集数据作为深度自编网络的输入,进行无监督学习,提取深度特征数据 自

    2024年02月12日
    浏览(31)
  • 深入理解Transformer,兼谈MHSA(多头自注意力)、Cross-Attention(交叉注意力)、LayerNorm、FFN、位置编码

    Transformer其实不是完全的Self-Attention(SA,自注意力)结构,还带有Cross-Attention(CA,交叉注意力)、残差连接、LayerNorm、类似1维卷积的Position-wise Feed-Forward Networks(FFN)、MLP和Positional Encoding(位置编码)等 本文涵盖Transformer所采用的MHSA(多头自注意力)、LayerNorm、FFN、位置编

    2024年04月12日
    浏览(48)
  • multi-head_seft-attention(多头自注意力)

    相比于single-head,multi-head就是将 q i q^i q i 分成了 h h h 份 将 q i q^i q i 分成了 h h h 份 计算过程 对于每个Head,我们可以提取出他的 b 11 b_{11} b 11 ​ 到 b m 1 b_{m1} b m 1 ​ ,以 H e a d 1 Head_1 He a d 1 ​ 举例 将输入序列进行embedding后,变为向量 a 1 a_1 a 1 ​ , a 2 a_2 a 2 ​ , a 3 a_3 a 3 ​

    2024年02月13日
    浏览(33)
  • 深入理解深度学习——注意力机制(Attention Mechanism):带掩码的多头注意力(Masked Multi-head Attention)

    分类目录:《深入理解深度学习》总目录 相关文章: ·注意力机制(AttentionMechanism):基础知识 ·注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归 ·注意力机制(AttentionMechanism):注意力评分函数(AttentionScoringFunction) ·注意力机制(AttentionMechanism):Bahda

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包