长文本的 KV 还能再压吗?(揭晓锚点另外 48 层)
本课一问:长文本的 KV 还能再压吗?锚点 Qwen3.8 的另外 48 层是什么?
这一课先不碰:只读一部分 KV 的稀疏注意力(第 5 课);训练时怎么把长度拉长(第 6 课);Gated DeltaNet 分块并行算法的推导(Dig 里只讲结论)。
从已有出发
三条已经埋下的线,在这一课汇合:
- C3 第 8–10 课:锚点每 token 的 KV 是 16 层 × 2 × 4 个 KV 头 × 256 × 2 字节 = 64 KiB,可锚点有 64 层——那一课的 Callout 说,另外 48 层「根本不存 KV」。
- C0 岔路:去掉 softmax,注意力可以写成一个固定大小的状态 S 往下传(线性注意力 = RNN);但 d × d 的状态最多装 d 对互不干扰的键值(容量墙)。那一课留了三个问题给这里:它怎么写入与遗忘?3:1 是怎么选的?它用不用位置信息?
- C2 第 4 课:「RoPE 只在 16 个全注意力层起作用,另外 48 层不用 RoPE」——这句话一直没核实。
先用贯穿例句算一笔反直觉的账。「小明把苹果给了小王」只有 5 个 token:16 层全注意力的 KV 只有 5 × 64 KiB = 320 KiB;可那 48 层的固定状态不管输入多短都是 144 MiB,是「这 48 层若也做全注意力」时 KV 的 153.6 倍。短句上,固定状态反而更占地方;过了 768 个 token,它才开始省(下面的账本会画出这个交叉点)。
先自己设计:只加不减的线性注意力
C0 岔路的版本:每读一对「键 k → 值 v」,就把外积 k vᵀ 加进状态;要读时用 q 去乘状态。这一课换一个例子,原因是:要看「写入与遗忘」,需要同一个键被写两次、需要键多到超过状态的维度,贯穿例句的 5 个 token 都做不到。下面用 4 × 4 的状态和教学构造的单位向量:
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
试三件事(在改进一侧):① 点「写完整串」,读 A:只 delta 与衰减 + delta 的误差都是 0.000——写 v4 之前先把 A 方向上的旧值 v1 读出来减掉;② 看读 B:只 delta 是 0.000,衰减 + delta 是 0.360——每步乘 α = 0.8,B 写入后又过了两步,门的代价是忘掉旧的;把 α 拖到 1.00,衰减 + delta 就和只 delta 一样;③ 切到「② 连写 12 对」:12 对塞进 4 × 4 的状态,谁都读不全,但只看最近写的 3 对,衰减 + delta 的误差最小(0.274),加法最大(1.280)。装不下的时候,先擦再写、再让旧的慢慢淡出,最近的才读得清。
改进:delta rule 加上衰减门
第一步,delta rule(Schlag 等人 2021,把线性注意力和上世纪 90 年代的「快速权重」联系起来):写之前先用 k 从状态里读出旧值 Sᵀk,只写差额 β(v − Sᵀk)。β = 1 时就是精确改写。摘要里把它叫作「让网络更容易修正当前的键到值的映射」 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条它先推出纯加法写入的容量局限,再用 delta rule 改写入指令;好不好是实验验证。 出处Schlag et al. 2021 摘要(需联网) ↗需联网 。
第二步,衰减门:每一步先把整个状态乘一个 α ∈ (0, 1),让旧内容整体淡出——这是 Mamba2 那一族的门。两者互补:Yang、Kautz、Hatamizadeh 2024 的摘要原话大意是「门控让记忆能被快速清空,delta rule 让更新有的放矢」,合起来就是 Gated DeltaNet 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条作者自报:在语言建模、常识推理、上下文检索、长度外推上超过 Mamba2 与 DeltaNet。 出处Gated Delta Networks · Yang et al. 2024(需联网) ↗需联网 。它不是 Qwen 发明的;Qwen 的贡献是在 Qwen3-Next(2025-09)里第一次把它和全注意力按 3:1 做成前沿规模的量产架构,Qwen3.5 推广到全系,Qwen3.8 沿用(R2 核对)。
揭晓:锚点的 48 层 Gated DeltaNet
逐项对着 Qwen3.8 的 config 与 HF transformers 的源码(models/qwen3_5/modeling_qwen3_5.py,Qwen3_5GatedDeltaNet)看:
一个头、一步更新的形状(真实维度;可切回 4 × 4 的小规模):
| 维度 | 含义 | 真实规模 | 小规模 |
|---|---|---|---|
| dk | linear_key_head_dim | 128 | 4 |
| dv | linear_value_head_dim | 128 | 4 |
这 48 层每层的参数是 115,876,064,比一层全注意力(104,858,112)还多(C4 岔路的账)。线性注意力省的是 KV 和长序列的计算,不是参数。
3:1 混合:KV 降到 1/4
试三件事:① 锚点:T 拖到 262,144(原生上下文),实际 16 GiB 多一点(KV + 144 MiB 状态),全换成全注意力要 64 GiB——3:1 让 KV 降到 1/4;② 把 T 拖回 5 和 256:实际反而比「全是全注意力」大,绿点就是交叉点 T* ≈ 768;③ 切到 Kimi K3 与 GLM-5.3-Flash:同样约 3:1,但全局层用的是 MLA(每 token 存一个压缩潜向量),KV 本来就小,交叉点被推到几千个 token。
为什么不干脆全换成线性层? 三条证据,分属三层:
- 可证明的下界:2026 年的一篇理论工作证明,对「多步函数复合」这类必须在一次前向里完成的推理,L + 1 层全注意力就够;而只含 L − 1 层全注意力的混合网络,配再多线性层也做不到 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条适用于所有能写成递推的线性注意力(Mamba、DeltaNet 等);它说明全局层不能省,但没有给出最优比例。 出处Ye et al. 2026 · 混合注意力的表达力分层(需联网) ↗需联网 。
- 负面经验:MiniMax-01(2025-01,456B / 45.9B)用 lightning 线性注意力混合;M2 却退回了全注意力。预训练负责人的博客给的理由:小规模榜单上混合和全注意力一样好,放大后在复杂多跳推理上暴露缺陷;线性注意力训练时受访存限制、对数值精度更敏感;还要解决前缀缓存与投机解码 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条一家公司的一手经验,不是对照实验。 出处MiniMax 官方博客 2025-10-29(需联网) ↗需联网 。
- 正面经验:Kimi Linear(2025-10,48B / 3B)在公平比较下第一次超过全注意力;Qwen 在 25B-A3B 的 MoE 上比较,GDN 混合平均 53.81、全注意力 49.87(C0 岔路引用过)。3:1 这个比例本身没有推导,是实验选出来的。
常见误解一:「线性注意力就是更粗糙的 softmax 注意力。」 它是另一种记忆:固定容量、按 delta 改写、按门遗忘。全注意力能精确回看任意一个 token;线性层只能读回「现在状态里还剩什么」。
常见误解二:「GDN 层也做 RoPE。」 源码核实:只有全注意力层接收位置编码。GDN 的顺序来自递推与短卷积——这也是 Kimi K3、GLM-5.3-Flash 敢让全局层干脆不用位置编码(NoPE)的理由之一(C2 第 5 课)。
常见误解三:「线性注意力在任何长度都更省。」 锚点短于 768 个 token 时,144 MiB 的固定状态比「这 48 层若也做全注意力」时的 KV 还大;MiniMax 博客也说,理论交叉点在「几千个 token」。
常见误解四:「线性注意力省参数。」 锚点一层 GDN 115,876,064 个参数,比一层全注意力还多。
再往前一步:KDA 与一个下界
Kimi Linear 的 KDA 把 α 从「每个头一个标量」细化成「每个通道一个」。旧版课程拆过它的公式,逐项保留:
🔍 一个下界为什么能提速:g_min = −5
KDA 的分块算法要把 key 按块内累积衰减的倒数重新缩放。Kimi Linear 与 Gated DeltaNet 一样用 g = −eA·softplus(z),取值 (−∞, 0) 没有下界,倒数可能超出浮点范围,于是每个对角块只能单独逐位置计算——这条慢路径成了整个算子的瓶颈。K3 改成 g = gmin·sigmoid(eAz),gmin = −5:每一步的保留因子 α > e−5 ≈ 6.7 × 10⁻³,16 个 token 一块的累积对数衰减落在 (−80, 0),倒数小于 e80 ≈ 5.54 × 10³⁴,在 BF16 的上限 3.39 × 1038 之内。所有块都能直接走 Tensor Core 的矩阵乘,慢路径删掉 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条数值范围是可证明的;提速多少是官方自报。 出处Kimi K3 §2.1.1 式 (5)、图 3(本地 PDF) ↗ 。
🔍 固定状态是递推的,训练时怎么并行?
逐 token 递推只在推理时用(源码的 torch_recurrent_gated_delta_rule)。训练时把序列切成 64 个 token 一块(torch_chunk_gated_delta_rule 的默认 chunk_size):块内用矩阵乘一次算完(需要解一个 64 × 64 的下三角方程,UT 变换),块与块之间才递推传状态。所以训练的显存里只有 64 × 64 的块内矩阵,没有 T × T 的分数表。推导见 Songlin Yang《DeltaNet Explained (Part II)》。
① 更多参数,不要更多算力(MoE)
- 解决了结构最简单:所有参数对每个 token 都生效。卡在锚点 Qwen3.8-27B 每 token 前向约 51.2 GFLOPs;同家族 2.4T 规模若是 dense,约 4.84 TFLOPs(94 倍)。
- 解决了每个 token 只算 top-k 个专家:Qwen3.8-2.4T-A95B 每 token 约 186.5 GFLOPs,是同参数 dense 的 26 分之一。卡在路由会自我强化地偏心:8 个专家全挤到 1 个时,Switch 负载损失从 0.01 升到 0.08;所有专家的权重仍要常驻显存。
- 解决了把「均衡」写进 loss,路由器被梯度推向均匀。卡在α 难调:太小拉不平,太大干扰主 loss(Switch 在 10⁻¹ 到 10⁻⁵ 之间扫;Wang 2024 的出发点)。
- 解决了偏置只改「选谁」,不进门控、不产生干扰梯度;DeepSeek-V3 前 14.3T token 用 γ = 0.001,最后 500B 设为 0。卡在固定步长在近千个专家时太慢或来回震荡(Kimi K3 报告)→ Quantile Balancing;而且统计范围(整批 vs 单条序列)比「有没有 loss」更要紧。
- 解决了同参数同计算,16 选 2 的 120 种组合变成 64 选 8 的 4,426,165,368 种;共享专家装公共知识。卡在显存账不减:Qwen3.8-2.4T 路由专家占主干参数 97.98%,BF16 权重 4.89 TB。
- 解决了Qwen3.8-2.4T 512 选 10 + 1 共享;K3 896 选 16 + LatentMoE + Quantile Balancing;V4.1 图文两套偏置。卡在共享专家 0、1、2 个都有人用(Qwen3 一个不设),稀疏度从 32 到 64 都有(GLM-5.3 与 V3 为 32、GLM-5.3-Flash 36、K2 48、Qwen3.8 51、K3 56、V4.1-Flash 64)——都是实验选择。
② 长文本:KV 与计算不再随长度等比例涨
- 解决了每个 token 都能精确回看任意一个前文 token。卡在KV ∝ 长度:锚点若 64 层全是全注意力,262,144 token 时 64 GiB。
- 解决了去掉 softmax,求和提前累加成一个固定大小的状态,与长度无关。卡在只加不减:同一个键写两次,读回的是两个值之和;状态最多装 d 对互不干扰的键值(C0 岔路)。
- 解决了写前先擦(delta)、每步衰减(门):锚点 48 层状态共 144 MiB(FP32)、与长度无关;KV 降到四分之一(262,144 时 16 GiB 对 64 GiB)。卡在剩下四分之一的全注意力层仍按长度涨;容量有限,3:1 是实验选出来的。
- 解决了每通道一个衰减;g_min = −5 让 16 token 块内累积不低于 −80,e⁸⁰ ≈ 5.5 × 10³⁴ 在 BF16 范围内(上限约 3.4 × 10³⁸),慢路径删除。卡在MiniMax M1 用线性混合、M2 又退回全注意力:大规模下多跳推理缺陷、训练受访存限制、低精度与缓存难题(官方博客)。
- 解决了lightning indexer 每个 query 只挑 top-2048 条做核心注意力。卡在省计算不省内存:KV 一条不少,每 token 48,068 B;indexer 本身仍要扫全部前文。
- 解决了V3.2 每 token 48,068 B → V4-Flash 3,514 B → V4.1-Flash 890 B(1M 时 0.87 GiB)。卡在是近似:V4.1 自陈 Bounded Replay「数学上不等价」、选择误差可能在未测过的边界情况退化。
③ 训练 4K,使用 128K
- 解决了训练与使用同一个长度,不需要任何折算。卡在注意力项随长度涨:Qwen3-32B(64 层全注意力)在 131,072 时注意力项是 6N 的 215%;早期长序列还带来梯度方差极端值(Li 2021)。
- 解决了DeepSeek-V3 的 14.8T token 全在 4K,之后两段各 1,000 步扩到 32K、128K,只占全部训练 token 的 0.84%;Llama 3 405B 六段、约 800B token。卡在长序列阶段的数据要专门配(长度上采样、领域均衡、合成跨全文任务)。
- 解决了K3:8K → 64K → 256K → 1M(NoPE 也照走课程);V4.1 注意力从头就是压缩稀疏的,直接从 64K 起训。卡在各家配方大多只公开阶段、不公开每段 token 数,无法横向比较成本。
- 解决了每个位置多学一个更远的目标;推理时当草稿,接受率 α 时每步期望产出 1 + α 个 token。卡在DeepSeek-V3 第 2 个 token 接受率 85%–90%,实测 1.8 倍 TPS;V4.1 预训练干脆去掉 MTP,没有公开消融。
证据三问
| 问 | 本课的回答 |
|---|---|
| ① 它解决什么问题? | 让大多数层的「记忆」不随长度增长:锚点 3:1 混合,KV 降到全注意力的 1/4,长序列的注意力计算也只剩 1/4 的层 |
| ② 数学上为什么可能有效? | 状态大小 dk × dv 与长度无关 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条由递推式直接得出。 出处待补 ;delta rule 精确改写、门控遗忘让有限容量用在最近、最相关的内容上 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条动机与小规模验证;容量上限本身可证(C0 岔路)。 出处Gated DeltaNet(需联网) ↗需联网 ;全局层不能全省有下界证明 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条只证明必须保留,不给比例。 出处arXiv 2602.01763(需联网) ↗需联网 |
| ③ 实验上为什么最后选了它? | Kimi Linear 公平比较超过全注意力;Qwen 的 25B-A3B 消融;2026 年 Qwen3.8、K3、GLM-5.3-Flash 都用约 3:1(Ling-3.0 是 5:1)。反例:MiniMax M2 退回全注意力 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条全部为作者自报;3:1 是经验值。 出处Kimi Linear;Qwen3.8-Flash-Next 报告;MiniMax 博客(需联网) ↗需联网 |
一句话
Gated DeltaNet 用固定大小的状态记前文:写之前先擦掉同一个键的旧值,每步整体衰减一点;锚点每 4 层留 1 层全注意力,KV 降到 1/4,代价是容量有限、精确回看靠那 1/4。
先停在这里:记住三个数:每头 128 × 128、48 层共 144 MiB、交叉点 768 token。
再深一层:读 Songlin Yang 的 Part I,再在实验台的「连写 12 对」里把 β、α 各拖一遍,体会「擦多少、忘多快」的权衡。
下一个缺口
线性层砍掉了 3/4 的 KV,剩下 1/4 的全注意力层仍按长度增长——能不能每次只读一部分? → 第 5 课:稀疏注意力省了什么,没省什么?
C3 第 10 课 KV 阶梯末尾那张 890 字节的虚线卡,也在下一课兑现。
你可能会问
- 「前缀缓存(同一段系统提示多个请求共用)对线性层怎么做?」 KV 可以按 token 截断复用,固定状态只能存某几个位置的快照;K3 为此做了 KDA 感知的前缀缓存,MiniMax 的博客把它列为难点之一。服务端的细节在 C13。
- 「为什么 V 头(48)比 QK 头(16)多?」 config 如此:每个 QK 头被 3 个 V 头共用,状态按 V 头算(48 块)。官方没有解释这个比例;作用类似 GQA,用更少的 key 维度支撑更多的值通道。
- 「Kimi K3、GLM-5.3-Flash 的全局层为什么不用 RoPE,Qwen 却保留?」 两条路线都做到了百万级上下文,是 2026 年分歧最大的地方之一,见 C2 第 5 课的 NoPE 一节。