Transformer位置编码(Position Embedding)理解

本文主要介绍4种位置编码,分别是NLP发源的transformer、ViT、Sw-Transformer、MAE的Position Embedding


一、NLP transformer 

使用的是1d的绝对位置编码,使用sin+cos将每个token编码为一个向量【硬编码】

Attention Is All You Need

在语言中,单词的顺序及其在句子中的位置非常重要。 如果重新排列单词,整个句子的意思可能会发生变化。 因此,位置信息被明确地添加到模型中,以保留有关句子中单词顺序的信息。

 

1、why 位置编码?

位置编码描述了序列中每个单词(token)的位置或位置,以便为每个位置分配一个唯一的表示。 不使用单个数字(例如索引值)来表示位置的原因有很多。 对于长序列,索引的幅度可能会变大, 如果将索引值规范化为介于 0 和 1 之间,则可能会为可变长度序列带来问题,因为它们的规范化方式不同。

Transformers 将每个单词的位置都映射到一个向量。 因此,一个句子的位置编码是一个矩阵,其中矩阵的每一行代表序列中的一个token与其位置信息相加。 下图显示了仅对位置信息进行编码的矩阵示例:

2、位置编码计算公式:

1D absolute sincos constant position embedding 位置编码的计算公式:

  • k:token在输入序列中的位置,0<=k<=L-1
  • d: 位置编码嵌入空间的维度
  • P(k,j): 位置函数,用于映射输入序列中k处的元素到位置矩阵的(k,j)处
  • n:用户定义的标量,由 Attention Is All You Need 的作者设置为 10,000。
  • i: 用于映射到列索引,0<=i<d/2,单个值i映射到正弦和余弦函数【这是因为使用了sin+cos,所以一次可以给张量的两个维度计算position value,所以只需要d/2个i就可以了】

3、位置编码计算示例

让我们以 n=100 和 d=4 的短语“I am a robot”为例。

这样就将每个单词的position映射到一个4维度的张量中了,并且每个单词对应的张量是不同的

一个简单的实现:

import torch# Section : 1. 1D absolute sincos constant position embedding
def create_1d_absolute_sincos_embedding(n_pos_vec, dim):# n_pos_vec: torch.arange(n_pos, dtype=torch.float)# dim: torch.arange(dim)assert dim % 2 == 0, "dim must be even"# 常数初始化一下position_embeddingposition_embedding = torch.zeros(n_pos_vec.numel(), dim, dtype=torch.float)# 完成指数部分的初始化omege = torch.arange(dim // 2, dtype=torch.float)omege /= dim / 2.omege = 1./(100 ** omege)# 扩充列向量和行向量:行数为pos, 列数为dim/2out = n_pos_vec[:, None] @ omege[None, :]emb_sin = torch.sin(out)emb_cos = torch.cos(out)# 交替填充:偶数列为sin, 奇数列为cosposition_embedding[:, 0::2] = emb_sinposition_embedding[:, 1::2] = emb_cosreturn position_embeddingif __name__ == "__main__":n_pos = 4dim = 4n_pos_vec = torch.arange(n_pos, dtype=torch.float)position_embedding = create_1d_absolute_sincos_embedding(n_pos_vec, dim)print(position_embedding.shape)print(position_embedding)

输出: 

二、Vision Transformer

使用的是1d的绝对位置编码,但是这个位置编码是可训练的(可学习的)。【软编码】

其实我感觉这种软编码,相对于硬编码来说不是很好,因为它并没有将位置的归纳偏置给模型,这种方式更像是增加了模型参数量的感觉。

【ICLR 2021】An Image is Worth 16x16 Words + Transformers for Image Recognition at Scale

代码实现:

