深入解析ViT中的RoPE旋转位置编码:原理、实现与视觉应用

vit中的位置编码,RoPE旋转位置编码,torch.nn.functional.embedding RoPE通过绝对位置编码的方式实现相对位置编码,综合了绝对位置编码和相对位置编码的优点。相对位置编码关注标记之间的距离,增强模型对标记关系的理解,但使模型架构复杂化。这是通过旋转机制实现的,其中序列中的每个位置都由嵌入空间中的旋转表示。主要就是对attention中的q, k向量注入了绝对位置信息,然后用更新的q,k向量做attention中的内积就会引入相对位置信息了。绝对位置编码就是对每个位置编码一个位置相关的向量 ,然后加到原来的特征上。图中每一行是一个位置的编码,编码的长度等于特征的长度512。 阅读详情

1. 位置编码:为什么Transformer需要“空间感”

大家好,我是老张,在AI和视觉领域摸爬滚打了十几年。今天咱们来聊一个Transformer模型里看似不起眼、实则至关重要的组件——位置编码。如果你玩过ViT(Vision Transformer),肯定知道它会把一张图片切成一个个小方块(patch),然后把这些方块像处理句子里的单词一样送进模型。但这里有个大问题:Transformer的核心注意力机制,天生是“位置盲”的。

想象一下,你把一句话的单词顺序完全打乱,比如“我爱北京天安门”变成“天安门爱我北京”,一个标准的Transformer(如果不做特殊处理)计算出的注意力权重可能是一样的,因为它只关心词与词之间的内容关联,不关心谁在前谁在后。这显然不对!对于图像更是如此,把一张猫脸的鼻子和眼睛位置对调,模型如果分辨不出来,那生成的“猫”可能就成克苏鲁了。

所以,我们必须给每个输入的小方块(或单词)注入位置信息,告诉模型:“嘿,你现在处理的是第几个位置的数据。”这就是位置编码的使命。在原始的ViT论文里,用的是绝对位置编码,简单粗暴,每个位置学一个固定的向量,直接加到输入特征上。这种方法实现起来简单,但有个硬伤:缺乏外推性。比如模型在训练时只见过最多14x14(196个)的patch位置,你突然给它一张更精细的、有20x20(400个)patch的图,它就没见过第197到第400号位置该长啥样,性能就可能暴跌。

为了解决这个问题,研究者们提出了各种相对位置编码方法,而今天的主角——旋转位置编码,就是其中一颗耀眼的明星。它不仅在自然语言处理的大模型(如LLaMA、GLM)里大放异彩,在视觉领域也展现出独特的魅力。它用一种非常“几何”的方式,将位置信息巧妙地编织进注意力计算中,既保留了绝对位置的确定性,又蕴含了相对位置的灵活性。

2. 从绝对到相对:位置编码的演进之路

2.1 经典绝对位置编码:简单但局限

我们先回顾一下最经典的Sinusoidal绝对位置编码,这也是原始Transformer论文和早期ViT常用的方法。它的核心思想是为序列中的每个位置(比如第0个、第1个patch)生成一个独一无二的、固定不变的向量。这个向量通常通过正弦和余弦函数生成,公式长这样:

对于位置 pos 和维度索引 i:

  • 如果 i 是偶数:PE(pos, i) = sin(pos / 10000^(2i/d_model))
  • 如果 i 是奇数:PE(pos, i) = cos(pos / 10000^(2i/d_model))

这里的 d_model 是特征维度。这个设计很巧妙,因为对于固定的偏移量 k,位置 pos + k 的编码可以被表示为位置 pos 编码的线性函数,这隐含了一定的相对位置关系。在代码里,我们通常会预计算一个位置编码矩阵:

import torch
import math

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_len=5000):
        super().__init__()
        pe = torch.zeros(max_len, d_model)
        position = torch.arange(0, max_len).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        self.register_buffer('pe', pe)  # 不参与训练

    def forward(self, x):
        # x: [batch_size, seq_len, d_model]
        return x + self.pe[:x.size(1), :]

优势一目了然:实现简单,可以预先算好,不增加训练参数,计算速度快。 劣势也很明显:最大的问题就是前面说的外推性差。模型在训练长度之外的位置编码是未定义的。虽然可以通过在微调时对位置编码进行插值来缓解,比如把训练时512长度的编码“拉伸”到1024去用,但这并非原生支持,效果不一定稳定。

2.2 相对位置编码的兴起:关注关系

正因为绝对位置编码的局限,大家开始转向相对位置编码。它的核心思想不是告诉模型“你在第几个位置”,而是告诉模型“你和另一个位置相隔多远”。在注意力计算中,这通常体现为在查询向量 q 和键向量 k 计算内积时,加上一个与它们相对位置 (m-n) 相关的偏置项。

相对位置编码让模型能更好地理解序列内部的结构关系,比如在图像中,一个像素和它相邻像素的关系,远比和遥远角落像素的关系更紧密。但是,很多相对位置编码的实现需要修改注意力计算结构,引入额外的可学习参数或计算步骤,增加了模型的复杂度和计算开销。

2.3 RoPE的巧妙融合:用绝对实现相对

那么,有没有一种方法能兼具两者的优点呢?旋转位置编码 的提出正是为了回答这个问题。RoPE的核心洞见非常优雅:通过对查询和键向量施加一个依赖于其绝对位置的旋转变换,使得它们在进行内积计算时,结果自然地只依赖于两者的相对位置。

