# 读 YaRN：长上下文扩展，核心不是硬拉窗口，而是别把 RoPE 拉坏了


如果只把 `YaRN` 看成“又一个把上下文从 `4k` 拉到 `64k/128k` 的技巧”，其实有点可惜。

它真正碰到的，是一个比“扩窗”更本质的几何问题：

**模型原本已经习惯了一套位置相位系统。现在你强行把长度拉大，怎样才能让这套系统在更长范围内继续工作，同时尽量不丢掉近距离的位置分辨率？**

这个问题一旦说清楚，`YaRN` 的设计就会显得非常自然。

<!--more-->

## 1. Task

把术语都拿掉，`YaRN` 要解决的问题可以形式化成一句话：

**给定一个在长度 `L` 上训练好的 `RoPE`-based Transformer，寻找一种新的位置映射，使模型在长度 `sL` 上仍然能稳定区分位置，并且尽量保持原来在短程区间里的注意力几何。**

更具体一点，可以把原始位置编码看成一组频率为 `omega_i` 的相位系统。  
原始相位是：

`theta_i(p) = omega_i * p`

现在我们要找新的相位函数 `theta'_i(p)`，满足三个条件：

1. 当 `p` 在原始训练区间 `[0, L]` 内时，`theta'_i(p)` 和 `theta_i(p)` 尽量一致。
2. 当 `p` 扩展到更长区间 `[L, sL]` 时，相位不要严重混叠，模型还能分清不同位置。
3. 对小的相对位移 `delta p`，尤其是局部顺序关系，分辨率不能被明显压扁。

如果再往模型层面写，可以理解为要让新的注意力核 `K'(p, q)` 满足：

- 在短程上，`K'(p, q)` 尽量逼近原始的 `K(p, q)`
- 在长程上，`K'(p, q)` 仍然保持可区分、可泛化
- 训练和推理代价尽量小

所以这不是一个简单的“把窗口数字改大”的问题，而是一个**带约束的多尺度几何延拓问题**。

## 2. Challenge

传统方法最自然的思路是 `Positional Interpolation (PI)`：

- 原来模型只会处理长度 `L`
- 现在想处理长度 `sL`
- 那就把更长的位置压回原来的坐标范围

这个想法直觉上很美，但它有一个第一性原理上的缺陷：

**它把所有频率维度都当成了同一种东西。**

可 `RoPE` 不是一把尺子，而是一整组不同频率的尺子：

- 高频维度更像显微镜，负责近距离和细粒度位置
- 低频维度更像望远镜，负责远距离和粗粒度范围

如果所有频率一起线性压缩，就会出现三个问题：

1. 远程范围是扩了，但近程分辨率也一起被磨平。
2. 高频成分先失真，局部顺序感最容易坏。
3. 位置变换是固定的，而自回归生成长度是动态增长的，两者天然不匹配。

后来 `NTK-aware` 已经意识到“不能一刀切”，但它更像一个全局修正，还没有把问题彻底还原成一个多尺度系统。

所以传统方法真正卡住的点不是“不会扩窗”，而是：

**没有优雅地处理不同频率在长短程中的不同职责。**

## 3. Insight & Novelty

### 3.1 Inspiration

`YaRN` 背后的启发，本质上来自两个非常常识的直觉。

第一，信号处理的直觉：

- 高频负责细节
- 低频负责轮廓
- 重采样时最怕先把高频细节抹掉

第二，生成过程的直觉：

- 自回归推理不是一下跳到 `128k`
- 而是从短到长一点点长出来

这两个常识放在一起，就已经很接近 `YaRN` 的核心了。

### 3.2 Insight

我觉得这篇论文真正有价值的 Insight 有三个。

#### Insight 1：长上下文问题首先是频率失真问题

这条 Insight 受“高频保细节、低频保范围”的信号处理直觉启发。

它修正了一个常见误解：

> 长上下文不是单纯把位置从 `4k` 拉到 `64k`，而是决定哪些频率该保、哪些频率该伸、哪些频率该过渡。

这是一种关于**位置几何**的 Insight。

#### Insight 2：不同频率不该承受同样的拉伸

这条 Insight 也是从多尺度信号直觉来的，只不过更进一步。

如果高频主要负责局部关系，那就应该尽量保护；  
如果低频主要负责远程范围，那就更适合承担扩展；  
中间频率则做平滑过渡。

这是一种关于**多尺度职责分工**的 Insight。

#### Insight 3：长度缩放应该跟着真实生成长度走

这条 Insight 受“生成长度是动态增长的”这个过程直觉启发。

既然模型在推理时是从短到长自然展开的，那位置缩放也不该从头到尾固定。  
短的时候过早扭曲，纯属白白损失局部分辨率。

这是一种关于**推理过程与位置系统耦合方式**的 Insight。

