这是 GPT 生成的内容。超过现有数学基础,只能说大概看懂了,后面基础上来了再细节推导和检查正确性。

DeepSeek Sparse Attention, DSA 可以理解为一个两阶段稀疏注意力系统:
- 用一个很轻量的 Lightning Indexer 近似估计“哪些历史 token 对当前 query 重要”;
- 再用 Fine-grained Sparse Attention 只对被选中的少量 token 做真正的 softmax attention。
其目标是把标准注意力的复杂度从近似
O(n2d)
降低到
O(nkd)+O(indexing cost),
其中 n 是序列长度,d 是 hidden/head 维度,k≪n 是每个 query 选中的 key/value 数量。DeepSeek-V3.2 技术报告中将 DSA 作为长上下文效率机制引入,并包含 Lightning Indexer 与 fine-grained sparse attention 的训练/部署流程。后续工作也指出,token-level sparse attention 中 indexer 本身会成为瓶颈,因此专门研究了更高效的层次化 indexer。
1. 标准 dense attention 回顾
设某一层、某一 attention head 中:
Q=XWQ∈Rn×d,K=XWK∈Rn×d,V=XWV∈Rn×d.
第 i 个 query token 对所有历史 key 的注意力为:
αij=∑ℓ≤iexp(qi⊤kℓ/d)exp(qi⊤kj/d),j≤i.
输出为:
oi=j≤i∑αijvj.
问题是,对每个 i,都要计算 qi⊤kj,其中 j=1,…,i。总复杂度为:
i=1∑nO(id)=O(n2d).
长上下文下,例如 (n = 128K),dense attention 的代价非常高。
2. DSA 的核心思想
DSA 的核心是:不要对所有 key 做精确 attention,而是先用便宜的 indexer 找候选 key。
也就是说,对于每个 query qi,我们不再使用所有历史 token 集合:
Pi={1,2,…,i},
而是选择一个稀疏子集:
Si⊂Pi,∣Si∣=k,k≪i.
然后只在 Si 上做 softmax:
αijsparse=∑ℓ∈Siexp(qi⊤kℓ/d)exp(qi⊤kj/d),j∈Si.
输出:
oisparse=j∈Si∑αijsparsevj.
所以 DSA 的关键数学问题变成:
Si=TopKj≤i(scoreij),
其中 scoreij 要尽可能接近真实 attention logit:
qi⊤kj,
但计算成本必须远低于 O(nd)。
3. Lightning Indexer:用低成本分数近似真实 attention 重要性
3.1 标准 attention score
真实 attention 的未归一化分数是:
sij=dqi⊤kj.
如果直接对所有 j 计算 sij,那又回到了 dense attention。
因此 Lightning Indexer 引入一个轻量级映射:
ϕQ(qi)∈Rr,ϕK(kj)∈Rr,
其中
r≪d.
然后用低维内积估计重要性:
s^ij=ϕQ(qi)⊤ϕK(kj).
如果 sij^ 与 sij 排序一致性较强,那么我们可以用:
Si=TopKj≤is^ij
代替
TopKj≤isij.
这就是 Lightning Indexer 的数学本质:
用便宜的近似打分函数预测真实 attention 的 Top-K 支持集。
3.2 低秩近似视角
假设真实 attention score 矩阵为:
S=QK⊤∈Rn×n.
Lightning Indexer 试图构造一个低成本矩阵:
S^=Q~K~⊤,
其中:
Q~=QA∈Rn×r,K~=KB∈Rn×r,
并且 r≪d。
于是:
S^ij=(QA)i⊤(KB)j.
如果 A,B 是可学习参数,则 indexer 可以通过训练学习如何预测 dense attention 的重要 token。
理想目标可以写成:
TopK(Si)≈TopK(S^i).
这里 Si 表示第 i 行,也就是第 i 个 query 对所有 key 的真实 attention logits。
4. Lightning Indexer 的训练目标
为了让 indexer 选出的 token 接近 dense attention,可以设计若干训练目标。DeepSeek-V3.2 报告中提到会先进行 indexer warm-up,然后再引入 fine-grained sparse attention。从数学上,可以理解为先让 indexer 学会模仿 dense attention 的选择分布。
4.1 以 dense attention 为 teacher
设 dense attention 分布为:
pij=∑ℓ≤iexp(siℓ)exp(sij).
Indexer 产生的近似分布为:
p^ij=∑ℓ≤iexp(s^iℓ)exp(s^ij).
一个自然的训练目标是 KL 散度:
Lindex=i∑KL(pi∣∣p^i).
展开为:
Lindex=i∑j≤i∑pijlogp^ijpij.
这个目标鼓励 indexer 的排序和 dense attention 接近。
4.2 Top-K 集合匹配目标
因为 sparse attention 最终关心的是 Top-K 选择,而不是完整分布,所以也可以用集合匹配的思想。
设 dense attention 的真实 Top-K 集合为:
Ti=TopKj≤i(sij).
Indexer 选出的集合为:
Si=TopKj≤i(s^ij).
希望最大化 recall:
Recalli=∣Ti∣∣Si∩Ti∣.
对应的目标是:
maxi∑k∣Si∩Ti∣.
实际训练中,Top-K 操作不可微,所以通常会用 soft surrogate,例如 pairwise ranking loss:
Lrank=i∑j∈Ti∑m∈/Ti∑max(0,γ−s^ij+s^im),
其中 γ>0 是 margin。
这个损失要求真正重要的 token j 的 indexer score 高于不重要 token m。
5. Fine-grained Sparse Attention
Lightning Indexer 只负责“找候选”。真正输出仍然由标准 attention 公式计算,只不过注意力范围缩小到 Si。
即:
Si=TopKj≤is^ij.
然后在这个集合上计算真实 logit:
sij=dqi⊤kj,j∈Si.
再做局部 softmax:
αijDSA=∑ℓ∈Siexp(siℓ)exp(sij),j∈Si.
输出:
oiDSA=j∈Si∑αijDSAvj.
注意这里有一个重要区别:
- Indexer score s^ij:只用于选择 token;
- 真实 attention score sij:用于最终 softmax 和加权求和。
所以 DSA 不是简单地用近似 attention 替代原 attention,而是:
cheap indexer for retrieval+exact attention over retrieved tokens.
这也是它比纯近似 attention 更稳的原因。
6. 为什么叫 Fine-grained?
很多 sparse attention 方法是 block-level 的,比如把上下文分成 block:
B1,B2,…,Bm.
然后选择若干 block:
Bi=TopKBlock(qi).
这种方法粒度较粗。如果 block 大小为 b,选中一个 block 就必须计算其中所有 b 个 token,即使其中大多数并不重要。
Fine-grained sparse attention 则直接在 token 级别选:
Si={j1,j2,…,jk}.
这比 block-level 更精细:
block-level: select blocks
fine-grained: select individual tokens.
好处是:
ktoken≪kblock⋅b
时,计算更省。
但坏处是 indexer 压力更大:
因为每个 query 都要在大量历史 token 中找 Top-K。后续 HISA 等工作正是指出 fine-grained token-level sparse attention 中 indexer 会成为新的瓶颈,并提出层次化索引来缓解。
7. DSA 的整体计算流程
对于当前 query token i:
Step 1:计算 query/key/value
qi=xiWQ,kj=xjWK,vj=xjWV.
Step 2:Lightning Indexer 生成低维表示
q~i=ϕQ(qi),k~j=ϕK(kj).
其中:
q~i,k~j∈Rr,r≪d.
Step 3:计算 indexer score
s^ij=q~i⊤k~j.
Step 4:选出 Top-K token
Si=TopKj≤is^ij.
Step 5:对选中 token 做真实 attention
sij=dqi⊤kj,j∈Si.
αij=∑ℓ∈Siexp(siℓ)exp(sij).
Step 6:聚合 value
oi=j∈Si∑αijvj.
8. 复杂度推导
8.1 Dense attention
每个 query 对 i 个 key 计算内积,每个内积维度为 d:
Cdense=i=1∑nid=2n(n+1)d=O(n2d).
8.2 DSA attention 主体复杂度
如果每个 query 只选 k 个 key:
Cattn=i=1∑nkd=O(nkd).
其中 k≪n。
8.3 Indexer 复杂度
若 Lightning Indexer 使用低维维度 r,粗略计算所有 query-key index score 的成本为:
Cindex=O(n2r).
因为 r≪d,它比 dense attention 便宜。
但如果真的计算全量 n2 个 index score,在极长上下文下仍然很贵。因此实际系统通常还需要结合:
- 分块;
- 层次化索引;
- 缓存;
- 近似 Top-K;
- 局部窗口加全局检索;
- query 分组;
- hardware-aware kernel。
后续研究如 HISA 就指出 DSA 这类 token-level sparse attention 的 indexer 会成为新瓶颈,因此提出 hierarchical indexing 来进一步降低 indexer 代价。
9. 误差分析:DSA 近似 dense attention 的条件
Dense attention 输出为:
oi=j≤i∑pijvj.
DSA 输出为:
o^i=j∈Si∑p^ijvj,
其中:
p^ij=∑ℓ∈Siexp(siℓ)exp(sij).
设未被选中的集合为:
Ri=Pi∖Si.
dense attention 在被丢弃 token 上的总概率质量为:
ϵi=j∈Ri∑pij.
如果 ϵi 很小,则 sparse attention 近似 dense attention 较好。
换句话说,DSA 成功的关键是:
j∈/Si∑pij≈0.
也就是 indexer 选中的 token 覆盖了 dense attention 的大部分概率质量。
可以给出一个直觉误差界。假设:
∥vj∥≤M.
那么丢弃部分导致的误差大致受控于:
j∈Ri∑pijvj≤j∈Ri∑pij∥vj∥≤Mϵi.
因此,如果 indexer 能让 ϵi 很小,DSA 输出就接近 dense attention。
10. 为什么需要 warm-up?
如果一开始就让模型使用 sparse attention,indexer 还没学会选 token,可能会漏掉重要上下文,训练不稳定。
所以可以先进行 indexer warm-up:
- 主模型仍然使用 dense attention;
- 同时训练 Lightning Indexer 去预测 dense attention 的重要 token;
- 当 indexer 的 Top-K recall 足够高后,再切换到 fine-grained sparse attention。
数学上就是先优化:
Lindex
让:
TopK(s^ij)≈TopK(sij),
再优化完整语言模型损失:
LLM=−t∑logp(xt∣x<t).
最终训练目标可以看成:
L=LLM+λLindex,
其中 λ 控制 indexer 监督强度。
11. 一个简化伪代码
# Q, K, V: [n, d]
# Wq_idx, Wk_idx: indexer projection, d -> r
# k_select: number of selected tokens
Q_idx = Q @ Wq_idx # [n, r]
K_idx = K @ Wk_idx # [n, r]
outputs = []
for i in range(n):
# causal keys: 0 ... i
idx_scores = Q_idx[i] @ K_idx[:i+1].T # [i+1]
# select fine-grained token indices
S_i = topk(idx_scores, k=k_select)
# exact attention over selected tokens
logits = Q[i] @ K[S_i].T / sqrt(d) # [k]
attn = softmax(logits)
out = attn @ V[S_i] # [d]
outputs.append(out)
这个伪代码对应数学公式:
Si=TopK(q~i⊤k~j),
oi=j∈Si∑softmax(dqi⊤kj)vj.
12. 总结
DeepSeek Sparse Attention = 学习型 token 级检索器 + 精确子集注意力。
更形式化地说:
Si=TopKj≤i(ϕQ(qi)⊤ϕK(kj))
oi=j∈Si∑∑ℓ∈Siexp(qi⊤kℓ/d)exp(qi⊤kj/d)vj
Lightning Indexer 负责便宜地找 Si,Fine-grained Sparse Attention 负责在 Si 上做真实 attention。只要 indexer 能保证被丢弃 token 的 attention mass 很小:
ϵi=j∈/Si∑pij≪1,
则 DSA 可以在保持效果的同时把主要 attention 计算从:
O(n2d)
降到:
O(nkd)+O(indexer).
评论