2024年12月29日

位置编码

位置编码是为 Transformer 输入注入序列顺序信息的方法,因为自注意力机制本身是排列不变的(对输入的任何排列产生相同的输出),必须通过额外的位置信号告诉模型每个 token 的位置。

知识库大模型基础原理llmmodeltransformerposition-encoding

先说结论

位置编码是为 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 是维度索引。

关键性质:

  1. 不同频率:低维度使用高频三角函数(捕捉局部位置差异),高维度使用低频三角函数(捕捉全局位置信息)。
  2. 相对位置可线性表示:对于任意固定偏移 k,PE(pos+k) 可以表示为 PE(pos) 的线性函数。这意味着模型可以通过学习线性变换来捕捉相对位置关系。
  3. 无需学习:完全由公式确定,不增加训练参数。
  4. 理论上可外推:对训练时未见过的更长序列,理论上仍能产生有效的编码(但实际外推能力有限)。

可学习位置编码(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

关键性质:

  1. 相对位置编码的数学优雅性:两个位置的 Query-Key 点积 Q_m * K_n 只依赖于相对位置 m-n,而非绝对位置 m 和 n。这意味着模型天然地编码了相对位置关系。
  2. 乘法注入:通过旋转而非加法注入位置信息,这意味着位置信息会在注意力计算中自然衰减——距离越远,旋转角度差异越大,点积值越小,注意力权重越低。这符合直觉:远距离 token 之间的关联通常更弱。
  3. 外推性:RoPE 支持通过 NTK-aware 缩放、YaRN 等技术扩展到更长的序列。
  4. 广泛采用: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, ...)。距离越远,惩罚越大。

关键性质:

  1. 极致简洁:实现只需在注意力分数上加一行代码。
  2. 出色的长度外推:在短序列上训练的模型可以直接在长序列上推理,性能下降极少。这是 ALiBi 最大的卖点。
  3. 无需位置嵌入参数:不增加任何可学习参数。
  4. 局限性:性能上限可能略低于 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 的实现要点

  1. 计算每个维度对对应的频率 theta_i = 1 / (10000^(2i/d))。
  2. 对每个位置 m,构建旋转角度 [mtheta_0, mtheta_1, ...]。
  3. 将 q 和 k 的相邻维度对视为复数,施加旋转(乘以 e^{imtheta})。
  4. 实际实现中通常使用三角函数公式直接计算,避免复数运算。

长度外推技术

训练时使用序列长度 L,推理时需要处理更长序列 L' > L:

  1. NTK-aware 缩放:调整 RoPE 的基频(10000 -> 10000 * alpha),使高频分量变化更缓慢。
  2. YaRN:结合 NTK 缩放和温度调整,对不同频率范围使用不同策略。
  3. 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

容易踩的坑

  1. 忘记添加位置编码:模型仍然可以训练(因为 token embedding 有一定信息),但在需要顺序理解的任务上表现极差,且这种问题不易察觉。
  2. RoPE 实现中的维度配对错误:RoPE 要求将相邻维度配对旋转,如果维度顺序搞错,模型性能会严重下降。
  3. 推理时序列长度超过训练长度:如果不做长度外推处理,模型性能会急剧下降(尤其对于可学习位置编码)。
  4. NTK 缩放因子选择不当:alpha 值太小外推不足,太大则近距离位置分辨率不够。

工程落地时我会怎么做

  1. 新项目默认使用 RoPE,它是目前工程验证最充分的位置编码方法。
  2. 训练时在预期最大长度的序列上训练,减少对外推的依赖。
  3. 如需外推,使用 NTK-aware 缩放或 YaRN,并在目标长度附近验证性能。
  4. RoPE 的基频(默认 10000)可以作为一个超参数调优。部分工作发现增大基频(如 500000)有利于长上下文。
  5. 在微调阶段可以使用 RoPE 缩放(如 LLaMA 的 long context fine-tuning)。

如果要对外讲,可以怎么概括

建议结构:

  1. 先解释为什么需要位置编码:自注意力的排列等变性。
  2. 介绍正弦编码的公式和直觉(不同频率捕捉不同粒度的位置信息)。
  3. 重点讲解 RoPE 的原理:通过旋转矩阵在注意力计算中隐式编码相对位置。
  4. 简述 ALiBi 的思路:在注意力分数上加线性偏置。
  5. 对比三种方法的优劣。

