跳转至

第 11 章 长上下文的困境

11.1 信息在哪里更容易丢

注意力对当前位置的 Query,给序列里每个 Key 打分,再经 softmax 变成一组和为 1 的权重。序列变长以后,参与归一化的位置变多:正确位置的 logit 若没有明显高于周围干扰,分到它上面的权重就被摊薄。经验上,开头与结尾更容易被用到,夹在中部的事实召回更差,文献里叫 Lost in the middle(Liu et al., 2023)。

长文档里还有大量重复、闲笔和互相打架的说法。即使用满窗口,模型仍要在这些位置里挑出该用的几句;窗口开大只增加候选,不自动提高挑中率。

11.2 远距离依赖为什么变弱

两处机制叠在一起。

一是上一节的权重摊薄:相关 token 隔得越远,中间夹着的无关位置越多,同样强度的 logit 更难在 softmax 里占到足够质量。

二是位置编码。RoPE 把相对距离写进 \(q^\top k\)。训练长度内出现过的旋转角,模型见过;位置差远超过训练长度时,角度落到分布外,远距离分数先不可靠。YaRN、调大 rope_theta、用长文继续训,改的是这一段。

因此「窗口写 128K」只说明实现接得下这么长的下标,远距离上的建模强度仍受训练长度和干扰量约束。多跳推理、跨章节对照一类任务,分数随长度掉得比大海捞针更快。

11.3 多长会顶满一张训练卡

先分清两笔账。

**KV 缓存(推理常驻)**随序列长度 \(n\) 线性增长:

\[ M_{\mathrm{KV}}=2BLn_{\mathrm{kv}}nd_hb_{\mathrm{kv}}. \]

以第 7 章的量级为例:36 层、MHA、\(h=n_{\mathrm{kv}}=32\)、\(d_h=128\)、bf16,大约 576 KB/token。A100 / H100 一类 80 GB 卡,若权重先占去约 16 GB(8B bf16),剩余六十多 GB 大约还能撑 十万 token 量级的单请求 KV;换成 GQA(\(n_{\mathrm{kv}}=8\))缓存约降到 1/4,同样显存可到数十万 token。并发 \(B>1\) 时按 \(B\) 倍乘上去,先顶满的是并发数。

Prefill 的注意力计算按 \(n^2\) 涨。不做分块时,实现里还会冒出 \(n\times n\) 的分数表;FlashAttention 把这块留在片上,显存峰值下来,配对数仍是 \(O(n^2)\)。训练还要加激活、梯度、优化器状态,同样长度下比纯推理更早触顶。粗算交叉点:投影与 FFN 约 \(O(nd^2)\),注意力约 \(O(n^2d)\),\(n\sim 6d\) 时两项同量级——\(d=4096\) 时大约两万多 token,之后 Prefill 时间明显被注意力拖住。

所以:顶满 80 GB 卡的,推理侧多半是线性涨的 KV;把首包时延和训练激活打爆的,是平方涨的注意力。