注意力机制本身没有任何语序信息,如果在输入时不人为加入位置信息,Attention 机制在处理序列时是置换不变的。这意味着,你把输入序列的词序任意打乱,模型计算出来的注意力权重和输出的向量结果完全是一模一样的。

位置编码就是为了把顺序信息注入进去

外推能力(Extrapolation Capability) 是指模型在处理比训练时更长的序列时,依然能够保持性能稳定、不崩溃且能正确理解位置关系的能力。

相对位置信息语言理解靠的是相对关系,不是绝对位置。“猫追狗"和"狗追猫”,每个词的绝对位置变了,但真正决定语义的是词与词之间的相对顺序关系。模型需要知道"追"和"猫"相邻,而不是"追"在第2位。更具体地说,注意力机制计算的是 Q·K 的相似度。 如果位置编码能让 qi⋅kjq_i \cdot k_jqikj 的结果包含 (i−j)(i-j)(ij) 的信息,那模型在做注意力的时候就自动感知到了"这两个 token 距离多远",这对语言建模非常有价值。所以"能捕捉相对位置"是一个质量指标。

在 Transformer 中,行(Row)代表不同的 Token,而列(Column)代表向量的维度。
假设输入句子是 "I love AI",包含 3 个 Token,模型的 dmodel=512d_{model} = 512dmodel=512
整个输入矩阵的形状是 [3, 512],它的物理结构如下:

Dim 0 (i=0, sin) Dim 1 (i=0, cos) Dim 2 (i=1, sin) Dim 511 (i=255, cos)
Token 0 (I, pos=0) PE(0,0) PE(0,1) PE(0,2) PE(0,511)
Token 1 (love, pos=1) PE(1,0) PE(1,1) PE(1,2) PE(1,511)
Token 2 (AI, pos=2) PE(2,0) PE(2,1) PE(2,2) PE(2,511)

1. 动机(Why) 前一个方案有什么问题,这个编码是为了解决什么而提出的。这是最重要的,导师追问几乎都从这里开始。
2. 原理(How) 核心公式或操作是什么,作用在哪里(Embedding层、Q/K、注意力矩阵……)。
3. 关键性质(What)

  • 有没有外推性
  • 是否需要训练
  • 能不能捕捉相对位置信息
    4. 代表性应用(Where) 哪些知名模型用了它,这让抽象的东西有了落脚点。
    5. 局限性(What’s wrong) 它自己又有什么问题,引出下一个方案。这条线串起来就是整个位置编码的发展脉络。

总结版

方案 作用位置 需要训练 外推性 相对位置能力 代表模型
绝对位置编码
正弦编码



Sinusoidal PE
Embedding 层 无参数 较差 间接(MkM_kMk 性质) Transformer, DETR
Learned PE



可学习绝对编码
Embedding 层 需要训练 间接(数据驱动) BERT, GPT-2, ViT
相对位置编码
Shaw RPE



最早相对编码
Q/K 点积 + V 聚合 需要训练 有限(±k\pm k±k 截断) 直接(硬截断) Music Transformer
T5 Bias



对数桶划分
注意力分数矩阵 需要训练 较强但受限 直接(对数桶) T5, mT5, FLAN-T5
ALiBi



线性距离惩罚
注意力分数矩阵 无参数 极强 直接(线性惩罚) BLOOM, MPT
旋转位置编码(RoPE 家族)
RoPE



旋转位置编码
Q/K(变换后) 无参数 直接外推差 直接(点积绑定) LLaMA, Qwen, DeepSeek
Linear Scaling



线性内插
位置索引 mmm 推荐微调 扩展后可用 继承 RoPE Code LLaMA
NTK-aware



不均匀频率缩放
旋转基数 base 无需微调 扩展后可用 继承 RoPE 多种开源模型
YaRN



分段 + 温度修正
θi\theta_iθi 分段 + 注意力缩放 少量微调 目前最强 继承 RoPE Mistral 长上下文版
XPos



指数衰减因子
Q/K(变换后) 无参数 训练时内置 直接(旋转 + 衰减) 未广泛应用

1. 绝对位置编码(Absolute Position Encoding)

将每个位置映射为一个固定的向量,直接加到词嵌入(Word Embedding)上。

正弦余弦位置编码(Sinusoidal Position Encoding)

动机

transformer里使用纯attention,但是attention只有语义信息没有语序信息,具有置换不变性,于是引入正弦余弦位置编码

原理

利用不同频率的正弦和余弦函数组合生成固定编码。
PE(pos,2i)=sin⁡(pos100002idmodel)PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{\frac{2i}{d_{model}}}}\right)PE(pos,2i)=sin(10000dmodel2ipos)

PE(pos,2i+1)=cos⁡(pos100002idmodel)PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d_{model}}}}\right)PE(pos,2i+1)=cos(10000dmodel2ipos)

  • pospospos:表示 Token 在当前句子中的绝对位置索引(如第 0 个词、第 1 个词……)。
  • dmodeld_{model}dmodel:表示词向量的总维度(Embedding Dimension)。
  • iii:表示词向量维度的序号索引,定位同一个 Token 向量内部的第几个特征通道,取值范围是 [0,dmodel2−1][0, \frac{d_{model}}{2} - 1][0,2dmodel1]
  • 2i2i2i2i+12i+12i+1:表示在 dmodeld_{model}dmodel 维度的向量中,偶数维使用正弦(sin⁡\sinsin)函数计算,奇数维使用余弦(cos⁡\coscos)函数计算。
公式理解

y=Asin⁡(ωx+ϕ)y = A\sin(\omega x + \phi)y=Asin(ωx+ϕ)
PE=sin⁡(1100002idmodel⋅pos)PE = \sin\left( \mathbf{\frac{1}{10000^{\frac{2i}{d_{model}}}}} \cdot \mathbf{pos} \right)PE=sin(10000dmodel2i1pos)
T=2πωT = \frac{2\pi}{\omega}T=ω2π
Ti=2π⋅100002idmodelT_i = 2\pi \cdot 10000^{\frac{2i}{d_{model}}}Ti=2π10000dmodel2i

随位置变化

iii 固定时,位置 pospospos 当变化将影响 PEPEPE 的值,例如,如果我们固定一个维度 i=0i=0i=0i=1i=1i=1 ,那么正弦和余弦函数将随着位置 呈现出周期性变化。这意味着模型能够区分输入序列中token的不同位置。

随维度变化

固定位置 pospospos ,随着维度 iii 的增加,正弦和余弦函数的频率会降低周期会变长
因此,较低维度具有短的周期,即在较小的位置范围内完成一个周期,也就是变化迅速,对小的位移敏感,也就是即使是相邻位置,位置编码的差异也会很大,这有助于模型识别相邻位置间的细微差异
相反,较高维度具有较长的周期,在较大的位置范围内才完成一个周期。变化缓慢,对小的位移不敏感,这能帮助模型感知全局位置关系,捕获长距离依赖。
这种多尺度的编码使得Transformer模型能够同时捕捉全局和局部的位置信息。

作用位置

位置编码作用在 Embedding 层之后

具体操作是:将计算得到的 PEPEPE 矩阵与词嵌入矩阵(Token Embedding)直接进行 按元素相加(Element-wise Addition)
Input=Embedding(X)+PE\text{Input} = \text{Embedding}(X) + PEInput=Embedding(X)+PE
随后,这个融合了位置信息的向量被送入后续的 WQ,WK,WVW_Q, W_K, W_VWQ,WK,WV 映射矩阵中。位置信息在进入 Self-Attention 计算之前,就已经融入到了 Q,K,VQ, K, VQ,K,V 当中。

关键性质

外推性

理论上,由于三角函数是连续函数,任意输入一个超长文本的 pospospos(如 pos=2000pos=2000pos=2000),公式都能直接计算出对应的编码,不需要截断。所以具有一定的外推性。
但是,由于模型在训练时有最大长度限制(假设为 512),模型从未见过 pos>512pos > 512pos>512 的编码。模型无法理解这些新编码的绝对位置,导致位置感知失灵。并且,在高维通道时(iii 很大),周期很大,频率很低,当pospospos的值变得很大时,相邻两个很远的位置,计算出来的结果差距也会很小。模型无法分辨它们的先后顺序。所以,外推性较差。

训练

不需要。 它是静态的、基于数学公式直接生成的,没有可训练的参数,零参数量。

相对位置信息

能,这是该公式的核心数学表象。 根据三角函数的两角和公式,对于距离为 kkk 的两个位置 pospospospos+kpos+kpos+k,存在一个仅与 kkk 相关的线性变换矩阵 MkM_kMk,使得:PEpos+k=Mk⋅PEposPE_{pos+k} = M_k \cdot PE_{pos}PEpos+k=MkPEpos这意味着,当模型在计算 QQQKKK 的点积(注意力权重)时,能够通过线性组合感知到两个 Token 之间的相对距离 kkk,而不仅仅是各自的绝对位置。

代表性应用

  • **Vanilla Transformer (Attention Is All You Need)
  • Detr (Detection Transformer)

