手撕SelfAttention

一、目录

  1. 定义
  2. 代码实现

二、实现

  1. 定义
    在这里插入图片描述
  2. 代码实现

#手撕 self attention
import torch
import torch.nn as nn
import numpy as np

class SelfAttention(nn.Module):
    def __init__(self,hidden_dim,dim_q,dim_v):
        super(SelfAttention,self).__init__()
        self.hidden_dim=hidden_dim
        self.dim_q=dim_q
        self.dim_k=dim_q
        self.dim_v=dim_v

        self.linear_q=nn.Linear(self.hidden_dim,self.dim_q)
        self.linear_k=nn.Linear(self.hidden_dim,self.dim_k)
        self.linear_v=nn.Linear(self.hidden_dim,self.dim_v)
        self.norm_fact=1/np.sqrt(self.dim_k)                #保持均值、方差不变,使得训练过程中梯度值保持稳定

    def forward(self,x):

        q=self.linear_q(x)                                  #为了提升模型的拟合能力,矩阵W都是可以训练的,起到一个缓冲的效果。
        k=self.linear_k(x)
        v=self.linear_v(x)

        acore=torch.matmul(q,k.transpose(1,2))*self.norm_fact
                                              #内积:以行向量的角度理解,里面保存了每个向量与自己和其他向量进行内积运算的结果,代表词的相关性
        a=torch.softmax(acore,dim=-1)
        att=torch.matmul(a,v)
        return att

if __name__ == '__main__':
    batch=2
    seq_len=5
    hidden_dim=4
    x=torch.randn(batch,seq_len,hidden_dim)
    attention=SelfAttention(hidden_dim,10,hidden_dim)
    print(attention(x).shape)





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值