4. 理解 YaRN

📅 2026/7/12 5:24:13 👁️ 阅读次数 📝 编程学习
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 , K ∈ R d Q,K \in \mathbb{R}^{d}Q,KRd,对于第m mm个位置,RoPE 的操作为:

Q m = R ( m ) Q Q_m = R(m)QQm=R(m)Q
K m = R ( m ) K K_m = R(m)KKm=R(m)K

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

[ x 1 ′ x 2 ′ ] = [ cos ⁡ ϕ − sin ⁡ ϕ sin ⁡ ϕ cos ⁡ ϕ ] [ x 1 x 2 ] \begin{bmatrix} x_1' \\ x_2' \end{bmatrix} = \begin{bmatrix} \cos\phi & -\sin\phi \\ \sin\phi & \cos\phi \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}[x1x2]=[cosϕsinϕsinϕcosϕ][x1x2]

RoPE 最重要的性质:在 Attention 计算点积时,Q m T K n = Q T R ( n − m ) K Q_m^T K_n = Q^T R(n-m) KQmTKn=QTR(nm)K

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

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

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

2.1 频率到底是什么?

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

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

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

θ i = 10000 − 2 i / d \theta_i = 10000^{-2i/d}θi=100002i/d

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

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

  • 高频维度(像秒针):频率大,Token 位置稍微变化一点,角度就转过一大圈。这让模型能像“显微镜”一样,敏锐区分“Token 100”和“Token 101”这种局部相邻位置。
  • 低频维度(像时针):频率极小,Token 位置变化成千上万,角度才缓慢转动一点。它虽然无法区分相邻细节,但在长跨度下不会发生周期重叠(Aliasing,混叠),非常适合记忆遥远位置的整体轮廓。

2.2 外推灾难(Position Extrapolation)

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

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

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

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

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

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

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

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

实际位置压缩后输入模型的位置
4096512
81921024
327684096

PI 的致命缺陷:一刀切

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

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

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

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

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

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

4.1 频率分段策略

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

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

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

θ i ′ = ( 1 − α i ) θ i + α i θ i s \theta_i' = (1-\alpha_i)\theta_i + \alpha_i \frac{\theta_i}{s}θi=(1αi)θi+αisθi

4.2 Attention Temperature 修正

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

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

A = softmax ( t ⋅ Q K T d ) A = \text{softmax}\left( t \cdot \frac{QK^T}{\sqrt{d}} \right)A=softmax(tdQKT)

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

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

5.1 极低成本的微调流程

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

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

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

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

  • PI:统一按比例压缩(牺牲了局部性能)。
  • YaRN:引入 Ramp 函数,分频率平滑压缩(兼顾了局部与全局)。
  • LongRoPE / LongRoPE2:微软提出的进一步优化方案,不再使用人工设定的固定规则,而是通过进化算法搜索最优的频率缩放策略,从而在短文本和超长文本(百万级 Token)之间取得更极致的平衡。

总结

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

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