局限性

  1. 绝对与相对位置的耦合性差:虽然数学上证明了存在相对位置的线性变换,但在实际通过 WQ,WKW_Q, W_KWQ,WK 矩阵做非线性映射并相乘后,绝对位置和相对位置的交叉项会变得极其混乱,模型难以高效利用相对位置。
  2. 外推性差:如前文所述,面对超长文本时,静态的绝对位置编码会让模型对未见过的 pospospos 产生认知混乱。
  3. 相加破坏语义:直接与词向量相加,虽然高维空间足够稀疏,但依然属于强行干预嵌入空间,模型需要学习如何从混合向量中分解出语义信息,和位置信息。

可学习绝对位置编码(Learned Absolute Position Encoding)

动机

正弦编码是人工设计的,背后隐含了一个假设——用三角函数的频率组合来表示位置是最优的。但这个假设未必成立,不同任务、不同数据分布下,最优的位置表示可能是不同的。
既然如此,为什么不让模型自己去学位置应该长什么样?
把每个位置的编码当成普通的 Embedding 参数,随模型一起训练,让数据来决定什么样的位置表示对当前任务最有用。
本质上是一种从"人工设计"到"数据驱动"的思路转变。

原理

将位置视为离散的标签,为其初始化一个可训练的 Embedding 矩阵,并与词向量直接相加(Additive Fusion)。 具体而言,假设词向量的维度为 256,输入的 token 序列长度为 512,则可以随机初始化一个位置编码矩阵 E∈R512×256\mathbf{E} \in \mathbb{R}^{512 \times 256}ER512×256,其第 kkk 行向量 ek∈R256\mathbf{e}_k \in \mathbb{R}^{256}ekR256 表示第 kkk 个位置对应的位置编码。在模型的训练过程中,该矩阵会逐步更新以学习到最优的位置编码矩阵 E^\widehat{\mathbf{E}}E 。在推理阶段,最终训练得到的 E^\widehat{\mathbf{E}}E 被用于为每个位置提供对应的位置编码进行使用。

作用位置

与正弦余弦绝对位置编码相同,作用在输入层(Embedding层)。一旦与词向量相加后,位置信息将随着网络层数的加深,隐式地流向后续的 Query (QQQ)、Key (KKK)、Value (VVV) 以及注意力矩阵的计算中。

关键性质

外推性

完全没有,如果在训练时最大长度设为 MMM,模型根本无法处理长度为 M+1M+1M+1 的推理序列,因为第 M+1M+1M+1 行的位置向量在训练阶段未被初始化和训练。

训练

需要训练

相对位置信息

能,但效果较弱且依赖数据驱动 ,当模型在大量文本上进行训练时,特定距离的词(例如“因为”和“所以”)经常以固定的间隔出现。由于反向传播的梯度更新,位置编码矩阵中相邻行(如第 kkk 行和第 k+1k+1k+1 行)的向量会产生某种统计相关性。模型通过数据驱动的方式,迫使绝对位置编码内部建立起了某种关于相对距离的几何结构
但是,learned PE无法处理未见过的相对距离,如果在训练时模型看到的最大序列长度是 512,它就完全无法理解长度为 513 的两个 Token 之间的相对关系。没有显式的平移不变性:在语言中,“主谓宾”结构出现在句首(位置 1、2、3)和句尾(位置 100、101、102),其相对距离都是 1。但在 Learned PE 中,位置 1 和 2 的差值向量 e2−e1\mathbf{e}_2 - \mathbf{e}_1e2e1,与位置 102 和 101 的差值向量 e102−e101\mathbf{e}_{102} - \mathbf{e}_{101}e102e101 是完全独立的。模型必须分别在句首和句尾都看够足够的数据,才能分别学会这两组相对关系,无法自动泛化。

代表性应用

  • BERT(掩码语言模型经典之作)
  • GPT-2 / GPT-3(大语言模型基座)
  • ViT (Vision Transformer)(图像领域将 Patch 视为序列,广泛采用可学习的一维/二维绝对位置编码)

局限性

  • 硬性阻断了长文本外推(Length Extrapolation): 无法直接推断超过训练长度的文本
  • 数据稀疏性问题: 文本末尾的高位索引位置(如接近最大长度 MMM 的位置)在训练时见到的样本较少,导致这些位置的编码参数训练不充分。
  • 缺乏空间平移不变性(Translation Invariance): “第 1 个词与第 3 个词”的相对关系,和“第 11 个词与第 13 个词”的相对关系,在可学习编码中是相互独立的

2. 相对位置编码(Relative Position Encoding)

一个Token的语义信息更取决于它与其他Token的相对距离(如“前一个”、“后两个”),而不是它在句子中的绝对坐标(如“第5个Token”)。

Shaw 相对位置编码(Shaw RPE)

动机

绝对位置编码的两种编码都是把位置信息加在 Embedding 上,然后指望模型通过 WQW_QWQ ​、WKW_KWK的变换间接学会利用相对位置。但这个过程太间接了,绝对位置和语义信息的交叉项让模型很难干净地提取"两个 token 距离多远"。
既然注意力机制关心的是 token 之间的关系,为什么不直接把相对距离注入到注意力分数的计算里?
Shaw RPE 的思路就是:不动 Embedding,直接在 QQQKKK的点积计算中加入相对位置的偏置项,让注意力分数显式感知到 iiijjj 之间的距离 (i−j)(i-j)(ij)

原理

Shaw RPE 将相对位置信息作为可学习的偏置项,分别注入到注意力权重的计算值向量(Value)的加权求和中。
注意力机制在计算 Token iiijjj 的关系时,只关心它们之间的相对距离(j−ij-iji),且对超出一定范围(±k\pm k±k)的远距离位置进行“截断”合并。

在模型刚建立、还没开始训练时,程序会在内存中开辟一块空间,里面填满随机数。即位置编码的参数矩阵 wKw^KwK,然后再将 wijKw_{ij}^KwijK 通过公式计算索引,到参数矩阵 wkw^kwk 对应位置取值赋值给 wijKw_{ij}^KwijK ,逐渐训练,优化参数矩阵wKw^KwK

公式

假设输入序列长度为 nnn,最大感知相对距离截断为 kkk
对于任意两个位置 iiijjj,其相对距离映射到可学习的嵌入向量:

wijK=wclip(j−i,k)K,wijV=wclip(j−i,k)Vw_{ij}^K = w_{\text{clip}(j-i, k)}^K, \quad w_{ij}^V = w_{\text{clip}(j-i, k)}^VwijK=wclip(ji,k)K,wijV=wclip(ji,k)V

clip(x,k)=max⁡(−k,min⁡(k,x))\text{clip}(x, k) = \max(-k, \min(k, x))clip(x,k)=max(k,min(k,x))
其中k的值是一个个试出来的,哪个效果好就用哪个。

计算步骤
1.计算相对距离 xxx

x=j−ix = j - ix=ji

  • j>ij > ij>i,说明 jjjiii 的右侧,相对距离为正。
  • j<ij < ij<i,说明 jjjiii 的左侧,相对距离为负。
2.边界截断:clip(x,k)\text{clip}(x, k)clip(x,k)

使用 clip\text{clip}clip 函数将相对距离 xxx 限制在 [−k,k][-k, k][k,k] 范围内:
clip(x,k)=max⁡(−k,min⁡(k,x))\text{clip}(x, k) = \max(-k, \min(k, x))clip(x,k)=max(k,min(k,x))

  • 未超限:若 −k≤x≤k-k \le x \le kkxk,则输出原值 xxx
  • 向右超限:若 x>kx > kx>k,则强行截断为 kkk
  • 向左超限:若 x<−kx < -kx<k,则强行截断为 −k-kk
3.查表获取向量:widxKw_{\text{idx}}^KwidxKwidxVw_{\text{idx}}^VwidxV

将截断后得到的索引(记为 idx\text{idx}idx)映射到可学习的参数矩阵 wKw^KwKwVw^VwV 中:
wijK=widxK,wijV=widxVw_{ij}^K = w_{\text{idx}}^K, \quad w_{ij}^V = w_{\text{idx}}^VwijK=widxK,wijV=widxV
最终得到的 wijKw_{ij}^KwijKwijVw_{ij}^VwijV 是具体的偏置向量,直接参与注意力分数(Attention Score)以及上下文向量(Context Vector)的加权计算(例如在 Transformer 的相对位置注意力变体中)。

例如:

  • 场景:计算位置 i=2i=2i=2 对位置 j=3j=3j=3 的相对位置权重。
  • 计算
    1. 相对距离:x=j−i=3−2=1x = j - i = 3 - 2 = 1x=ji=32=1
    2. 边界截断:clip(1,2)=max⁡(−2,min⁡(2,1))=1\text{clip}(1, 2) = \max(-2, \min(2, 1)) = 1clip(1,2)=max(2,min(2,1))=1
  • 结果w2,3K=w1Kw_{2,3}^K = w_1^Kw2,3K=w1K(直接取索引为 1 的向量)。
