首页 > 其他分享 >旋转位置编码

旋转位置编码

时间:2024-09-25 11:34:30浏览次数:7  
标签:编码 torch tensor 位置 旋转 77 bs theta input

参考自RoPE旋转位置编码深度解析:理论推导、代码实现、长度外推 - 知乎 (zhihu.com)

位置编码: 1.绝对, 直接加到输入中. 2.相对,加在Attn的内积之前, 外推性能强。

 

ROPE:对Attn的K和V矩阵做ROPE

二维场景: 

对于一个二维向量 :

 

偶数维的可以用拆成若干个2维的向量, 对这些向量分别用ROPE再拼接回原始维度(内积满足线性叠加性)

 

import torch

def apply_rope(input_tensor):
    bs, seq_len, channels = input_tensor.shape  # [bs, 77, 4]
    
    # 假设通道为偶数维度,这里c=4
    assert channels % 2 == 0

    # 对通道进行划分 (c=4 -> 两个二维向量)
    c1 = input_tensor[:, :, 0::2]  # shape [bs, 77, 2] -> (c1, c3)
    c2 = input_tensor[:, :, 1::2]  # shape [bs, 77, 2] -> (c2, c4)

    # 生成旋转角度 \theta_p
    positions = torch.arange(seq_len).unsqueeze(1)  # [77, 1]
    theta = positions / (10000 ** (torch.arange(2) / channels))  # 根据RoPE公式计算theta

    cos_theta = torch.cos(theta).unsqueeze(0)  # shape [1, 77, 2]
    sin_theta = torch.sin(theta).unsqueeze(0)  # shape [1, 77, 2]

    # 对每对通道应用旋转矩阵
    c1_prime = c1 * cos_theta - c2 * sin_theta  # 旋转后的第一维
    c2_prime = c1 * sin_theta + c2 * cos_theta  # 旋转后的第二维

    # 拼接回原来的通道维度
    output_tensor = torch.stack([c1_prime, c2_prime], dim=-1).reshape(bs, seq_len, channels)
    
    return output_tensor

# 假设输入是 [bs, 77, 4] 的张量
input_tensor = torch.randn(bs, 77, 4)
output_tensor = apply_rope(input_tensor)

 

标签:编码,torch,tensor,位置,旋转,77,bs,theta,input
From: https://www.cnblogs.com/alexlord/p/18431000

相关文章

  • Nat Genet | 发现8个新基因!外显子组测序揭示罕见编码基因突变对成人认知功能的影响
    认知功能是一种复杂的心理过程,包括注意力、记忆力、处理速度、空间能力、语言和解决问题的能力,很难单独评估。已有研究表明,成人认知功能受到遗传的强烈影响。基于常见变异的全基因组关联研究(GWAS),目前已经确定了近4000个个体效应较小的认知功能基因位点。同时,GWAS还证明了认知功能和......
  • 【代数与编码】域的概念
    什么是域?温故群:一个集合G,一种二元运算∗,满足群公理(封闭,结合,单位元,逆元)。阿贝尔群(交换群):任意a,b∈G,a∗b=b∗a。(交换律)环:一个集合R,两种二元运算加法和乘法(+,·),满足(加法构成阿贝尔群,乘法构成半群,分配律)。含幺环(单位环):环,乘法单位元。交换环:环,乘法交换律。含幺交换环:环,乘......
  • MISC - 第四天(OOK编码,audacity音频工具,摩斯电码,D盾,盲文识别,vmdk文件压缩)
    前言各位师傅大家好,我是qmx_07,今天继续讲解MISC知识点FLAG附件是一张图片,尝试binwalk无果使用StegSolve工具DataExtract查看时发现PK字段,是大多数压缩包的文件头点击SaveBin保存zip文件解压缩失败使用修复软件:http://forspeed.onlinedown.net/down/95222_201706......
  • 告别旋转手机:SLAM过程中的磁力计标定
    1.论文信息论文标题:Sayinggoodbyestorotatingyourphone:MagnetometercalibrationduringSLAM作者:IlariVallivaara,YinhuanDong,TughrulArslan作者单位:爱丁堡大学论文链接:https://arxiv.org/pdf/2409.012422.摘要虽然室内定位仍然更普遍地使用Wi-Fi定位......
  • 第八章习题4-有个整数,使前面各数顺序向后移个m个位置,最后m个数变成最前面m个数,见图
     ......
  • linux如何查看当前的目录所在位置
    在Linux系统中,查看当前目录所在位置的常用命令是pwd,它代表"printworkingdirectory"(打印工作目录)。当你在终端中输入pwd并按下回车键时,它会显示当前所在的完整路径。打开终端,然后输入以下命令:pwd系统会返回你当前所在的目录路径。例如,如果你在/home/username/Documents目录......
  • HarmonyOS开发之横竖屏旋转适配
    场景描述在HarmonyOS移动应用开发中,横竖屏旋转适配成为了一个不可或缺的功能点。特别是在HarmonyOSNEXT平台,开发者面临着更加多样化的设备和更复杂的用户交互需求。以下是我们在项目中遇到的一些关于横竖屏旋转的高频问题及解决方案:如何通过传感器自己感知方向并设置旋转:在不考虑......
  • threejs 使用base64编码的图片作为贴图
     使用base64作为贴图可以从接口直接传输(如果特别大需要压缩),可以省去很多操作 代码如下//纹理加载器consttexLoader=newTHREE.TextureLoader();constbase64Str="data:image/png;base64,...";texLoader.load(base64Str,(texture)=>{constaspectRa......
  • 如何使用位置参数从 ROS 的 Geometry_msgs 初始化 Pose?
    在文档中,它说我可以使用“完整的字段值集,按.msg顺序”进行初始化。这是什么意思?我如何用Python和C++实现它?谢谢!使用位置参数初始化ROSGeometry_msgs的Pose是对的,ROSGeometry_msgs的Pose消息类型可以通过“完整的字段值集,按.msg顺序”进行初始......
  • 备战软考02——硬件组成,CPU,编码,浮点数
    计算机硬件组计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成运算器、控制器等部件被集成在一起统称为中央处理单元(CentralProcessingUnit,CPU)。CPU是硬件系统的核心,用于数据的加工处理,能完成各种算术、逻辑运算及控制功能。◆存储器是计算机系......