模型上下文窗口从 2K 扩到 64K,token 数翻了 32 倍。按直觉,计算量也该翻 32 倍。但标准注意力的复杂度是 O(n²)——token 翻倍,计算量变四倍;token 翻十倍,计算量变一百倍。你想让 AI 一口气读完一本百万 token 的长篇,光一个注意力头的「两两配对」次数就是 10^12。长文本难做,不是显存不够,是数学就不允许。

2017 年,Attention Is All You Need 让注意力机制成了 Transformer 的绝对核心,也把 O(n²) 钉成了所有长文本方案的天花板。2020 年,一篇论文称找到了把复杂度降到 O(n) 的办法,标题很挑衅:Transformers are RNNs。它确实做到了,但代价呢?这篇拆给你看。
标准注意力做对了什么:softmax 才是真正的「选择器」
标准注意力就是这行公式:softmax(QK^T/√d)V。拆开是三步:
- 每个 token 生成三个向量:Query(我想找什么)、Key(我是什么)、Value(我的内容)。
- 每个 Query 和所有 Key 点积,得到 n×n 的打分矩阵。O(n²) 的根源全在这一步。
- 对打分做 softmax,再按权重加权所有 Value,得到输出。
大多数解释把 softmax 一笔带过,好像它只是「归一化一下」。但它做的远比归一化狠:指数函数把分数差指数级放大成权重差——最高分的 token 会碾压其他所有选项。
说人话:标准注意力有「硬选择」的能力。让它「在第三段里找人名」,它真的能把注意力怼到那一个名字上,而不是在十个名字之间平均。这种锐利,是它在精确检索和复杂推理上强大的根本原因。
线性注意力的全部奥义:一道初中乘法结合律
线性注意力论文的推导,我最早以为是什么高深的核方法。后来才发现,真正的杠杆是乘法结合律。
首先,把 softmax 丢掉,用一个逐元素函数 φ 来代替 softmax(QK^T),论文里选的 φ 是 elu(x)+1:
attn = φ(Q)φ(K)^T V
然后利用结合律,换一下矩阵乘法的顺序:
attn = φ(Q)(φ(K)^T V)
先算 φ(K)^T V,得到一个 d×d 的小矩阵;再拿 φ(Q) 去乘它。中间结果的最大尺寸是 d×d,跟 token 数量 n 彻底解耦。复杂度从 O(n²·d) 降到了 O(n·d²),长文本场景下 n≫d,这就是 O(n)。
这步还有一个额外福利:所有历史信息都被压进了一个固定大小的状态矩阵,推理时像 RNN 一样每来一个 token 就更新一次状态,不用缓存每个历史 token 的 Key 和 Value。状态占用 O(1),不随 n 增长。这就是论文标题「Transformers are RNNs」的含义。
看着挺完美?问题出在你丢掉的 softmax 上。
真正的代价:从「锐利选择」退化成了「平均混合」
softmax 有指数锐化能力。线性注意力没有。它的权重来自 φ(Q) 和 φ(K) 的线性点积,天然是平坦的——最好的情况之一,一个 token 拿 0.3、0.4 的权重,剩下的均匀分给其他一堆 token。
这意味着什么?你问模型「周三开会还是周四开会」,标准注意力可以把「周三」的权重拉到接近 1,其余全压到接近 0。线性注意力做不到这种集中,它只会「比较看重周三,其他也各给一点」。
单挑一次,这种模糊好像还能忍。但在超长文本里,每一层、每一个头都这样「平均」一次,误差层层叠加,最后模型只能「大概记得有这么个事」,说不准「到底在哪说的」。这就是线性注意力精确检索能力显著弱于标准注意力的机制根源。
论文里也加了一个分母归一化因子来避免数值爆炸,但那个分母只能控制输出的量级,不能让权重重新尖锐起来。softmax 的赢家通吃,在线性结构里不存在。
补救方案:没人敢只用它
正因为钝,后续所有方案都不是「纯线性注意力」,而是三条互补路线:
- Performer:给线性注意力镀金。Rethinking Attention with Performers 用随机特征去近似 softmax 核函数,想让线性复杂度「继承」锐利。理论漂亮,但随机近似有误差——特征维度取小了会「抖」,取大了速度优势又没了。
- 局部窗口 + 全局补全:干脆绕开它。短窗口内用标准注意力保证精度,窗口外用更省的方式补足长程信息。Longformer 是这套思路的先行者,Mistral 7B 的滑动窗口注意力是它在工业界的变体。
- Mamba:把状态压缩本身做成「可选择」的。Mamba 让输入自己决定哪些信息写入状态,相当于给压缩装了一道选择性阀门。比线性注意力聪明,但「判断什么重要」成了新的瓶颈——精确检索依然不敌标准注意力。
一张表看清天平两端:
| 维度 | 标准 Softmax 注意力 | 线性注意力 |
|---|---|---|
| 复杂度 | O(n²·d) | O(n·d²),长文本即 O(n) |
| 注意力分布 | 尖锐,能「选中」关键 token | 平坦,只能「加权混合」 |
| 历史状态 | 无压缩,缓存全部 KV | 压缩为固定大小状态矩阵 |
| 精确检索 | 强 | 弱 |
| 长文本成本 | 随 n 平方爆炸 | 随 n 线性增长 |
我的判断:什么时候该用它,什么时候别用
线性注意力不是骗局,但也不是免费午餐。它的 O(n) 是用「表达力」换来的——你放弃了两两 token 的精确交互,换来了超长历史的压缩。它适合「宽而浅」的任务:超长文档的全局语义理解、跨段落主题归纳、不需要逐字定位的摘要。
它也明确不适合「窄而深」的任务:多跳推理、精确事实检索、位置敏感的对齐与计算。在这些任务上,线性注意力和标准 Transformer 的差距不是一点半点。这也是为什么今天主流模型在 128K 以内仍然以标准注意力为主;真要到 1M 以上,才会考虑线性注意力或混合架构。
所以别再问「线性注意力能不能替代标准注意力」——它不能,也不该。正确的用法是把它当一个「特定场景的补充武器」:当你的核心矛盾变成「上下文太长,标准注意力算不动」,它才是答案。
Mamba 到底算不算线性注意力?
不算直接变体,但算同一思想的近亲。线性注意力把 φ(K)^T V 累加进一个 d×d 状态矩阵;Mamba 用 A 矩阵控制遗忘,输入决定各通道写入多少。共同点是固定大小状态加线性复杂度,差别在于状态如何更新。
为什么我们日常用的模型不直接用线性注意力?
因为大部分真实场景的序列长度还没到「标准注意力完全撑不住」的级别。128K 以内,FlashAttention 之类的 IO 优化已经让标准注意力足够快;超过 1M 的产品也不会只依赖线性注意力,而是稀疏注意力、混合架构、检索增强的组合。
O(n) 是免费的吗?
不是。它的成立依赖 n≫d。如果你的任务序列很短、但模型宽度很大,比如 n=512、d=4096,线性注意力可能比标准注意力更慢。只有真正需要超长文本时,它才有性价比。
进阶:为什么「无损线性注意力」至今不存在
线性注意力的本质,是用有限维特征 φ 去近似 softmax 对应的核函数 e^{x^T y}。这个核函数在数学上对应无限维特征空间,有限维近似必有误差。Performer 的随机特征是一种蒙特卡洛近似,误差随特征维数增大而减小,但不会归零。这就是「无损」的数学障碍。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/663.html