注意力 · 长上下文讲义
DeepSeek-V4 / Qwen / DeepSeek-V3.2 / MiniMax

历史怎么存,
当前读哪里?

从两本账看懂长上下文注意力:压缩减少长期记忆的条目,稀疏减少每次读取的位置。CSA/HCA 与 QSA、DSA、MSA,真正分歧在这里。

存 · KV cache 有多大?

DSA/QSA/MSA 通常保留逐位置历史;V4 把长期 KV 汇聚成更少的表示。

读 · 这个 query 要看谁?

DSA 选 token,QSA 选微块,MSA 按组选大块;CSA 选摘要,HCA 通读摘要。

先建立共同坐标

少存,与少算,不是同一个优化。

存储账:所有历史留下什么

历史 token 的 Key / Value 被缓存下来。条目数量、每条特征宽度、KV 头数、精度与层数,共同决定显存开销。

缓存量 ∝ 层数 × 历史条目数
    × 每条 KV 字节数

读取账:当前 query 用到什么

注意力给可读位置分配权重,再汇总 Value。稀疏方案先挑位置,让昂贵的主计算只读取一个小集合。

Attention = softmax(qKᵀ / √d)V
稀疏后,K、V 只取所选子集
缓存里有,不等于这次读;这次没读,不等于可以删。
后续 query 可能重新选中历史位置。MLA/GQA 缩减每位置的特征存储或 KV 头数,和沿序列压缩、稀疏选位置是不同优化轴。

交互实验

同一段历史,五种读取方式。

切换机制,观察原始 token、索引候选与主注意力读入的表示。颜色表示“如何被使用”,不是模型实际预测的重要性。

64 token · 固定种子教学示意
读原始 KV被压缩表示覆盖局部原始 KV未读
更早的历史最近历史 → 当前 query

教学缩比:DSA 选8 token;QSA 选2个4-token微块;MSA 选2个8-token块;CSA 每4 token产1摘要、选3个;HCA 每16 token产1摘要、全读。V4 局部窗口缩为8。MSA/HCA 的缩比块大小不等于论文配置,真实预算见后文。CSA 紫色展示重叠压缩覆盖,不表示原始 KV 被读取。

DeepSeek Sparse Attention

DSA:从历史里,逐 token 挑重点。

Lightning Indexer 给历史位置打分,Top-k 选择位置,主注意力在所选集合上计算。在 V3.2 中,DSA 与 MLA 组合。

完整历史逐位置保留可检索表示
→
轻量索引器给历史 token 打分
→
Top-2,048 token位置独立选择
→
主注意力只融合所选位置
I(t,s) = Σⱼ w(t,j) · ReLU(qᴵ(t,j) · kᴵ(s))
S(t) = Top-kₛ I(t,s)

索引 query/key 是轻量检索表示。不同索引头的分数经权重汇总,得到统一的 token 排名。

DeepSeek-V3.2 · Figure 2:DSA在MLA下实现 · 报告第 4 页

读图路线:绿色分支负责索引与选择,主注意力路径读取所选KV,产生输出。

细粒度检索

能抓住远处孤立位置,不必连带整块邻居。MLA 管每条记忆存多宽,DSA 管本次读哪些位置。

仍然有索引账单

索引器要扫描历史;Top-k 与不规则访存也有成本。主注意力变稀疏,不代表总计算不再依赖历史长度。

索引器怎么学会“挑重点”?

先稠密预热:冻结主干,让索引分布通过 KL 损失模仿主注意力;再启用稀疏选择继续训练。Top-k 不可导,所以索引器需要独立的训练信号。2,048 是发布配置,不是方法本身的固定定义。

Qwen Sparse Attention

QSA:缩短检索目录,不替换原文。

QSA 将索引 key 每4个平均池化,再归一化并施加位置编码。索引器选择微块,主注意力展开读取块内原始 token KV。

4 个索引 key连续位置
→
AvgPool → Norm → RoPE每块1个索引 key
→
最多 512 块对应 2,048 token
→
展开读原始 KV不是读摘要 KV
Qwen3.8-Flash-Next · Figure 3:QSA总览 · 报告第 5 页

读图路线:从左下AvgPool向上到Top-k,再看下方两种掩码:索引选择展开为微块内原始位置。