常见面试追问:

  • RoPE 为什么编码的是相对位置而非绝对位置?(点积只依赖角度差,即位置差)
  • 如何让 RoPE 支持更长的序列?(NTK 缩放、YaRN、Position Interpolation)
  • ALiBi 为什么外推性好?(偏置只依赖距离,与绝对位置无关)

最后记几条

  1. 必要性:自注意力本身不编码位置,不加位置编码等于在处理无序集合。
  2. RoPE 是当前主流:通过旋转矩阵优雅地编码相对位置,几乎被所有现代 LLM 采用。
  3. 正弦编码的巧妙之处:不同频率的三角函数让模型可以在多个粒度上感知位置。
  4. ALiBi 的极简哲学:不加位置编码,只在注意力分数上加线性偏置,外推性极佳。
  5. 长度外推是实际工程中的关键挑战:训练成本限制了训练长度,但推理时经常需要处理更长输入。

面试高频题

QUESTION 为什么 Self-Attention 需要位置编码? Self-Attention 是排列等变的:对输入 {x1,x2,,xn}\{x_1, x_2, \ldots, x_n\} 施加任意排列 π\pi,输出也仅按 π\pi 重排。模型完全无法区分"猫追狗"和"狗追猫"。位置编码通过为每个位置注入唯一的位置签名来打破排列等变性。

QUESTION 绝对位置编码和相对位置编码有什么区别? 绝对位置编码:为每个位置 ii 分配一个固定向量 PE(i)PE(i),加到 token embedding 上。模型需要从中学出相对关系。代表:正弦编码、可学习编码。

相对位置编码:直接编码位置之间的相对距离 iji - j,不依赖绝对位置。代表:T5 相对偏置、ALiBi、RoPE(乘法式相对编码)。

关键区别:绝对编码有 max_len 限制,相对编码天然支持长度外推。

QUESTION RoPE 是绝对位置编码还是相对位置编码? RoPE 是形式上的绝对位置编码、实质上的相对位置编码。它通过旋转矩阵将位置 mm 乘入 QmQ_m,形式上每个位置有独立的变换。但由于旋转矩阵的性质 R(m)TR(n)=R(nm)R(m)^T R(n) = R(n - m),点积 QmKnQ_m \cdot K_n 只依赖于相对位置 mnm - n。这意味着模型天然编码了相对位置关系。

QUESTION 正弦位置编码的两个重要性质是什么?

  1. 不同频率的多尺度性:低维度用高频三角函数(捕捉局部位置差异),高维度用低频三角函数(捕捉全局位置信息)。这相当于在多个分辨率上同时感知位置。
  2. 相对位置的线性可表示性PE(pos+k)PE(pos + k) 可以表示为 PE(pos)PE(pos) 的线性函数。这意味着模型可以通过学习线性变换来捕捉固定偏移的位置关系。

QUESTION 如何让 RoPE 支持更长的上下文?

方法 原理 效果
Position Interpolation (PI) [0,L][0, L'] 线性映射回 [0,L][0, L] 简单但分辨率降低
NTK-aware 缩放 调整基频 1000010000α10000 \to 10000 \cdot \alpha 保持分辨率,更平滑
YaRN 结合 NTK 缩放 + 温度调整 + 频率分段策略 当前最优
动态 NTK 训练时逐渐增大基频 兼顾训练稳定性

QUESTION ALiBi 为什么外推性好? ALiBi 完全不用位置编码,只在注意力分数上加线性偏置 m(ji)m \cdot (j - i),其中 mm 是每个头的固定斜率。由于偏置只依赖相对距离 jij - i,与绝对位置无关,因此在任意长度的序列上都能工作。训练时用短序列,推理时直接用于长序列,性能下降极少。

位置编码全面对比

方法 注入方式 可学习 相对/绝对 长度外推 计算开销 代表模型
正弦编码 加法 绝对(可推导相对) 有限 原始 Transformer
可学习编码 加法 绝对 差(有 max_len 限制) BERT, GPT
T5 相对偏置 注意力加偏置 相对 中等 T5
RoPE 乘法(旋转) 相对 好(配合 NTK/YaRN) LLaMA, Qwen
ALiBi 注意力加线性偏置 相对 极好 极低 BLOOM, MPT

延伸阅读

参考资料

  • 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."