Transformer中的位置编码PE(position encoding)

Transformer中的位置编码PE(position encoding)

1.提出背景

transformer模型的attention机制并没有包含位置信息,即一句话中词语在不同的位置时在transformer中是没有区别的

2.解决背景

给encoder层和decoder层的输入添加了一个额外的向量Positional Encoding(PE),与embedding维度一致

embedding维度:

  • 句子:词向量的维度大小,如512
  • 图片:通道数

实际应用中,会对位置信息向量如[1,2,…,16]先进行位置编码,位置编码的维度可以先保持与句子编码维度一致,如512。再通过一个线性层,将维度降为需要的通道数,最后再进行信息合并。

3. 创建一个位置编码器PE

需要的输入设置

  • 序列的最大长度 max_seq_len,如1000
  • 编码向量的维度 d_model,如512或128

主体逻辑

  1. 计算PE矩阵
  2. 重新定义嵌入层:将嵌入层的权重替换为PE(不可训练)

PE计算
PE为二维矩阵,大小跟输入embedding的维度一样,行表示词语,列表示词向量;pos 表示词语在句子中的位置;dmodel表示词向量的维度;i表示词向量的位置。因此,上述公式表示在每个词语的词向量的偶数位置添加sin变量,奇数位置添加cos变量,以此来填满整个PE矩阵,然后加到input embedding中去,这样便完成位置编码的引入了。

参考:https://blog.csdn.net/qq_34771726/article/details/102918440

