3. Position Encoding

介绍位置编码的基本原理、常见方法(正余弦编码、可学习编码、RoPE、ALiBi)及长度外推问题的解决方案

什么是位置编码

  • 假设序列长度为 $L$、模型维度为 $d_{\text{model}}$,输入嵌入可表示为:

    InputEmbedding[i]=TokenEmbedding[i]+PositionalEncoding[i]\text{InputEmbedding}[i] = \text{TokenEmbedding}[i] + \text{PositionalEncoding}[i]
    • $\text{TokenEmbedding}[i]$:表示 token 的语义信息

    • $\text{PositionalEncoding}[i]$:表示 token 的位置信息

  • Transformer 没有循环或卷积结构,所以无法天然知道 token 的顺序,因此需要给每个 token 添加位置信息

  • 位置编码大体上分为两种方法:

    • 绝对位置编码:通过给序列中的每个 token 分配 “某个固定位置的向量”,包括正余弦位置编码(Transformers 模型)、可学习位置编码(BERT 模型)、旋转位置编码(LlaMa 模型)

    • 相对位置编码:显式地表示 token 之间 “距离” 的信息,而不是它们的绝对位置

正余弦位置编码

  • 正弦 / 余弦位置编码(Sinusoidal Positional Encoding)最初由 Transformer 模型提出:

    PE(pos,2i)=sin!(pos100002i/dmodel)PE(pos,2i+1)=cos!(pos100002i/dmodel)\begin{align} \text{PE}_{(pos, 2i)} &= \sin!\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \\ \text{PE}_{(pos, 2i+1)} &= \cos!\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \end{align}
    • $pos$ 为 token 在序列中的位置

    • $i$ 为维度索引

  • 分析

    • 确定性

      • 与需要通过训练获得的可学习位置编码不同,正余弦位置编码由预先定义的固定函数生成,因此是确定性的

      • 对于任意位置 pos 和维度索引 i,其取值恒定,不依赖训练过程,也不引入额外的可学习参数

    • 有界性

      • 正弦和余弦函数的取值范围限制在 $[-1,1]$ 内,在与词嵌入相加时,不会显著改变组合后表示的整体尺度

      • 这种有界特性有助于保持表示的数值稳定性,从而使训练过程更加平稳

    • 平滑性

      • 正余弦函数随位置连续、平滑变化,因此相邻位置 $pos$ 与 $pos+1$ 的位置编码彼此相似

      • 这一性质与自然语言中相邻词语往往具有强上下文相关性的直觉相一致

    • 外推能力

      • 由于正余弦位置编码由固定函数定义,而非从有限长度的训练数据中学习,它可以为任意位置生成编码

      • 因此,在处理超过训练序列长度的输入时,位置编码本身不会失效或产生未定义表示,相较于学习型位置嵌入具备更好的外推性(尽管模型整体性能仍可能受其他因素限制)

  • 尽管具备确定性和可外推的形式定义,正余弦位置编码在实践中并不能可靠地从训练序列长度泛化到显著更长的未见长度:

    • 高频维度的周期性问题

      • 正余弦位置编码由一组不同频率的正弦和余弦函数组成,其中高频分量的周期较短

      • 当位置 $pos$ 远超训练范围时,这些高频维度会发生周期性重复,导致不同位置之间出现相似甚至重叠的相位表示,从而削弱位置区分能力

    • 语义解读能力受训练范围限制

      • 模型在训练过程中仅在 $[0, L_{train}]$ 的位置范围内接触到这些正余弦信号

      • 因此,模型实际学到的是如何在该有限区间内解读不同维度的相位组合,例如哪些频率对应“近距离”关系,哪些反映“远距离”依赖,哪些维度刻画整体结构上的衰减模式

      • 当位置超出训练长度时,虽然位置编码函数本身仍然定义良好,但这些相位组合落入了模型从未见过的分布区域,导致已学到的解读方式不再可靠