import torch
import torch.nn as nn# Section : 2. 1D absolute trainable position embedding
def create_1d_absolute_trainable_embedding(n_pos_vec, dim):# 创建一个n_pos_vec * dim维度的绝对位置编码的embedding,这个embedding是可以训练的。【与torch.nn.Parameter()用法有一些类似】position_embedding = nn.Embedding(n_pos_vec.numel(), dim)# 初始化嵌入层的权重为0nn.init.constant_(position_embedding.weight, 0)return position_embeddingif __name__ == "__main__":n_pos = 3dim = 4n_pos_vec = torch.arange(n_pos, dtype=torch.float)position_embedding = create_1d_absolute_trainable_embedding(n_pos_vec, dim)print(position_embedding)

三、Swin Transformer

四、Masked AutoEncoder(MAE)

# TODO:待更新...懒得写了,大概你知道PE的意思就行了

transformer计算位置编码的过程示例_哔哩哔哩_bilibili

Transformer位置编码图解 - BimAnt

46、四种Position Embedding的原理与PyTorch手写逐行实现(Transformer/ViT/Swin-T/MAE)_哔哩哔哩_bilibili

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

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

相关文章

FDU 2018 | 1. 求众数

文章目录 1. 题目描述2. 我的尝试 1. 题目描述 AcWing 3685 求众数 给定一个长度为 n 的整数序列&#xff0c;请你求出该序列的众数。 众数就是一个序列中出现次数最多的数字。 如果不唯一&#xff0c;则输出小的那个值。 输入格式 第一行输入一个整数 n&#xff0c;表示有 …

RPG Maker MV 踩坑八 仿新仙剑战斗物品指令菜单

仿新仙剑战斗物品指令菜单 遇到的坑坑一坑二解决方法 遇到的坑 上次做的额外战斗指令菜单和物品战斗指令菜单&#xff0c;突然发现一个大问题&#xff0c;漏风了&#xff01;&#xff01;&#xff01; 其实就是将底部漏出来了&#xff0c;这样整个UI就不完整了&#xff0c;算是…

Wpf-自定义状态控件

