Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Long Context: 长上下文能力通常在改什么?

这一节单独把“长上下文”拿出来讲,因为它很容易被说成一个单一问题,但实际上它往往是好几类问题叠在一起:

  • 序列变长之后,attention 本身更贵了
  • 位置信息如何表示会变得更敏感
  • 推理时 KV cache 会更大
  • 模型在超出原训练长度后,表现还可能明显退化

这一节准备回答几个问题:

  1. 为什么长上下文会变成单独的优化方向?
  2. 长上下文问题通常不只是“attention 太慢”这么简单
  3. YaRN 这一类工作大致在改什么?
  4. 看长上下文优化时,应该抓住哪些主线?

Q1: 为什么长上下文会变成单独的优化方向?

因为序列一长,很多原本不明显的问题会一起放大。

比如:

  • attention 的中间矩阵更大
  • 训练和推理的显存压力更高
  • KV cache 更容易成为瓶颈
  • 原本的位置表示方式未必还能稳定工作

所以“把上下文从 2k 拉到 32k、128k,甚至更长”并不是一个只改配置文件的小动作。
它通常会牵涉到:

  • 位置建模
  • attention 实现
  • 推理缓存
  • 训练分布和泛化能力

Q2: 长上下文问题通常不只是“attention 太慢”这么简单

如果只从计算复杂度看,attention 的一个核心瓶颈是:

$$ QK^\top \in \mathbb{R}^{n \times n} $$

所以随着 \( n \) 增长,计算和存储压力都会迅速上升。
但在真实模型里,长上下文问题往往至少有两层:

  1. 能不能算得动
  2. 算得动之后,结果还好不好

第一层偏工程:

  • 显存够不够
  • attention 是否足够高效
  • KV cache 会不会爆

第二层偏建模:

  • 位置关系在更长范围里还能不能稳定表达
  • 模型有没有在训练时真正见过足够长的上下文
  • 超出原训练长度后性能会不会快速掉下去

所以长上下文优化不能只盯着一个公式看,而要同时看“算力”和“表示能力”。

Q3: YaRN 这一类工作大致在改什么?

像 YaRN 这一类方法,通常可以粗略理解成:

  • 它们不是重新定义 Transformer
  • 而是在想办法让已有的位置建模方式,尤其是像 RoPE 这样的方案,更平滑地扩展到更长上下文

换句话说,它们更关心的是:

  • 长度拉长后,位置表示如何继续保持可用
  • 如何减少超出原训练长度后的性能退化

所以如果把它和 FlashAttention、KV Cache 放在一起看,会发现它们关注的重点并不一样:

  • FlashAttention 更偏实现效率
  • KV Cache 更偏推理复用
  • YaRN 这类方法更偏长上下文下的位置建模与泛化

Q4: 看长上下文优化时,应该抓住哪些主线?

如果只保留几个最核心的观察,我会更倾向于抓下面几条:

  1. 长上下文首先是一个系统问题,而不是某个单一模块的问题。
  2. 很多工作表面都在讲“支持更长长度”,但实际可能分别在改:
    • 位置表示
    • attention 实现
    • 推理缓存
    • 训练策略
  3. 判断一种长上下文方案时,至少要同时问两件事:
    • 它让模型更长,是因为更省资源了?
    • 还是因为位置建模本身更稳了?

这一节之后最重要的收获是什么?

如果只保留最重要的几点,我觉得是:

  1. 长上下文不是一个单点技巧,而是一组互相耦合的问题。
  2. 它既涉及 attention 的计算效率,也涉及位置表示和训练泛化。
  3. 像 YaRN 这样的工作,更适合放在“长上下文扩展”这条线上理解,而不是和所有 attention 优化混成一类。

所以如果后面看到“长上下文优化”这类说法,最好先追问一句:

  • 这次优化主要是在解决算不动,还是在解决拉长之后不稳定?