可学习位置编码

  • 可学习位置编码不依赖预定义的数学函数,而是将序列中的每个绝对位置视为一个可学习的“符号”:

    • 在模型设计阶段预先设定最大支持序列长度 $L_{max}$(如 512、1024、2048)

    • 构造一个位置嵌入矩阵 $P \in \mathbb{R}^{L_{max} \times d_{model}}$,其中第 $i$ 行 $P_i$ 表示位置 $i$ 的嵌入向量,满足 $0 \le i < L_{max}$

    • 该矩阵通常随机初始化,并在训练过程中通过反向传播与模型其他参数一同优化

  • 给定长度为 $L$($L \le L_{max}$)的输入序列:

    • 首先得到词向量 $E_{token} \in \mathbb{R}^{L \times d_{model}}$

    • 再从 $P$ 中取出前 $L$ 个位置嵌入,构成

      Eposition=[P0,P1,,PL1]RL×dmodelE_{position} = [P_0, P_1, \dots, P_{L-1}] \in \mathbb{R}^{L \times d_{model}}
    • 最终输入表示为逐元素相加:

      Einput=Etoken+EpositionE_{input} = E_{token} + E_{position}
  • 外推能力受限

    • 位置嵌入仅为 $[0, L_{max})$ 范围内的位置定义

    • 当序列长度超过 $L_{max}$ 时,模型无法直接处理,通常需要重新训练或引入额外策略

    • 相比之下,正弦位置编码可为任意位置生成定义良好的编码

  • 参数量增加

    • 额外引入 $L_{max} \times d_{model}$ 个可训练参数

    • 当 $L_{max}$ 或 $d_{model}$ 较大时,会显著增加模型规模、显存占用和过拟合风险

  • 数据依赖性强

    • 学习稳定、有效的位置表示通常需要充足的数据

    • 在数据有限的情况下,正弦编码的结构性归纳偏置往往更有利于泛化

旋转位置编码

  • 在训练高上下文长度的模型时,句子长度可能远远小于上下文窗口长度,因此需要对来自不同文档的文本进行打包(Packing),即在不同句子之间添加 [SEP]

  • 这样,前后相连的两个句子可能来自毫无关系的两个文档,绝对位置编码可能会误导模型认为这两个句子是上下文关联的

  • 而旋转嵌入能够捕捉绝对和相对的标记位置信息,基于在嵌入空间中旋转向量的概念实现

  • 给定 Token Embedding 中的二维维度对 $(x_{2k}, x_{2k+1})$,旋转位置编码(RoPE, Rotary Positional Embedding)通过与位置 $pos$ 相关的角度 $\theta_k$​ 对该向量进行旋转:

    (x2k x2k+1)(cos(posθk)sin(posθk)sin(posθk)cos(posθk))(x2k x2k+1)\begin{pmatrix} x'_{2k} \ x'_{2k+1} \end{pmatrix} \begin{pmatrix} \cos(pos \cdot \theta_k) & -\sin(pos \cdot \theta_k) \\ \sin(pos \cdot \theta_k) & \cos(pos \cdot \theta_k) \end{pmatrix} \begin{pmatrix} x_{2k} \ x_{2k+1} \end{pmatrix}
  • 这样,每个 Token Embedding 根据其在序列中的位置被旋转,从而隐式编码相对位置信息,并保留了原始 token 的语义结构

  • 其核心特点在于,位置差在内积中自然体现——在注意力计算 $Q_i \cdot K_j$ 时,RoPE 的旋转结构保证:

QirotKjrotcos((ij),θ)Q_i^{\text{rot}} \cdot K_j^{\text{rot}} \propto \cos\big((i-j),\theta\big)
  • 其注意力分数仅依赖于相对位置 $(i-j)$,无需额外设计

  • 在 RoPE 中,每个 Token Embedding 看成一个向量,每到一个新的位置,这个向量被多转一点角度,越到后面旋转角度越大,而注意力计算就是比较这些旋转后的向量是否方向接近 → 方向的差异就包含了位置信息

ALiBi

  • 在普通注意力机制中,注意力分数为:

    scoreij=QiKjd\text{score}_{ij} = \frac{Q_i \cdot K_j}{\sqrt{d}}
  • ALiBi(Attention with Linear Biases)不修改 token embedding,也不使用显式位置向量,而是直接在注意力分数中加入距离惩罚:

    scoreij=QiKjdmh(ij)\text{score}_{ij} = \frac{Q_i \cdot K_j}{\sqrt{d}} - m_h (i - j)
    • $i$ 为当前 token 的位置

    • $j$ 为被关注的 token 的位置

    • $m_h$ 为第 $h$ 个注意力头的固定斜率(不同头使用不同斜率)

