内容提要
DSA(DeepSeek稀疏注意力)先用轻量索引器为每个query扫描全部历史,选出top-k位置,主注意力只计算这些位置。文章从输出误差界推导出应尽量少丢注意力质量,因此各头共享按平均概率选出的下标;索引器用低维query-key打分加ReLU保留多头响应,并以主注意力概率为教师做KL蒸馏,绕开top-k不可导问题。训练分两阶段:先冻结主模型、稠密热身索引器,再启用稀疏注意力联合训练。主KV缓存仍全量保留,计算与读取减少但容量增加。
延伸解读
误差界解释的是“选谁”,不是“选多少”
文章用输出误差上界 2Mε 说明:固定保留 k 个位置时,应尽量少丢注意力概率质量,这为按平均概率选共享 top-k 提供了依据。但该界是单头输出的最坏情况,不保证最终答案误差;k=2048、索引头宽度等来自实验配置,无法由误差界唯一推出。读者应把它理解为设计动机,而非性能保证。
共享下标是计算与精度的折中
各主注意力头共享一份下标,便于复用 KV 读取,代价是不同头的偏好被平均。文章指出平均丢弃质量恰好等于 1 减去所选位置的平均概率,因此按平均概率选 top-k 能使该量最小。但平均的是概率而非原始 QK 分数,各头实际贡献未必等权,这一偏差仍需后续训练弥补。
蒸馏绕开不可导,但监督有盲区
top-k 返回整数下标,无法直接反向传播,DSA 改用主注意力概率作教师,以 KL 散度训练索引器,梯度方向是低估重要位置就抬高其分数。稀疏阶段教师只来自选中集合内部,集合外没有直接监督,集合内 KL 很小也可能漏选重要位置,因此文章建议另用验证集重算稠密教师、测保留质量。
省的是计算和读取,不是缓存容量
按文章估算,128K 历史、top-2048 下单层单次 decode 的主注意力矩阵乘法从 36.51 GFLOP 降到 2.72 GFLOP,理想读取量从 82.00 MiB 降到 17.78 MiB,但主 KV 仍需全量保留,加上索引缓存后容量从 82.00 MiB 增至 98.50 MiB。索引器仍全量扫描,prefill 仍含二次复杂度,这些数字不是实测加速比。
Q&A
DeepSeek DSA 的核心思路是什么?
DSA(DeepSeek稀疏注意力)的核心思路是:先用一个轻量的索引器扫描全部历史,为每个query选出top-k个位置,然后让昂贵的主注意力只计算这些被选中的位置,从而减少计算量。
为什么DSA要让各注意力头共享top-k下标?
因为从输出误差界可以推导出,固定只看k个位置时,应尽量少丢注意力概率质量。各头共享按平均概率选出的top-k下标,能使平均丢弃质量最小,同时便于复用KV读取。
DSA的索引器为什么使用ReLU激活函数?
索引器用低维query-key打分加ReLU来保留多头响应。如果没有非线性,多头加权可以合成一个query,失去多头表达能力;加入ReLU后,不同key可以激活不同的头,增强非线性表达能力。论文也提到选择ReLU考虑了吞吐。
DSA如何训练索引器,以绕开top-k不可导的问题?
DSA将主注意力的概率作为教师,用KL散度训练索引器拟合该概率分布。这样梯度可以通过softmax后的概率传递,绕开top-k离散选择不可导的问题。
DSA的两阶段训练分别是什么?
第一阶段是稠密热身:冻结主模型,用稠密注意力产生的教师概率训练索引器,约1000步、2.1B token。第二阶段是稀疏继续训练:启用top-k稀疏注意力,联合训练主模型和索引器,约15000步、943.7B token。
使用DSA后,KV缓存容量是减少还是增加?
KV缓存容量反而增加。因为主KV缓存仍需全量保留,未选中的token下次可能用到,不能删除;此外还要加上索引缓存。所以总容量比稠密注意力更大。