自注意力(self_attention)和位置编码

ops/2024/9/23 14:59:51/

目录

1.自注意力(self_attention)公式

2.代码实现

 2.1位置编码的代码实现

3.知识点个人理解 


 

1.自注意力(self_attention)公式

2.代码实现

python">import math
import torch
from torch import nn
import dltoolsnum_hiddens, num_heads = 100, 5
dropout = 0.2
#使用多头注意力机制时, 让key_size,  query_size,  value_size都=num_hiddens
attention = dltools.MultiHeadAttention(num_hiddens, num_hiddens, num_hiddens, num_hiddens, num_heads, dropout)
#dropout与.eval()搭配使用
attention.eval()
MultiHeadAttention((attention): DotProductAttention((dropout): Dropout(p=0.2, inplace=False))(W_q): Linear(in_features=100, out_features=100, bias=False)(W_k): Linear(in_features=100, out_features=100, bias=False)(W_v): Linear(in_features=100, out_features=100, bias=False)(W_o): Linear(in_features=100, out_features=100, bias=False)
)
python">batch_size, num_queries, valid_lens = 2, 4, torch.tensor([3, 2])
X = torch.ones((batch_size, num_queries, num_hiddens))
#创建不带位置信息的自注意力,就是让queries/keys/values都传X
attention(X, X, X, valid_lens).shape

 torch.Size([2, 4, 100])

 2.1位置编码的代码实现

 

python">#位置编码
class PositionalEncoding(nn.Module):def __init__(self, num_hiddens, dropout, max_len=10000, **kwargs):super().__init__(**kwargs)self.dropout = nn.Dropout(dropout)#创建一个存放位置编码的tensorself.P = torch.zeros((1, max_len, num_hiddens))  #第0维度的1,便于后面与其他数据计算时进行广播机制#除号左边的shape=(10000, 1),1在进行除法运算会进行广播机制,变成50X = torch.arange(max_len, dtype=torch.float32).reshape(-1, 1) / torch.pow(10000, torch.arange(0, num_hiddens, 2, dtype=torch.float32)/num_hiddens)#取出所有的偶数列, 进行赋值self.P[:, :, 0::2] = torch.sin(X)#取出所有的奇数列, 进行赋值self.P[:, :, 1::2] = torch.cos(X)#定义前向传播def forward(self, X):#: X.shape[1]表示只会索引到X的最大值X = X + self.P[:, : X.shape[1], :].to(X.device)return self.dropout(X)
python">encoding_dim, num_steps = 32, 60
#创建位置编码对象
pos_encoding = PositionalEncoding(encoding_dim, dropout=0)
pos_encoding.eval() #
X = pos_encoding(torch.zeros(1, num_steps, encoding_dim))
#调用pos_encoding中的self.P属性
P = pos_encoding.P[:, :X.shape[1], :]
X.shape, P.shape

 (torch.Size([1, 60, 32]), torch.Size([1, 60, 32]))

python">#dltools绘图
dltools.plot(torch.arange(num_steps), P[0, :, 6:10].T, xlabel='Row (position)', figsize=(6, 2.5), legend=['Col %d' % d for d in torch.arange(6,10)])

 

3.知识点个人理解 

 


http://www.ppmy.cn/ops/113971.html

相关文章

【系统架构设计】系统的可靠性分析与设计

【系统架构设计】系统的可靠性分析与设计 可靠性概述系统故障模型系统配置方法组成结构‌‌功能与应用场景‌‌技术含量与成本‌ 系统可靠性 可靠性概述 这里有几个名词要做好区分,可靠度是某一个时间区间内能正常运行的概率;可用度是某一时刻可运行的概…

Qt_输入类控件

目录 1、QLineEdit 1.1 使用QLineEdit 1.2 正则表达式 2、QTextEdit 2.1 使用QTextEdit 2.2 测试QTextEdit的信号 3、QComboBox 3.1 使用QComboBox 3.2 测试QComboBox的信号 4、QSpinBox 4.1 使用QSpinBox 4.2 测试QSpinBox的信号 5、QDateTimeEdit 5.1 使用…

【Python常用模块】_cx_Oracle模块详解

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…

java和kotlin版本对照表

Java 和 Kotlin 是两种广泛使用的编程语言,特别是在 Android 开发领域。虽然它们有不同的语法和特性,但它们在很多方面是可以互操作的,尤其是在同一个项目中使用时。了解 Java 和 Kotlin 的版本对应关系可以帮助开发者更好地进行跨语言开发和…

练习题 - Django 4.x Models Relationship fields 字段关联关

在 Django 中,模型(Model)是用于定义数据库结构的核心部分。关系型数据库的一个重要特性是能够在不同的表(模型)之间建立关联,Django 提供了多种字段类型用于定义模型之间的关系,如 ForeignKey、OneToOneField 和 ManyToManyField。这些关系字段使得开发者能够轻松地在模…

[每周一更]-(第115期):不同系统安装godoc

文章目录 主要功能 安装WindowsmacOSLinux环境变量配置WindowsmacOS 和 Linux 如何使用 godoc 生成自己项目的文档1. 安装 godoc2. 编写注释3. 启动 godoc 服务器4. 访问文档 生成静态文档示例输出总结 godoc 是一个 Go 语言的工具,用于生成和查看 Go 代码的文档。它…

数据结构--查找

1.顺序查找&#xff1a; #include <stdio.h> #define MAXL 100 //最大长度 typedef int KeyType; //定义关键字类型为int typedef char InfoType;typedef struct {KeyType key; //关键字项InfoType data; //其他数据项&#xff0c;类型为InfoType } RecType; //查…

[Meachines] [Medium] Bart Server Monitor+Internal Chat+UA投毒+Winlogon用户密码泄露权限提升

信息收集 IP AddressOpening Ports10.10.10.81TCP:80 $ nmap -p- 10.10.10.81 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 | http-methods: |_ Potentially risky methods: TRACE |_http-server-header: Micros…