alibi原理图

  • 该设计使得:

    • 距离越远,惩罚越大,注意力权重越小,模型天然偏向关注局部上下文

    • 不引入额外位置向量,能够在训练长度之外自然外推,可用于长序列建模

  • 对于任意一对位置 $(i, j)$,ALiBi 只关注它们的相对距离 $|i - j|$,并对注意力得分施加线性、无参数增长的惩罚

  • 具体而言,注意力分数会额外减去一项与距离成正比的偏置:

    Δij=mij\Delta_{ij} = m \cdot |i - j|
    • 其中 $m$ 为固定斜率,不随序列长度增长

    • 因此在任意长度的序列中,例如距离为 $5000$ 的位置对,惩罚始终为 $5000 \times m$,与训练时的最大上下文无关

    • 这一机制使模型在长序列推理时仍能保持稳定表现

    • 同时,模型不需要额外训练位置编码,偏置直接作用于 attention 分数,使得远距离 token 的位置信息依然可区分

    • 因此,Alibi 在长序列外推时表现比 RoPE 更稳定

  • 实际设计中,ALiBi 为每个注意力头分配不同的线性斜率($H$ 是注意力头个数):

    mh=12h/Hm_h = \frac{1}{2^{h/H}}
    • 低序号头 ($h$ 小):衰减快,偏向捕捉局部依赖

    • 高序号头 ($h$ 大):衰减慢,偏向捕捉长距离依赖

    • 这种设计使多头注意力在序列长度上天然分工,提高模型对不同范围依赖的建模能力

长度外推问题

  • 为什么会出现长度外推问题

    • Transformer 的位置编码在训练区间之外缺乏泛化能力,长度外推性本质上来自 train-short 与 test-long 的结构性矛盾

    • 在训练阶段,序列长度通常较短:

      • 受限于训练成本,长序列显著增加计算量与内存开销

      • 真实语料存在严重长尾分布,大部分文本并不长,因此设置极大 $\text{max_length}$ 在统计意义上并不有效

    • 在测试阶段,希望模型在远超训练长度的输入上仍保持性能,即 test-long

      LtestLtrainL_{\text{test}} \gg L_{\text{train}}
    • 但由于 Transformer 的位置编码是按训练域拟合的函数,超过训练位置后会出现无法控制的外推偏差

  • 当输入长度超出训练区间数倍时,模型常出现以下退化现象:

    • 生成语义不连贯或无意义文本

    • 注意力坍塌,仅关注序列开头或结尾

    • 失去对上下文的有效利用

    • 出现重复、幻觉或乱码式输出

    • 多轮对话质量显著下降

    • 推理任务准确率骤降至接近随机水平

  • 为了做到长度外推性,需要解决两个主要问题

    • 预测阶段的位置编码外推偏差:当模型在推理时遇到训练中未出现过的位置索引,即使位置编码本身是非学习式(如正弦编码、RoPE),也会产生外推偏差,其原因在于:

      • 虽然位置编码函数本身可定义在无限区间上,但上层参数(如注意力、前馈层)是在训练区间内拟合该位置嵌入分布的

      • 未见过的位置将产生未被模型参数 “校准” 的向量,从而导致注意力结构和表示空间发生漂移

      • 学习式位置编码(如 APE、T5 相对位置偏置)更明显地无法外推,但非学习式编码同样会影响上层参数的泛化性

      • 因此,位置编码不仅要形式上可外推,更需要在训练过程中避免对有限长度区间的过拟合

    • 长序列导致注意力熵显著增大:在推理时,序列长度 $L_\text{test} \gg L_\text{train}$ 会改变注意力的统计结构:

      • 随着 $L$ 增大,softmax 分布的熵上升,注意力更分散

      • 如果训练阶段仅在短序列上优化,模型会倾向于将注意力集中在局部区域,并学习到与短上下文相关的归纳偏置

      • 长序列输入会破坏这种偏置,导致:

        AttnEntropy(L_test)AttnEntropy(L_train)\text {AttnEntropy}(L\_\text {test}) \gg \text {AttnEntropy}(L\_\text {train})

        结果是注意力无法集中,各 token 难以聚焦于关键信息,最终造成性能下降

RoPE 的理论推导

1. RoPE 的核心目标

  • 在 Transformer 中,注意力得分为

    scoremn=QmKn\text{score}_{mn} = Q_m \cdot K_n
  • 若希望注意力依赖相对位置 $(m-n)$ 而非绝对位置 $(m,n)$,需满足

    f(q,m),f(k,n)=g(q,k,mn)\langle f(q,m), f(k,n) \rangle = g(q,k,m-n)
    • 其中 $f(\cdot)$ 为加入位置后的向量

2. 用复数形式推导

  • 将二维向量映射为复数,如 $q \mapsto q_0 + i q_1$,内积可写为

    q,k=Re[qk]\langle q,k \rangle = \operatorname{Re}[q k^*]
  • f(q,m)=Rf(q,m)eiΘf(q,m),f(k,n)=Rf(k,n)eiΘf(k,n),f(q,m) = R_f(q,m)e^{i\Theta_f(q,m)},\qquad f(k,n) = R_f(k,n)e^{i\Theta_f(k,n)},
  • 代入得到

    Re[f(q,m)f(k,n)]=g(q,k,mn)\operatorname{Re}[f(q,m)f^*(k,n)] = g(q,k,m-n)