作用位置
  • 注意力矩阵(Q/K 交互)
    修改原始的注意力得分计算公式,加入相对位置表征 wijKw_{ij}^KwijKeij=xiWQ(xjWK+wijK)Tdke_{ij} = \frac{x_i W^Q (x_j W^K + w_{ij}^K)^T}{\sqrt{d_k}}eij=dk xiWQ(xjWK+wijK)T最终得分 eij=qikjTdk⏟原始注意力得分(纯语义)+qi(wijK)Tdk⏟相对位置修正项\text{最终得分 } e_{ij} = \underbrace{\frac{q_i k_j^T}{\sqrt{d_k}}}_{\text{\textbf{原始注意力得分(纯语义)}}} + \underbrace{\frac{q_i (w_{ij}^K)^T}{\sqrt{d_k}}}_{\text{\textbf{相对位置修正项}}}最终得分 eij=原始注意力得分(纯语义) dk qikjT+相对位置修正项 dk qi(wijK)T
  • 上下文向量聚合(Value 聚合)
    在对 VVV 进行加权求和时,加入相对位置表征 wijVw_{ij}^VwijVzi=∑j=1nαij(xjWV+wijV)z_i = \sum_{j=1}^n \alpha_{ij} (x_j W^V + w_{ij}^V)zi=j=1nαij(xjWV+wijV)αij\alpha_{ij}αij(即注意力权重)是通过对前面算出的原始注意力得分 eije_{ij}eij 进行 Softmax 归一化 计算出来的。
    zi=∑j=1nαijvj⏟第一项:内容信息聚合+∑j=1nαijwijV⏟第二项:相对位置偏置聚合z_i = \underbrace{\sum_{j=1}^n \alpha_{ij} v_j}_{\text{\textbf{第一项:内容信息聚合}}} + \underbrace{\sum_{j=1}^n \alpha_{ij} w_{ij}^V}_{\text{\textbf{第二项:相对位置偏置聚合}}}zi=第一项:内容信息聚合 j=1nαijvj+第二项:相对位置偏置聚合 j=1nαijwijV

性质

外推性

具备有限的外推性只能保证不报错,但是没能力推理。由于设置了最大截断距离 kkk,当推理长度超过训练长度时,超出 kkk 的距离一律被视为 ±k\pm k±k。模型不会因为未见过的超大绝对位置下标而崩溃,但它无法分辨超出 kkk 之后的更远距离。
假设 k=8k=8k=8,推理序列长度为 100。对于当前位置的词,距离它 8 个单位远的词,对应的位置偏置是 w8Vw_8^Vw8V。距离它 50 个单位远、甚至 90 个单位远的词,对应的位置偏置全都是 w8Vw_8^Vw8V

训练

需要训练,相对位置嵌入矩阵 wKw^KwKwVw^VwV 属于模型的参数,随网络一起训练更新。

相对位置信息

能,且是较为直接的方式获取相对位置信息。通过 j−ij-iji 的索引方式,直接将相对距离转化为特征向量参与矩阵运算。

代表性应用

Shaw RPE 本身的直接应用不多,它更多是作为相对位置编码的奠基工作存在。Shaw RPE 提出了"把相对位置注入注意力计算"这个范式,直接启发了后续的 T5 Relative Bias、Transformer-XL 等工作。第一个把相对位置编码从 Embedding 层迁移到注意力层的方案

局限性

1. 截断假设过于粗糙
Shaw RPE 设定一个最大相对距离 kkk,超出范围的所有位置共享同一个编码。这意味着距离 k+1k+1k+1 和距离 k+100k+100k+100 被视为完全一样,对长距离依赖的建模非常粗糙。

2. 引入了额外的可训练参数,且缺乏外推性
相对位置的编码向量是可学习的,训练时只见过[−k,k] 范围内的相对距离,超出这个范围就没有对应参数,外推能力依然有限。

T5 位置编码(T5 Relative Bias)

动机

Shaw RPE 的截断太粗糙——距离 k+1k+1k+1 和距离 k+100k+100k+100 被一视同仁,这不符合语言的实际规律。
语言中位置关系的重要性是不均匀的:

  • 近距离:相邻词之间的关系极其重要,"猫追狗"和"狗追猫"差一个位置语义就完全不同,需要精细区分。
  • 远距离:距离很远的两个词,差5个位置和差50个位置对注意力的影响差别不大,粗粒度就够了。
    既然近处需要精细、远处可以粗糙,为什么不用非线性的方式来分配"分辨率"?
    T5 的回答是:用对数刻度做桶划分——近距离每个位置一个桶,远距离多个位置共享一个桶。这样用有限的桶数就能覆盖很大的距离范围,同时把"分辨率"集中在真正需要的地方。

原理

直接在自注意力得分矩阵(Attention Matrix)上,给每个位置对 (i,j)(i,j)(i,j) 加上一个“标量(Scalar)”偏置

公式

假设输入序列中 Query 的位置是 iii,Key 的位置是 jjj,其相对距离为 r=i−jr = i - jr=ij
T5 修改后的注意力得分计算公式为:
Attention Score(i,j)=qikjTdk+bbucket(i−j)\text{Attention Score}(i, j) = \frac{q_i k_j^T}{\sqrt{d_k}} + b_{\text{bucket}(i-j)}Attention Score(i,j)=dk qikjT+bbucket(ij)
T5 没有为每个动态距离都分配一个独立偏置,而是将相对距离映射到有限数量的“桶”bucket 函数就是通过对数压缩(Log-scale),将无限或超长的相对距离 (i−j)(i-j)(ij),映射到固定数量的有限“桶”中。

  • 近距离精细,远距离模糊:在较小的距离内(如 0 到 7),每个距离拥有一个独立的桶(精细感知);随着距离变远,多个距离共享同一个桶(粗粒度感知),分桶间隔按对数规律(Logarithmic Scale)指数级递增。
分桶的核心数学逻辑

假设我们总共设置了 MMM 个桶(比如 M=32M=32M=32),最大精细划分距离为 KKK(比如 K=8K=8K=8)。对于任意计算出来的相对距离 x=i−jx = i - jx=ij,分桶函数的划分逻辑如下:

第一步:正负分流

相对位置是有方向的。

  • 如果 x>0x > 0x>0,说明是正向距离(比如当前词看左边的词),分到前一半的桶(0∼M2−10 \sim \frac{M}{2}-102M1)。
  • 如果 x<0x < 0x<0,说明是负向距离(比如当前词看右边的词),分到后一半的桶(M2∼M−1\frac{M}{2} \sim M-12MM1)。

以下以正向距离 x>0x > 0x>0 为例进行说明(绝对值 ∣x∣|x|x 的处理完全一致)。

第二步:近处线性划分

若相对距离 ∣x∣<K|x| < Kx<K(在设定的近处范围内):

  • 直接给它分配独立的桶,即 bucket_idx=∣x∣\text{bucket\_idx} = |x|bucket_idx=x
  • 例子:距离为 1 就是 1 号桶,距离为 2 就是 2 号桶。这样能保证模型对邻近词的绝对位置关系敏感。
第三步:远处对数压缩(区间模糊)

若相对距离 ∣x∣≥K|x| \ge KxK(超出了精细范围):

  • 采用对数函数(log⁡\loglog)对距离进行压缩,让距离越远的空间,划分的格子(桶)越宽。其核心计算公式的数学原型为:bucket_idx=K+int(log⁡(∣x∣/K)log⁡(Max_Distance/K)×(剩余桶数))\text{bucket\_idx} = K + \text{int}\left( \frac{\log(|x| / K)}{\log(\text{Max\_Distance} / K)} \times (\text{剩余桶数}) \right)bucket_idx=K+int(log(Max_Distance/K)log(x∣/K)×(剩余桶数))
    分了桶之后,每个位置对 (i,j)(i, j)(i,j) 最终会得到一个具体的、通过训练优化好的实数(标量偏置 bbb。这个数字会被直接加到原始的注意力得分上,用来放大或缩小当前位置 iii 对目标位置 jjj 的关注度。

性质

外推性

具备较强的外推性,但依然受限。T5 的对数桶设计,使得随着距离的成倍拉长,它依然能分出“很远”和“超级远”。例如:在 K=8,M=32K=8, M=32K=8,M=32 且推理长度很大时,距离 16 和距离 64 属于不同的桶,它们拥有不同的标量偏置。模型能够模糊感知到超长文本中远端实体的“相对远近关系”。
但是,在 T5 的分桶算法中,设置了一个最大硬边界(源码中对应的超参数通常是 max_distance = 128256)。一旦文本长度特别长,超过了这个硬边界,所有更远的位置都会被强行塞进全表最后一个桶(即第 M−1M-1M1 号桶)中。模型就会丧失远距离的分辨力。

训练

需要训练。每个桶对应一个可学习的标量 bbb

相对位置信息

能捕获相对位置信息,完全基于 i−ji-jij 的相对差值进行查表寻桶。

代表性应用

  • T5 (Text-to-Text Transfer Transformer):该编码方案的诞生地与核心支柱。
    更多是作为从硬截断到软截断的过渡方案,证明了对数刻度桶划分的合理性,为后续 ALiBi 的线性惩罚思路提供了铺垫。

局限性

  • 远距离分辨率丢失:对数桶的设计假设了“远处的词不重要”,但这在需要进行精确长文本检索(如 NIAH 大海捞针测试、长代码解析)的场景下是一个致命缺陷,因为模型无法分辨第 1000 个 Token 和第 2000 个 Token 的精确相对距离。
  • 桶的划分是人工设计的超参数: 桶的数量、边界怎么划分,都是手动设定的,不同任务下最优的划分方式可能不同,缺乏自适应性。

ALiBi(Attention with Linear Biases)

动机

现有的相对位置编码(Shaw、T5)都还有可学习参数,这带来两个问题:

  1. 外推性依然受限——训练时没见过的距离,对应的参数是未优化的,效果会退化
  2. 引入了额外的参数量和训练复杂度——桶、嵌入向量、标量偏置,这些都需要训练
    ALiBi 的出发点是:位置惩罚根本不需要学习。

直觉非常简单——距离越远的 token,对当前 token 的注意力就应该越小。这个规律是普遍成立的,不需要靠数据来学,直接用一个固定的线性惩罚项写死就行:距离每增加 1,注意力分数就减去一个固定的常数 mmm

所以 ALiBi 完全抛弃了可学习的位置参数,改用一个无参数的固定惩罚,推理时不管序列多长,公式都能直接算,外推性因此大幅提升。

原理

在计算 Self-Attention 矩阵时,不改变 QQQKKK 的内容,而是直接在计算出的点积矩阵上,减去一个正比于 Key 和 Query 相对距离的线性偏置(Bias)

公式

Attention(Q,K)=softmax(QKTd−m⋅A)\text{Attention}(Q, K) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}} - m \cdot \mathbf{A}\right)Attention(Q,K)=softmax(d QKTmA)
其中,矩阵 A\mathbf{A}A 的元素 Ai,j=∣i−j∣A_{i,j} = |i - j|Ai,j=ijAij\mathbf{A}_{ij}Aij(也就是矩阵 A\mathbf{A}A 中第 iii 行、第 jjj 列的那个元素)代表的是位置 iii 和位置 jjj 之间的“绝对相对距离”。代表 Query iii 和 Key jjj 之间的绝对相对距离

