「支持 128K 上下文」是大模型发布会上的标准句式,但支撑这句话的算法故事要回溯到 2021 年:RoFormer 论文提出的旋转位置编码(RoPE)让模型以绝对位置的写法获得相对位置感知,随后成为 Llama、Qwen、DeepSeek 等几乎所有开源模型的标配。今天各家动辄百万的上下文窗口,本质上都是在回答同一个问题——模型只在几千个位置上训练过旋转角,如何让它处理一百万个位置而不崩溃。这篇深度解析拆解这条演进线上的四个算法与三类工程实践。
一、RoPE 的机制:给每两维一个旋转速度
RoPE 的做法是把向量的每两维看成一个二维平面,用与位置成正比的角度旋转 Q 和 K(V 不转)。旋转后的 Q 与 K 做内积,结果只依赖两个 token 的位置差——绝对位置的实现方式,相对位置的语义,且不引入任何可学习参数。各维的旋转频率按几何级数分布:θ_i = 10000^(−2i/d)——低维维度转得快(高频,编码细粒度的近距离关系),高维维度转得慢(低频,编码粗粒度的远距离关系),像一组不同指针速度的时钟。论文同时证明了旋转矩阵的正交性保证训练稳定,以及注意力分数随相对距离的长程衰减。
这个优雅设计的软肋在训练边界:模型只见过位置 0 到 L(比如 4096)以内的旋转角。推理时位置直接越界会发生什么?
小结:RoPE 把位置编码变成了一组「时钟」,扩展上下文的所有算法,本质都是在回答「时钟走太快了怎么办」。
二、直接外推的崩溃与位置插值的保守解
最朴素的方案——直接把超过训练长度的位置喂进去——已被反复证明是灾难:Meta 的位置插值(PI)论文实测,困惑度会飙到 10³ 以上、与未训练模型相当;论文还从理论上证明,外推的注意力分数上界比插值差约 600 倍。原因正是高频维:训练时没见过的旋转角让注意力分布完全失真。
PI 的解法是整条轴等比压缩:位置索引 m 缩放为 m·L/L′(L′ 是目标窗口)。原来 0–8192 的位置被压进 0–4096 的「训练见过」的区间,模型只需在拉伸后的位置分布上做少量适配。效果立竿见影:LLaMA 7B 到 65B 都能在 1000 步微调内从 4K 扩到 32K;对照组是只微调不插值——超过 10000 步,有效窗口也只从 2048 爬到 2560。但等比压缩有明确的物理代价:所有位置挤进更窄的区间,旋转角的分辨率整体下降,原窗口内的困惑度出现小幅回退,近距 token 的位置区分度被牺牲。
三、NTK-aware:不动秒针,放慢分针
2023 年 6 月,Reddit r/LocalLLaMA 社区用户 kaiokendev 提出了一个免微调的方案:不改位置索引,改各维的旋转频率——把基底 10000 整体放大为 b′ = b·s^(d/(d−2))(s 为放大倍数、d 为维度)。直觉图景是时钟:高频维(秒针)几乎不动,保住近距离的相对位置精度;低频维(分针时针)被放慢,让同一角度跨度覆盖更长的距离。这就是「高频分量近似外推、低频分量近似插值」的来历——位置精度与覆盖范围的负担被分配给了不同频率。
社区随后补充了动态版本(dynamic NTK):按当前序列长度实时计算缩放倍数,短序列不缩放、长序列才放大。这套方案不需要任何训练就能把 LLaMA 扩到 8K 以上,质量损失可控,在当时的小模型生态里被疯抢——Code Llama 就采用了手动放大幅度的 NTK 类缩放(base 提到 100 万),以 16K 微调实现约 100K 的推理上下文。
小结:PI 是「整条轴压缩」,NTK-aware 是「按频率区别对待」——后者把「插值还是外推」从全局决策变成了逐频率的局部决策,为 YaRN 铺了路。
四、YaRN:把分段插值做成可调公式,再补一个温度
YaRN(Nous Research 等,ICLR 2024)把社区的直觉变成了严格的分段公式。它先给每个维度算一个判据:该维波长 λ = 2π/θ 与目标上下文 L 的比值 r——波长比上下文短得多的高频维度,保持原频率不插值(它们在训练长度内已转了很多圈,外推无碍);波长达到或超过上下文的低频维度,执行纯插值(它们只转过一圈以内,外推就是盲区);中间地带用线性 ramp(α=1、β=32)平滑过渡。方向与很多人想当然的正好相反:高频动都不动,低频才压缩。
YaRN 的第二个组件解决插值的副作用:位置压缩会让注意力分数整体变大,需要给 softmax 降温。它引入一个随缩放倍数对数增长的温度因子(√(1/t) = 0.1·ln(s) + 1),对 Q/K 除以 √t。
效果数字是这条路线的标杆:Llama 2 7B 用 400 步(64K)加 200 步(128K)共约 600 步训练扩到 128K,YaRN 论文宣称比先前方法少一个数量级的 token、训练步数省 2.5 倍以上。今天它已是工业界标配:DeepSeek-V3 的两阶段上下文扩展(4K→32K→128K,各 1000 步)用的就是 YaRN——且只作用于 MLA 解耦出来的共享 RoPE 键(s=40),与 MLA 的结构严丝合缝;Qwen2.5 的 128K(7B 及以上)同样由「YaRN + DCA」组合在推理侧完成,官方消融显示 32K 以内模型行为完全不变。
2024 年 Microsoft 的 LongRoPE 又推了一层:不再手工定分段规则,用进化搜索逐维度寻找非均匀缩放因子,外加一个反直觉的发现——序列开头的 token 应该少插值甚至不插值(它们承担着锚定全文的作用)。LongRoPE 把 LLaMA 2 扩到了 2M 上下文,微调只用了 256K 长度内的约 1000 步。
小结:PI 定框架,NTK-aware 给直觉,YaRN 定公式,LongRoPE 上搜索——四步走完,RoPE 扩展从「能跑」变成了「可量产」。
五、大厂的三条路线:换 base、推理时外推、改架构
把 2024–2026 年各家旗舰的做法归类,RoPE 扩展实际收敛为三种姿势:
| 路线 | 代表做法 | 代价与特点 |
|---|---|---|
| 换大 base + 继续预训练 | Llama 3.1:base 提到 500K,6 阶段渐进到 128K(约 800B token) | 训练贵,但上下文能力是「原生」的 |
| 推理时外推 | Qwen2.5:YaRN + DCA 四倍扩展;DeepSeek-V3:两阶段 YaRN | 几乎免费,32K 内无损,依赖基座质量 |
| 架构改动 | Llama 4:iRoPE——每 4 层 1 层无位置编码的全局注意力层,其余 RoPE + 8K 分块 | 混合设计,宣称 10M 上下文(无技术报告支撑) |
第一种最豪华:直接把旋转频率标尺做长,再用 800B token 的继续预训练把能力「焊」进权重。第二种最经济:训练保持短上下文,部署时用 YaRN 系算法拉伸——Qwen 系还叠加了 DCA(把长序列切成块、块内块外分别处理相对位置),进一步压低成本。第三种最激进:Llama 4 干脆让一部分注意力层完全不要位置编码(全局关注),另一部分带 RoPE 但只看 8K 局部窗口,用分工换扩展性——10M 的官方宣称至今没有技术报告佐证,社区实测有质疑。
2025 年之后出现了第四种思路的苗头:既然外推有极限,就不追求每个 token 都被看见——DeepSeek-V3.2 的 DSA 用轻量索引器给历史 token 打分、每个查询只读 top-2048 个(复杂度从 O(L²) 降到 O(L·k));MiniMax-01 与 Qwen3-Next 用线性注意力层混合,前者训练 1M、外推宣称 4M。长上下文的战场正在从「位置编码怎么拉」转向「注意力怎么省着读」。
小结:三种主流路线对应三种预算——算力充足换原生能力,预算有限买推理时拉伸,激进者改架构分工;2025 年起稀疏与线性混合成为新的第四选择。
六、宣称窗口 ≠ 有效窗口
最后是必须泼的冷水:算法把「能喂进多少 token」撑上去了,不等于「模型真能用好这些 token」。RULER 基准(NVIDIA,2024)测了 17 个宣称 32K 以上上下文的模型,约一半在 32K 长度就达不到合格线——而它们在检索一句重复句子的朴素测试上几乎都满分,说明常见评测严重高估了有效上下文。NoLiMa(2025,ICML 2025)把测试难度再抬一层(去掉字面词汇重叠线索):13 个宣称 128K 的模型里 11 个在 32K 处跌破短文本基线的 50%,GPT-4o 从 99.3% 跌到 69.7%。OpenAI 自评的 GPT-4.1 在百万上下文处的检索成绩也只有约 50%。RULER 论文的结论值得抄在墙上:「名义上下文窗口是有效上下文窗口的糟糕代理」。
业界因此普遍把上下文窗口类比成工作记忆:它决定了模型「一次能拿着多少纸」,不保证「纸上的每处都被认真读过」。真正的长上下文能力 = 位置编码扩展(本文主角)+ 注意力效率 + 训练数据分布三者相乘——任何一环拉胯,宣称的数字都只是包装。
小结:YaRN 们解决的是「喂得进去」,RULER 们提醒的是「用得起来」;评估长上下文,请看有效窗口的实测,不看宣传页的数字。
参考资料
- RoFormer: Enhanced Transformer with Rotary Position Embedding(arXiv 2021-04) — RoPE 原始论文:旋转矩阵、相对位置性质与频率分布。
- Extending Context Window via Positional Interpolation(arXiv 2023-06) — PI 的公式、1000 步微调与外推崩溃的理论界。
- YaRN: Efficient Context Window Extension(arXiv 2023-09) — 分段插值公式与温度缩放(ICLR 2024)。
- LongRoPE: Extending LLM Context Window Beyond 2M(arXiv 2024-02) — 逐维进化搜索与首 token 少插值。
- The Llama 3 Herd of Models(arXiv 2024-07) — base 500K 与 6 阶段长上下文预训练的官方描述。
- Qwen2.5 Technical Report(arXiv 2024-12) — YaRN + DCA 推理侧扩展的工业实践。
- DeepSeek-V3 Technical Report(arXiv 2024-12) — 两阶段 YaRN 只作用于解耦共享键的细节。
- RULER: What Is the Real Context Size of Your Long-Context Models?(arXiv 2024-04) — 有效上下文与宣称窗口差距的基准证据。
读者留言
COMMENTS 暂无还没有留言,来说第一句?