昨天DeepSeek又开源了,NSA框架,通过稀疏注意力,让大模型的上下文长度可以达到64k,并且性能大幅提升。 随后晚上Kimi也来了,开源MoBA框架,数值更逆天,可以scaleup到10M上下文。今天简单聊聊二者的差异, 2个框架的取名也是一种艺术~。
DeepSeek-NSA
Kimi-MoBA
技术报告地址:
- kimi moba: https://github.com/MoonshotAI/MoBA/blob/master/MoBA\_Tech\_Report.pdf
- deepseek nsa: https://arxiv.org/pdf/2502.11089
kimi是已经开源了代码,项目地址:https://github.com/MoonshotAI/MoBA
首先二者都是提出了一个稀疏注意力算法,NSA通过对 粗粒度压缩和细粒度选择 构造的一种动态分层的稀疏策略, MOBA则是受MoE启发,将块稀疏注意力与动态路由结合,通过分块和门控机制选择最相关的KV块。
DeepSeek NSA:
NSA将注意力分为三个并行分支, 压缩注意力、 选择注意力、 滑动注意力。
- 粗粒度压缩: 将512个token压缩为32个语义块(类似视频关键帧);
- 细粒度选择:动态保留64个关键token块。
- 局部连贯性:关注最近的512个token。
step1 : 压缩注意力
将连续token块压缩为单个表示
φ
其中, l是块长度, φ是可学习的MLP压缩函数
step2: 选择注意力
先计算块重要性分数,然后选择Top-n重要块
step3: 滑动注意力, 保持固定窗口大小w
简单的伪代码表示:
def
NSA\_attention
(query, keys, values,
compress\_size=
32
,
# 压缩块大小
select\_size=
64
,
# 选择块大小
window\_size=
512
,
# 滑动窗口大小
top\_n=
16
)
:
# 选择块数量
# 1. 压缩块注意力
compressed = compress\_blocks(keys, values, compress\_size)
# 2. 选择重要块
blocks = split\_into\_blocks(keys, values, select\_size)
scores = [score\_block(query, block)
for
block
in
blocks]
selected = top\_k\_blocks(scores, top\_n)
# 3. 滑动窗口
local = (keys[-window\_size:], values[-window\_size:])
# 计算三路注意力并组合
attn\_outputs = [
flash\_attention(query, c\_k, c\_v)
for
c\_k, c\_v
in
[compressed, selected, local]
]
return
sum(g * out
for
g, out
in
zip(gate\_weights(query), attn\_outputs))
Kimi MOBA
先将文本分割为512-4096token的块, 然后通过门控网络动态选择top3相关块。为了局部的连贯性,用了当前块强选的策略。
step1: 块注意力计算
step2: 块选择策略
先计算块亲和度分数,然后选topk
简单的伪代码表示
def
MoBA\_attention
(query, keys, values, block\_size=
512
, top\_k=
3
)
:
blocks = split\_into\_blocks(keys, values, block\_size)
scores = [gate(query, block)
for
block
in
blocks]
selected = top\_k\_blocks(scores, top\_k)
return
flash\_attention(query, selected\_blocks)
- 预训练阶段:90%时间用MoBA,10%切换全注意力
- 微调阶段:最后3层保留全注意力(确保指令跟随能力)
从对比评测来看,二者都在大多数任务上接近或超过Full Attention,在某些特定任务上有小幅下降,但是计算效率显著提升。 NSA在推理任务上有明显优势,例如GSM8K, DROP有较大幅提升;MOBA有更好的编码能力。