稀疏注意力(Sparse Attention)是一类让模型在计算注意力时只挑一部分位置两两配对、而不是让每个词都和所有词算一遍的方法。
自注意力(self-attention)的原版做法是:序列里每个位置都生成一个查询(Query)和一个键(Key),两两打分,得到一个 N×N 的分数矩阵,N 是序列长度。算力和显存都随 N 的平方增长——文本长一倍,成本翻四倍。稀疏注意力的思路很直接:这张表里大部分格子其实不重要,别算了。
打个比方:一家 200 人的公司要求“所有人两两私聊一次”,那是 19900 场对话。稀疏注意力改规矩:每人只跟左右邻座聊,再隔十个人找一个聊,另外指定三位“总协调人”跟所有人聊。对话场次从平方级掉到线性级。
常见套路就那么几种:
- 局部窗口(local / sliding window):只看前后 k 个位置,管住近距离的语法搭配
- 跨步或空洞(strided / dilated):每隔几个位置取一个,制造“跳着看”的远处视野
- 全局 token(global token):让开头、分隔符、段落标题这类位置与所有位置相连,充当信息中转站
- 内容路由:按相似度临时挑 top-k 个位置,动态决定该看谁
| 稠密注意力 | 稀疏注意力 | |
|---|---|---|
| 计算量 | 随序列长度平方增长 | 随长度线性或接近线性增长 |
| 显存 | 要存整张 N×N 分数矩阵 | 只存被选中的那些格子 |
| 优点 | 任意两个位置都能直接交换信息 | 能处理长得多的输入,更快 |
| 代价 | 长文本容易爆显存 | 没连上的位置之间要“传话”,可能漏掉远处细节 |
三个容易混淆的邻居:线性注意力(Linear Attention)和低秩近似是用少量向量拼出整张矩阵的近似值,稀疏注意力则是直接删格子;AI 词典:FlashAttention">FlashAttention 不改变注意力的数学结果,只是把计算分块、少读写显存,属于“算得一样但更省内存”;检索增强(RAG)是在输入阶段就把不相关段落扔掉,稀疏注意力是输入全收,只在计算阶段少配对。
实际意义:长文档问答、代码仓库理解、长日志排查、长视频与基因序列,这些场景里 N 动辄上万,稀疏注意力是把成本压回可接受范围的关键手段之一。但它是带条件的省——如果关键信息恰好落在“没连上”的两个位置之间,模型只能靠中间层一层层传话,传着传着就可能丢。比如一句话开头定义的变量名,隔了几千字后再次出现,窗口没覆盖到就可能接不上。所以工程上常见的是混搭:局部窗口保底,加少量全局 token 兜底,再按任务调比例,具体实现与效果以各家官方文档为准。
对普通职场人:看到“支持超长上下文”时,值得多问一句——是真的每个词都和每个词算了,还是挑着算的?这两者在翻找细节类任务上的表现,可能并不一样。
