先说结论
位置编码是为 Transformer 输入注入序列顺序信息的方法,因为自注意力机制本身是排列不变的(对输入的任何排列产生相同的输出),必须通过额外的位置信号告诉模型每个 token 的位置。
为什么我会单独记这一篇
自注意力操作本质上是一个集合操作:对于输入 {x_1, x_2, ..., x_n},Self-Attention 计算的是所有 token 对之间的相似度和加权求和。如果你打乱输入 token 的顺序,自注意力的输出也只会以相同的方式打乱——模型完全无法区分不同的排列。
这显然是个问题。自然语言是有序的:"猫吃鱼"和"鱼吃猫"含义完全不同。如果模型不知道 token 的位置,它就无法理解语言的语法结构和语义。
位置编码的核心挑战在于:如何以一种有效、可泛化、不干扰语义信息的方式,将位置信息注入模型。
先把核心脉络捋清楚
位置编码方法的分类
| 类型 | 方法 | 代表 |
|---|---|---|
| 绝对位置编码(加法) | 正弦编码、可学习编码 | 原始 Transformer、BERT、GPT |
| 相对位置编码(注意力偏置) | T5 相对偏置、ALiBi | T5、MPT、BLOOM |
| 旋转位置编码(乘法) | RoPE | LLaMA、PaLM、Qwen |
| 外推性优化 | YaRN、NTK-aware 缩放 | 长上下文 LLaMA |
正弦位置编码(Sinusoidal Positional Encoding)
原始 Transformer 的方法,使用固定(不可学习)的三角函数:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
其中 pos 是 token 位置,i 是维度索引。
关键性质:
- 不同频率:低维度使用高频三角函数(捕捉局部位置差异),高维度使用低频三角函数(捕捉全局位置信息)。
- 相对位置可线性表示:对于任意固定偏移 k,PE(pos+k) 可以表示为 PE(pos) 的线性函数。这意味着模型可以通过学习线性变换来捕捉相对位置关系。
- 无需学习:完全由公式确定,不增加训练参数。
- 理论上可外推:对训练时未见过的更长序列,理论上仍能产生有效的编码(但实际外推能力有限)。
可学习位置编码(Learned Positional Embedding)
BERT、GPT 系列使用的方法:直接将位置编码作为可学习的参数向量,维护一个位置嵌入矩阵 [max_seq_len, d_model]。
优势:灵活性更高,模型可以学习最适合任务的位置表示。 劣势:无法自然外推到训练时未见过的更长序列;max_seq_len 成为硬性上限。
RoPE(Rotary Position Embedding)
RoPE 是目前最主流的位置编码方法,由苏剑林等人在 2021 年提出。
核心思想:不是在嵌入向量上加一个位置偏移,而是将位置信息通过旋转矩阵"乘"进 Query 和 Key 向量中。具体地,将 Query 和 Key 的每两个维度视为一个二维子空间,根据位置施加不同角度的旋转变换:
对于位置 m 的 token,其第 i 个二维子空间旋转角度 m * theta_i
q_m = [q_0, q_1, ..., q_{d-2}, q_{d-1}]
R(m) * q_m 会将每个相邻维度对旋转 m * theta_i
关键性质:
- 相对位置编码的数学优雅性:两个位置的 Query-Key 点积 Q_m * K_n 只依赖于相对位置 m-n,而非绝对位置 m 和 n。这意味着模型天然地编码了相对位置关系。
- 乘法注入:通过旋转而非加法注入位置信息,这意味着位置信息会在注意力计算中自然衰减——距离越远,旋转角度差异越大,点积值越小,注意力权重越低。这符合直觉:远距离 token 之间的关联通常更弱。
- 外推性:RoPE 支持通过 NTK-aware 缩放、YaRN 等技术扩展到更长的序列。
- 广泛采用:LLaMA、Mistral、Qwen、Gemma 等几乎所有 2023 年后的主流 LLM 都使用 RoPE。
ALiBi(Attention with Linear Biases)
ALiBi 由 Press 等人在 2022 年提出,采取了截然不同的思路:完全不使用位置编码,而是在注意力分数上直接加上一个与距离成线性关系的偏置。
attention_score(i, j) = q_i * k_j + m * (j - i)
其中 m 是每个注意力头专属的斜率(slope),通常按几何级数设定(如 1/2, 1/4, 1/8, ...)。距离越远,惩罚越大。
关键性质:
- 极致简洁:实现只需在注意力分数上加一行代码。
- 出色的长度外推:在短序列上训练的模型可以直接在长序列上推理,性能下降极少。这是 ALiBi 最大的卖点。
- 无需位置嵌入参数:不增加任何可学习参数。
- 局限性:性能上限可能略低于 RoPE(这存在争议,且取决于具体任务和模型规模)。
原理拆开看
为什么自注意力需要位置编码
数学上,Self-Attention 是一个集合函数:对于输入集合 {x_1, ..., x_n},如果对输入施加任何排列 pi,那么 Attention 的输出也仅仅是原输出按 pi 重排。注意力权重矩阵 A[i][j] = softmax(Q_i * K_j / sqrt(d_k)),交换 x_i 和 x_j 的位置不会改变 A 的值,只会改变 A 的行列索引。
这与语言的顺序敏感性矛盾。位置编码通过为每个位置注入唯一的位置签名来打破排列等变性。
RoPE 的数学直觉
RoPE 的精妙之处在于:它将位置编码与注意力计算统一到了同一个框架中。在标准注意力中,Q_m * K_n = sum(q_m,d * k_n,d)。在 RoPE 中,每对维度被旋转后:
Q_m * K_n = sum(R(m)*q_d * R(n)*k_d)
由于旋转矩阵的性质 R(m)^T * R(n) = R(n-m),点积只依赖于相对位置 m-n。这意味着模型不需要显式地学习"绝对位置",而是直接从几何上编码了"相对距离"。
为什么 RoPE 中远距离注意力会衰减
旋转角度差异随距离增加而增大。当两个位置距离很远时,它们的向量在多维空间中被旋转到近乎正交的方向,点积值趋于零。这是一种"软性的"距离衰减,而非硬性的截断。
放到工程里怎么落
RoPE 的实现要点
- 计算每个维度对对应的频率 theta_i = 1 / (10000^(2i/d))。
- 对每个位置 m,构建旋转角度 [mtheta_0, mtheta_1, ...]。
- 将 q 和 k 的相邻维度对视为复数,施加旋转(乘以 e^{imtheta})。
- 实际实现中通常使用三角函数公式直接计算,避免复数运算。
长度外推技术
训练时使用序列长度 L,推理时需要处理更长序列 L' > L:
- NTK-aware 缩放:调整 RoPE 的基频(10000 -> 10000 * alpha),使高频分量变化更缓慢。
- YaRN:结合 NTK 缩放和温度调整,对不同频率范围使用不同策略。
- Position Interpolation (PI):将新位置 [0, L'] 线性映射回 [0, L],相当于"压缩"位置空间。
实际工程选择
| 场景 | 推荐方案 |
|---|---|
| 通用 LLM | RoPE + NTK-aware 缩放 |
| 需要极致长度外推 | ALiBi 或 RoPE + YaRN |
| 小模型/快速实验 | 可学习位置编码(简单直接) |
| 微调预训练模型 | 保持原模型的位置编码不变 |
与相邻概念的区别
- 位置编码 vs Token Embedding:Token Embedding 编码"这是什么词",位置编码编码"这个词在第几个位置"。两者相加后输入模型。
- 绝对位置编码 vs 相对位置编码:绝对编码告诉模型"你在第 5 个位置";相对编码告诉模型"你与第 3 个位置相差 2"。RoPE 和 ALiBi 是相对编码的两种实现。
- 位置编码 vs 位置内插:位置内插(PI)是一种让已有位置编码适应更长序列的技术,不是新的编码方法。
设计时真正要权衡什么
| 设计选择 | 优势 | 代价 |
|---|---|---|
| 正弦编码(固定) | 无参数、理论上可外推 | 灵活性低 |
| 可学习编码 | 灵活、适应任务 | 外推性差、有 max_len 限制 |
| RoPE | 优雅的相对编码、广泛验证 | 实现复杂度中等、需要外推技巧 |
| ALiBi | 极简、出色外推 | 性能上限可能低于 RoPE |
容易踩的坑
- 忘记添加位置编码:模型仍然可以训练(因为 token embedding 有一定信息),但在需要顺序理解的任务上表现极差,且这种问题不易察觉。
- RoPE 实现中的维度配对错误:RoPE 要求将相邻维度配对旋转,如果维度顺序搞错,模型性能会严重下降。
- 推理时序列长度超过训练长度:如果不做长度外推处理,模型性能会急剧下降(尤其对于可学习位置编码)。
- NTK 缩放因子选择不当:alpha 值太小外推不足,太大则近距离位置分辨率不够。
工程落地时我会怎么做
- 新项目默认使用 RoPE,它是目前工程验证最充分的位置编码方法。
- 训练时在预期最大长度的序列上训练,减少对外推的依赖。
- 如需外推,使用 NTK-aware 缩放或 YaRN,并在目标长度附近验证性能。
- RoPE 的基频(默认 10000)可以作为一个超参数调优。部分工作发现增大基频(如 500000)有利于长上下文。
- 在微调阶段可以使用 RoPE 缩放(如 LLaMA 的 long context fine-tuning)。
如果要对外讲,可以怎么概括
建议结构:
- 先解释为什么需要位置编码:自注意力的排列等变性。
- 介绍正弦编码的公式和直觉(不同频率捕捉不同粒度的位置信息)。
- 重点讲解 RoPE 的原理:通过旋转矩阵在注意力计算中隐式编码相对位置。
- 简述 ALiBi 的思路:在注意力分数上加线性偏置。
- 对比三种方法的优劣。
常见面试追问:
- RoPE 为什么编码的是相对位置而非绝对位置?(点积只依赖角度差,即位置差)
- 如何让 RoPE 支持更长的序列?(NTK 缩放、YaRN、Position Interpolation)
- ALiBi 为什么外推性好?(偏置只依赖距离,与绝对位置无关)
最后记几条
- 必要性:自注意力本身不编码位置,不加位置编码等于在处理无序集合。
- RoPE 是当前主流:通过旋转矩阵优雅地编码相对位置,几乎被所有现代 LLM 采用。
- 正弦编码的巧妙之处:不同频率的三角函数让模型可以在多个粒度上感知位置。
- ALiBi 的极简哲学:不加位置编码,只在注意力分数上加线性偏置,外推性极佳。
- 长度外推是实际工程中的关键挑战:训练成本限制了训练长度,但推理时经常需要处理更长输入。
面试高频题
QUESTION 为什么 Self-Attention 需要位置编码? Self-Attention 是排列等变的:对输入 施加任意排列 ,输出也仅按 重排。模型完全无法区分"猫追狗"和"狗追猫"。位置编码通过为每个位置注入唯一的位置签名来打破排列等变性。
QUESTION 绝对位置编码和相对位置编码有什么区别? 绝对位置编码:为每个位置 分配一个固定向量 ,加到 token embedding 上。模型需要从中学出相对关系。代表:正弦编码、可学习编码。
相对位置编码:直接编码位置之间的相对距离 ,不依赖绝对位置。代表:T5 相对偏置、ALiBi、RoPE(乘法式相对编码)。
关键区别:绝对编码有 max_len 限制,相对编码天然支持长度外推。
QUESTION RoPE 是绝对位置编码还是相对位置编码? RoPE 是形式上的绝对位置编码、实质上的相对位置编码。它通过旋转矩阵将位置 乘入 ,形式上每个位置有独立的变换。但由于旋转矩阵的性质 ,点积 只依赖于相对位置 。这意味着模型天然编码了相对位置关系。
QUESTION 正弦位置编码的两个重要性质是什么?
- 不同频率的多尺度性:低维度用高频三角函数(捕捉局部位置差异),高维度用低频三角函数(捕捉全局位置信息)。这相当于在多个分辨率上同时感知位置。
- 相对位置的线性可表示性: 可以表示为 的线性函数。这意味着模型可以通过学习线性变换来捕捉固定偏移的位置关系。
QUESTION 如何让 RoPE 支持更长的上下文?
方法 原理 效果 Position Interpolation (PI) 将 线性映射回 简单但分辨率降低 NTK-aware 缩放 调整基频 保持分辨率,更平滑 YaRN 结合 NTK 缩放 + 温度调整 + 频率分段策略 当前最优 动态 NTK 训练时逐渐增大基频 兼顾训练稳定性
QUESTION ALiBi 为什么外推性好? ALiBi 完全不用位置编码,只在注意力分数上加线性偏置 ,其中 是每个头的固定斜率。由于偏置只依赖相对距离 ,与绝对位置无关,因此在任意长度的序列上都能工作。训练时用短序列,推理时直接用于长序列,性能下降极少。
位置编码全面对比
| 方法 | 注入方式 | 可学习 | 相对/绝对 | 长度外推 | 计算开销 | 代表模型 |
|---|---|---|---|---|---|---|
| 正弦编码 | 加法 | 否 | 绝对(可推导相对) | 有限 | 低 | 原始 Transformer |
| 可学习编码 | 加法 | 是 | 绝对 | 差(有 max_len 限制) | 低 | BERT, GPT |
| T5 相对偏置 | 注意力加偏置 | 是 | 相对 | 中等 | 中 | T5 |
| RoPE | 乘法(旋转) | 否 | 相对 | 好(配合 NTK/YaRN) | 中 | LLaMA, Qwen |
| ALiBi | 注意力加线性偏置 | 否 | 相对 | 极好 | 极低 | BLOOM, MPT |
延伸阅读
-
注意力机制 — 注意力计算中位置编码如何被使用
-
Transformer — 位置编码在整体架构中的位置
-
编码器与解码器 — 不同架构对位置编码的不同需求
-
注意力优化前沿 — 长上下文优化与位置编码外推
参考资料
- Vaswani, A. et al. (2017). "Attention Is All You Need." 正弦位置编码的原始论文。
- Su, J. et al. (2021). "RoFormer: Enhanced Transformer with Rotary Position Embedding." RoPE 的原始论文。
- Press, O. et al. (2022). "Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation." ALiBi 的原始论文。
- Chen, S. et al. (2023). "Extending Context Window of Large Language Models via Positional Interpolation."
- Peng, B. et al. (2023). "YaRN: Efficient Context Window Extension of Large Language Models."