llm 绝对位置编码/相对位置编码/旋转位置编码

位置编码(Positional Encoding, PE)是Transformer架构能够理解序列顺序的关键组件,

Transformer 的核心组件 ——自注意力机制(Self-Attention) 是置换不变性(Permutation Invariant)的,即它本身不感知输入序列中 token 的顺序,因此通过位置编码将序列的顺序信息注入到模型中。

 

1. 绝对位置编码 (Absolute Positional Encoding, APE)

核心思想:为序列中的每个绝对位置(如第1个词、第2个词)分配一个唯一的编码向量,然后将其加到该位置的词嵌入向量上
最早期、最基础的位置编码方式,主要分为固定编码和可学习编码两种。

(1) 固定正弦余弦编码 (Sinusoidal PE)

  • 原理:利用正弦(sin)和余弦(cos)函数生成一个固定的、预定义的矩阵。对于位置 pos 和维度 i,其计算公式为:

   image

  • 特点:
    • 无需训练:参数是数学生成的,不占用模型参数量。
    • 外推性好:由于是函数生成的,模型在训练时如果只见过长度为 512 的序列,测试时可以处理长度为 1024 的序列(虽然效果会衰减,但不会报错)。
    • 相对位置暗示:利用三角恒等式(sin(α+β)=…),绝对位置可以线性表示相对位置信息,但这需要模型自己去学习这种映射关系。

原始论文作者明确指出,他们选择这个函数形式,是因为它允许模型轻松地学习到关注相对位置。

采用cos和sin 的最根本原因,对于任意固定的位置偏移量 k,位置 pos+k的位置编码可以表示为位置 pos的位置编码的线性函数。

image

 

模型(特别是自注意力机制中的线性变换层)完全有能力通过一组固定的权重(由 cos⁡(β)cos(β) 和 sin⁡(β)sin(β) 决定),从 PE(pos)PE(pos) 计算出 PE(pos+k)PE(pos+k)。

换句话说,只要模型学会了这组权重,它就能理解“偏移k个位置”这个概念,从而捕捉到相对位置信息。

 

Sin/Cos 编码在设计时,将向量的不同维度分配了不同的频率(Frequency)。

函数是周期性的,但由于频率 ωi在维度 i上呈几何级数变化(10000的幂),不同维度上的周期长度差异巨大。这就好比多个不同频率、不同波长的波叠加在一起。

  • 在低维度(i 较小),ωi 很大,周期很长,在这个维度上编码值变化缓慢,可以编码长程的、粗略的位置信息。

  • 在高维度(i 较大),ωi 很小,周期很短,编码值变化剧烈,可以编码精细的、短程的位置信息。

image

 

(2) 可学习位置编码 (Learned PE)

  • 原理:
    初始化一个大小为 [Max_Seq_Length, Embedding_Dim] 的参数矩阵,这个矩阵是随机初始化的,然后作为模型参数的一部分参与梯度下降训练。
  • 特点:
    • 效果通常更好:在固定长度内,通过训练学到的位置信息往往比人工设计的正弦波更贴合任务。
    • 外推性差:如果训练时最大长度是 512,测试时输入 513,模型就没有对应的编码可用了(通常做法是截断或复制最后一个位置的编码,效果很差)。

绝对位置编码的核心问题:

它将每个位置看作独立的个体(如位置 1 就是位置 1),忽略了 token 之间的距离关系。例如,在序列 "A...B...C" 中,A 和 C 的距离与 B 和 C 的距离在绝对编码中没有直接的数值体现,这导致模型难以捕捉长距离依赖。
 

2. 相对位置编码 (Relative Positional Encoding, RPE)

为了解决 APE 忽视距离的问题,RPE 应运而生。它不再关注 "我在第几个位置",而是关注 "我和你相距多远"。
模型真正需要理解的是标记之间的距离或相对关系(例如,“我”在“爱”之前两个位置)。因此,直接建模标记对之间的相对位置偏移。