mmm 是一个与注意力头的数量相关静态缩放因子(斜率)mmm 是一个固定的,不需要学习的惩罚斜率标量。
对于一个拥有 HHH 个注意力头的多头注意力机制,第 hhh 个头的斜率 mhm_hmh 计算公式为:
mh=128hHm_h = \frac{1}{2^{\frac{8h}{H}}}mh=2H8h1
假设模型有 8 个注意力头(H=8H=8H=8:代入公式后,这 8 个头分到的固定斜率 mmm 分别是:
[121,122,123,124,125,126,127,128]=[0.5,  0.25,  0.125,  0.0625,  …,  0.0039]\left[ \frac{1}{2^1}, \frac{1}{2^2}, \frac{1}{2^3}, \frac{1}{2^4}, \frac{1}{2^5}, \frac{1}{2^6}, \frac{1}{2^7}, \frac{1}{2^8} \right] = \left[ 0.5, \; 0.25, \; 0.125, \; 0.0625, \; \dots, \; 0.0039 \right][211,221,231,241,251,261,271,281]=[0.5,0.25,0.125,0.0625,,0.0039]

为什么不同的注意力头需要不同的mmm

通过让不同的注意力头分配到大大小小不同的斜率,来强制让不同的头有不同的"视野范围"

  • mmm 大的头:惩罚力度强,衰减快,只关注近距离的 token,擅长捕捉局部依赖
  • mmm 小的头:惩罚力度弱,衰减慢,能关注到远距离的 token,擅长捕捉长距离依赖
    这样多个头组合起来,模型同时具备了局部和全局的位置感知能力
作用位置

作用于 Softmax 之前的注意力得分矩阵

性质

外推性

极强。模型在短文本(如 2k)上训练后,无需任何微调,可以直接在外推到长文本(如 8k 甚至更长)上流畅推理。

  • 抛弃了需要训练的位置参数表,面对超长文本时,没有参数表的大小限制,绝对不会发生越界报错,也不会把长距离一刀切。
  • 它将“距离越远、关联度越低”的人类语言规律直接写成了硬性数学定理。随着距离 ∣i−j∣|i - j|ij 无限增大,远端的无关噪声会被负向惩罚彻底压死,强行保证了模型在长文本下的注意力聚焦。 但这意味着模型实际上看不到很远的 token,对需要精确长距离检索的任务(如大海捞针测试)依然有局限。
  • mmm 的头对距离不敏感
训练

不需要。斜率 mmm 和距离矩阵 A\mathbf{A}A 都是根据网络结构预先固定计算好的,不包含任何可训练参数。

相对位置信息

能力很强,由于引入了 −m∣i−j∣-m|i-j|mij,距离越远的 Token,其注意力得分被扣减得越多。这为模型建立了一种强烈的局部性偏好(Locality Bias),非常符合语言学中“越靠近的词关系越紧密”的规律。

代表性应用

  • BLOOM(BigScience,2022)——最知名的应用,176B 参数的开源多语言大模型
  • MPT(MosaicML,2023)——专门为长上下文优化的模型,MPT-7B 和 MPT-30B 都用了 ALiBi
    ALiBi 的流行窗口期其实很短。2023 年 LLaMA 出来之后,RoPE 凭借更好的长文本理解能力迅速成为主流,ALiBi 基本就淡出了新模型的选择范围。
    所以 ALiBi 的历史定位是:在 RoPE 统治之前,外推性最强的方案,证明了"无参数固定惩罚"这条路的可行性,但最终还是被 RoPE 取代了。

局限性

1. 线性惩罚假设过于强硬
ALiBi 强制规定"距离越远注意力越小",但这个假设并不总是成立。比如长文本、长代码,远距离的 token 可能非常重要,线性惩罚会把它们的注意力权重压得很低,模型很难关注到。

2. 超长序列下远距离信息实际上被屏蔽
线性惩罚随距离线性增长,经过 Softmax 后远距离 token 的权重趋近于零。外推时不崩溃,但实际上模型根本没有在看远处的内容,这是一种"假外推"。

3. 没有语义和位置的交互
ALiBi 的惩罚项是纯粹基于距离的标量,和 Q、K 的语义内容完全无关。两个 token 无论语义上多么相关,只要距离远就会被惩罚,缺乏灵活性。

4. 不适合视觉等二维任务
ALiBi 的线性惩罚是为一维序列设计的,扩展到二维空间(如图像 patch)时没有自然的推广方式,而 RoPE 可以比较自然地扩展到 2D。

3. 旋转位置编码(Rotary Position Embedding, RoPE)

大模型时代的最主流最核心的位置,属于相对位置编码的变体。

RoPE(旋转位置编码)

动机

回顾已有方案的根本矛盾:
绝对位置编码(正弦、Learned PE):形式简单,但位置信息注入在 Embedding 层,经过 WQW_QWQ, WKW_KWK 变换后绝对和相对信息混在一起,模型难以干净利用相对位置
相对位置编码(Shaw、T5、ALiBi):直接在注意力层注入相对距离,但要么引入额外参数,要么用固定惩罚丢失了语义和位置的交互

RoPE 想同时解决这两个问题,提出了一个更本质的问题:
能不能找到一种对 qiq_iqi​ 和 kjk_jkj 的编码方式,使得它们的点积 qi⋅kjq_i \cdot k_jqikj的结果自然地、仅仅只与相对距离 (i−j)(i-j)(ij)有关,而与绝对位置无关?
这个目标比之前所有方案都更直接——不是"加偏置",不是"查表",而是从点积的数学结构出发,设计一种编码让相对位置信息天然涌现出来。

RoPE 的答案是:用旋转矩阵对 qqqkkk进行变换,利用旋转的几何性质,使得两个向量点积的结果恰好只依赖于它们位置的差值。

旋转矩阵

在二维笛卡尔坐标系中,将一个向量逆时针旋转 θ\thetaθ 角,其旋转矩阵 R2DR_{2D}R2D 为:

R2D=[cos⁡θ−sin⁡θsin⁡θcos⁡θ]R_{2D} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}R2D=[cosθsinθsinθcosθ]
若原向量为 v=[x,y]T\mathbf{v} = [x, y]^Tv=[x,y]T,旋转后的向量 v′=[x′,y′]T\mathbf{v}' = [x', y']^Tv=[x,y]T 可通过矩阵乘法得到:
v′=R2Dv\mathbf{v}' = R_{2D}\mathbf{v}v=R2Dv

旋转矩阵的转置是反方向的旋转

对于 2×22 \times 22×2 矩阵,主对角线上的元素(aaaddd)位置保持不变,而副对角线上的元素(bbbccc)互换位置。
所以:
R(θ)T=[cos⁡θ−sin⁡θsin⁡θcos⁡θ]T=[cos⁡θsin⁡θ−sin⁡θcos⁡θ]R(\theta)^T = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}^T = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}R(θ)T=[cosθsinθsinθcosθ]T=[cosθsinθsinθcosθ]

