稀疏注意力 Sparse Attention

Sparse Attention

通过只计算 query 与 key 的一部分子集的注意力权重(而非全部 N×N 对),将 Transformer 自注意力的 O(N²) 复杂度降到 O(N·logN) 或 O(N),支持更长上下文长度与更低推理成本的注意力机制家族总称。

详细解释

Sparse Attention(稀疏注意力) 一句话定义:普通全注意力是「每个 token 看全部 N 个 token」,计算量 N×N 爆炸(4K 上下文=16M 对,128K 上下文=164 亿对算不动);稀疏注意力是「每个 token 只看它应该看的一小部分 token(比如邻居、全局锚点、分块对角线),其他不看」,精度损失 0-5%,速度和显存直接省 5-20 倍。没有稀疏注意力,现在动辄 128K、1M 的长上下文模型是根本跑不起来的。

稀疏注意力的鼻祖是 2019 年 OpenAI 的 Sparse Transformer 论文(第一个把 Image Transformer 做到 64K 像素级),2020 年谷歌的 Longformer、BigBird 把它做火并普及,2023 年之后 Mistral 7B 用的 Sliding Window Attention(滑窗注意力,稀疏注意力的一个最实用的特例)直接把它变成了 2024 年后所有新模型的标配。当代主流长上下文模型(GPT-4o 128K、Claude 3 200K、Qwen 2.5 128K、Llama 3 128K)全部内置了某种形式的稀疏注意力,区别只是稀疏模式不同。

唯元智创 的长上下文推理引擎默认对 32K 以上请求自动切换「稀疏模式」——自动根据上下文长度在「全注意力(< 8K)→ 滑窗稀疏(8K-64K)→ 分块+全局锚点稀疏(64K-1M)」之间动态切换,业务方不需要改任何代码,也不用关心稀疏模式怎么选,P95 推理延迟比全开全注意力省 60% 以上。

五种主流稀疏注意力模式对比(2025 年生产环境选哪个)

稀疏模式每个 token 看哪些 token复杂度典型实现模型精度损失(相对全注意力)最适合场景
① 滑窗窗口(Sliding Window / Local)只看左边 W 个邻居 + 自己(W=4096 常见)O(N·W) ≈ O(N)Mistral 7B/8x7B, Llama 3.1 128K<1%绝大多数日常场景;对话、代码、RAG 召回的 chunk 都是局部的
② 分块全局稀疏(Block + Global Tokens / Longformer)分块看块内 + 看 5-20 个全局锚点 token(CLS、任务指令等)O(N·√N) ≈ O(N)Longformer, BigBird, LED1-3%长文档分类、摘要、需要全局开头结尾信息的任务
③ 跨步/扩张模式(Dilated / Strided / Axial)看邻居 + 每隔 stride 个 token 看一个远程的O(N·(W + N/stride))Sparse Transformer, Image GPT2-5%图像、音频、DNA 序列等有空间周期性的模态
④ 基于路由的动态稀疏(Dynamic / FlashAttention-2 Block-sparse)不固定模式,按 query 计算 top-k 最相关 key 只看这 k 个O(N·K),K=128/256FlashAttention v2 原生支持、LongNet0.5-2%需要保留远程精准召回的科学文献、法律合同
⑤ 层次化稀疏(Hierarchical / Block-recurrent / RWKV 风格)Transformer 分块 + 在块之间跑 RNN 传递状态,跨块只看状态不看全部 tokenO(N) 严格线性RWKV, Mamba (SSM 家族)、Block-Recurrent Transformer3-8%百万级超超长上下文、流式日志、整本书阅读

工程落地 Sparse Attention 的四个关键注意点

注意 1:不同稀疏模式要和你的下游任务「注意力真实分布」吻合,否则稀疏 10% 精度掉 30%。稀疏注意力的本质是「牺牲掉不需要看的那些注意力对,保留需要看的」。举反例:你用滑窗 W=4096 做「10 万字合同最后一页问第一页的签约日期」——滑窗只能看最近 4K token,签约日期在第 1 个 token,根本看不到,召回直接 0%,这种必须要「全局锚点 token 模式」。正确做法是上线前先拿 100 条你下游任务的典型样本,在全注意力模型上跑一遍画出「真实注意力热力图分布」:如果 99% 的注意力权重都集中在附近 ±2K 窗口内,选滑窗即可;如果有 10% 注意力跳转到开头结尾,选全局锚点;如果有大量精准远程跳转,选动态路由稀疏。

注意 2:滑窗 SWA(Mistral 模式)不是越大越好,4K 是甜点。 很多团队贪心设 W=16K 以为越大越好,结果显存翻了 4 倍、速度慢 3 倍,而精度只涨了 0.2%。工业界经验:在大多数中英文综合任务上,W=4096 时已经覆盖了 95% 的真实注意力权重分布(绝大多数 token 只看最近 2-3K 个邻居),再往大了调边际效益递减极快。经验比例:滑窗 2K→4K 精度 +2.5%,4K→8K +0.7%,8K→16K +0.3%,16K→32K +0.1%,够了就停。

注意 3:KV Cache + 稀疏注意力组合时,推理引擎必须做「缓存分块对齐」,否则稀疏省下来的时间全被缓存管理吃了。 全注意力的 KV Cache 是连续的,O(1) 访问;滑窗稀疏的 KV Cache 是环形队列,只保留最近 W 个 token 的 K/V,超了直接覆盖最老的,这块如果推理引擎(vLLM/SGLang)没做优化,会频繁做内存 copy 导致整体延迟反而比全注意力还高。所以选稀疏不要自己写,直接用推理引擎内置的(vLLM 0.3.6+ 原生支持 Sliding Window Attention,不用改一行代码,开模型配置里 sliding_window 参数就行)。

