课程0基础Agent开发课 / LLM基础 / 位置编码与RoPE-LLM怎么知道词在哪个位置
— 10 min read

位置编码与RoPE-LLM怎么知道词在哪个位置

> **[进阶选读]** 本文适合想深入理解 LLM 内部机制的读者。理解位置编码,能解释为什么现代 LLM 能支持超长上下文,以及上下文窗口扩展的工程原理。路径 A 的读者可以跳过。

位置编码与 RoPE:LLM 怎么知道词在哪个位置

[进阶选读] 本文适合想深入理解 LLM 内部机制的读者。理解位置编码,能解释为什么现代 LLM 能支持超长上下文,以及上下文窗口扩展的工程原理。路径 A 的读者可以跳过。


[进阶选读] 本篇深入讲解位置编码的数学原理,适合想理解现代 LLM 如何支持超长上下文的读者。如果你的目标是应用开发(路径 A),可以跳过本篇,不影响后续学习。

考虑这两句话:

  • "猫追狗"
  • "狗追猫"

词完全相同,顺序不同,意思截然相反。对人来说显而易见。但对 Transformer 来说,如果不做特殊处理,这两句话在模型眼里是一模一样的

这就是位置编码要解决的问题。


1.1 为什么 Transformer 需要显式注入位置信息

1.1.1 自注意力的设计哲学与它的盲点

自注意力机制的强大来自它的并行性:所有 token 同时处理,每个 token 直接与其他所有 token 交互。但这个设计有一个固有盲点:它完全不感知顺序。

绝对位置编码与 RoPE 对比
图 6.17:绝对位置编码(正弦编码)与 RoPE 旋转位置编码对比——RoPE 天然编码相对位置,泛化性更强

自注意力的计算过程:计算 Q 与 K 的点积,得到相似度分数,做 softmax,加权聚合 V。整个过程中,没有任何地方用到了"第几个位置"这个信息。

这意味着:把"我爱你"打乱成"你爱我",自注意力对每个词计算的相关度分数完全相同,产生完全相同的输出。

这是一个设计上的必然结果,不是 bug。Transformer 为了实现并行计算,放弃了 RNN 那种天然的时序感知。位置感知需要通过额外的机制来注入。


1.2 自注意力是"置换不变"的

自注意力机制处理一个句子时,每个词同时与所有其他词计算相关性,没有先后顺序的概念。

用数学术语说,自注意力是**置换不变(Permutation Invariant)**的(即对输入元素的排列顺序不敏感):把输入词的顺序打乱,输出的注意力分布不变。

一个直观类比:把一个句子的词写在纸条上,全部扔进袋子里,然后让自注意力机制处理这袋词——它只知道"袋子里有哪些词",不知道"这些词原来排列的顺序"。

有序的句子一袋无序的词 ,在自注意力看来没有区别。

这显然不对。语言的顺序承载着大量信息:"我欠你钱"和"你欠我钱"语义完全相反,但词袋完全相同。

为了让模型感知顺序,必须在输入里额外注入位置信息——这就是位置编码(Positional Encoding)的来历。


1.3 方案一:绝对位置编码(正弦编码)

1.3.1 正弦函数的设计动机:编码位置的数学性质

为什么用正弦函数而不是简单的数字(第1位用1,第2位用2)来编码位置?

简单数字编码有两个问题。第一,训练时见过的最长序列长度决定了数字的范围,超出范围的位置没有对应表示;第二,位置 100 和位置 101 之间的差距,在数值上和位置 1 与位置 2 的差距完全相同,但对语言来说,相邻词的关系应该相似,不管在句子的哪个位置。

正弦函数的设计利用了三角函数的几个性质:不同频率的正弦/余弦可以唯一表示任意位置;三角恒等式确保了任何两个位置之间的相对关系可以通过线性变换表达;函数是周期性的,位置信息是"旋转"形式的,有助于泛化。

1.3.2 原理

原始 Transformer 论文(Attention is All You Need,2017)提出的方案:为序列中每个位置 $i$ 生成一个固定的数学信号,叠加到对应词的向量表示上。