QSA 压缩“目录”;CSA 压缩“长期记忆本身”。
当前未完成微块的可见 token 直接加入读取,避免等待微块凑齐。完整块进入检索排名。

选择变粗,目录更短

索引候选数量约缩为1/4;命中一个 token 会带上同块邻居,平均池化也可能稀释孤立信号。

别把混合模型都算给 QSA

该模型用36层 GDN 与12层 QSA,按3∶1排列。GDN 的固定状态也贡献缓存节省;QSA 层仍保存可检索的逐位置主 KV。

尾部计数与 query 自身

本页预算以“已缓存历史 + 下一 query”为简化模型,尾部为0~3个历史位置,不另计 query 自身。实际代码的因果掩码、索引约定与当前位置可能影响边界计数。

MiniMax Sparse Attention

MSA:各个 GQA 组,各挑自己的块。

Index Branch 先算 token 分数,再以块内最大值得到块分数。每个 query、每个 GQA 组独立选择 Top-k 块,组内 query 头共享选择。

token 分数各组轻量索引 q/k
→
Block Max Pooling不是先平均 key
→
16 × 128 / 组局部块占一个名额
→
块稀疏主注意力读取原始 KV
MiniMax Sparse Attention · Figure 1:MSA总览 · 报告第 1 页

读图路线:左侧Index Branch筛选块,右侧不同Query Group读取不同色块。当前局部块始终保留。

不只是把 QSA 的块放大

QSA 先聚合索引 key 再评分;MSA 先评分再最大池化,并支持不同 GQA 组的独立选择。

把理论稀疏变成 GPU 加速

连续块让访存更规整。KV-outer kernel 围绕同一 KV 块聚集用到它的 query,增加数据复用与矩阵计算效率。

训练与性能数字要分清口径

KL 损失让索引分布对齐组内主注意力的平均分布;辅助损失梯度与主干分离,并使用索引器预热。论文109B实验模型在1M上下文报告注意力 FLOPs 降28.4×;H800上 prefill/decode 实现路径分别加速14.2×/7.6×。这些不是整个模型端到端的统一倍数,不能与其他论文直接排名。

DeepSeek-V4 Hybrid Attention

V4:这次,不只少读,还要少存。

V4 沿序列维度压缩长期 KV。CSA 轻压缩再检索,HCA 重压缩后全读。两者都搭配未压缩局部窗口。

CSA · 细摘要,挑着读

长期 KV 与索引 key 的条目数都约为 N/4。最多选1,024个压缩条目,加最近128个原始位置。

4倍是输出密度。相邻两块重叠汇聚,每个正常条目融合两路特征、覆盖8个 token,首块有边界填充。

HCA · 粗摘要,全部读

每128个 token汇聚1个条目,不重叠。主注意力读全部可见压缩条目,加最近128个原始位置。

没有 Top-k 和稀疏索引器。便宜是因为候选本身已经很少,不是筛掉大量候选。

DeepSeek-V4 · Figure 3:CSA架构 · 报告第 9 页

读图路线:底部两套压缩器分别生成压缩KV与压缩索引key;索引结果选出摘要,与局部KV拼接进入主注意力。

CSA:N → 约 N/4 个摘要 → Top-1,024
           + 128 局部原始位置
DeepSeek-V4 · Figure 4:HCA架构 · 报告第 11 页

读图路线:重度压缩KV与Sliding Window KV拼接。没有Lightning Indexer与Top-k Selector。

HCA:N → 约 N/128 个摘要 → 全部读取
            + 128 局部原始位置
“摘要”是可学习的逐通道加权汇聚,不是自然语言摘要。
压缩可能丢细节;局部窗口保留近期精确信息。CSA 另有索引漏选风险;HCA 用更强压缩换全局覆盖。
为什么交错使用两种层?查看整体架构原图

CSA 保留较细压缩表示并选择性检索,HCA 读取更粗但全覆盖的历史。这是结构直觉,不是给层硬性分配“检索/概括”职责。发布配置存在首尾例外,不能简单画成整网严格1∶1交替。

DeepSeek-V4 · Figure 2:整体架构 · 报告第 6 页

读图路线:关注Transformer Block中的CSA/HCA;mHC负责残差流,是另一个设计维度。

V4 和 MLA、mHC 的关系