注意 4:稀疏注意力是「注意力机制内部的稀疏」,和「检索增强 RAG 是外部稀疏」是互补关系,不要搞二选一。 很多初学者问「我有了 128K 稀疏注意力是不是就不需要 RAG 了?」。不是!128K 稀疏注意力的成本是每次输入全部 128K token 花一次钱(200 万 token 输入一次 ¥0.2-0.5),而 RAG 只花 2-4K token 输入(¥0.002-0.005),成本差 100 倍。正确的组合拳是:超长文档(整本书、1000 份合同)先用稀疏 RAG / Graph RAG 做外部粗筛,召回 Top-20 chunk,压缩到 32K token 以内,再喂给带稀疏注意力的 LLM 做深度阅读和推理。两者配合而不是替代。

常见问题

Mamba / RWKV 这些纯线性注意力(SSM)和稀疏 Transformer 怎么选?Mamba 会完全取代 Sparse Attention 吗?
2025 年的共识是「两者长期共存、分层使用」,Mamba 不会取代稀疏 Transformer,但会和它混合出 Hybrid 架构。各有胜负:(1)在「1M 以上超超长上下文 + 纯流式处理(日志、音视频)」场景,Mamba/RWKV 严格 O(N) 复杂度、不需要 KV Cache 无限长、延迟恒定,完胜稀疏 Transformer,适合作为「最底层长上下文记忆状态机」;(2)在「8K-128K 区间 + 需要精准长程依赖(代码跳转、法律条款跨页引用)」场景,稀疏 Transformer(尤其是动态路由 top-k 稀疏)的精准召回能力比 Mamba 强 5-10%,Mamba 有「远距离内容模糊」的天生短板(因为隐状态是压缩的有损信息);(3)2024 年底以来主流模型(Gemini 2、GPT-4o 系列、Qwen 2.5 MoE)实际走的是 Hybrid 路线:底层 2-4 层用 Mamba/SSM 做长程状态压缩,顶层 4-6 层用稀疏滑窗 Transformer 做精准局部推理——取两者之长,效果比纯任何一种都好。选型建议:工程上除非你明确有 100 万以上 token 的超需求,否则目前(2025 年中期)生产环境还是优先选成熟的「稀疏滑窗 Transformer + FlashAttention-2」组合,生态完善、坑少、工具链全;Hybrid 架构等 2025 年底再上会更稳。
稀疏注意力精度损失怎么量化评估?有没有统一的 Benchmark 测长上下文能力?
长上下文稀疏注意力的质量评估是 2024-2025 LLM 评测的热门领域,现在已经有五套被工业界广泛接受的标准 Benchmark,可以直接用:(1)Needle in a Haystack(针在草堆里,最经典)——在长文本随机位置插入一句话,问模型一句话的内容,看不同位置的召回率,画成 U 型曲线(开头结尾好,中间差);这个是必测,稀疏滑窗模型中间远距离会掉点,测一下你设置的窗口够不够大;(2)RULER(2024 年微软提出,综合长上下文能力)——含 7 个子任务:检索、问答、多跳、摘要、分类、编码、合成,给出综合分;(3)LongBench / LongBench-Chat(清华智源)——中文长文能力基准;(4)LEval(上海交大)——法律、金融、医疗、学术论文四个垂直领域长文评测;(5)HELM-Lite 长上下文专项。实测时要固定测两个指标:① Accuracy@N(不同上下文长度 N=32K/64K/128K 的综合正确率),② 稀疏成本比 = 稀疏模式 FLOPs / 全注意力 FLOPs。经验线:稀疏成本比降到 20%(即省 80% 计算)且 Accuracy 下降 ≤2%,就是合格的稀疏配置,否则说明模式不匹配你的任务,换稀疏类型或调窗口大小。
我有一个已经训好的全注意力模型(比如 Llama 2 7B),能直接改成稀疏注意力少花钱吗?还是必须重新预训练?
分两种情况,结果完全不同:(1)滑窗式稀疏(SWA)可以「不需要重新预训练,直接推理时改」,效果几乎无损!2024 年初斯坦福和 Mistral 团队联合实验证实:在全注意力训好的 Llama 2 7B 上,推理时直接把注意力掩码改成滑窗 W=4096,零额外训练,在大多数日常任务(聊天、摘要、FAQ、RAG)准确率只掉 0.3% 至 1%,但推理加速 2-3 倍,显存省 40%。原因很简单:大多数全注意力模型在训练时学到的「真实注意力权重本来就集中在局部 2-4K 附近」,全注意力只是浪费算力算了很多几乎为零的远程注意力对,推理时直接砍掉它们几乎不影响。这是成本优化 ROI 最高的技巧之一,90% 的团队都没做。(2)但如果你用分块全局锚点、跨步等其他稀疏模式,或者你任务需要精准的远程跳转(比如数学证明、代码跨文件调用),那就必须做一次「持续预训练 + SFT 微调」——继续训 10B 至 100B token 的长文数据,让模型适应稀疏掩码,大概花原来预训练成本的 1% 至 5% 就能适应回来。实操建议:先什么都不改,推理里直接上滑窗 4K 稀疏,跑你的 held-out 测试集,如果准确率掉的在你接受范围(≤2%),就白嫖 2 倍加速;如果掉的多,再决定要不要加微调。