R(−θ)=[cos⁡(−θ)−sin⁡(−θ)sin⁡(−θ)cos⁡(−θ)]R(-\theta) = \begin{bmatrix} \cos(-\theta) & -\sin(-\theta) \\ \sin(-\theta) & \cos(-\theta) \end{bmatrix}R(θ)=[cos(θ)sin(θ)sin(θ)cos(θ)]
然后根据奇函数和偶函数的性质:cos⁡(−θ)=cos⁡θ\cos(-\theta) = \cos\thetacos(θ)=cosθsin⁡(−θ)=−sin⁡θ\sin(-\theta) = -\sin\thetasin(θ)=sinθ
R(−θ)=[cos⁡θsin⁡θ−sin⁡θcos⁡θ]R(-\theta) = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}R(θ)=[cosθsinθsinθcosθ]
所以:
R(θ)T=R(−θ)R(\theta)^T = R(-\theta)R(θ)T=R(θ)

旋转矩阵相乘,旋转角度直接相加

R(α)R(\alpha)R(α)R(β)R(\beta)R(β) 分别是旋转 α\alphaαβ\betaβ 角度的矩阵,它们相乘的结果为:
R(α)R(β)=[cos⁡α−sin⁡αsin⁡αcos⁡α][cos⁡β−sin⁡βsin⁡βcos⁡β]R(\alpha)R(\beta) = \begin{bmatrix} \cos\alpha & -\sin\alpha \\ \sin\alpha & \cos\alpha \end{bmatrix} \begin{bmatrix} \cos\beta & -\sin\beta \\ \sin\beta & \cos\beta \end{bmatrix}R(α)R(β)=[cosαsinαsinαcosα][cosβsinβsinβcosβ]=[cos⁡αcos⁡β−sin⁡αsin⁡β−(sin⁡αcos⁡β+cos⁡αsin⁡β)sin⁡αcos⁡β+cos⁡αsin⁡βcos⁡αcos⁡β−sin⁡αsin⁡β]= \begin{bmatrix} \cos\alpha\cos\beta - \sin\alpha\sin\beta & -(\sin\alpha\cos\beta + \cos\alpha\sin\beta) \\ \sin\alpha\cos\beta + \cos\alpha\sin\beta & \cos\alpha\cos\beta - \sin\alpha\sin\beta \end{bmatrix}=[cosαcosβsinαsinβsinαcosβ+cosαsinβ(sinαcosβ+cosαsinβ)cosαcosβsinαsinβ]
=[cos⁡(α+β)−sin⁡(α+β)sin⁡(α+β)cos⁡(α+β)]=R(α+β)= \begin{bmatrix} \cos(\alpha+\beta) & -\sin(\alpha+\beta) \\ \sin(\alpha+\beta) & \cos(\alpha+\beta) \end{bmatrix} = R(\alpha+\beta)=[cos(α+β)sin(α+β)sin(α+β)cos(α+β)]=R(α+β)

两个列向量的内积可以表示为一个向量的转置乘以另一个向量

假设有 a\mathbf{a}ab\mathbf{b}b 两个 ddd 维列向量:

a=[a1a2⋮ad],b=[b1b2⋮bd]\mathbf{a} = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_d \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_d \end{bmatrix}a= a1a2ad ,b= b1b2bd

它们的内积(点积)与矩阵乘法的转换关系如下:
⟨a,b⟩=a⋅b=aTb\langle \mathbf{a}, \mathbf{b} \rangle = \mathbf{a} \cdot \mathbf{b} = \mathbf{a}^T \mathbf{b}a,b=ab=aTb

原理

ddd 维向量切分为 d/2d/2d/2 个二维子空间,在 Q 和 K 经过线性变换后、计算点积之前,对每个二维子空间独立施加旋转矩阵,注入位置信息。

推导
目标

在 Attention 机制中,我们要计算第 mmm 个位置的 Query 向量 qm\mathbf{q}_mqm 和第 nnn 个位置的 Key 向量 kn\mathbf{k}_nkn 的内积。
我们希望找到一个位置编码函数 fff,将位置信息 mmmnnn 注入到向量中。注入后,我们要求它们的内积结果只能包含相对位置差 (n−m)(n - m)(nm),即:

⟨f(q,m),f(k,n)⟩=g(q,k,n−m)\langle f(\mathbf{q}, m), f(\mathbf{k}, n) \rangle = g(\mathbf{q}, \mathbf{k}, n - m)f(q,m),f(k,n)⟩=g(q,k,nm)

二维空间推导

首先假设词向量只有 2 维:q=[q0,q1]T\mathbf{q} = [q_0, q_1]^Tq=[q0,q1]Tk=[k0,k1]T\mathbf{k} = [k_0, k_1]^Tk=[k0,k1]T

注入位置信息

把第 mmm 个位置的向量旋转 mθm\thetamθ 角度,把第 nnn 个位置的向量旋转 nθn\thetanθ 角度:
f(q,m)=R(mθ)qf(\mathbf{q}, m) = R(m\theta)\mathbf{q}f(q,m)=R(mθ)q
f(k,n)=R(nθ)kf(\mathbf{k}, n) = R(n\theta)\mathbf{k}f(k,n)=R(nθ)k

计算编码后的内积

向量的内积在矩阵运算中可以写成转置相乘:⟨u,v⟩=uTv\langle \mathbf{u}, \mathbf{v} \rangle = \mathbf{u}^T \mathbf{v}u,v=uTv。我们把刚才注入位置后的向量带入:
⟨f(q,m),f(k,n)⟩=(R(mθ)q)T(R(nθ)k)\langle f(\mathbf{q}, m), f(\mathbf{k}, n) \rangle = (R(m\theta)\mathbf{q})^T (R(n\theta)\mathbf{k})f(q,m),f(k,n)⟩=(R(mθ)q)T(R(nθ)k)
利用矩阵转置的性质 (AB)T=BTAT(AB)^T = B^T A^T(AB)T=BTAT,展开左边:
=qTR(mθ)TR(nθ)k= \mathbf{q}^T R(m\theta)^T R(n\theta) \mathbf{k}=qTR(mθ)TR(nθ)k
因为:R(mθ)TR(nθ)=R(−mθ)R(nθ)=R((n−m)θ)R(m\theta)^T R(n\theta) = R(-m\theta)R(n\theta) = R((n - m)\theta)R(mθ)TR(nθ)=R(mθ)R(nθ)=R((nm)θ)综上:
⟨f(q,m),f(k,n)⟩=qTR((n−m)θ)k\langle f(\mathbf{q}, m), f(\mathbf{k}, n) \rangle = \mathbf{q}^T R((n - m)\theta) \mathbf{k}f(q,m),f(k,n)⟩=qTR((nm)θ)k
这样两个向量的内积结果只与相对位置有关。

高维空间扩展

真实的 Embedding 维度 ddd 通常是几百甚至上千。RoPE 的做法是ddd 维空间切分成 d/2d/2d/2 个独立的二维空间

对于一个 ddd 维的向量,每两个相邻的通道组成一个二维向量,每个二维空间分配一个不同的基准旋转步长 θi\theta_iθi(其中 θi=10000−2(i−1)/d\theta_i = 10000^{-2(i-1)/d}θi=100002(i1)/d): 不同的频率表示的范围不一样
q=[q0,q1⏟θ1,q2,q3⏟θ2,…,qd−2,qd−1⏟θd/2]T\mathbf{q} = [\underbrace{q_0, q_1}_{\theta_1}, \underbrace{q_2, q_3}_{\theta_2}, \dots, \underbrace{q_{d-2}, q_{d-1}}_{\theta_{d/2}}]^Tq=[θ1 q0,q1,θ2 q2,q3,,θd/2 qd2,qd1]T
那么,高维的旋转矩阵 RmdR^d_mRmd 就是一个由各个二维旋转矩阵组合起来的分块对角矩阵
Rmd=[R(mθ1)0…00R(mθ2)…0⋮⋮⋱⋮00…R(mθd/2)]R^d_m = \begin{bmatrix} R(m\theta_1) & 0 & \dots & 0 \\ 0 & R(m\theta_2) & \dots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \dots & R(m\theta_{d/2}) \end{bmatrix}Rmd= R(mθ1)000R(mθ2)000R(mθd/2)
对于高维向量,注入位置后的内积为:

⟨f(q,m),f(k,n)⟩=(Rmdq)T(Rndk)=qT(Rmd)TRndk\langle f(\mathbf{q}, m), f(\mathbf{k}, n) \rangle = (R^d_m \mathbf{q})^T (R^d_n \mathbf{k}) = \mathbf{q}^T (R^d_m)^T R^d_n \mathbf{k}f(q,m),f(k,n)⟩=(Rmdq)T(Rndk)=qT(Rmd)TRndk

由于 RmdR^d_mRmd 是分块对角矩阵,其转置也是分块对角矩阵,每个块独立转置:

(Rmd)T=[R(mθ1)T⋱R(mθd/2)T]=[R(−mθ1)⋱R(−mθd/2)](R^d_m)^T = \begin{bmatrix} R(m\theta_1)^T & & \\ & \ddots & \\ & & R(m\theta_{d/2})^T \end{bmatrix} = \begin{bmatrix} R(-m\theta_1) & & \\ & \ddots & \\ & & R(-m\theta_{d/2}) \end{bmatrix}(Rmd)T= R(mθ1)TR(mθd/2)T = R(mθ1)R(mθd/2)