具体做法是用不同频率的正弦和余弦函数组合,生成一个与词向量维度相同的位置向量,然后直接相加。

非程序员可跳过代码,重点看文字说明

code
位置向量 PE(pos, 2i)   = sin(pos / 10000^(2i/d_model))
位置向量 PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))

最终输入 = 词向量 + 位置向量

直觉理解:就像给每个座位贴不同频率的"条纹码",模型通过学习这些条纹码,推断词语的位置关系。

1.3.3 局限性

正弦编码最明显的问题是外推能力差

如果模型训练时最长序列是 2048 个 Token,那 2048 之后的位置,模型从未见过对应的位置向量,遇到更长的文本时,直接失效。这就像一把只刻到2048刻度的尺子,超出范围就没法量了。

后来又出现了可学习的绝对位置编码(把位置向量变成可训练参数),但外推问题依然没有根本解决。


1.4 方案二:ALiBi(相对位置编码)

1.4.1 核心思想

ALiBi(Attention with Linear Biases,2021年提出)换了一个思路:不引入位置向量,而是直接在注意力得分上加距离惩罚

计算注意力得分时,两个词距离越远,得分就自动减去一个与距离成正比的偏置值,相当于"距离越远,关注度越低"。

类比:看书时,你对当前词的注意力,自然会向附近的词倾斜,很少去关注几百词之前的内容。ALiBi 把这种"近则亲"的直觉直接编码进注意力计算里。

1.4.2 ALiBi 的优势

ALiBi 完全不需要位置向量,结构更简单,而且有一定的长度外推能力——训练时用 1024 长度,推理时用 2048 长度,仍然可以工作,因为"距离越远惩罚越大"的规则在任何长度下都成立。

但 ALiBi 也有缺点:它假设"越近越重要",这种强假设在某些任务下并不成立,表达能力受限。


1.5 方案三:RoPE(旋转位置编码)

RoPE(Rotary Position Embedding,2021年由苏剑林提出)是目前主流大模型普遍采用的方案,LLaMA、Qwen、DeepSeek 均使用 RoPE。

1.5.1 核心直觉

RoPE 的思想非常精妙:不是把位置信息加到词向量上,而是把位置信息"旋转"进词向量里

用一个几何类比:把词向量想象成二维平面上的一根箭头,位置 $m$ 的词,就把这根箭头旋转 $m \times \theta$ 角度($\theta$ 是一个预设的小角度)。

这样设计的关键好处:当计算两个词的相关性时(Q 和 K 的点积),数学上可以证明,这个点积的结果只依赖于两个词的相对距离,而不依赖它们的绝对位置

非程序员可跳过代码,重点看文字说明

code
位置 m 的词向量 q 经 RoPE 变换后:
q_m = R(m) · q

两词的注意力得分:
score(q_m, k_n) = (R(m)·q)ᵀ (R(n)·k)
               = qᵀ · R(m-n) · k    ← 只依赖相对位置 (m-n)

换句话说,RoPE 是通过绝对位置编码的实现方式,达到了相对位置编码的效果。

1.5.2 为什么 LLaMA/Qwen/DeepSeek 都选 RoPE

  1. 理论优雅:用旋转这个几何操作,天然得到相对位置信息,数学上非常干净。
  2. 外推能力更好:相对位置的表示方式,让模型在遇到训练时未见过的长度时,有更合理的泛化。
  3. 工程实现高效:RoPE 可以在计算注意力的同时顺带完成,不引入额外的嵌入层参数。
  4. 社区验证充分:LLaMA 的成功让 RoPE 成为事实标准,大量工程优化也都围绕 RoPE 展开。

1.6 上下文扩展:如何让模型读更长的文本

原始 RoPE 也存在训练长度外推的问题。如果模型只用 4096 长度训练,直接推理 32K 长度的文档,RoPE 的旋转角度超出训练范围,效果会退化。

为了突破这个限制,研究者提出了几种扩展技术。

1.6.1 位置插值(PI,Position Interpolation)

