Long Context: 长上下文能力通常在改什么?
这一节单独把“长上下文”拿出来讲,因为它很容易被说成一个单一问题,但实际上它往往是好几类问题叠在一起:
- 序列变长之后,attention 本身更贵了
- 位置信息如何表示会变得更敏感
- 推理时 KV cache 会更大
- 模型在超出原训练长度后,表现还可能明显退化
这一节准备回答几个问题:
- 为什么长上下文会变成单独的优化方向?
- 长上下文问题通常不只是“attention 太慢”这么简单
- YaRN 这一类工作大致在改什么?
- 看长上下文优化时,应该抓住哪些主线?
Q1: 为什么长上下文会变成单独的优化方向?
因为序列一长,很多原本不明显的问题会一起放大。
比如:
- attention 的中间矩阵更大
- 训练和推理的显存压力更高
- KV cache 更容易成为瓶颈
- 原本的位置表示方式未必还能稳定工作
所以“把上下文从 2k 拉到 32k、128k,甚至更长”并不是一个只改配置文件的小动作。
它通常会牵涉到:
- 位置建模
- attention 实现
- 推理缓存
- 训练分布和泛化能力
Q2: 长上下文问题通常不只是“attention 太慢”这么简单
如果只从计算复杂度看,attention 的一个核心瓶颈是:
$$ QK^\top \in \mathbb{R}^{n \times n} $$
所以随着 \( n \) 增长,计算和存储压力都会迅速上升。
但在真实模型里,长上下文问题往往至少有两层:
- 能不能算得动
- 算得动之后,结果还好不好
第一层偏工程:
- 显存够不够
- attention 是否足够高效
- KV cache 会不会爆
第二层偏建模:
- 位置关系在更长范围里还能不能稳定表达
- 模型有没有在训练时真正见过足够长的上下文
- 超出原训练长度后性能会不会快速掉下去
所以长上下文优化不能只盯着一个公式看,而要同时看“算力”和“表示能力”。
Q3: YaRN 这一类工作大致在改什么?
像 YaRN 这一类方法,通常可以粗略理解成:
- 它们不是重新定义 Transformer
- 而是在想办法让已有的位置建模方式,尤其是像 RoPE 这样的方案,更平滑地扩展到更长上下文
换句话说,它们更关心的是:
- 长度拉长后,位置表示如何继续保持可用
- 如何减少超出原训练长度后的性能退化
所以如果把它和 FlashAttention、KV Cache 放在一起看,会发现它们关注的重点并不一样:
- FlashAttention 更偏实现效率
- KV Cache 更偏推理复用
- YaRN 这类方法更偏长上下文下的位置建模与泛化
Q4: 看长上下文优化时,应该抓住哪些主线?
如果只保留几个最核心的观察,我会更倾向于抓下面几条:
- 长上下文首先是一个系统问题,而不是某个单一模块的问题。
- 很多工作表面都在讲“支持更长长度”,但实际可能分别在改:
- 位置表示
- attention 实现
- 推理缓存
- 训练策略
- 判断一种长上下文方案时,至少要同时问两件事:
- 它让模型更长,是因为更省资源了?
- 还是因为位置建模本身更稳了?
这一节之后最重要的收获是什么?
如果只保留最重要的几点,我觉得是:
- 长上下文不是一个单点技巧,而是一组互相耦合的问题。
- 它既涉及 attention 的计算效率,也涉及位置表示和训练泛化。
- 像 YaRN 这样的工作,更适合放在“长上下文扩展”这条线上理解,而不是和所有 attention 优化混成一类。
所以如果后面看到“长上下文优化”这类说法,最好先追问一句:
- 这次优化主要是在解决算不动,还是在解决拉长之后不稳定?