两个分块对角矩阵相乘,对应块直接相乘:

(Rmd)TRnd=[R((n−m)θ1)⋱R((n−m)θd/2)]=Rn−md(R^d_m)^T R^d_n = \begin{bmatrix} R((n - m)\theta_1) & & \\ & \ddots & \\ & & R((n - m)\theta_{d/2}) \end{bmatrix} = R^d_{n-m}(Rmd)TRnd= R((nm)θ1)R((nm)θd/2) =Rnmd

因此:
⟨f(q,m),f(k,n)⟩=qTRn−mdk\langle f(\mathbf{q}, m), f(\mathbf{k}, n) \rangle = \mathbf{q}^T R^d_{n-m} \mathbf{k}f(q,m),f(k,n)⟩=qTRnmdk
于是可以证明经过 RoPE 编码后的 Query 和 Key 向量,在进行 Attention 的内积计算时,结果只和它们的相对距离 (n−m)(n-m)(nm) 有关,而与它们在句子中的绝对位置 mmmnnn 无关。

在经过RoPE编码后,我们得到了带有位置信息的 qmRoPE\mathbf{q}_m^{RoPE}qmRoPEknRoPE\mathbf{k}_n^{RoPE}knRoPE
随后直接将它们送入传统的无位置编码 Attention 公式中:
Scorem,n=qmRoPE⋅(knRoPE)Td\text{Score}_{m,n} = \frac{\mathbf{q}_m^{RoPE} \cdot (\mathbf{k}_n^{RoPE})^T}{\sqrt{d}}Scorem,n=d qmRoPE(knRoPE)T
1.序列特别长怎么办

性质

外推性

