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,旋转位置编码) 的巧妙之处在于,它通过旋转矩阵来编码位置信息。
假设查询向量和键向量
其中,
RoPE 最重要的性质: 在 Attention 计算点积时,
通过推导可以发现,点积的结果只与相对位置
二、理解 RoPE 的命门:频率与位置外推
要理解长上下文扩展的难点,必须先搞懂 RoPE 中的频率(Frequency)。
2.1 频率到底是什么?
很多文章笼统地说“高频负责局部,低频负责全局”,但这非常抽象。在 RoPE 中,旋转角度
一句话理解频率:位置每增加 1 个 Token,向量在特定维度上的旋转角度增加多少。
RoPE 为不同的维度设计了不同的频率:
其中
我们可以用时钟来生动比喻:
- 高频维度(像秒针): 频率大,Token 位置稍微变化一点,角度就转过一大圈。这让模型能像“显微镜”一样,敏锐区分“Token 100”和“Token 101”这种局部相邻位置。
- 低频维度(像时针): 频率极小,Token 位置变化成千上万,角度才缓慢转动一点。它虽然无法区分相邻细节,但在长跨度下不会发生周期重叠(Aliasing,混叠),非常适合记忆遥远位置的整体轮廓。
2.2 外推灾难(Position Extrapolation)
假设模型预训练时最大长度为 4096,那么模型在训练期间见过的最大位置
到了推理阶段,如果强行输入长度为 65536 的文本,对于低频维度来说,它需要计算
遇到完全陌生的位置分布,模型的注意力机制就会彻底混乱,无法进行长距离检索,困惑度(PPL)急速飙升。这就是长上下文的“外推灾难”。
三、治标不治本:Position Interpolation (PI)
为了解决外推问题,学术界提出了 Position Interpolation (PI,位置插值)。
它的核心逻辑非常暴力:既然模型没见过超纲的位置,那就把长文本“压缩”回训练区间。
假设训练长度是 4K,目标长度是 32K,扩展倍率
PI 算法将所有新位置
| 实际位置 | 压缩后输入模型的位置 |
|---|---|
| 4096 | 512 |
| 8192 | 1024 |
| 32768 | 4096 |
PI 的致命缺陷:一刀切
PI 等价于把所有维度的频率统一缩小
但我们前面说过,高频维度负责捕捉相邻 Token 的精细顺序(局部语法、短距离依赖)。经过
这导致 PI 扩展后的模型,虽然能看长文了,但在短上下文任务上的基础能力出现了明显衰退。
四、YaRN 的优雅解法:分频施策
YaRN(Yet another RoPE extensioN)的作者敏锐地发现了 PI 的痛点:问题不在于压缩,而在于不应该对所有频率进行同等强度的压缩。
YaRN 提出了一个优雅的准则:保护局部能力,只拉伸远程能力。
4.1 频率分段策略
YaRN 根据维度的不同频率,采取了截然不同的处理方式:
- 高频部分(负责局部信息): 保持原样不压缩。
- 低频部分(负责全局信息): 按照扩展倍率缩放。
- 中间频率(过渡区): 引入一个权重因子
进行平滑过渡。
YaRN 巧妙地设计了一个 Ramp 函数 来计算
4.2 Attention Temperature 修正
频率调整完后,YaRN 的作者还发现了一个长上下文的通病:Attention 分布容易变得过于平坦(所有 Token 权重接近,无法聚焦关键信息)。
为此,YaRN 在标准 Attention 机制中引入了一个温度系数
通过放大点积的差异,强行让 Attention 的概率分布变得更加尖锐,从而大幅提升了模型在海量文本中的“长距离精确检索”能力。
五、YaRN 的微调范式与长文演进
5.1 极低成本的微调流程
使用 YaRN 扩展上下文长度非常轻量化,通常只需四步:
- 加载权重: 加载基础模型(如 Llama、Mistral)。
- 替换参数: 将原始 RoPE 频率公式替换为 YaRN 的分段频率公式。
- 输入长文: 喂入 32K、64K 甚至 128K 的长文本数据。
- 轻量继续训练: 通常只需要消耗十几亿到几十亿 Token 的算力,即可完成长文能力的适配,成本远低于从头预训练。
5.2 大模型长上下文技术的全貌
从宏观视角来看,RoPE 体系下的长文扩展技术脉络非常清晰:
- PI: 统一按比例压缩(牺牲了局部性能)。
- YaRN: 引入 Ramp 函数,分频率平滑压缩(兼顾了局部与全局)。
- LongRoPE / LongRoPE2: 微软提出的进一步优化方案,不再使用人工设定的固定规则,而是通过进化算法搜索最优的频率缩放策略,从而在短文本和超长文本(百万级 Token)之间取得更极致的平衡。
总结
YaRN 的成功,本质上是对 Transformer 位置编码底层逻辑的一次深刻回归。它基于一个极其直观但极易被忽略的事实:在 RoPE 的频率空间中,高频负责局部细节,低频负责全局轮廓。
通过构建巧妙的 Ramp 函数进行分段插值,再辅以 Attention 温度修正,YaRN 实现了“既要又要”:既保留了预训练模型强大的短文理解能力,又解锁了远超训练长度的长文处理空间。这也是为什么今天大量标榜支持 64K、128K 甚至更大上下文窗的开源大模型,其底层依然流淌着 YaRN 及其变种的血液。