听起来有点绕?我们来打个比方。想象一下,每个位置都有一个特定的“角度”。对于位置 m 的查询向量 q_m,我们把它在特征空间的某个二维子平面上旋转 m * θ 角度;对于位置 n 的键向量 k_n,我们把它旋转 n * θ 角度。那么,旋转后的 q_m 和旋转后的 k_n 做内积,根据几何知识,结果会等于原始 q_m 和 k_n 的内积再乘以一个与 (m-n) * θ 相关的因子。看,绝对位置 m 和 n 消失了,只剩下相对位置 m-n 出现在最终的内积中!

这种方法的美妙之处在于:

  1. 形式上是绝对的:我们确实为每个绝对位置计算了一个变换(旋转矩阵)。
  2. 效果上是相对的:注意力分数最终只依赖于相对位置。
  3. 结构上是简洁的:它不需要改变标准的注意力计算流程,只需在计算 q 和 k 的内积前,对它们进行旋转操作即可。
  4. 外推性是优秀的:
深入解析ViT中的RoPE旋转位置编码:从理论到PyTorch实现 本文深入解析了Vision Transformer中RoPE旋转位置编码的核心原理与实现。通过对比传统绝对位置编码,详细阐述了RoPE如何通过旋转操作将绝对位置信息融入注意力计算,从而自然地建模相对位置关系,并提供了从一维序列到二维图像的完整PyTorch实现代码,包括在ViT中的集成方法。 阅读详情

相关推荐

PCB设计之ODB++文件格式详解

ODB++(Open Database++)是一种广泛应用于PCB(印制电路板)设计和制造领域的开放数据交换格式。它由Valor Computerized Systems(现为Siemens EDA的一部分)开发,旨在替代传统的Gerber文件格式,提供更完整、结构化的制造数据,从而优化PCB设计到生产的流程。ODB++通过结构化数据整合了PCB设计到制造的全流程信息,显著提高了生产效率和准确性。尽管存在一定的兼容性挑战,但其在复杂项目和高可靠性场景中的价值不可替代。

ZZcppc的博客 9990

python123题目——个税计算器

类型:简单分支。

m0_62488776的博客 5795

STM32_HAL库—PWM产生指定个数

(一)CubeMX设置: 1. 晶振配置(72M) 2. 引脚配置 3. 中断配置 4. 配置及实现方式 由上推出公式: 机器周期: (72MHz / 36) = 2MHz = 0.5us PWM周期: 0.5 * 100 = 50us = 20kHz 5. 主函数调用PWM函数 HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_2); //此处一句后可直接进入中断 6. PWM溢出回调函数 void HAL_TIM_PWM_PulseFinished

5520

CANoe-vTESTstudio之Test Diagram编辑器

总之,CANoe-vTESTstudio的Test Diagram编辑器提供了一个直观且强大的工具,用于创建和管理测试用例。通过图形化的界面和丰富的功能,测试工程师可以更轻松地编写复杂的测试脚本,并有效地进行测试开发。在上面的示例中,我们创建了一个名为"MyTestCase"的测试用例,并定义了两个测试步骤"Step1"和"Step2"。在上面的示例中,我们在执行"Step1"之后使用条件语句来确定是否执行"Step2"。在每次迭代中,我们创建一个新的测试步骤,并根据迭代次数动态生成相应的日志和验证消息。

TcData的博客 240

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7074

推荐系统[八]算法实践总结V3:重排在快手短视频推荐系统中的应用and手淘信息流多兴趣多目标重排技术

快手推荐系统包括了传统的召回、粗排、精排、Learning To Rank 的多目标排序、多目标预估等技术环节。而在这些模块之后的技术环节就属于重排序,主要包括手机端和服务端两部分。服务端通过传统服务器部署重排服务,包括序列重排、多源内容混排、多样性模块。端上部分包括端上重排模型和端上重排策略两部分。重排技术是快手十分重要的技术环节,它的发展速度远快于其他排序环节,属于较新的技术范畴。整个序列的价值并非单 item 效果的累计,如何使得序列价值最大化;

丨汀、的博客 1055

【2024遥感应用组一等奖】基于风云四号卫星的小时级大气气溶胶和颗粒物监测

最后,比较AGRI观测反射率和查找表计算的反射率反演得到的1小时分辨率AOD数据。然后,使用广泛应用的MODIS DT和DB产品进行对比,图 5显示了它们逐像元尺度的对比,AGRI LaGA算法可以捕捉亚洲地区AOD高低值空间分布格局,比如南亚次大陆、中南半岛、塔克拉玛干沙漠和华北平原是AOD高值区域(平均AOD高于0.3),中国西北、中国南方、中国东北和韩国地区为AOD中值地区(平均AOD在0.2到0.3之间),北纬45度以上以及日本地区为AOD低值区域(平均AOD小于0.2),与全球平均AOD值接近。

JData_Engineer的博客 366

借助Gemini 3 Pro高效解决课题申报中的五大核心痛点,亲测有效经验分享

之前给大家分享过关于AI辅助课题申报的相关的内容,涵盖了申报书部分撰写技巧,但没针对性拆解各位同仁在实际申报时遇到的卡壳的地方。比如选题范围拿捏不准,定的太大,根本没法落地完成;定的太小,研究价值则体现不了;写综述时,容易单纯罗列文献,缺乏批判性视角,没办法自然融入自己的判断,找不到研究缺口;研究方法部分,可能担心方法设计不够严谨,别人难以复现.....针对这些申报中的高频痛点,接下来七哥会从五个核心要点出发,借助Gemini 3 Pro高效解决这些痛点。

智能AI让学术科研更容易 697

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: GEE分块运算实战:如何用4行代码解决大区域内存溢出问题
下一篇: Golang实战技巧:彻底规避Protobuf文件重复注册的5种工程化方案
alice7model
博客等级 码龄1天 0粉丝 1671原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值