4. 理解 YaRN

从 RoPE 到 YaRN:大语言模型长上下文扩展技术详解

随着大语言模型(LLM)的快速演进,模型能够处理的上下文长度(Context Window)已成为衡量其能力的核心指标之一。无论是 ChatGPT 阅读长篇财报、Claude 处理数十万 Token 的代码库,还是 Gemini 进行超长上下文推理,长文本能力都至关重要。

然而,受限于算力成本,大多数基础模型(如 Llama、Mistral、Qwen 等)在预训练时的上下文长度通常仅为 2048、4096 或 8192 Token。如果直接将一个在 4K 上下文下训练的模型用于推理 64K 甚至 128K 的序列,模型的表现会迅速崩溃。

为了打破这一限制,研究界提出了一条清晰的长上下文扩展技术路线:

RoPE → NTK-Aware Scaling → Position Interpolation (PI) → YaRN → LongRoPE → LongRoPE2

其中,YaRN(Yet another RoPE extensioN) 凭借其极低的微调成本和优秀的性能,成为目前开源社区应用最广泛的扩展方案之一。它由 Nous Research 团队在 2023 年提出,论文标题为:

YaRN: Efficient Context Window Extension of Large Language Models。论文的核心目标是:让原本只能处理几千个 Token 的模型,在尽量少训练成本的情况下,支持数万甚至十几万个 Token 的长上下文。

论文地址:
YaRN(原论文(ArXiv))

一、为什么需要 RoPE?

1.1 Transformer 的“位置盲区”

Transformer 架构的核心是 Self-Attention(自注意力机制),但它本身是无法感知 Token 顺序的。对于 Attention 计算而言,“我爱中国”和“中国爱我”的 Token 集合完全相同,计算结果毫无区别。因此,必须人为注入位置编码(Position Embedding)

1.2 RoPE 的核心思想:旋转即位置

传统的绝对位置编码是直接将位置信息加在 Token Embedding 上,而 RoPE(Rotary Position Embedding,旋转位置编码) 的巧妙之处在于,它通过旋转矩阵来编码位置信息。

假设查询向量和键向量 Q,KRd,对于第 m 个位置,RoPE 的操作为:

Qm=R(m)QKm=R(m)K

其中,R(m) 是一个旋转矩阵。对于二维特征 (x1,x2),引入旋转角 ϕ=mθ,其旋转过程可表示为:

[x1x2]=[cosϕsinϕsinϕcosϕ][x1x2]

RoPE 最重要的性质: 在 Attention 计算点积时,QmTKn=QTR(nm)K

通过推导可以发现,点积的结果只与相对位置 (nm) 有关。这意味着,RoPE 天然以绝对位置编码的形式,实现了相对位置编码的效果

二、理解 RoPE 的命门:频率与位置外推

要理解长上下文扩展的难点,必须先搞懂 RoPE 中的频率(Frequency)

2.1 频率到底是什么?

很多文章笼统地说“高频负责局部,低频负责全局”,但这非常抽象。在 RoPE 中,旋转角度 ϕi=mθi,其中 m 是位置,θi 是频率。

一句话理解频率:位置每增加 1 个 Token,向量在特定维度上的旋转角度增加多少。

RoPE 为不同的维度设计了不同的频率:

θi=100002i/d

其中 i 是维度编号,d 是隐藏层总维度。这导致了一个现象:靠前的维度频率极高,靠后的维度频率极低

我们可以用时钟来生动比喻:

2.2 外推灾难(Position Extrapolation)

假设模型预训练时最大长度为 4096,那么模型在训练期间见过的最大位置 m[0,4096]

到了推理阶段,如果强行输入长度为 65536 的文本,对于低频维度来说,它需要计算 65536θi 的旋转角——这是一个模型在训练期间从未见过的数值范围

遇到完全陌生的位置分布,模型的注意力机制就会彻底混乱,无法进行长距离检索,困惑度(PPL)急速飙升。这就是长上下文的“外推灾难”。

三、治标不治本:Position Interpolation (PI)

为了解决外推问题,学术界提出了 Position Interpolation (PI,位置插值)

它的核心逻辑非常暴力:既然模型没见过超纲的位置,那就把长文本“压缩”回训练区间。

假设训练长度是 4K,目标长度是 32K,扩展倍率 s=8

PI 算法将所有新位置 m 映射为 m=m/s。例如,把第 32768 个 Token 当作第 4096 个 Token 塞给模型。

实际位置 压缩后输入模型的位置
4096 512
8192 1024
32768 4096

PI 的致命缺陷:一刀切

PI 等价于把所有维度的频率统一缩小 s 倍:θi=θi/s

但我们前面说过,高频维度负责捕捉相邻 Token 的精细顺序(局部语法、短距离依赖)。经过 s=8 的严重压缩后,原本相邻 Token 的位置差异变小了,模型变得难以区分相邻 Token

这导致 PI 扩展后的模型,虽然能看长文了,但在短上下文任务上的基础能力出现了明显衰退。

四、YaRN 的优雅解法:分频施策

YaRN(Yet another RoPE extensioN)的作者敏锐地发现了 PI 的痛点:问题不在于压缩,而在于不应该对所有频率进行同等强度的压缩。

YaRN 提出了一个优雅的准则:保护局部能力,只拉伸远程能力。

4.1 频率分段策略

YaRN 根据维度的不同频率,采取了截然不同的处理方式:

  1. 高频部分(负责局部信息): 保持原样不压缩。θi=θi
  2. 低频部分(负责全局信息): 按照扩展倍率缩放。θi=θi/s
  3. 中间频率(过渡区): 引入一个权重因子 αi 进行平滑过渡。

YaRN 巧妙地设计了一个 Ramp 函数 来计算 αi,实现了平滑插值,避免了频率的突变:

θi=(1αi)θi+αiθis

4.2 Attention Temperature 修正

频率调整完后,YaRN 的作者还发现了一个长上下文的通病:Attention 分布容易变得过于平坦(所有 Token 权重接近,无法聚焦关键信息)。

为此,YaRN 在标准 Attention 机制中引入了一个温度系数 t>1

A=softmax(tQKTd)

通过放大点积的差异,强行让 Attention 的概率分布变得更加尖锐,从而大幅提升了模型在海量文本中的“长距离精确检索”能力。

五、YaRN 的微调范式与长文演进

5.1 极低成本的微调流程

使用 YaRN 扩展上下文长度非常轻量化,通常只需四步:

  1. 加载权重: 加载基础模型(如 Llama、Mistral)。
  2. 替换参数: 将原始 RoPE 频率公式替换为 YaRN 的分段频率公式。
  3. 输入长文: 喂入 32K、64K 甚至 128K 的长文本数据。
  4. 轻量继续训练: 通常只需要消耗十几亿到几十亿 Token 的算力,即可完成长文能力的适配,成本远低于从头预训练。

5.2 大模型长上下文技术的全貌

从宏观视角来看,RoPE 体系下的长文扩展技术脉络非常清晰:

总结

YaRN 的成功,本质上是对 Transformer 位置编码底层逻辑的一次深刻回归。它基于一个极其直观但极易被忽略的事实:在 RoPE 的频率空间中,高频负责局部细节,低频负责全局轮廓。

通过构建巧妙的 Ramp 函数进行分段插值,再辅以 Attention 温度修正,YaRN 实现了“既要又要”:既保留了预训练模型强大的短文理解能力,又解锁了远超训练长度的长文处理空间。这也是为什么今天大量标榜支持 64K、128K 甚至更大上下文窗的开源大模型,其底层依然流淌着 YaRN 及其变种的血液。