经典方法(如Transformer-XL, T5)

  • 原理:
    在计算 Attention Score 时,不仅计算 Query 和 Key 的点积,还额外加上一个相对位置偏置项 aij​,这个偏置项取决于 i 和 j 的距离
  • 公式逻辑:

    image

  • T5:引入了相对位置偏置(Relative Position Bias),在多头注意力中,每个头都有一个可学习的距离偏置表
  • DeBERTa:提出了 Disentangled Attention,将内容(Content)和位置(Position)分开。它使用了两个矩阵:一个是内容注意力矩阵(基于 token 语义),一个是位置注意力矩阵(基于 token 间的距离)。

核心操作:不向输入嵌入添加绝对位置编码,而是在注意力计算过程中,修改注意力分数,引入一个与相对位置偏移(i-j)相关的偏置项

      image

相对位置编码的优点:

  • 平移不变性:如果整句话在文章中上下移动,token 之间的相对距离不变,编码也不变,这符合人类语言习惯。
  • 更好的长距离依赖:模型明确知道两个词隔了多远。

缺点:

  • 计算开销:在计算 Attention Map 时需要额外的计算步骤,增加了实现复杂度和显存占用。
  • 序列长度限制:通常也需要预设一个最大相对距离(例如超过 128 就都算作 128),否则参数量会爆炸。

 

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

RoPE 是目前最流行、最强大的位置编码技术之一,被广泛应用于 LLaMA, GPT-NeoX, PaLM 等现代大模型中。
  • 核心思想:
    将位置编码看作是向量空间中的旋转操作。
    它通过复数域(Complex Numbers)或高维空间的旋转矩阵,将位置信息 “旋转” 进 Query 和 Key 向量中。
  • 原理:
    对于每个 token 的向量,将其切分为实部和虚部(或者前后两半维度)。通过矩阵乘法,将 Query 和 Key 进行旋转。
    关键数学性质在于:内积的旋转不变性。
    ⟨R(θ)q, R(θ+m)k⟩ = ⟨q, R(m)k⟩
    这意味着,当 Query 和 Key 都经过 RoPE 编码后,旋转后的 Q 和 K 做点积时结果中自然包含了相对位置 m 的信息

image

  • 为什么叫 Rotary?
    因为它利用了 eiθ=cosθ+isinθ 的欧拉公式性质,使得位置的增加对应于向量在复平面上的旋转角度增加。
  • 核心操作:

    1. 将词嵌入向量视为一组二维向量对(即复数形式)。

    2. 对每一对分量,根据其绝对位置pos,进行一个旋转。

    3. 旋转角度θ与位置pos和维度i成比例:θ = pos * base^{-2i/d}base是一个很大的常数(如10000)。

  • 数学上:对于位置mn的查询q和键k,它们的内积 <f(q, m), f(k, n)> 只与 (m-n) 有关,即只依赖于相对位置

image

 

RoPE 的革命性优势:

  1. 绝对位置编码的形式,相对位置编码的效果:
    它在实现上是对每个位置的向量进行独立编码(像 APE),但在最终计算 Attention Score 时,起作用的是它们之间的相对角度差(像 RPE)。
  2. 完美的外推性 (Extrapolation):
    这是 RoPE 最大的杀手锏。如果模型在 2048 长度下训练,当输入 4096 长度时,RoPE 依然可以计算出合理的旋转角度(虽然没见过,但数学上是连续的)。配合 NTK-Aware Scaling 等技术,RoPE 可以让 LLaMA 轻松处理 100k 以上的超长文本。
  3. 无额外参数:
    它是通过矩阵运算生成的,不增加模型参数。
 

