Hero background

中午好,欢迎你。

这里是胡洋的个人主页

一名 AI 研究员 & 开发者

用技术做点有意思、也有用的东西

Hu Yang avatar

胡洋

技术栈

PythonPyTorchJAXTransformersDiffusersDockerGitC/C++

关于我

致力于做一名精于 AI 的全栈开发者。 喜欢从数学或物理的视角来解释 AI 算法背后的逻辑(尽管并不专业),也同样关注 AI 技术从底层原理到工程落地的完整过程。 喜欢用自己的知识与技术栈去做一些好玩的事情,享受从想法到实现的过程。 目前依旧在不断学习、持续积累中。

教育

The University of Tokyo logo

2026.04 — 2028.03

东京大学 工学系研究科

工学硕士 技术经营战略学专攻

所属:松尾・岩泽研究室

University of Tsukuba logo

2022.04 — 2026.03

筑波大学 信息学群

信息媒体科学学士 信息媒体创成学类

所属:落合阳一研究室

经历

Matsuo-Iwasawa Lab logo

2026.03 — 2026.05

研究助理

东京大学 松尾・岩泽研究室

深度参与研究项目设计,微调多个 Vision-Language-Action(VLA)模型并完成对比实验,同时在 HPC 集群上搭建模型训练环境。

AI Robotics Association logo

2025.02 — 2026.02

软件开发 / 技术企划

AI机器人协会(AiRoA)

基于提供数据集微调已有 VLA 预训练模型,搭建基于 SimplerEnv 的机器人仿真测试环境,参与评估指标设计,并完成模型在实体机器人上的部署与真实测试。

项目

2025

VLA 模型微调与仿真/实机测试

VLASimplerEnvRobot Testing

概要

基于 OpenPi 微调 VLA 模型,分别在仿真环境和实体机器人上进行测试,并参与评测规则制定。

描述

2025 年实习期间参与的项目。我使用 OpenPi 框架对 Vision-Language-Action 模型进行了微调,并分别在 SimplerEnv 仿真环境和真实机器人上完成了部署与测试。项目过程中还参与了评测指标与评估流程的设计工作。

博客

写一些值得留下的思绪。或关乎对算法的理解与追问,或关乎时代转向中的风声与暗流,亦或只是关乎日常一隅的微光与褶皱。将诸多思绪落成文字,任其慢慢堆叠沉淀,成为我理解世界的路径。

2026.05

浅谈位置编码 2

摘要

RoPE 怎样用旋转把绝对位置悄悄变成相对距离,又为何在长上下文里会失灵。

正文

上一篇聊到,Transformer 本身并不天然感知顺序,所以需要额外注入位置信息。绝对位置编码直接告诉模型“当前 token 在第几位”,相对位置编码则更关注“两个 token 相隔多远”。

这两种思路各有问题。绝对位置编码简单,但它把位置直接加到 token embedding 上,位置和内容混在一起;相对位置编码更符合 attention 的结构,但通常要额外改 attention score,形式上没那么干净。

RoPE(Rotary Position Embedding)提供了一个很漂亮的折中:它用绝对位置来定义旋转角度,但在 query 和 key 做内积之后,真正起作用的是相对位置。

从二维旋转说起

先看一个二维向量:

如果把它旋转角度 ,可以写成:

也就是:

RoPE 的基本想法很直接:不同位置的 token,用不同角度去旋转它的 query 和 key。

假设第 个 token 的 query 是 ,key 是 ,那么 RoPE 会做:

其中 是由位置 决定的旋转矩阵。

这里要注意一点:RoPE 不是把一个位置向量加到 token embedding 上,而是在 attention 里面,对 query 和 key 动手。这也是它和普通绝对位置编码很不一样的地方。

高维向量怎么旋转

真实模型里的 query 和 key 当然不是二维的,而是高维向量。RoPE 的处理方式是:把向量的维度两两分组,每两个维度当成一个二维平面,然后在每个二维平面里做旋转。

比如:

可以分成:

每一组都旋转,但旋转速度不同。

对第 组维度,位置 对应的角度通常写成:

其中:

所以位置越靠后,旋转角度越大;不同维度组的 不同,相当于有不同频率的“指针”。

如此,对不同维度使用不同频率进行旋转,RoPE将位置信息注入了向量。

RoPE 中的相对位置计算

RoPE 最关键的地方在 query 和 key 的点积。

位置 的 query 旋转后是:

位置 的 key 旋转后是:

attention 里计算的是:

代入进去:

由于旋转矩阵满足:

所以:

一开始我们明明用了两个绝对位置 和 ,但点积之后,位置项变成了 。也就是说,attention score 里真正出现的是两个 token 的相对距离。这就是 RoPE 最巧妙的地方:用绝对位置做旋转,最后在 attention 里留下相对位置。

正如开篇所说, RoPE 是绝对位置和相对位置之间的折中。但更准确地说,它不是简单把二者拼起来,而是通过旋转矩阵把绝对位置转化成了相对位置信息。

从复数角度理解

RoPE 还有一个更简洁的理解方式:把每两个维度看成一个复数。

比如二维向量:

可以看成:

二维旋转角度 ,等价于乘上:

那么位置 上的旋转就是:

query 在位置 ,key 在位置 ,它们分别带上相位:

做相似度计算时,两个相位相减,留下:

也还是相对位置 。

这个视角下,RoPE 像是在给每个 token 的 query 和 key 挂上一个“相位”。位置越靠后,相位转得越多。不同维度转速不同,于是模型就获得了一组多尺度的位置参考。

RoPE 的优与劣

自回归模型预测下一个 token 时,光知道"我现在是第几个"基本没用,真正有用的是当前 token 和前面某个 token 的关系——上一个词是什么、那个左括号在哪里、这个变量之前在哪定义过、这句话呼应的是前文哪一段。而RoPE 把这种相对关系直接塞进了 attention 里。

除此之外它还有几个好处。一是省掉了一张要学的位置 embedding 表,比 learned absolute positional embedding 更容易往训练长度之外推。二是实现简单,对 query 和 key 做个旋转就完事,不用给每个相对距离另外存参数。三是它和 causal attention 配合得很顺——反正自回归只看左边,RoPE 表达"当前位置离历史位置多远"刚好对口。

所以现在很多大模型里都用它。

但 RoPE 的底子是三角函数,三角函数有周期:

转得够久,指针会绕回原地。

之前说 RoPE 像一组指针。沿着这个比喻,时间足够长,指针总要回来。

短序列里这不是问题,因为 RoPE 不是单一频率,而是多个频率叠在一起转。一个维度绕回来了,别的维度未必同步绕回来,整体上还能区分。

长上下文里就麻烦了。

训练时模型可能只见过 4K、8K 的长度,推理时你扔给它 32K、128K,位置 变得很大,旋转角度 跑到了训练时根本没出现过的区域。两件事会同时发生:模型没见过这些相位的组合,attention 分布开始飘;远处的位置在某些频率上又恰好和近处对上了,发生位置混叠。

所以 RoPE 能给任意长度"算出"一个位置编码,不代表模型真的能在那个长度上正常工作。

算得出来是一回事,泛化得过去是另一回事。

小结

RoPE 不是“完美的位置编码”,而是一种很优雅、很实用、但也有边界的方法。它将绝对位置和相对距离连接了起来,同时依旧面对着长上下文的难题。

下一篇可以顺着这个问题继续往下看。文本里,RoPE 的长距离问题可能表现为上下文利用变差;到了视频生成里,这个问题会更直观——模型可能不是简单忘掉前文,而是在生成很长时间后突然“回到开头”。