class PositionalEncoding(nn.Module):

    def __init__(self, max_seq_len: int, d_model: int):
        super().__init__()

        # Assume d_model is an even number for convenience
        assert d_model % 2 == 0   # 为了编码方便

        # ---1.计算PE矩阵
        # 位置编码二维矩阵PE的大小: [max_seq_len, d_model]
        pe = torch.zeros(max_seq_len, d_model)  # 初始化为零矩阵
        # 行:i向量 [0,1,2,..., 999]  表示每个时间步t
        i_seq = torch.linspace(0, max_seq_len - 1, max_seq_len)
        # 列:j向量 [0,2,4,6,8]       表示偶数位
        j_seq = torch.linspace(0, d_model - 2, d_model // 2)   #(0, 8, 5)
        # 生成网格数据: 2个矩阵[1000, 5]
        pos, two_i = torch.meshgrid(i_seq, j_seq)
        pe_2i = torch.sin(pos / 10000**(two_i / d_model))    # 偶数位sin
        pe_2i_1 = torch.cos(pos / 10000**(two_i / d_model))  # 奇数位cos
        # stack拼接到第2个维度[0,1,2],在把3维重塑为2维
        pe = torch.stack((pe_2i, pe_2i_1), 2).reshape(max_seq_len, d_model)

        # ---2.定义嵌入层
        self.embedding = nn.Embedding(max_seq_len, d_model)  # 定义了一个嵌入层
        self.embedding.weight.data = pe      # 使用位置编码计算好的嵌入矩阵对其进行初始化
        self.embedding.requires_grad_(False) # 将其参数设为不可训练

    def forward(self, t):
        # 调用嵌入层方法
        # t表示抽取的时间点向量: [32, 43, 85, 31, 86, 90, 67, 61, 50, 33, 87, 48, 31, 48, 48, 93]
        return self.embedding(t)

4.调用位置编码器PE

  1. 对输入的位置向量,如[1,2,…,16]. 先经过PE编码为词向量长度: [16, 1, 128]
  2. 与原图x拼接,即x+t
  • 先经过一个线性层,将词向量维度转换为与图片通道数一致
  • 与原图相加拼接
‘’‘
对输入时间点的位置编码
’‘’
# 1. 设置位置编码器PE
max_seq_len = 1000   # 最大序列长度
d_model = 128        # 编码向量的维度
pe = PositionalEncoding(max_seq_len, d_model)
pe

# 2.随机抽取时间点
n_steps = 100
batch_size = 16
t1 = torch.randint(0, n_steps, (batch_size, ))    # 随机抽取16个时间点

# 3.对时间点进行PE编码
p1 = pe(t1)
p1    # 得到位置编码结果[1000, 128]

将编码后的时间与原图进行拼接

‘’‘
将编码后的时间与原图进行拼接
’‘’
pe_dim = 128   # 词向量维度
channel = 1    # 图片通道数C
n = 16   # 图片批量大小(也就是上面时间t的步数)

# 1.先经过一个线性层,将词向量维度转换为与图片通道数一致
# 设置映射空间层
pe_linear = nn.Sequential(nn.Linear(pe_dim, channel), 
                           nn.ReLU(),
                           nn.Linear(channel, channel))
# 将128的词词向量维度转换为1的图片通道数
pe_v = pe_linear(p1).reshape(n, -1, 1, 1)  # (1, 128) -> (1,1) -> (1,1,1)
# pe_linear: 降维 128 -> 1 通道数
# reshape: 整理维度 [n, C, 1, 1]

# 2.将整理后的位置编码与图片连接
# 原图
x = torch.randn(1, 28, 28) 

# 拼接
x + pe_v  
# [16, 1, 28, 28]  
# 16: 数据批量大小(时间点的个数 - batch_size)
# 1: 通道数
# 28*28: 图片大小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/669182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux进程的加载和启动过程分析

我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,那么当我们在终端敲下指令$ ./a.out argv1 argv2 后,操作系统是怎么将我们的可执行文件加载并运行的呢? 首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后…

使用迭代最近点 (ICP) 算法在 Open3D 中对齐点云

一、Open3D 简介及其功能 Open3D 是一个现代库,它提供了用于处理 3D 数据的各种工具。在其功能中,它提供了高效的数据结构和算法来处理点云、网格等,使其成为在计算机视觉、机器人和图形领域工作的研究人员和从业人员的不错选择。Open3D 的特…

运维开发详解之指标收集

一、指标收集 运维开发中的指标收集是指收集、监控和分析系统运行的各种指标数据,用于评估系统的性能、健康状况和可靠性。这些指标可以包括服务器的 CPU 使用率、内存利用率、磁盘空间使用情况、网络流量等等。 指标收集的目的是为了及时发现系统存在的问题&…

Jetpack MVVM - Android架构探索!

一 开发架构 是什么? 我们先来理解开发架构的本质是什么,维基百科对软件架构的描述如下: 软件架构是一个系统的草图。软件架构描述的对象是直接构成系统的抽象组件。各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段&a…

选择算法之冒泡排序【图文详解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

Java——变量

一、变量介绍 变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。 1、变量声明和初始化 变量的声明: int a; i…

2021JSP普及组第三题:插入排序

2021JSP普及组第三题 题目: 思路: 题目要求排序后根据操作进行对应操作。 操作一需要显示某位置数据排序后的位置,所以需要定义结构体数组储存原数据的位置和数据本身排序后所得数据要根据原位置输出排序后的位置,所以建立一个新…

字典树,AcWing 5726. 连续子序列

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 5726. 连续子序列 - AcWing题库 二、解题报告 1、思路分析 字典树存储前缀和 考虑边遍历计算前缀和,边查询字典树 查询流程: 记当前前缀和为s 如果当前位k为1,那么s …

Qt6 mathgl数学函数绘图

1. 程序环境 Qt6.5.1, mingw11.2mathgl 8.0.1: https://sourceforge.net/projects/mathgl/,推荐下载mathgl-8.0.LGPL-mingw.win64.7z,Windows环境尝试自己编译mathgl会缺失一些库,补充完整也可以自己编译,路径"D:\mathgl-8.0.LGPL-mingw.win64\bin"添加至系统环境…

关于Golang中自定义包的简单使用-Go Mod

1. go env 查看 GO111MODULE 是否为 on,不是修改成on go env -w GO111MODULEon 2 .自定义包的目录格式 3. test.go 内容 package calc func Add(x, y int) int { // 首字母大写表示公有方法return x y }func Sub(x, y int) int {return x - y } 4.生成calc目…

RedisSearch与Elasticsearch:技术对比与选择指南

码到三十五 : 个人主页 数据时代,全文搜索已经成为许多应用程序中不可或缺的一部分。RedisSearch和Elasticsearch是两个流行的搜索解决方案,它们各自具有独特的特点和优势。本文简单探讨一些RedisSearch和Elasticsearch之间的技术差异。 目录…

AndroidStudio使用高德地图API获取手机定位

一、高德地图API申请 首先去高德注册开发者账号 下面这两个选项,也是我们项目成功的关键 1.1怎么获取SHA1指纹密码 ①使用AS自带的签名文件 你的用户文件下面会有一个.android文件夹,进入文件夹,在这个路径下打开cmd 如果.android下面没有签名文件参考创建文章 …

CSS Canvas鼠标点击特效之天女散花(文本粒子动画)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;padding: 0;wi…

一个班有n个学生,需要把每个学生的简单材料(姓名和学号)输入计算机保存。然后可以通过输入某一学生的姓名查找其有关资料。

当输入一个姓名后&#xff0c;程序就查找该班中有无此学生&#xff0c;如果有&#xff0c;则输出他的姓名和学号&#xff0c;如果查不到&#xff0c;则输出"本班无此人"。 为解此问题&#xff0c;可以分别编写两个函数&#xff0c;函数input_data用来输人n个…

Spring系统学习 - Spring入门

什么是Spring&#xff1f; Spring翻译过来就是春天的意思&#xff0c;字面意思&#xff0c;冠以Spring的意思就是想表示使用这个框架&#xff0c;代表程序员的春天来了&#xff0c;实际上就是让开发更加简单方便&#xff0c;实际上Spring确实做到了。 官网地址&#xff1a;ht…

vmdx 文件如何打开

如果在网上下载到了 vmdx 文件要如何使用呢 首先开启 vmware 新建一个虚拟机 选择高级模式 选择你要给他的配置 在选择磁盘文件的时候,找到这个vmdx 如果要升级的话最好选择【不升级】 然后就可以用了

倪师哲学。不要浪费时间去做无谓的事情

再比如你像我拍这个视频&#xff0c;在我的视频下方啊&#xff0c;评论区啊&#xff0c;经常性的会有一些人去评论&#xff0c;一些那种不痛不痒的事&#xff0c;我给你找几条&#xff0c;你看一下就知道了. 就比如&#xff0c;今天早上&#xff0c;我翻到倪海夏老师的第一篇图…

如何获取SSL证书,消除网站不安全警告

获取SSL证书通常涉及以下几个步骤&#xff1a; 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; 你需要从受信任的SSL证书颁发机构中选择一个&#xff0c;比如DigiCert、GlobalSign、JoySSL等。部分云服务商如阿里云、腾讯云也提供免费或付费的SSL证书服务。 生成证…

命运方舟台服注册 命运方舟台服怎么注册?不会操作看这里

命运方舟台服注册 命运方舟台服怎么注册&#xff1f;不会操作看这里 命运方舟作为今年备受瞩目的一款MMORPG类型游戏&#xff0c;在上线前的预约数量已经一次又一次创下新高。这款游戏的开发商Smile gate真是给玩家们带来了一款让人眼前一亮的作品。游戏创建在虚幻引擎的基础…

为什么要学习数据结构和算法

前言 控制专业转码学习记录&#xff0c;本科没学过这门课&#xff0c;但是要从事软件行业通过相关面试笔试基础还是要打牢固的&#xff0c;所以通过写博客记录一下。 必要性 1.越是厉害的公司&#xff0c;越是注重考察数据结构与算法这类基础知识 2.作为业务开发&#xff0c…