### 3.3 Novelty

作者的 Novelty 主要不是架构级的，而是**方法级和策略级**的。

没有发明新 Transformer，也没有改 attention 主体结构。  
真正的创新在于：围绕 `RoPE` 的多尺度失真问题，给出了一套更细、也更顺的修正方案。

严格按你的格式来写：

【统一插值会压扁局部位置信号】 -> 【受 Insight 1 和 Insight 2 启发：频率职责不同，不能统一处理】 -> 【设计了 `NTK-by-parts` 风格的分段频率缩放：高频尽量少动，低频承担长程扩展，中间频率平滑过渡】

【固定缩放因子会让短序列也提前承受长上下文失真】 -> 【受 Insight 3 启发：生成长度本来就是动态增长的】 -> 【设计了 `Dynamic Scaling` / `Dynamic YaRN` 思路，在每次 forward 时按当前真实序列长度更新缩放因子，而不是全程固定一个比例】

【位置坐标系变了之后，attention logits 的数值分布也会跟着变】 -> 【受 Insight 1 启发：几何变化最终会反映成注意力数值变化】 -> 【加入 attention temperature / length scaling 修正，让长上下文下的 softmax 行为更稳定】

【长上下文适配往往需要大量训练 token 和训练步数】 -> 【受前面三个 Insight 共同启发：真正要修的是位置系统，而不是把整个模型重新训练一遍】 -> 【把创新点尽量收束在 `RoPE` 及其配套缩放策略上，做到训练便宜、推理几乎无额外开销】

## 4. Potential Flaw

### 4.1 当前情境的局限，以及能否延伸到新情境

`YaRN` 的解决情境其实有明确边界：

- 模型是 `RoPE`-based Transformer
- 主要问题是位置几何在长程扩展时失真
- 希望用很低的代价把上下文拉长

这很强，但也很局部。

它没有直接回答这些更难的情境：

- 如果模型不是 `RoPE`，而是别的位置系统怎么办？
- 如果是视频、音频、3D 场景这种多维位置坐标怎么办？
- 如果不只是长度变长，而是条件、约束、模态都在变怎么办？

这些都可以往外延：

- 多维 `RoPE` 或 Fourier 位置系统的各向异性扩展
- 长视频建模里的时间-空间联合缩放
- 检索、记忆、压缩模块和位置系统的联合设计

### 4.2 数据如果有什么坏性质，会特别困难

在当前情境下，如果数据有下面这些性质，问题会明显变难：

- 远距离片段高度相似，语义上又非常细微地不同
- 关键证据埋在极长文本的局部角落，需要很细的定位
- 任务不是“看见更远”，而是“跨很远距离做组合推理”
- 文本里存在大量模板化重复，容易让模型误把位置相似当语义相似

这时哪怕位置系统没坏，模型也可能依然不会用。  
因为困难已经从“坐标失真”转移到“信息选择、记忆分配和长程推理”。

### 4.3 哪种困难最值得挖成 paper

最值得深挖的，是下面这条：

**怎样把位置系统修正、长文本训练信号、以及模型对超长依赖的实际利用能力一起联合优化。**

这件事有论文价值，因为它正好补上 `YaRN` 的边界：

- `YaRN` 解决的是“别让坐标先坏”
- 下一篇更深的论文，应该解决“坐标修好了以后，模型怎样真正学会用它”

## 5. Motivation

如果顺着第一性原理去想，`YaRN` 的 general idea 其实可以被一连串问句很自然地推出：

- 之前的方法只是把位置统一压缩，那为什么一扩到很长就容易坏？
- 坏的到底是“长度不够”，还是“位置几何失真”？
- 如果 `RoPE` 本质上是一组不同频率的相位系统，那为什么所有频率要承受同样的拉伸？
- 高频本来就在服务局部细节，那可不可以尽量少动它？
- 低频本来就在服务长程范围，那是不是更适合拿来承担扩窗？
- 介于中间的频率，如果既承担局部又承担远程，那是不是应该平滑过渡，而不是一刀切？
- 既然自回归生成本来就是从短到长长出来的，那缩放因子为什么要全程固定？
- 如果位置坐标变了之后，attention 的数值温度也会变，那可不可以顺手把 temperature 一起调掉？
- 如果真正要修的是位置系统，而不是整个模型，那可不可以把改动都收束在最小的那一圈上？

顺着这些问句走下去，`YaRN` 几乎就是最自然、也最省力的答案。

## 参考链接

- [YaRN: Efficient Context Window Extension of Large Language Models - arXiv](https://arxiv.org/abs/2309.00071)
- [YaRN - ar5iv HTML 版](https://ar5iv.labs.arxiv.org/html/2309.00071)
- [Extending Context Window of Large Language Models via Positional Interpolation - arXiv](https://arxiv.org/abs/2306.15595)

