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 convenienceassert 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]  表示每个时间步ti_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))    # 偶数位sinpe_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: 图片大小

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【专利 超音速】一种光伏检测系统

申请号CN202410053901.0公开号(公开)CN118032774A申请日2024.01.12申请人(公开)超音速人工智能科技股份有限公司发明人(公开)张俊峰(总); 叶长春(总); 许春夏 摘要 本发明公开一种光伏检测系统&#xff0…

iotdb时序库在火电设备锅炉场景下的实践【原创文字,IoTDB社区可进行使用与传播】

一.概述 1.1 说明 本文章主要介绍iotdb数据库在电站锅炉工业场景下,对辅助智能分析与预警的使用介绍。 【原创文字,IoTDB社区可进行使用与传播】 1.2 项目背景 随着人工智能算法在电力领域的发展,以及燃煤锅炉设备精细化调整需求的增加&…

数据结构——经典链表OJ(二)

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…

chatgpt之api的调用问题

1.调用api过程中,出现如下报错内容 先写一个测试样例 import openaiopenai.api_key "OPEN_AI_KEY" openai.api_base"OPEN_AI_BASE_URL" # 是否需要base根据自己所在地区和key情况进行completion openai.ChatCompletion.create(model"g…

【intro】GNN中异构图(heterogeneous graph)综述

本篇博客内容是读两篇论文,两篇论文连接如下: Heterogeneous graph neural networks analysis: a survey of techniques, evaluations and applications A Survey on Heterogeneous Graph Embedding: Methods, Techniques, Applications and Sources …

瓦罗兰特国际服 外服游玩教程 瓦罗兰特外服下载注册游玩指南

瓦罗兰特国际服 外服游玩教程 瓦罗兰特外服下载注册游玩指南 瓦罗兰特作为当今游戏圈顶流的一款热门FPS。游戏,作为拳头游戏公司划时代的一款游戏。游戏不仅延续了传统FPS游戏的玩法,还添加许多新玩法,这也是游戏可以吸引大批量玩家的原因之…

基于电导增量MPPT控制算法的光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于电导增量MPPT控制算法的光伏发电系统simulink建模与仿真。输出MPPT跟踪后的系统电流,电压以及功率。 2.系统仿真结果 3.核心程序与模型 版本:MAT…

cocos creator 3.x实现手机虚拟操作杆

简介 在许多移动游戏中,虚拟操纵杆是一个重要的用户界面元素,用于控制角色或物体的移动。本文将介绍如何在Unity中实现虚拟操纵杆,提供了一段用于移动控制的代码。我们将讨论不同类型的虚拟操纵杆,如固定和跟随,以及如…

视频汇聚平台EasyCVR对接GA/T 1400视图库结构化数据:人员/人脸、非/机动车、物品

在信息化浪潮席卷全球的背景下,公安信息化建设日益成为提升社会治理能力和维护社会稳定的关键手段。其中,GA/T 1400标准作为公安视频图像信息应用系统的核心规范,以其结构化数据处理与应用能力,为公安信息化建设注入了强大的动力。…

【图解IO与Netty系列】Reactor模型

Reactor模型 Reactor模型简介三类事件与三类角色Reactor模型整体流程 各种Reactor模型单Reactor单线程模型单Reactor多线程模型主从Reactor模型 Reactor模型简介 Reactor模型是服务器端用于处理高并发网络IO请求的编程模型,与传统的一请求一线程的同步式编程模型不…

翼龙面板是什么,如何进行搭建

翼龙面板是一个开源的,用于游戏服务器管理的程序,可以方便地在网页界面中创建Minecraft,起源引擎游戏和Teamspeak3 服务器。 它使用前后端程序,因此可以创建多后端节点,对游戏服务器和服务器节点进行统一管理。 对游戏…

Vue进阶之Vue无代码可视化项目(二)

Vue无代码可视化项目 项目初始化路由子路由错误示范正确示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts项目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由样式App.vue进一步的App.vue项目初始化 路由 router i…

synchronized 锁的到底是什么?

通过8种情况演示锁运行案例,看看我们到底锁的是什么 1锁相关的8种案例演示code package com.bilibili.juc.lock;import java.util.concurrent.TimeUnit;/*** 题目:谈谈你对多线程锁的理解,8锁案例说明* 口诀:线程 操作 资源类* 8…

LeetCode875爱吃香蕉的阿珂

题目描述 珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从…

IntelliJ IDEA / Android Studio 方法显示Git提交人

显示方法: 设置 > 编辑器 > 嵌入提示 > Code Vision > 代码作者(勾选) IntelliJ IDEA Android Studio

springboot编写日志环境搭建过程

AOP记录日志 AOP记录日志的主要优点包括: 1、低侵入性:AOP记录日志不需要修改原有的业务逻辑代码,只需要新增一个切面即可。 2、统一管理:通过AOP记录日志可以将各个模块中需要记录日志的部分进行统一管理,降低了代…

神经网络的工程基础(二)——随机梯度下降法|文末送书

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下:regression2chatgpt/ch06_optimizer/stochastic_gradient_descent.ipynb 本文将讨论利用…

WinApp自动化测试之辅助工具介绍

前篇文章中,我们简单介绍了部分WinApp自动化测试脚本常规操作,今天我们来讲剩余的部分。 文件批量上传 文件批量上传和文件单个上传原理是相同的,单个上传直接传入文件路径即可,批量上传需要进入批量上传的文件所在目录&#xf…

uniapp创建支付密码实现(初始密码,第二次密码)

示例: 插件地址:自定义数字/身份证/密码输入框,键盘密码框可分离使 - DCloud 插件市场 1.下载插件并导入HBuilderX,找到文件夹,copy number-keyboard.vue一份为number-keyboard2.vue(number-keyboard.vue是…

C++ STL map容器erase操作避坑

map容器的erase方法有三种重载形式: //1.删除迭代器所指向的元素 //返回值是指向下一个节点的迭代器 iterator erase(iterator it); //2.区间删除 iterator erase(iterator first, iterator last); //3.根据键值删除 //返回值为删除的元素个数 size_type erase(con…