关于Transformer中的位置编码
位置编码 (Positional Encoding)
位置编码是在自然语言处理中,特别是在 Transformer 架构中使用的一个重要概念。Transformer 架构由于其自注意力机制 (Self-Attention Mechanism) 的特性,对序列中的元素没有固有的顺序感知。这意味着,如果不加以处理,Transformer 无法区分序列中的元素的相对位置。为了解决这个问题,位置编码被引入。
位置编码的重要性
位置编码的重要性主要体现在以下几点:
- 序列顺序的感知:在许多任务中,如机器翻译、文本生成等,元素的顺序是非常关键的。位置编码确保 Transformer 可以考虑到这种顺序。
- 增强模型的表达能力:位置编码为模型提供了额外的信息,使其能够更好地理解和生成序列。
- 灵活性:位置编码是可学习的,这意味着模型可以在训练过程中调整它,以更好地适应特定的任务。
- 与自注意力机制的结合:位置编码与自注意力机制结合,使 Transformer 能够考虑到序列中的长距离依赖关系。
图像中的位置编码
在图像处理中,位置编码的引入与自然语言处理中的方法有所不同,但基本的原理是相似的:为模型提供空间位置信息。以下是几种在图像处理中引入位置编码的方法:
1. 二维位置编码
与自然语言处理中的一维位置编码不同,图像通常需要二维的位置编码来表示其宽度和高度。这可以通过为每个像素或区域分配一个二维编码来实现。
2. 绝对位置编码
为图像中的每个像素或区域分配一个固定的编码,表示其在图像中的绝对位置。
3. 相对位置编码
与绝对位置编码不同,相对位置编码表示一个像素或区域与其他像素或区域之间的相对位置关系。
4. 位置嵌入 (Position Embeddings)
这是一种学习位置信息的方法。与位置编码不同,位置嵌入是在模型训练过程中学习的,而不是预先定义的。
5. 卷积操作
卷积神经网络 (CNN) 通过其卷积操作隐式地捕获位置信息。但在某些无卷积的模型结构中,如 Vision Transformer (ViT),需要显式地引入位置编码。
6. 扩展到更高维度
对于视频或3D图像,可以考虑引入三维或更高维度的位置编码。
7. 组合方法
在某些应用中,可能需要同时使用多种方法来捕获位置信息,例如,结合绝对位置编码和相对位置编码。
绝对位置编码
绝对位置编码是为序列中的每个位置分配一个固定的编码,这个编码表示该位置在整个序列中的确切位置。这种编码方式不依赖于其他位置,因此被称为“绝对”。
特点:
- 固定编码:每个位置都有一个预定义的编码,不受其他位置的影响。
- 独立性:绝对位置编码不考虑其他位置,只关注当前位置。
- 常见实现:在 Transformer 模型中,通常使用正弦和余弦函数来生成绝对位置编码。
相对位置编码
相对位置编码不是直接编码每个位置,而是编码两个位置之间的相对距离。例如,对于一个给定的位置,其与其他位置的相对位置编码将表示它们之间的距离或关系。
特点:
- 距离感知:相对位置编码捕获了两个位置之间的距离或关系。
- 动态性:相对于一个固定的参考点,其他位置的编码会发生变化。
- 应用场景:在某些模型中,如 Transformer 的自注意力机制,相对位置编码可以帮助模型捕获长距离的依赖关系。
对比:
- 稳定性:绝对位置编码为每个位置提供了一个稳定的、不变的编码,而相对位置编码则依赖于参考位置。
- 灵活性:相对位置编码可以更灵活地捕获位置之间的关系,而绝对位置编码则更注重每个位置本身。
- 实现复杂性:相对位置编码的实现通常比绝对位置编码更复杂,因为它需要考虑两个位置之间的关系。
绝对位置编码
绝对位置编码在 Transformer 模型中使用正弦和余弦函数来表示每个位置的信息。
公式
对于偶数维度 (i):
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i d model ) PE(pos, 2i) = \sin\left(\frac{pos}{10000^{\frac{2i}{d_{\text{model}}}}}\right) PE(pos,2i)=sin(10000dmodel2ipos)
- 对于奇数维度 (i):
P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i d model ) PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{\frac{2i}{d_{\text{model}}}}}\right) PE(pos,2i+1)=cos(10000dmodel2ipos)
其中:
- P E ( p o s , 2 i ) PE(pos, 2i) PE(pos,2i)是位置 p o s pos pos 在维度 i i i的位置编码。
- d model d_{\text{model}} dmodel是模型的维度。
代码分析
代码中的这一部分:
div_term = np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))
实际上是在计算上述公式的除数部分:
div_term = 1000 0 2 i d model \text{div\_term} = 10000^{\frac{2i}{d_{\text{model}}}} div_term=10000dmodel2i
当我们对上述公式取自然对数,我们得到:
log ( div_term ) = 2 i d model log ( 10000 ) \log(\text{div\_term}) = \frac{2i}{d_{\text{model}}} \log(10000) log(div_term)=dmodel2ilog(10000)
这与代码中的形式相匹配,其中 np.exp 是为了从对数形式回到原始的指数形式。
Python 实现
import numpy as np
def get_positional_encoding(seq_len, d_model):position = np.arange(seq_len)[:, np.newaxis]div_term = np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))position_encoding = np.zeros((seq_len, d_model))position_encoding[:, 0::2] = np.sin(position * div_term)position_encoding[:, 1::2] = np.cos(position * div_term)return position_encoding
相对位置编码
相对位置编码主要用于增强 Transformer 中的自注意力机制对位置信息的感知。在原始的 Transformer 模型中,注意力权重是基于查询(Q)、键(K)和值(V)来计算的。当引入相对位置编码时,我们会修改注意力权重的计算方式,使其同时考虑相对位置信息。
使用相对位置编码的简化步骤:
- 计算相对位置编码:首先,使用提供的
relative_positional_encoding函数计算相对位置编码。 - 计算注意力权重:在计算自注意力的 Q 和 K 的点积时,将相对位置编码添加到结果中。这可以通过将相对位置编码与 Q 的每一行相乘并求和来实现。
- 归一化注意力权重:使用 softmax 函数归一化注意力权重。
- 计算输出:使用归一化的注意力权重与 V 相乘,得到自注意力的输出。
Python 代码示例
import numpy as npclass SelfAttentionWithRelativePosition:def __init__(self, d_model, seq_len):self.d_model = d_modelself.seq_len = seq_lenself.scale = np.sqrt(d_model)# 初始化权重self.WQ = np.random.rand(d_model, d_model)self.WK = np.random.rand(d_model, d_model)self.WV = np.random.rand(d_model, d_model)# 获取相对位置编码self.relative_pos_encoding = self.relative_positional_encoding(seq_len, d_model)def relative_positional_encoding(self, seq_len, d_model):position = np.arange(seq_len)relative_position_matrix = position[:, np.newaxis] - position[np.newaxis, :]relative_position_matrix = np.clip(relative_position_matrix + seq_len, 0, 2 * seq_len - 1)div_term = np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))sinusoid_table = np.zeros((2 * seq_len, d_model))sinusoid_table[:, 0::2] = np.sin(relative_position_matrix * div_term)sinusoid_table[:, 1::2] = np.cos(relative_position_matrix * div_term)return sinusoid_table[relative_position_matrix]def forward(self, Q, K, V):Q = np.matmul(Q, self.WQ)K = np.matmul(K, self.WK)V = np.matmul(V, self.WV)attn_logits = np.matmul(Q, K.T) / self.scaleattn_logits += np.matmul(Q, self.relative_pos_encoding.T)attn_weights = np.exp(attn_logits) / np.sum(np.exp(attn_logits), axis=-1, keepdims=True)output = np.matmul(attn_weights, V)return output# 示例
seq_len = 10
d_model = 512
Q = np.random.rand(1, d_model)
K = np.random.rand(seq_len, d_model)
V = np.random.rand(seq_len, d_model)attention_layer = SelfAttentionWithRelativePosition(d_model, seq_len)
output = attention_layer.forward(Q, K, V)
print(output)相关文章:
关于Transformer中的位置编码
位置编码 (Positional Encoding) 位置编码是在自然语言处理中,特别是在 Transformer 架构中使用的一个重要概念。Transformer 架构由于其自注意力机制 (Self-Attention Mechanism) 的特性,对序列中的元素没有固有的顺序感知。这意味着,如果不…...
ABAP 期初库存批量导入 demo1
&--------------------------------------------------------------------- *& Report ZMMCP005 &--------------------------------------------------------------------- 作者: Liv完成日期:描述: 期初库存导入需求简要说明&…...
想用 Python 写游戏,都有哪些好用的游戏开发库?
虽然 Python 在网络爬虫、人工智能、数据分析方面有广泛应用,但它并不是一门专门做游戏开发的编程语言,不过对于小型的游戏开发,Python 还是挺香的。下面为大家介绍几个支持 Python 的 2D、3D 游戏开发库,使用它们,你可以设计出很多有意思的小游戏! Cocos2d Cocos2d 是…...
vue3 路由缓存问题
目录 解决问题的思路: 解决问题的方案: 1、给roter-view添加key(破坏复用机制,强制销毁重建) 2、使用beforeRouteUpdate导航钩子 3、使用watch监听路由 vue3路由缓存:当用户从/users/johnny导航到/use…...
如何找到一个数的所有质因数,以及如何快速判断一个数是不是质数
前情介绍 今天遇到一个需求:找到一个数所有的质因数。 初步解决 先定义一个判断质数的函数: def is_Prime(number):i 2count 0while i < number:if number % i 0 :count 1i 1if count > 0:return Falseelse:return True 接着定义一个寻找质…...
西瓜书之神经网络
一,神经元模型 所谓神经网络, 目前用得最广泛的一个定义是“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应”。 M-P神经元 M-P神经元:接收n个输入(…...
C++进阶 特殊类的设计
本篇博客介绍:介绍几种特殊的类 特殊类的设计 设计一个类不能被拷贝设计一个类 只能在堆上创建对象设计一个类 只能在栈上创造对象设计一个类不能被继承单例模式饿汉模式懒汉模式单例模式对象的释放问题 总结 设计一个类不能被拷贝 我们的拷贝只会发生在两个场景当…...
NLP序列标注问题,样本不均衡怎么解决?
【学而不思则罔,思而不学则殆】 1.问题 NLP序列标注问题,样本不均衡怎么解决? 2.解释 以命名实体识别(NER)为例,这个样本不均衡有两种解释: (1)实体间类别数量不均衡…...
大端和小端
大端和小端 大端(Big Endian)和小端(Little Endian)是两种不同的字节序排列方式,用于解释多字节数据在内存中的存储顺序。 在大端字节序中,高位字节(最高有效位)存储在低位地址&am…...
C++快速回顾(二)
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。C/C是音视频必…...
【LVS】1、LVS负载均衡群集
1.群集的含义: Cluster、群集、集群 由多台主机构成并作为一个整体,只提供一个访问入口(域名与IP地址);可伸缩 2.集群使用的场景: 高并发 3.企业群集的分类: 根据群集所针对的目标差异&a…...
el-tree 懒加载树
el-tree 懒加载树 添加自定义图标指定叶子节点懒加载 <template><div><el-treeclass"filter-tree":data"treeData":props"defaultProps"ref"tree"lazy:load"loadTree":expand-on-click-node"true"…...
到江西赣州ibm维修服务器之旅-联想X3850 x6黄灯故障
2023年08月15日,一位江西赣州工厂客户通过朋友介绍与冠峰售前工程师取得联系,双方对产品故障前后原因沟通的大致情况如下: 服务器型号:Lenovo system x3850 x6 为用户公司erp仓库服务器 服务器故障:正常使用过程中业…...
VMware 虚拟机三种网络模式详解
文章目录 前言桥接模式(Bridged)桥接模式特点: 仅主机模式 (Host-only)仅主机模式 (Host-only)特点: NAT网络地址转换模式(NAT)网络地址转换模式(NAT 模式)特点: 前言 很多同学在初次接触虚拟机的时候对 VMware 产品的三种网络模式不是很理解,本文就 VMware 的三种网络模式进行…...
ASP.NET指定变量数据类型,速度提高了100倍
ASP.NET指定变量数据类型,速度提高了100倍由自动编程人工智能 发表在专区 10亿次求余数为0的计算: ASP运行速度130秒左右 ASP.NET Dim i, c, max 如果不指定数据类型,运行要120秒左右 Dim i, c, max As Integer 指定数据类型,运…...
PyArmor 一键加密
使用: pyarmor obfuscate main.py 参考:Python代码加密方案_python加密代码_wgr_1009的博客-CSDN博客 一 简介 PyArmor是用于保护Python代码的工具,它可以将Python脚本编译成加密的字节码,以增加代码的保护性。它的主要目的是防…...
redis--持久化
redis持久化 在 Redis 中,持久化是一种将数据从内存写入到磁盘的机制,以便在服务器重启或崩溃时能够恢复数据。Redis 提供了两种主要的持久化方式:RDB(Redis Database Snapshot)和AOF(Append-Only File&am…...
管理外部表
官方文档地址:Managing Tables 关于外部表 Oracle 数据库允许您对外部表中的数据进行只读访问。外部表定义为不驻留在数据库中的表,通过向数据库提供描述外部表的元数据,数据库能够公开外部表中的数据,就好像它是驻留在常规数据…...
数字图像处理-AWB跳变
1、自动白平衡(AWB)算法是相机中常用的图像处理技术,它能够自动调整图像中的白平衡,使得图像中的颜色更加真实、自然。然而,在实际应用中,AWB算法也存在着一些问题,例如AWB跳变(Whit…...
DNNGP、DeepGS 和 DLGWAS模型构成对比
一、DNNGP DNNGP 是基于深度卷积神经网络,这个结构包括一个输入层,三个卷积层,一个批标准化层,两个dropout层,一个平坦化层,一个 dense层。 dropout层:在神经网络中,dropout层是一个非常有效的正…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...