后端代码 public class AxisStatus : Control{static AxisStatus(){DefaultStyleKeyProperty.OverrideMetadata(typeof(AxisStatus), new FrameworkPropertyMetadata(typeof(AxisStatus)));}public CornerRadius CornerRadius{get > (CornerRadius)GetValue(CornerRadiusPro…

微服务day04(上)-- RabbitMQ学习与入门

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但…

深度学习 | 神经网络

一、神经网络原理 1、神经元模型 虽然叫个神经元&#xff0c;但骨子里还是线性模型。 2、神经网络结构 顾名思义就是由很多个神经元结点前后相连组成的一个网络。虽然长相上是个网络&#xff0c;但是本质上是多个线性模型的模块化组合。 在早期也被称为 多层感知机 Multi-Layer…

Visual Studio 2013 - 调试模式下根据内存地址查看内存

Visual Studio 2013 - 调试模式下根据内存地址查看内存 1. 查看内存References 1. 查看内存 调试 -> 窗口 -> 内存 -> 内存1-4 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【质押空投】公链Zkasino

据深潮TechFlow报道&#xff0c;游戏公链Zkasino HyperChain宣布上线质押挖矿活动&#xff0c;参与者可通过将ETH跨链到Zkasino链的方式来获取ZKAS代币。本次活动总共将分配25%的总代币供应量给参与者。质押挖矿时间将通过倒计时的方式来限制参与人数&#xff0c;以保护早期质押…

Datawhale 零基础入门数据挖掘-Task1 赛题理解

一、 赛题理解 Tip:此部分为零基础入门数据挖掘的 Task1 赛题理解 部分&#xff0c;为大家入门数据挖掘比赛提供一个基本的赛题入门讲解&#xff0c;欢迎后续大家多多交流。 赛题&#xff1a;零基础入门数据挖掘 - 二手车交易价格预测 地址&#xff1a;零基础入门数据挖掘 -…

【代码分享】四十七种测试函数(关注可免费获取)

智能优化算法测试函数简介 智能优化算法测试函数是为了在优化算法研究和开发中测试算法性能的规范问题集合。这些测试函数模拟了真实世界优化问题的不同方面,包括局部最小值、最大值、全局最优解,以及多种复杂性如高维度、非线性、不连续等。优化算法,如遗传算法、粒子群优…

蓝桥杯之动态规划冲刺

文章目录 动态规划01背包小练一下01背包网格图上的DP完全背包 最长公共字符串最长递增子序列 动态规划 动态规划&#xff1a;确定好状态方程&#xff0c;我们常常是确定前 当状态来到 i 时&#xff0c;前 i 个物体的状态是怎么样的&#xff0c;我们并不是从一个点去考虑&#x…

突破编程_C++_C++11新特性(tuple)

1 std::tuple 简介 1.1 std::tuple 概述 std::tuple 是一个固定大小的不同类型值的集合&#xff0c;可以看作 std::pair 的泛化&#xff0c;即 std::pair 是 std::tuple 的一个特例&#xff0c;其长度受限为 2。与 C# 中的 tuple 类似&#xff0c;但 std::tuple 的功能更为强…

数据库基本介绍及编译安装mysql

目录 数据库介绍 数据库类型 数据库管理系统&#xff08;DBMS&#xff09; 数据库系统 DBMS的工作模式 关系型数据库的优缺点 编译安装mysql 数据库介绍 数据&#xff1a;描述事物的的符号纪录称为数据&#xff08;Data&#xff09; 表&#xff1a;以行和列的形式组成…

mysql迁移达梦数据库 Java踩坑合集

达梦数据库踩坑合集 文章目录 安装达梦设置大小写不敏感Spring boot引入达梦驱动&#xff08;两种方式&#xff09;将jar包打入本地maven仓库使用国内maven仓库&#xff08;阿里云镜像&#xff09; 达梦驱动yml配置springboot mybatis-plus整合达梦,如何避免指定数据库名&…

CCAA审核员考试认证通用基础--合格评定基础练习题

合格评定基础练习题 一、单项选择题 1.与适用相同的规定要求、具体规则与程序的特定的合格评定对象有关的合格评定制度是&#xff08; &#xff09;。 A.合格评定 B 合格评定制度. C.合格评定方案 D.合格评定规范 2.认证也被称为&#xff08; &#xff09; A.证明 B.…

常用负载均衡详解

一、介绍 在互联网场景下&#xff0c;负载均衡&#xff08;Load Balance&#xff09;是分布式系统架构设计中必须考虑的一个环节&#xff0c;它通常是指将负载流量&#xff08;工作任务、访问请求&#xff09;平衡、分摊到多个操作单元&#xff08;服务器、组件&#xff09;上去…

Vue 计算属性和watch监听

1.1.计算属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- 引入vue.js --><script src"node_modules/vue/dist/vue.js"></script> </h…

MySQL 快速学习路径

整理了下MySQL的快速学习路径 最近因为失业一直在家&#xff0c;闲来没事打算学习一下&#xff0c;打发时间。 大家可以订阅关注加转发 \(^o^)/~MySQL安装(Mac系统) MySQL的启停登陆与退出 MySQL的目录结构 MySQL语法分类 DDL&#xff08;1&#xff09; MySQL语法分类 DDL…

蚓链与数字化供应链的融合 带给新零售新福音

蚓链数字化生态与全境供应链的数字化融合&#xff0c;确实为新零售数字化营销带来了新的机遇。这种结合不仅提供了创新的思维和方法&#xff0c;更为新零售企业提供了强大的数字化承载和解决方案&#xff0c;使其能够更快捷地启动动销、实现倍速裂变、高福利宠粉&#xff0c;以…

如何在尽量不损害画质的前提下降低视频占内存大小?视频格式科普及无损压缩软件推荐

大家好呀&#xff0c;相比大家都有对视频画质和体积的追求和取舍&#xff0c;那么&#xff0c;如何才能在不牺牲画质的前提下&#xff0c;尽可能的将视频大小降低到极致呢&#xff1f; 首先我们要了解视频的构成&#xff0c;要想降低视频的体积大小&#xff0c;我们可以从以下几…

FITS:一个轻量级而又功能强大的时间序列分析模型

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…