较差

  • 计算外推 vs 效果外推:旋转矩阵的公式对任意位置 mmm 都是通用的,数学上不存在越界崩溃。但“能算”不等于“有效”。
  • 高频维度的特性:根据角度公式 θi=10000−2i/d\theta_i = 10000^{-2i/d}θi=100002i/d,当 iii 较小时(低维/高频),θi\theta_iθi 较大。这意味着位置 mmm 每增加 1,旋转角度 mθim\theta_imθi 变化极大,旋转周期极短
  • 训练与推理的分布差异(相位失控)
    • 在训练长度内(0…Ltrain0 \dots L_{train}0Ltrain:由于高频维度转速快,在有限的长度内已经转了非常多圈,模型已经完整学习并适应了该维度在 0002π2\pi2π 完整周期内的所有角度组合。
    • 在超出训练长度后(>Ltrain> L_{train}>Ltrain:按原文逻辑,高频维度在长文本中会继续积累旋转角度,进入未曾泛化过的相对位置组合(即相位失控),打破了模型在训练时建立的注意力分数分布,最终导致模型失效。
训练

不需要训练

相对位置信息

能力很强,内积结果直接绑定相对距离 m−nm-nmn

代表性应用

  • LLaMA 家族 (LLaMA 1 / 2 / 3)
  • DeepSeek (DeepSeek-V3 / R1)
  • QwenMistralGemma
  • 几乎统治了当前(2026年)所有主流开源与商业大语言模型。

局限性

1. 直接外推效果差
高频维度在超出训练长度后相位失控,注意力分数分布紊乱。虽然理论上可以外推,但直接用效果很差,必须配合额外的扩展技术才能用于长上下文场景

3. 不作用于 V,位置信息只影响注意力权重
RoPE 只旋转 Q 和 K,V 不携带任何显式位置信息。这意味着位置信息只体现在"关注谁"上,而聚合阶段的内容本身是无位置感知的。在某些需要位置感知输出的任务上可能是一个限制。

RoPE 的外推扩展技术

1. 线性插值 (Linear Interpolation)

通过将推理时的位置坐标“等比例缩小”,使其强行落回训练时的位置范围内,从而解决长文本外推失效的问题。

原理

在标准 RoPE 中,位置 mmm 的旋转角度为 mθim\theta_imθi。当推理长度 LtestL_{test}Ltest 大于训练长度 LtrainL_{train}Ltrain 时,位置 mmm 会超过 LtrainL_{train}Ltrain,导致位置编码的分布发生偏移。

线性插值引入一个缩放因子 κ=LtestLtrain>1\kappa = \frac{L_{test}}{L_{train}} > 1κ=LtrainLtest>1,将位置 mmm 修改为:
m′=mκm' = \frac{m}{\kappa}m=κm
对应的旋转角度变为:
θi′=mκθi\theta_i' = \frac{m}{\kappa}\theta_iθi=κmθi
通过把每个位置都除以 κ\kappaκ,使得即使最大位置 m=Ltestm = L_{test}m=Ltest,缩放后的位置 m′m'm 也精确等于 LtrainL_{train}Ltrain所有位置被“压缩”回了模型见过的空间内。

优缺点
  • 优点:结构最简单。
  • 缺点分辨率下降(精度损失)。由于所有维度一起被压缩,原本相隔 1 的两个 Token,插值后基底角度差变成了 1/κ1/\kappa1/κ。视角变模糊了,模型对紧邻 Token 的顺序和局部细节感知力会下降

2. NTK-aware 插值 (NTK-aware RoPE Scaling)

放弃了线性插值的“一刀切”做法,选择在低频维度(大 iii)进行插值以解决外推越界问题,而在高频维度(小 iii)保持原样以保留局部高精度的位置信息。

原理

在线性插值中,我们直接修改位置 m→m/κm \to m/\kappamm/κ。而在 NTK-aware 中,我们保持 mmm 不变,转而通过修改旋转基数 base=10000\text{base} = 10000base=10000 来达到动态缩放的效果。

设上下文扩展倍数为 κ=LtestLtrain\kappa = \frac{L_{test}}{L_{train}}κ=LtrainLtest,新的基数修改为:
base′=10000⋅κdd−2\text{base}' = 10000 \cdot \kappa^{\frac{d}{d-2}}base=10000κd2d

带入修改后的基数,新的旋转角度公式为:
θi′=(10000⋅κdd−2)−2(i−1)d=10000−2(i−1)d⋅κ−2(i−1)d−2\theta_i' = \left( 10000 \cdot \kappa^{\frac{d}{d-2}} \right)^{-\frac{2(i-1)}{d}} = 10000^{-\frac{2(i-1)}{d}} \cdot \kappa^{-\frac{2(i-1)}{d-2}}θi=(10000κd2d)d2(i1)=10000d2(i1)κd22(i1)

  • i→1i \to 1i1(最高频维度): 缩放项接近 κ0=1\kappa^0 = 1κ0=1。这意味着 θi′≈θi\theta_i' \approx \theta_iθiθi几乎没有被插值压缩。高频的局部相对位置精度(如相邻 Token 的前后顺序)被完美保留。
  • i→d/2i \to d/2id/2(最低频维度): 缩放项接近 κ−1=1/κ\kappa^{-1} = 1/\kappaκ1=1/κ。这使得旋转角度整体变慢,其效果等同于位置 mmm 被除以了 κ\kappaκ(即等比例线性插值),成功将外推范围压缩回训练分布内。
优缺点
  • 优点:Linear Scaling 均匀压缩所有维度,高频维度原本就靠细微的角度差区分相邻位置,压缩后这种细微差别被抹平了。NTK-aware 对高频维度少压缩,保留了近距离的位置分辨率。
  • 缺点:NTK-aware 是对整体基底 100001000010000 进行替换,本质上还是一个全局调整,没有真正做到每个维度独立优化。高频和低频维度的需求不同,用同一个公式处理是一种妥协。

YaRN (Yet Another RoPE Extrapolation)

通过“分频段独立优化(分段掩码)”和“注意力分数温度修正”,完美解决了超大尺度外推下的局部信息模糊和长程噪声累积问题。

原理

YaRN 认为,RoPE 的各个维度对应的“波长”不同,对长文本的敏感度也完全不同。波长公式为 λi=2π/θi\lambda_i = 2\pi / \theta_iλi=2π/θi
θi=b−2id\theta_i = b^{-\frac{2i}{d}}θi=bd2i
随着维度指数 iii 的增大,频率 θi\theta_iθi 越来越低,波长 λi\lambda_iλi 越来越长。
于是,
YaRN 引入了两个超参数 α\alphaαβ\betaβ(通常根据实验经验设定,例如 α=1,β=32\alpha=1, \beta=32α=1,β=32),并结合原始上下文窗口长度 LLL(如 4096),定义了两个临界点:

  • 高频区(λi<Lβ\lambda_i < \frac{L}{\beta}λi<βL:完全不插值,保持原生 RoPE 的外推,锁死局部相对位置分辨率。这些维度的旋转速度极快,在原始长度 LLL 内已经完成了非常多次的完整周期循环。它们对绝对局部的相对位置极其敏感。

  • 低频区(λi>Lα\lambda_i > \frac{L}{\alpha}λi>αL:完全线性插值,将整体范围压缩到原训练窗口内,防止角度越界。这些维度的旋转速度极慢,在整个原始长度 LLL 内甚至连半个周期都无法跑完。它们主要用于描述超长距离的宏观线性趋势

  • 中频区(Lβ≤λi≤Lα\frac{L}{\beta} \le \lambda_i \le \frac{L}{\alpha}βLλiαL:引入一个平滑函数 ,让插值比例从 0 渐进式滑向 1,实现高低频的丝滑过渡。

当文本长度从 LtrainL_{train}Ltrain 扩展到 LtestL_{test}Ltest 时,网络中需要计算 Attention 的 Token 数量暴增。这会导致一个纯数学上的问题:Attention 矩阵乘法后的激活值分布,其均值和方差会发生偏移,导致 Softmax 后的分布变得异常平缓(被稀释),模型会丧失对重点 Token 的聚焦能力。

于是引入了一个温度修正因子 ttt,在计算 Attention Score (QKTQ K^TQKT) 时
Attention(Q,K,V)=softmax(QKTtd)V\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{Q K^T}{t \sqrt{d}} \right) VAttention(Q,K,V)=softmax(td QKT)V
通过将分母的缩放系数从 d\sqrt{d}d 修正为 tdt \sqrt{d}td (其中 ttt 依赖于外推倍数 κ\kappaκ),强行把外推后的注意力分布拉回训练时的陡峭度。这使得模型在 32k 甚至 128k 的超长文本下,依然能像在 2k 训练长度时一样,精准捕捉长距离的依赖关系。
ttt 不是一个固定常数,而是通过以下公式计算得出的变量:
t=1+ln⁡(κ)ln⁡(10000)t = \sqrt{1 + \frac{\ln(\kappa)}{\ln(10000)}}t=1+ln(10000)ln(κ)
其中 κ=LtestLtrain\kappa = \frac{L_{test}}{L_{train}}κ=LtrainLtest 是上下文的扩展倍数。
根据这个公式,可以看到 ttt 在不同场景下的状态:
标准训练与常规推理时(κ=1\kappa = 1κ=1
在模型原始训练长度内(如 4k 长度内)进行推理时,扩展倍数 κ=1\kappa = 1κ=1
代入公式:ln⁡(1)=0\ln(1) = 0ln(1)=0,此时 t=1+0=1t = \sqrt{1 + 0} = 1t=1+0 =1
此时分母为 1×d1 \times \sqrt{d}1×d 温度修正因子完全不生效,退化为最原始的 Standard Attention 状态。

超长文本外推时(κ>1\kappa > 1κ>1
将文本外推到 16 倍(如 64k)甚至更高时,κ>1\kappa > 1κ>1
由于 ln⁡(κ)>0\ln(\kappa) > 0ln(κ)>0,此时 t>1t > 1t>1。此时 ttt 开始介入。

优缺点
  • 优点:在外推长度、模型困惑度(PPL)和微调收敛速度上全面碾压前两者。能够以极少的微调步骤实现 128k 甚至更长窗口的扩展。
  • 缺点:计算逻辑相对复杂,超参数(如过渡频带的上下界)需要精细调优。

XPos

XPos 是为了解决 RoPE 在长文本下长距离衰减不稳定而提出的。它在 RoPE 的旋转操作基础上,给 QQQKKK 直接乘了一个随距离指数衰减的因子,在计算点积时自动推导出了 γm−n\gamma^{m-n}γmn 惩罚项
它用数学方法把 RoPE 的旋转能力ALiBi 的局部性偏好(距离越远惩罚越狠) 结合在了一起。
但是由于XPos 核心卖点是长文本外推。但工业界后来普遍采用了 Linear Scaling(线性内插)NTK-aware RoPEYaRN 等基于标准 RoPE 的直接改进方案。这些方案不需要修改模型底层算子,只需在推理时改几行代码,所以XPos并没有广泛运用

2D/Spatial 位置编码

行列交叉污染(Cross-term Pollution)是指在处理二维数据(如图像)时,由于位置编码设计不当,导致模型在计算自注意力(Self-Attention)时,“行(Row)的查询信息QQQ”错误地与“列(Column)的键信息KKK”产生了本不该存在的矩阵乘积项
QKT=(Qrow+Qcol)(Krow+Kcol)TQK^T = (Q_{\text{row}} + Q_{\text{col}})(K_{\text{row}} + K_{\text{col}})^TQKT=(Qrow+Qcol)(Krow+Kcol)T

QKT=QrowKrowT⏟行与行交互+QcolKcolT⏟列与列交互+QrowKcolT+QcolKrowT‾⏟行列交叉污染项QK^T = \underbrace{\mathbf{Q_{\text{row}} K_{\text{row}}^T}}_{\text{行与行交互}} + \underbrace{\mathbf{Q_{\text{col}} K_{\text{col}}^T}}_{\text{列与列交互}} + \underbrace{\underline{Q_{\text{row}} K_{\text{col}}^T + Q_{\text{col}} K_{\text{row}}^T}}_{\mathbf{行列交叉污染项}}QKT=行与行交互 QrowKrowT+列与列交互 QcolKcolT+行列交叉污染项 QrowKcolT+QcolKrowT

2D Absolute Sinusoidal PE (二维绝对正余弦位置编码)

动机

Transformer 原始的 1D Sinusoidal PE 只能编码单一维度的序列顺序(如纯文本),无法直接感知图像的二维空间结构(行与列)。如果直接将图像展平为 1D 序列并应用 1D PE,模型会丢失视觉上至关重要的上下邻近关系。
于是,我们想要赋予模型显式的横向(X轴)和纵向(Y轴)空间几何感知能力

原理

将 2D 坐标 (x,y)(x, y)(x,y) 分别独立进行 1D 正余弦编码,各自占用一半的通道数(d/2d/2d/2),然后将两部分的编码拼接 (Concat) 成一个完整的 ddd 维向量。
PE(x,y)=[PE1D(x,d/2)  ∥  PE1D(y,d/2)]\text{PE}(x, y) = \Big[ \text{PE}_{1D}(x, d/2) \;\big\|\; \text{PE}_{1D}(y, d/2) \Big]PE(x,y)=[PE1D(x,d/2) PE1D(y,d/2)]
假设我们要对一个图像中坐标为 (x,y)=(2,3)(x, y) = (2, 3)(x,y)=(2,3) 的像素进行编码,目标总特征维度 d=4d = 4d=4

1. 计算 xxx 方向(行)的 1D 编码
  • 维度为 d/2=2d/2 = 2d/2=2
  • 假设计算得出 PE1D(2,2)=[0.5,0.8]\text{PE}_{1D}(2, 2) = \mathbf{[0.5, 0.8]}PE1D(2,2)=[0.5,0.8]
2. 计算 yyy 方向(列)的 1D 编码
  • 维度同样为 d/2=2d/2 = 2d/2=2
  • 假设计算得出 PE1D(3,2)=[0.1,0.9]\text{PE}_{1D}(3, 2) = \mathbf{[0.1, 0.9]}PE1D(3,2)=[0.1,0.9]
3. 拼接(∥\|)两个向量

将两组 2 维向量拼成一个 4 维向量:
PE(2,3)=[0.5,0.8]  ∥  [0.1,0.9]=[0.5,0.8,0.1,0.9]\text{PE}(2, 3) = [0.5, 0.8] \;\big\|\; [0.1, 0.9] = \mathbf{[0.5, 0.8, 0.1, 0.9]}PE(2,3)=[0.5,0.8] [0.1,0.9]=[0.5,0.8,0.1,0.9]

代表性应用
  • DETR (Object Detection with Transformers)
局限性

空间对称性冗余:由于 XXXYYY 独立编码且加在 Embedding 层,经过多头自注意力机制(MHA)的 WQ,WKW_Q, W_KWQ,WK 线性变换后,会导致行信息与列信息产生错误的交叉乘积项(如 XQYKX_Q Y_KXQYK。由于模型无法区分这些对称的交叉项,导致绝对方向感丢失,相对位置信息在深层网络中被噪点稀释。模型本应该只关心“行与行交互”(XQXKTX_Q X_K^TXQXKT)和“列与列交互”(YQYKTY_Q Y_K^TYQYKT)。但是展开项中必然出现 XQYKTX_Q Y_K^TXQYKTYQXKTY_Q X_K^TYQXKT

2D Learnable Absolute PE (二维可学习绝对位置编码)

原理

预先定义一个形状为 (H,W,d)(H, W, d)(H,W,d) 的可训练参数张量(Embedding矩阵)。对于图像中 (x,y)(x, y)(x,y) 位置的 Patch,直接根据索引查找对应的 ddd 维向量。

在模型构建时,预先定义一个三维的、可更新梯度的参数张量,其形状为 (H,W,d)(H, W, d)(H,W,d)

  • HHH:图像在垂直方向上的 Patch 数量(高)。
  • WWW:图像在水平方向上的 Patch 数量(宽)。
  • ddd:每个 Patch 的特征维度(与 Transformer 的 Embedding 维度一致)。

当图像被切分为 H×WH \times WH×W 个 Patch 并通过线性映射得到形状为 (H,W,d)(H, W, d)(H,W,d) 的图像特征后:

  1. 精确对齐:对于坐标为 (x,y)(x, y)(x,y) 的 Patch,直接从可训练张量中切片取出对应的 ddd 维向量 px,y=Tensor[x,y,:]\mathbf{p}_{x,y} = \text{Tensor}[x, y, :]px,y=Tensor[x,y,:]
  2. 矩阵相加:将整个 (H,W,d)(H, W, d)(H,W,d) 的位置编码矩阵,直接按元素加到(Element-wise Add) 同样形状的图像特征矩阵上。

代表性应用 (Where)

  • ViT (Vision Transformer 官方基线模型)

局限性

  • 缺乏外推性
  • 平移变体(Translation Variant): 每一个位置的编码都是独立训练的,模型无法原生感知“两个 Patch 靠得很近”这一空间几何规律,完全依赖数据驱动去硬学。
  • 存在行列交叉污染:经线性变换后必然在 QKTQK^TQKT 展开式中出现交叉项。

2D Rotary Position Embedding (2D RoPE / 二维旋转位置编码)

原理

ddd 维的 QQQKKK 向量分成两半(分别对应 XXXYYY 轴)。对于 XXX 轴坐标 xxxYYY 轴坐标 yyy,分别应用二维旋转矩阵进行复数空间旋转。
Q2D(x,y)=[RxQx  ∥  RyQy]Q_{2D}(x, y) = \Big[ \mathbf{R}_{x} Q_{x} \;\big\|\; \mathbf{R}_{y} Q_{y} \Big]Q2D(x,y)=[RxQx RyQy]

具体示例

假设我们要对图像中坐标为 (x,y)=(1,2)(x, y) = (1, 2)(x,y)=(1,2) 的 Patch 计算其 Q2DQ_{2D}Q2D 向量,目标总维度 d=4d = 4d=4

1. 拆分原始向量 QQQ

在未注入位置信息前,该位置的原始查询向量为 Q=[q0,q1,q2,q3]TQ = [q_0, q_1, q_2, q_3]^TQ=[q0,q1,q2,q3]T
按照公式,将其均分为行、列两部分(维度各为 d/2=2d/2 = 2d/2=2):

  • Qx=[q0,q1]TQ_x = [q_0, q_1]^TQx=[q0,q1]T (负责水平方向)
  • Qy=[q2,q3]TQ_y = [q_2, q_3]^TQy=[q2,q3]T (负责垂直方向)
2. 计算行方向的旋转(RxQx\mathbf{R}_x Q_xRxQx

已知行坐标 x=1x = 1x=1,定义基础旋转弧度为 θ\thetaθ。二维旋转矩阵 Rx=1\mathbf{R}_{x=1}Rx=1 为:

R1=(cos⁡(1⋅θ)−sin⁡(1⋅θ)sin⁡(1⋅θ)cos⁡(1⋅θ))\mathbf{R}_{1} = \begin{pmatrix} \cos(1\cdot\theta) & -\sin(1\cdot\theta) \\ \sin(1\cdot\theta) & \cos(1\cdot\theta) \end{pmatrix}R1=(cos(1θ)sin(1θ)sin(1θ)cos(1θ))
乘上 QxQ_xQx,相当于在二维复平面上将向量 QxQ_xQx 旋转了 1⋅θ1\cdot\theta1θ 弧度,得到旋转后的行向量 Qx_rotQ_{x\_rot}Qx_rot

3. 计算列方向的旋转(RyQy\mathbf{R}_y Q_yRyQy

已知列坐标 y=2y = 2y=2。二维旋转矩阵 Ry=2\mathbf{R}_{y=2}Ry=2 为:

R2=(cos⁡(2⋅θ)−sin⁡(2⋅θ)sin⁡(2⋅θ)cos⁡(2⋅θ))\mathbf{R}_{2} = \begin{pmatrix} \cos(2\cdot\theta) & -\sin(2\cdot\theta) \\ \sin(2\cdot\theta) & \cos(2\cdot\theta) \end{pmatrix}R2=(cos(2θ)sin(2θ)sin(2θ)cos(2θ))
乘上 QyQ_yQy,相当于将向量 QyQ_yQy 旋转了 2⋅θ2\cdot\theta2θ 弧度,得到旋转后的列向量 Qy_rotQ_{y\_rot}Qy_rot

4. 拼接得到最终的 Q2DQ_{2D}Q2D

将旋转后的两部分重新拼接:
Q2D(1,2)=[Qx_rot  ∥  Qy_rot]Q_{2D}(1, 2) = \Big[ Q_{x\_rot} \;\big\|\; Q_{y\_rot} \Big]Q2D(1,2)=[Qx_rot Qy_rot]
最终输出的 4 维向量中,前两维带有行坐标(旋转了 1θ1\theta1θ)的信息,后两维带有列坐标(旋转了 2θ2\theta2θ)的信息。

代表性应用

Qwen-VL——用2D RoPE来区分图像token的行列位置,是目前最知名的2D RoPE应用

是否存在行列交叉污染

不存在。2D RoPE 在通道层面上严格将 X 轴和 Y 轴隔离。前 d/2d/2d/2 维通道只做行旋转,后 d/2d/2d/2 维通道只做列旋转。在计算内积时,前一半通道与后一半通道正交(乘积为 0),因此 QrowKcolT=0Q_{\text{row}} K_{\text{col}}^T = 0QrowKcolT=0从根本上切断了交叉污染

2D Relative Position Bias (二维相对位置偏置)

原理

直接将相对距离作为一个可学习的偏置项(Bias)注入到注意力分数中。计算窗口内任意两点 i(x1,y1)i(x_1, y_1)i(x1,y1)j(x2,y2)j(x_2, y_2)j(x2,y2) 的相对坐标 (Δx,Δy)=(x1−x2,y1−y2)(\Delta x, \Delta y) = (x_1 - x_2, y_1 - y_2)(Δx,Δy)=(x1x2,y1y2)。通过一个定义好的索引表(Table),将 2D 相对坐标映射为一个一维的标量索引,从而查找一个可训练的偏置值 B(Δx,Δy)B(\Delta x, \Delta y)B(Δx,Δy)
Attention(Q,K)=Softmax(QKTd+B)\text{Attention}(Q, K) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d}} + B\right)Attention(Q,K)=Softmax(d QKT+B)

1. 核心映射流程

以输入特征图大小为 H×WH \times WH×W 为例,任意两个位置 i=(xi,yi)i=(x_i, y_i)i=(xi,yi)j=(xj,yj)j=(x_j, y_j)j=(xj,yj) 的映射步骤如下:

步骤一:计算相对坐标差

计算位置 iii 和位置 jjj 在行、列方向上的相对距离:
Δx=xi−xj∈[−(H−1),H−1]\Delta x = x_i - x_j \in [-(H-1), H-1]Δx=xixj[(H1),H1]
Δy=yi−yj∈[−(W−1),W−1]\Delta y = y_i - y_j \in [-(W-1), W-1]Δy=yiyj[(W1),W1]

步骤二:坐标平移(使其非负)

因为数组索引不能为负数,将取值范围平移至从 0 开始:
Δx′=Δx+(H−1)∈[0,2H−2]\Delta x' = \Delta x + (H - 1) \in [0, 2H - 2]Δx=Δx+(H1)[0,2H2]
Δy′=Δy+(W−1)∈[0,2W−2]\Delta y' = \Delta y + (W - 1) \in [0, 2W - 2]Δy=Δy+(W1)[0,2W2]

步骤三:二维索引转一维索引

利用类似二维矩阵扁平化(Flatten)的公式,将二维差值 (Δx′,Δy′)( \Delta x', \Delta y' )(Δx,Δy) 压缩为一个一维标量索引 III
I=Δx′×(2W−1)+Δy′I = \Delta x' \times (2W - 1) + \Delta y'I=Δx×(2W1)+Δy
这个公式利用了进制转换的原理:

  • Δy′\Delta y'Δy 视为低位
  • Δx′\Delta x'Δx 视为高位
  • 由于 Δy′\Delta y'Δy 的最大可能取值是 2W−22W-22W2(共有 2W−12W-12W1 个可选值),所以高位必须乘以进制基数 (2W−1)(2W-1)(2W1)
    通过这种设计,每一对不同的 (Δx′,Δy′)(\Delta x', \Delta y')(Δx,Δy) 组合,都必然会映射到一个互不重复的整数 III,绝对不会发生索引冲突
步骤四:查表(Lookup)

构建一个形状为 ((2H−1)×(2W−1),num_heads)((2H-1) \times (2W-1), \text{num\_heads})((2H1)×(2W1),num_heads) 的可学习偏置表 Bias Table
最终的注意力权重通过索引 III 从表中取出对应的偏置值:
Bias=Bias Table[I]\text{Bias} = \text{Bias Table}[I]Bias=Bias Table[I]

代表性应用

Swin Transformer (V1/V2)

位置编码类型 相对/绝对 是否具备外推性 是否存在行列交叉污染 核心代表模型
2D Sinusoidal 绝对 是(但效果一般) (严重污染) DETR
2D Learnable 绝对 (需插值重训练) ViT
2D RoPE 隐式相对 (支持线性和NTK插值) (通道隔离) Qwen-VL, CogVLM
2D Relative Bias 显式相对 (超出窗口需截断/插值) Swin Transformer

版权声明:本博客所有原创文章,除特别声明外,均采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。转载时请务必注明出处。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