对比总结

 
特性绝对位置编码 (如Sinusoidal)相对位置编码 (如T5式)旋转位置编码 (RoPE)
核心思想 为每个位置分配唯一编码,相对位置信息需要模型自身进行学习 直接建模标记间的相对距离 通过旋转嵌入注入位置,使内积仅依赖相对位置
注入方式 加法,在输入或每层 加法偏置,在注意力分数 乘法旋转,在查询和键向量上
外推性 较差 较好 极好 (配合技巧)
实现复杂度 简单 中等 中等
流行程度 早期Transformer基础 在需要精确相对位置的任务中常用 当前大模型主流

 

Qwen3上下文长度32K -> 128K扩展

Qwen3 8B原生支持32K上下文,但通过位置外推技术(Position Interpolation)可以处理更长的序列:

  • 不截断:整个序列(如128K)会被输入模型

  • 位置重映射:通过数学变换将[0, 128K)的位置映射到模型熟悉的[0, 32K)范围

  • 注意力计算:模型对全部token计算注意力,但位置编码经过了调整

方面32K原生128K扩展注意事项
推理速度 较慢(约降低30-50%) 注意力计算复杂度增加
显存占用 较低 显著增加(~4倍) 需要更多GPU内存
长文档精度 一般 前32K最佳,后续可能衰减 可能出现"中间迷失"现象
成本 较高 需要更多计算资源

位置范围        相对效果        原因
0-32K           ~100%         原生训练范围
32K-64K         ~85-95%       轻度位置压缩
64K-96K         ~70-85%       中度位置压缩  
96K-128K        ~60-75%       重度位置压缩
# 使用Qwen3的官方长上下文支持
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-8B-Instruct",
    torch_dtype="auto",
    device_map="auto",
    # 启用长上下文支持
    use_flash_attn=True,
    trust_remote_code=True
)

# 明确指定最大长度
response = model.chat(
    tokenizer,
    "长文档内容...",
    max_length=131072,  # 指定128K
    truncation=True
)

YaRN(Yet another RoPE extensioN method)是一种针对基于旋转位置编码(RoPE)的大语言模型(如 LLaMA、GPT - NeoX、Qwen 等)的上下文窗口高效扩展方法,核心是通过改进 RoPE 的频率插值与注意力缩放,以极低微调成本将上下文窗口扩展至原生长度的数倍(如 Qwen32B 从 32K 扩至 131K)

YaRN 本质是 NTK - by - parts 插值的升级版,核心由两大关键技术构成:

  1. NTK - by - parts 插值:将位置编码的频率按不同频段拆分处理。低频段(对应长距离依赖)采用 NTK - aware 缩放,保证长距离相对位置信息不丢失;高频段(对应短距离细节)采用常规插值,保留局部语义连贯性,避免长文本扩展时的性能断崖式下降。
  2. 注意力预 softmax 缩放:在计算注意力权重的 softmax 前,对注意力分数进行自适应缩放,补偿长距离注意力衰减问题,确保模型在长序列中仍能有效捕捉全局依赖,同时避免梯度消失或爆炸。
  3. 动态 β 缩放(推理时):可根据输入序列长度,动态调整 RoPE 的旋转角度参数 β,实现无需额外微调即可进一步扩展上下文窗口,适配不同长度的文本输入。

实现流程

  1. 预训练适配:无需重新预训练,仅需在原有预训练模型基础上,修改 RoPE 的频率计算逻辑,引入 NTK - by - parts 插值公式。
  2. 高效微调
    • 数据:仅使用原始预训练数据量的 0.1%(约数十亿 token)的长文本数据(如 64K 长度)进行微调。
    • 步骤:训练步数仅为传统 Position Interpolation(PI)方法的 1/2.5(如扩展至 64K 仅需 400 步),大幅降低计算成本。
    • 目标:让模型快速适配新的位置编码规则,学会在长序列中保持语义理解与生成能力。
  3. 推理扩展:微调后模型可支持 “训练短、测试长”,如用 64K 数据训练的模型可稳定推理 128K 长度文本;结合动态 β 缩放,还能进一步提升至 131K 等更长序列。
posted @ 2026-01-15 16:42  wangssd  阅读(5)  评论(0)    收藏  举报