思路非常直接:把超出训练范围的位置,按比例压缩回训练范围内

类比:有一把只能量 0-4096 的尺子,要量一段 8192 长的序列,把尺子的刻度压缩一倍,让 0-8192 映射到 0-4096,就能用了。

压缩后,旋转角度仍在模型见过的范围内。再用少量长文本数据微调,效果就能恢复。大量 128K 上下文模型用的就是这个技巧。

1.6.2 YaRN(Yet another RoPE extensioN)

YaRN 是 PI 的改进版,关键观察是:RoPE 用不同频率的旋转处理词向量的不同维度,低频维度的旋转角本来就小,压缩时不需要动;高频维度的旋转角大,才需要压缩

YaRN 对不同频率的维度区别对待,避免了 PI 一刀切压缩带来的信息损失,在极长上下文(128K、200K)下效果更好。

1.6.3 为什么同样标称 128K 上下文,不同模型效果差异很大

这是开发者经常困惑的问题。原因在于:

  • 使用的扩展技术不同(PI vs YaRN vs 其他)
  • 长文本微调数据量不同(有的只用很少的长文本数据做了简单微调)
  • 训练阶段的最大长度不同(有的是真正用 128K 数据训练,有的是用短文本训练后硬扩展)

"128K 上下文"只是一个能力声明,实际的长文本性能需要看具体评测(比如 RULER、Needle-in-a-Haystack 等长文本测试)。


1.7 三种位置编码方式的架构对比

RoPE

旋转变换

词向量

旋转后的向量

位置角度

注意力计算中自然包含相对位置

ALiBi

减去偏置

词向量

注意力得分

位置距离

调整后的注意力得分

绝对位置编码

加法

词向量

词向量 + 位置向量

固定正弦函数


1.8 对比表格

维度 绝对位置编码(正弦) ALiBi RoPE
位置信息形式 加到词向量上 注意力分数偏置 旋转词向量
编码类型 绝对位置 相对距离 绝对实现、相对效果
长度外推 很差,超出训练长度失效 较好,有距离衰减保证 好,可借助 PI/YaRN 扩展
额外参数 无(固定)或有(可学习)
训练稳定性 稳定 稳定 稳定
代表模型 原始 Transformer、BERT MPT、BLOOM LLaMA、Qwen、DeepSeek
主流程度 已逐渐被替代 小众 当前主流

1.9 对开发者的实际意义

选模型时为什么要关注位置编码类型

  1. 长文本任务优先选 RoPE 模型。如果你的应用需要处理长文档(超过 8K Token),RoPE 结合 YaRN 的模型在长文本理解上更可靠,比 ALiBi 或旧式绝对位置编码模型表现更好。

  2. 不要只看标称上下文长度。Qwen2.5-72B 标称 128K,GPT-4o 标称 128K,但实际在超长文本任务上的表现差异明显。需要查该模型的长文本评测报告。

  3. 上下文扩展后需要微调。如果你在自己微调一个基础模型,扩展上下文时光改 RoPE 参数是不够的,还需要用对应长度的数据做继续预训练或微调,否则模型虽然"能读"长文本,但理解能力不到位。

  4. KV Cache 与上下文长度的关系。位置编码影响的是模型能理解多长的序列,而 KV Cache(见第14篇)影响的是推理时的内存和速度。两者相互独立,超长上下文意味着 KV Cache 也会非常大。


1.10 小结

位置编码这几件事值得记住:

  • 自注意力本身不感知顺序,必须外加位置信息
  • 正弦绝对编码是历史起点,外推能力弱
  • ALiBi 用距离衰减偏置简化了设计,但表达能力有限
  • RoPE 通过旋转变换优雅地融合了绝对与相对位置信息,成为当前主流
  • PI 和 YaRN 是在 RoPE 基础上扩展上下文长度的工程技术
  • "128K上下文"标称不等于实际长文本能力,需要看评测数据

下一篇将介绍残差连接与 LayerNorm——让深层神经网络得以稳定训练的两个关键机制。

本页目录