Linear Attention
线性注意力用特征映射替代 softmax,使计算成本随序列长度线性增长,并在解码时保持固定大小的状态。内容涵盖 DeltaNet 和混合架构。
线性注意力是一类注意力机制,其开销随序列长度线性增长,而标准 softmax 自注意力的开销则呈二次增长。Softmax 注意力会计算每个查询与每个键的分数,因此 N 个token会为每个头生成一个 N × N 分数矩阵;生成文本的Transformer还会维护一个随每个 token 增长的 KV 缓存。线性注意力用特征映射的点积 φ(q)·φ(k) 替代 softmax 相似度,让模型能够重新排列矩阵乘法,并在固定大小的状态中概括所有历史键和值。Katharopoulos 等人在 2020 年的论文 Transformers are RNNs 中给出了这种方法的常见形式;如今,门控变体已与标准注意力层一起应用于生产环境中的大型语言模型(LLM)。
线性注意力的工作原理#
Softmax 注意力计算 softmax(QKᵀ)V;由于 exp(q·k) 无法分解为查询部分和键部分,因此必须为每一对查询和键计算分数。使用特征映射 φ(例如 elu(x) + 1)后,输出变为 φ(Q)(φ(K)ᵀV),并由 φ(Q) 乘以 φ(K) 各行之和进行归一化。矩阵乘法满足结合律,因此可以先计算 φ(K)ᵀV,得到一个 d × d 矩阵,其中 d 是头的维度,无论 token 数量是多少。计算时间由 O(N²d) 降至 O(Nd²),当序列长度远大于头的维度时,这种方法就能带来优势。
对于因果模型,相同的代数变换会将注意力转化为具有矩阵状态的循环神经网络(RNN)。每个新 token 都会将外积 φ(k)vᵀ 加入状态,其查询再从该状态读取信息,因此文本生成每个 token 所需的内存和时间都是常数。训练时使用并行形式,或使用 flash-linear-attention 库中的分块内核,因此 GPU 仍可一次处理整个序列。在 PyTorch 中,两种形式会产生相同的输出:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
n, d = 2048, 64
q, k, v = torch.randn(3, n, d).unbind(0)
phi_q, phi_k = F.elu(q) + 1, F.elu(k) + 1 # positive feature map in place of softmax
# Parallel form: an n x n causal score matrix, as in softmax attention
scores = torch.tril(phi_q @ phi_k.T)
parallel = (scores @ v) / scores.sum(dim=-1, keepdim=True)
# Recurrent form: a fixed d x d state that each new token updates
state, norm, outputs = torch.zeros(d, d), torch.zeros(d), []
for t in range(n):
state += torch.outer(phi_k[t], v[t])
norm += phi_k[t]
outputs.append(phi_q[t] @ state / (phi_q[t] @ norm))
recurrent = torch.stack(outputs)
print("Same outputs:", torch.allclose(parallel, recurrent, atol=1e-4))
print(f"Recurrent state: {state.numel():,} numbers; KV cache after {n:,} tokens: {2 * n * d:,} numbers")它会打印 Same outputs: True。无论序列增长多长,64 × 64 的状态都只包含 4,096 个数字;而一个头在处理 2,048 个 token 后的 KV 缓存包含 262,144 个数字,并且每新增一个 token 就增加 128 个数字。
DeltaNet、门控与混合模型#
固定大小的状态是一种有损记忆。普通线性注意力只会向状态中添加内容,因此旧关联会不断堆积并相互干扰,对长上下文窗口中特定事实的回忆能力也不如 softmax 注意力。目前有两种主流改进方法。门控会在每次更新前将状态乘以一个可学习的衰减值,使模型能够遗忘;这与 Mamba-2 等状态空间模型(SSM)采用的机制相同,其作者证明这两个模型家族是彼此的对偶形式。Delta 规则源自将线性 Transformer 与快速权重程序联系起来的研究:它读取当前存储的键对应的值,并且只写入新值与该已存储预测之间的差异。DeltaNet 于 2024 年实现了在整个序列上并行训练 Delta 规则;Gated DeltaNet(ICLR 2025)增加了衰减门控;Moonshot AI 的 Kimi Linear 则进一步改进了门控,使其能分别作用于每个通道。
生产模型会将这些层与完整注意力交替使用,从而通过少数 softmax 层保持精确回忆能力。Qwen3-Next 和 Qwen3.5 系列会重复使用由三层 Gated DeltaNet 和一层门控 softmax 注意力层组成的模块;Kimi Linear 则采用类似的 3:1 混合比例,使用 Kimi Delta Attention 和多头潜在注意力:
线性注意力与相关方法的区别#
- 自注意力:精确的 softmax 形式,会为所有 token 对计算分数,计算时间呈二次增长,KV 缓存也随序列增长。
- Flash Attention:一种 GPU 内核,在片上内存中以分块方式计算精确的 softmax 注意力。它减少了内存流量,但运算次数仍呈二次增长。
- 稀疏注意力:保留 softmax,但只为选定的 token 对计算分数,例如只关注最近 token 的局部窗口。
- 分组查询注意力(GQA):让多个查询头共享键和值,以常数倍缩小 KV 缓存,同时保留完整的 softmax 注意力。
线性注意力的应用场景#
长上下文语言模型是最大的应用领域,因为混合模型中的线性层在解码期间会维持固定大小的状态,只有少数 softmax 层需要使用不断增长的 KV 缓存。视觉是第二大应用领域,因为 token 数量会随图像分辨率增加。EfficientViT 使用基于 ReLU 的线性注意力进行高分辨率语义分割,NVIDIA 的 SANA 则构建了线性扩散 Transformer,可生成最高 4096 × 4096 像素的图像。在目标检测中,注意力通常只在特征图尺寸最小时运行。YOLO26 保留标准 softmax 注意力,并且只在 C2PSA 模块和一个启用了注意力的 C3k2 模块中运行,两者都作用于 640 像素图像的 20 × 20 stride-32 特征图,因此每个注意力层处理 400 个 token,每个头的完整分数矩阵包含 160,000 个元素。










