【pytorch】手把手实现自注意力机制

本文介绍了一种基于PyTorch实现的多头自注意力机制方法。该方法接收形状为(B, N, C)的输入矩阵,并通过定义一个多头自注意力类来实现自注意力机制。最终输出经过注意力加权后的特征矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

        不仅在NLP领域,自注意力机制也在CV领域有着广泛的应用。所以,如何很好地实现自注意力机制成为比较关键的问题。下面我们来对于该机制进行简单实现。

        先总结一下思路:

        1. 我们的输入是一个(B,N,C)形状的矩阵,其中B代表Batch Size,N代表Time Step,C代表每个Time Step的维度。

        2. 我们想做的是,根据输入得到多头的qkv。qkv分别代表query,key,value。我们想用query来查询key而得到一个关联度矩阵A。

        3. 由于是多头注意力,我们得到了多个关联度矩阵,我们要将多个关联度矩阵合并为一个。

        4. 最后的关联度矩阵和value矩阵相乘,等到最后的输出。

最后的代码如下:

        

import torch,math
import torch.nn as nn
class MultiHead_SelfAttention(nn.Module):
    def __init__(self, dim, num_head):
        '''

        Args:
            dim: dimension for each time step
            num_head:num head for multi-head self-attention
        '''
        super().__init__()
        self.dim=dim
        self.num_head=num_head
        self.qkv=nn.Linear(dim, dim*3) # extend the dimension for later spliting

    def forward(self, x):
        B, N, C = x.shape
        qkv = self.qkv(x).reshape(B, N, 3, self.num_head, C//self.num_head).permute(2, 0, 3, 1, 4)
        q, k, v= qkv[0], qkv[1], qkv[2]
        att = q@k.transpose(-1, -2)/ math.sqrt(C)
        att = att.softmax(dim=1) # 将多个注意力矩阵合并为一个
        x = (att@v).transpose(1, 2)
        x=x.reshape(B, N, C)
        return x



if __name__=='__main__':
    B = 10
    N = 20
    C = 32
    num_head=8
    x = torch.rand((B, N, C))
    MHSA=Multihead_SelfAttention(C, num_head)
    print(MHSA(x).shape)

要用Pytorch手写一个Transformer模型,可以按照以下步骤进行: 1. 导入所需的库和模块,包括torch、torch.nn、torch.nn.functional以及Transformer模型所需的子模块如EncoderLayer和DecoderLayer。 2. 定义Transformer模型的编码器部分。编码器由多个EncoderLayer组成,每个EncoderLayer包含自注意力机制(Self-Attention)、前馈神经网络和残差连接。 3. 定义Transformer模型的解码器部分。解码器也由多个DecoderLayer组成,每个DecoderLayer包含自注意力机制、编码器-解码器注意力机制和前馈神经网络。 4. 定义Transformer模型本身。它包含编码器和解码器,以及最后的线性层用于生成输出。 5. 实现模型的前向传播函数。在前向传播函数中,输入数据将分别经过编码器和解码器,并返回最后的输出。 6. 初始化模型并定义损失函数和优化器。 7. 定义训练循环。在每个训练迭代中,将输入数据传递给模型进行前向传播,计算损失值,并进行反向传播和参数更新。 8. 进行模型训练。根据实际情况,可以调整超参数、训练数据和训练次数等。 请注意,以上步骤是一个大致的框架,具体的实现细节可能会有所不同。可以参考引用中提到的huggingface提供的transformer模型代码,以及Transformer模型的论文《Attention is All You Need》来进行更详细的实现。 huggingface官方文档: [link] Transformer模型图: [link]<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [手把手教你用Pytorch代码实现Transformer模型(超详细的代码解读)](https://blog.csdn.net/qq_43827595/article/details/120394042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程思睿Siri

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值