首页 > 其他分享 >Transformer

Transformer

时间:2024-03-25 17:44:25浏览次数:23  
标签:dim Transformer nn seq self len size

Transformer

自注意力机制

自注意力机制核心就是计算句子在编码过程中每个位置上的注意力权重,然后再以权重和的方式计算整个句子的隐含向量表示

attention核心?

self-attention 核心公式:

\(\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V\)

  • 其中,\(Q\),\(K\),\(V\)分别表示查询(Query)、键(Key)和值(Value)的矩阵,\(d_k\)是每个注意力头的维度。
  • 首先将query与key的转置做点积,然后将结果除以sqrt(\(d_k\)),再进行softmax计算,最后将结果与value做矩阵乘法得到output,\(d_k\)表示词向量维度,除以sqrt(\(d_k\))是为了防止\(QK^T\)过大导致softmax计算溢出,其次可以将\(QK^T\)结果满足均值为0,方差为1的分布。
  • \(QK^T\)计算相当于计算Q和V中每个向量的点积,本质上是余弦相似度,可以表示两个向量在方向上的相似度,结果越大越相似。

总而言之,在Self-Attention中,通过计算查询和键之间的相似性得到注意力分布,然后将该分布与值相乘以获取加权的值表示。最后,对所有头的结果进行拼接或平均操作,得到最终的输出。

img

Q、K、V是什么?

q,k,v分别代表query,key,value对应为查询,键、值

img

Q、K、V都是对X进行矩阵W后的线性变换

实现


import numpy as np 

from math import sqrt

import torch 

from torch import nn


classSelf_Attention(nn.Module):

# input: batch_size * seq_len * input_dim

# Q: batch_size * seq_len * dim_k

# K: batch_size * seq_len * dim_k

# V: batch_size * seq_len * dim_v

def __init__(self,input_dim,dim_k,dim_v):

        super(Self_Attention,self).__init__()

self.q = nn.Linear(input_dim, dim_k)

self.k = nn.Linear(input_dim, dim_k)

self.v = nn.Linear(input_dim, dim_v)

self._norm_fact = 1 / sqrt(dim_k)


defforward(self,x):

        Q = self.q(x)  # Q: batch_size * seq_len * dim_k

        K = self.k(x)  # K: batch_size * seq_len * dim_k

        V = self.v(x)  # V: batch_size * seq_len * dim_v


# Q * K.T()  batch_size * seq_len * seq_len 

        atten = nn.Softmax(dim=-1)(torch.bmm(Q,K.permute(0,2,1))) * self._norm_fact

# Q * k.T() * V batch_size * seq_len * dim_v

        output = torch.bmm(atten,V)


return output


X = torch.randn(4,3,2)

print(X)

self_atten = Self_Attention(2, 4, 5)

res = self_atten(X)

print(res.shape)

多头注意力机制

不同于只使用一个注意力池化,可以将输入x拆分为h份,然后独立计算h组不同的线性投影来得到各自的QKV,然后将变换后的h组QKV并行计算注意力,最后将h个注意力池化拼接起来并通过另一个可以学习的线性投影进行变换以产生输出,这种设计叫做多头注意力。

img

在多头注意力机制中,每个头可能会关注输入的不同部分,可以表示比简单加权平均值更加复杂的函数。

img

实现


# Muti-head Attention 机制的实现

from math import sqrt

import torch

import torch.nn as nn



classSelf_Attention_Muti_Head(nn.Module):

# input: batch_size * seq_len *input_dim 

# q: bath_size * seq_len * dim_k

# k: bath_size * seq_len * dim_k

# v: bath_size * seq_len * dim_v

def __init__(self,input_dim,dim_k,dim_v,nums_head):

        super(Self_Attention_Muti_Head, self).__init__()

assert(dim_k % nums_head ==0)

assert(dim_v % nums_head ==0)

self.q = nn.Linear(input_dim, dim_k)

self.k = nn.Linear(input_dim, dim_k)

self.v = nn.Linear(input_dim, dim_v)


self.nums_head = nums_head

self.dim_k = dim_k

self.dim_v = dim_v

self._norm_fact = 1 / sqrt(dim_k)



