SelfAttenion自注意力机制

my-attention

考虑别的token对当前token的语义影响

第一种情况, 维度缩减

输入x= [4x6]

dk=3

wq = [6x3]

wk = [6x3]

wv = [6x3]

q = x@ wq = [4x6]*[6x3] = [4x3]

k = x@ wk = [4x6]*[6x3] = [4x3]

r=q@k.T = [4x3]*[3x4]=[4x4]

缩放

r = r/sqrt(dk)=[4x4]

a = softmax®=[4x4]

v = x@ wv = [4x6]*[6x3] = [4x3]

out = a@v = [4x4] * [4x3] = [4x3]

第二种情况, 维度不缩减

输入x= [4x6]

输出维度为6

dk=6

随机生成qkv

wq = [6x6]

wk = [6x6]

wv = [6x6]

q = x@ wq = [4x6]*[6x6] = [4x6]

k = x@ wk = [4x6]*[6x6] = [4x6]

r=q@k.T = [4x6]*[6x4]=[4x4]

缩放

r = r/sqrt(dk)=[4x4]

归一化

a = softmax®=[4x4]

原始值增加权重

v = x@ wv = [4x6]*[6x6] = [4x6]

out = a@v = [4x4] * [4x6] = [4x6]

保证输出结果的维度和要求要一致

下面是用代码实现了一下自注意力机制

复制代码
import math

import torch
from torch import nn

x = torch.randn(16, 64, 512)

d_model = 512
h_num = 8


class Self_Attention(nn.Module):
    def __init__(self, d_model, h_num):
        # 调用父类构造函数
        super(Self_Attention, self).__init__()

        self.d_model = d_model
        self.h_num = h_num
        self.softmax = nn.Softmax(dim=-1)
        self.w_q = nn.Linear(d_model, d_model)
        self.w_k = nn.Linear(d_model, d_model)
        self.w_v = nn.Linear(d_model, d_model)
        self.w_o = nn.Linear(d_model, d_model)

    def forward(self, x):
        B, L, D = x.shape

        h_d = self.d_model // self.h_num

        q, k, v = self.w_q(x), self.w_k(x), self.w_v(x)
        q = q.view(B, L, self.h_num, h_d).transpose(1, 2)
        k = k.view(B, L, self.h_num, h_d).transpose(1, 2)
        v = v.view(B, L, self.h_num, h_d).transpose(1, 2)

        r = q @ k.transpose(2, 3) / math.sqrt(h_d)

        mask = torch.tril(torch.ones(L, L, dtype=bool))

        r = r.masked_fill(~mask, -10000) 

        a = self.softmax(r)

        o = a @ v
        o = o.transpose(1, 2).contiguous().view(B, L, self.d_model)

        return self.w_o(o)


attention = Self_Attention(d_model, h_num)
y = attention(x)
print(y.shape)
print(y)
相关推荐
User_芊芊君子11 分钟前
CANN_PTO_ISA虚拟指令集全解析打造跨平台高性能计算的抽象层
人工智能·深度学习·神经网络
alvin_200514 分钟前
python之OpenGL应用(二)Hello Triangle
python·opengl
铁蛋AI编程实战23 分钟前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
HyperAI超神经27 分钟前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
jiang_changsheng35 分钟前
RTX 2080 Ti魔改22GB显卡的最优解ComfyUI教程
python·comfyui
空白诗42 分钟前
CANN ops-nn 算子解读:Stable Diffusion 图像生成中的 Conv2D 卷积实现
深度学习·计算机视觉·stable diffusion
0思必得01 小时前
[Web自动化] Selenium处理滚动条
前端·爬虫·python·selenium·自动化
子榆.1 小时前
CANN 与主流 AI 框架集成:从 PyTorch/TensorFlow 到高效推理的无缝迁移指南
人工智能·pytorch·tensorflow
User_芊芊君子1 小时前
CANN图编译器GE全面解析:构建高效异构计算图的核心引擎
人工智能·深度学习·神经网络
沈浩(种子思维作者)1 小时前
系统要活起来就必须开放包容去中心化
人工智能·python·flask·量子计算