大模型基础

位置编码有哪些?RoPE 为什么能实现相对位置编码?怎么做长度外推?

91学AI·2026/7/26·10 阅读

考察点

位置编码是 Transformer 面试的进阶题,重点不在「有哪些」,而在 RoPE:为什么旋转操作能让点积只依赖相对距离,以及训练长度 4K 的模型怎么外推到 128K。能说清位置插值、NTK、YaRN 的区别,基本就能和背书型选手拉开差距。追问常往外推为什么失效、RoPE 的 base 参数(theta)调整上走。

参考答案

位置编码的几条路线

自注意力本身对顺序不敏感——打乱输入 token,输出也跟着打乱,所以需要显式注入位置信息。主要路线:

  • 正弦绝对位置编码(原始 Transformer):用不同频率的 sin/cos 函数生成固定向量,直接加到 embedding 上。不增加参数,理论上能外推到任意长度,但实测外推效果差。
  • 可学习绝对位置编码(BERT、GPT-2):给每个位置一个可训练向量,简单有效,但长度被训练时的最大位置卡死,超出部分没有参数可用。
  • 相对位置编码(T5、ALiBi):不给 token 加位置,而是在计算注意力分数时加入两个位置距离的偏置项。ALiBi 尤其简单:给第 h 个头的注意力分数直接减去 m_h * (i - j),距离越远惩罚越大,外推性意外地好。
  • RoPE(旋转位置编码,RoFormer 提出):现在绝对主流,LLaMA、Qwen、DeepSeek 全在用。

RoPE 的原理

RoPE 的核心操作:把 d 维的 query/key 向量两两分组,每一对看成一个复数,第 m 个位置的 q(或 k)按位置 m 旋转一个角度,频率随维度对变化——低维转得快,高维转得慢,类似正弦编码的多频率思想。

$$f(q_m, m) = R_m , q_m$$

其中 R_m 是由若干 2×2 旋转矩阵组成的块对角矩阵,第 i 组的旋转角是 m·θ_i,θ_i = base^(-2i/d),base 通常取 10000。

为什么说它是相对位置编码:注意力算的是 q_m 和 k_n 的点积。旋转矩阵有个性质——(R_m q)·(R_n k) = q·(R_{n-m} k),两个各自旋转过的向量做点积,结果只取决于它们的相对距离 n-m 和原始向量,绝对位置 m、n 被消掉了。也就是说 RoPE 用绝对位置的方式实现(每个位置只管旋转自己),在点积层面自动得到相对位置的效果。同时随着距离增大,旋转角差周期性变化让点积整体呈衰减趋势,自带「近处更重要」的归纳偏置。

实现上不真的构造矩阵,而是按维度对用 cos/sin 逐元素计算,代价几乎为零。

长度外推

模型在 4K 长度上训练,直接推理 32K 会发生什么?位置 m 超出训练范围后,旋转角 m·θ_i 落在训练时从没见过的区间,注意力分数分布剧变,PPL 爆炸。这就是 RoPE 的外推失效问题。

主流解法按思路分两类:

  • 位置插值(PI):既然超范围,就把长位置压缩回训练范围——位置 m 映射为 m·(L_train/L_infer)。相当于把旋转频率整体缩小。微调少量步数就能恢复效果,代价是高频率分量被压缩后损失了对近距离位置的分辨能力。
  • NTK-aware 缩放:不统一压频率,而是分维度处理——高频维度(负责局部位置)少动,低频维度(负责长程位置)多缩放,通过调大 RoPE 的 base(比如 10000 调到 500000)实现。Code LLaMA、Qwen 用的就是这类思路,不用微调也能直接扩上下文,微调后更稳。
  • YaRN:NTK 的改进版,对频率做分段插值再加一个温度系数修正注意力分布,是 Llama 系长上下文微调的常用配方。实际业务里扩上下文的标准做法是「调大 base + 长文本继续训练几千步」,而不是指望免训练外推。

可能的追问

  • RoPE 和正弦编码是什么关系? 可以看成同一思想的两种实现:都是多频率的 sin/cos。正弦编码把位置加在输入 embedding 上,是绝对的;RoPE 把旋转施加在 q/k 上,点积时自然呈现相对性。
  • 外推时为什么只调 base 就有用? 调大 base 等价于整体降低旋转频率,长位置的旋转角落回训练见过的范围;NTK 的分维度处理保护了高频分量不被过度压缩。
  • ALiBi 和 RoPE 怎么选? ALiBi 外推性好、实现极简,但表达力略逊且不支持一些需要精确相对位置的任务;社区实践最终收敛到 RoPE,生态和验证最充分。

评论 (0)

暂无评论,快来抢沙发吧!

91学AI

© 2026 91学AI · 按岗位学 AI 与大数据. All rights reserved.