V4 主注意力采用共享 Key-Value MQA:压缩向量同时作为 key 和 value,并使用低秩 query 与分组输出投影。它不是原封不动的旧 MLA。mHC 则负责残差流,是另一个优化维度,不等于 HCA。

预算计算器

百万历史,不代表每次读百万条。

拖动历史长度,比较单层、单 query 的主分支输入条目。不是总 FLOPs 或显存计算:头数、特征宽度、精度、层数和索引开销未统一。

1,048,57616K → 1M
机制主分支读取预算长期缓存/候选条目读什么
DSA2,048N原始位置
QSA2,048 + 尾部N;索引约N/4原始 KV
MSA2,048 / 组N原始 KV
CSA1,024 + 128N/4 + 局部压缩 + 局部
HCA8,192 + 128(1M)N/128 + 局部压缩 + 局部

基于 V3.2、Qwen3.8-Flash-Next、MSA论文实验与V4-Pro配置。N是已缓存历史,不另计query自身。完整块按floor(N/B)计算;因果边界与未完成块可能使实际读取更少。V4压缩与局部表示可覆盖同一历史,表中不是互不重叠的原始token数。条形仅表示输入条目数/N,不等于计算量比例。

三个不成立的推论
“只读2,048,所以只缓存2,048”——未来仍要检索历史。
“主分支 O(Nk),所以整个算法线性”——索引扫描仍有成本。
“HCA压128倍,所以整模型省128倍显存”——还要算局部、索引、层数、维度和精度。
复杂度:把索引分支单独列账

忽略维度与头数:DSA/MSA主分支约O(Nk),索引仍有O(N²)项;QSA索引候选缩至N/4,相关打分约O(N²/4);CSA的N/4索引候选同样保留二次项。HCA整段主注意力约O(N²/128)。固定压缩率降低常数,不自动改变渐近阶数。单步decode与整段prefill的计算口径也不同。

把五个缩写,还原成五个动作

别只问“稀不稀”,要问“选什么、读什么”。

机制索引/选择单位主分支读什么缩短长期主 KV?关键取舍
DSA单个 token所选原始位置表示否;MLA另管特征选择细,访存不规则
QSA4-token微块;池化key展开后的原始 KV否;缩短索引索引便宜,连带邻居
MSA各组独立;128-token块所选块原始 KV否粒度粗,GPU块访问规整
CSA压缩条目所选摘要 + 局部是,约N/4压缩损失 + 检索漏选
HCA不选择全部摘要 + 局部是,约N/128更强压缩,换全局覆盖
检验理解:哪句话正确?

带走一句话:DSA挑token;QSA压目录、读微块原文;MSA各组挑大块;CSA压记忆、再挑读;HCA重压缩、全读。

证据与延伸阅读

原图来自报告,示意不冒充实验。

非官方中文教学讲义。六张原图直接从已下载PDF裁取并内嵌,版权归原作者;仅裁去周围正文,不改绘图内内容。中文说明、交互色块和预算表是教学整理。

  1. DeepSeek-V4报告 · 本地PDF§2.3;Figure 2(第6页)、Figure 3(第9页)、Figure 4(第11页)。另核对V4-Pro配置。
  2. DeepSeek-V3.2报告 · 本地PDF§2.1,Figure 2(第4页)。另有最初引入DSA的V3.2-Exp报告。
  3. Qwen3.8-Flash-Next报告 · 本地PDF§2.1.2,Figure 3(第5页)。发布配置:indexer_compress_ratio=4,indexer_budget=2048。
  4. MiniMax Sparse Attention · 本地PDF本地PDF为v2,Figure 1(第1页);§3方法、§4 kernel。块大小128、每组16块为论文实验配置。
  5. answer-me-with-html借鉴“结论在前、按信息形状选图、一个面板回答一个问题、单文件可读”。本页为适配原图放大与交互模拟的定制实现,不是该项目CLI原始输出。
中文博客:继续深挖

V4逐层拆解 · Qwen架构学习笔记 · DSA公式讲解 · MSA与kernel解读。关键定义仍以报告和代码为准。

打开配套中文讲解稿 →

图片和交互无需网络;官方来源需联网,本地报告/讲解稿链接需保留同目录文件。支持浏览器打印为PDF。“讲解提示”显示各章提示,“宽屏讲解”隐藏侧栏。