defforward(self,x):


        Q = self.q(x).reshape(-1,x.shape[0],x.shape[1],self.dim_k // self.nums_head)

        K = self.k(x).reshape(-1,x.shape[0],x.shape[1],self.dim_k // self.nums_head)

        V = self.v(x).reshape(-1,x.shape[0],x.shape[1],self.dim_v // self.nums_head)


        print(x.shape)

        print(Q.size())


        atten = nn.Softmax(dim=-1)(torch.matmul(Q,K.permute(0,1,3,2))) # Q * K.T() ---> batch_size * seq_len * seq_len

        output = torch.matmul(atten,V).reshape(x.shape[0],x.shape[1],-1) # Q * K.T() * V ---> batch_size * seq_len * dim_v


return output


x = torch.rand(1,3,4)

print(x)


atten = Self_Attention_Muti_Head(4, 4, 4, 2)

y = atten(x)

print(y.shape)


标签:dim,Transformer,nn,seq,self,len,size
From: https://www.cnblogs.com/yege/p/18094939

相关文章

  • 学习人工智能:Attention Is All You Need-3-训练;结果;结论;Transformer模型相当于 E=MC^2
    5训练Training本节描述了我们模型的训练方案。5.1训练数据和批次处理TrainingDataandBatching我们在标准的WMT2014英德数据集上进行了训练,该数据集包含约450万个句子对。句子使用字节对编码[3]进行编码,其共享源-目标词汇表包含约37000个标记。对于英法翻译,我们使用......
  • 谈一谈BEV和Transformer在自动驾驶中的应用
    谈一谈BEV和Transformer在自动驾驶中的应用BEV和Transformer都这么火,这次就聊一聊。结尾有资料连接一BEV有什么用首先,鸟瞰图并不能带来新的功能,对规控也没有什么额外的好处。从鸟瞰图这个名词就可以看出来,本来摄像头等感知到的物体都是3D空间里的的,投影到2D空间,只是信息的......
  • 马斯克开源的 grok-1 底层 Transformer 模型论文 《Attention is All You Need》
    拓展阅读马斯克开源的grok-1底层Transformer模型论文《AttentionisAllYouNeed》马斯克开源的grok-1大模型底层Transformer模型到底是个啥?马斯克开源的grok-1大模型硬核源码第1弹马斯克开源的grok-1大模型硬核源码第2弹马斯克开源的grok-1大模型硬核源......
  • 机器学习算法那些事 | 使用Transformer模型进行时间序列预测实战
    本文来源公众号“机器学习算法那些事”,仅用于学术分享,侵权删,干货满满。原文链接:使用Transformer模型进行时间序列预测实战时间序列预测是一个经久不衰的主题,受自然语言处理领域的成功启发,transformer模型也在时间序列预测有了很大的发展。本文可以作为学习使用Transformer模......
  • 【论文精读】VIT:vision transformer论文
    相关文章【论文精读】Transformer:AttentionIsAllYouNeed文章目录相关文章一、文章概览(一)研究背景(二)核心思路(三)相关工作(三)文章结论二、模型细节(一)组成模块(二)模型的大体流程(三)具体的模型的前向过程(四)transformerencoder的公式表达(五)消融实验1、关于图像分类编码方......
  • 政安晨:【深度学习处理实践】(九)—— Transformer架构
    咱们接着这个系列的上一篇文章继续:政安晨:【深度学习处理实践】(八)——表示单词组的两种方法:集合和序列https://blog.csdn.net/snowdenkeke/article/details/136762323Transformer是一种架构,用于在自然语言处理(NLP)和其他任务中进行序列到序列(seq2seq)学习。它于2017年由Vaswani......
  • 学习人工智能:Attention Is All You Need-2-Transformer模型;Attention机制;位置编码
    3.2注意力机制Attention注意力函数可以描述为将查询和一组键值对映射到输出的过程,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中每个值的权重由查询与相应键的兼容性函数计算得出。3.2.1缩放点积注意力 ScaledDot-ProductAttention我们将我们特定的......
  • 如何用pytorch调用预训练Swin Transformer中的一个Swin block模块
    1,首先,我们需要知道的是,想要调用预训练的SwinTransformer模型,必须要安装pytorch2,因为pytorch1对应的torchvision中不包含SwinTransformer。2,pytorch2调用预训练模型时,不建议使用pretrained=True,这个用法即将淘汰,会报警告。最好用如下方式:fromtorchvision.models.swin_trans......
  • 4.transformer
    建议直接看参考的知乎链接,我这是一坨1.encorder\[\mathrm{LayerNorm}\big(X+\mathrm{MultiHeadAttention}(X)\big)\]\[\mathrm{LayerNorm}\big(X+\mathrm{Feed}\mathrm{Forward}(X)\big)\]\[\mathrm{FeedForward}(X)=\max(0,XW_1+b_1)W_2+b_2\]做layernorm而不是batchnor......
  • VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准
    文章目录VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer数据库基本信息方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM)p......