3. 分解模长和长度

  • 得到两组条件

    {Rf(q,m)Rf(k,n)=Rg(q,k,mn),Θf(q,m)Θf(k,n)=Θg(q,k,mn).\begin{cases} R_f(q,m)R_f(k,n)=R_g(q,k,m-n),\\ \Theta_f(q,m)-\Theta_f(k,n)=\Theta_g(q,k,m-n). \end{cases}
  • 对模长:当 $m=n$ 时有

    Rf(q,m)Rf(k,m)=qk  Rf(q,m)=q.R_f(q,m)R_f(k,m)=\Vert q\Vert\Vert k\Vert\ \Rightarrow\ R_f(q,m)=\Vert q\Vert.
  • 对角度,说明位置相关性仅体现在角度差:

    Θf(q,m)Θf(k,m)=Θ(q)Θ(k),\Theta_f(q,m)-\Theta_f(k,m)=\Theta(q)-\Theta(k),

4. 角度的等差结构

  • 若位置递增的角度增量为常数 $\theta$,则

    φ(m)=mθ.\varphi(m)=m\theta.
  • 因此得到复数形式的旋转位置编码

    f(q,m)=q,eimθ,f(k,n)=k,einθ.f(q,m)=q,e^{im\theta},\qquad f(k,n)=k,e^{in\theta}.

5. 转为 2D 旋转矩阵形式

  • 对二维向量 $(q_0,q_1)$,旋转 $m\theta$ 等价于

    f(q,m)=(cos(mθ)sin(mθ) sin(mθ)cos(mθ))(q0 q1).f(q,m)= \begin{pmatrix} \cos(m\theta) & -\sin(m\theta)\ \sin(m\theta) & \cos(m\theta) \end{pmatrix} \begin{pmatrix} q_0\ q_1 \end{pmatrix}.

6. 注意力分数依赖相对位置

  • 将 $d$ 维向量分成 $d/2$ 个二维子空间,每个子空间使用不同频率 $\theta_i$,则

    (Qmrot)Knrot=Re![i=0d/21q[2i:2i+1],k[2i:2i+1],ei(mn)θi](Q_m^{\text{rot}})^\top K_n^{\text{rot}} = \operatorname{Re}!\left[ \sum_{i=0}^{d/2-1} q_{[2i:2i+1]}, k_{[2i:2i+1]}^*, e^{i(m-n)\theta_i} \right]
  • 结果仅依赖位置差 $(m-n)$,实现相对位置编码并具备良好外推性

7. 直观理解

  • 将每个 token 的某个维度对映成二维子向量

  • 每个位置对该子向量施加固定角度增量

  • 注意力内积的有效位置信息来自旋转差,即 $(m-n)$

  • 高频维度捕获局部依赖;低频维度捕获长程依赖

RoPE+YaRN

  • 原始 RoPE 的问题

    • 原始 RoPE(LLama 等模型默认使用)的设计存在上下文长度限制

    • 模型训练时的最大上下文(比如 LLama 2 是 4096)是 RoPE 频率参数的 “设计上限”,如果直接把推理上下文扩展到 8192/16384 等更长的长度,会出现两个核心问题:

      • 频率压缩过度:直接缩放 RoPE 频率会导致低频维度(对应长距离依赖)的旋转信息丢失,模型无法有效捕捉长文本的语义关联

      • 上下文混淆:超长序列中,不同位置的 RoPE 旋转角度变得过于相似,模型无法区分位置,出现 “记混前文” 的现象

    • 简单来说,原始 RoPE 硬扩上下文,会导致长文本理解能力大幅下降

  • YaRN(Yet another RoPE extension method)的核心是分维度混合插值 + 外推的频率缩放策略,而非对所有维度用同一缩放系数,核心解决了 “长上下文扩展时频率缩放的维度不均衡问题”

  • RoPE 的 head_dim 是按频率高低分维度的:

    • 前半部分维度(高频):对应短距离依赖(比如词内、相邻词的关联),对缩放更敏感,适合插值(Interpolation)(压缩频率,适配更长序列)

    • 后半部分维度(低频):对应长距离依赖(比如段落间、上下文的关联),对缩放不敏感,适合外推(Extrapolation)(不压缩频率,保留长距离旋转信息)

  • YaRN 就是让不同维度的 RoPE 频率,按 “高频插值、低频外推” 的规则平滑混合,既适配长上下文,又不丢失短 / 长距离的位置信息

Last updated

Was this helpful?