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)
相关推荐
揽秀亭长1 分钟前
论文降AI率有哪些方法?论文修改流程详解
人工智能·深度学习
傻啦嘿哟18 分钟前
Python的默认参数把我坑惨了,原来写[]和写None的区别这么大
开发语言·python·机器学习
微小冷20 分钟前
Python凸优化cvxpy初步
python·机器人·凸优化·数学规划·cvxpy
在世修行35 分钟前
干货:显式映射 vs 自动判据
python·插件
xzal1239 分钟前
Python之简单理解栈和队列
python
民乐团扒谱机1 小时前
【微科普】节拍检测从入门到迁移:西方SOTA模型怎么识别Beat,中国戏曲民乐又该怎么训练?
深度学习·大模型
lupai1 小时前
维修保养记录精准版 API 对接实战指南
数据库·python
水水不水啊1 小时前
告别杂乱的调试窗口:我用 Python + WebView 写了一个现代化串口助手
python·测试工具·嵌入式·嵌入式开发·串口调试·串口助手
richard_yuu2 小时前
动态规划:强化学习的「数学基础」,从 MDP 到值迭代
深度学习·神经网络·算法·yolo·机器学习·动态规划
三水写代码2 小时前
手写一个 Claude Code(1):从 Agent Loop 到工具、权限、Hooks 与任务规划
python·ai编程·claude·ai agent·claudecode