/ What Is Series
What Is Linear Attention?
A practical explanation of Linear Attention: how kernel feature maps and recurrent states reduce long-context cost, and why Gamma, Delta, Gate, and Conv variants matter.
在大模型语境里,**Linear Attention(线性注意力)**通常指一类把标准 self-attention 的序列复杂度从二次级降低到线性级的注意力机制。
一句话概括:
Linear Attention 不再显式计算所有 token 两两之间的注意力矩阵,而是把历史 key-value 压缩成一个可递推更新的状态,再让当前 query 从这个状态里读取信息。
这句话里有两个关键词:
- 压缩状态:历史 token 不再以完整 KV cache 的形式全部保留,而是被写入一个固定大小或近似固定大小的 state。
- 递推读取:causal 推理时,状态可以像 RNN hidden state 一样逐 token 更新。
所以,Linear Attention 的核心不是“把 attention 简单线性化”,而是把注意力机制改造成一种更适合长上下文和低缓存推理的状态系统。
1. 标准 Attention 的问题在哪里#
标准 Transformer Attention 可以写成:
Attention(Q, K, V) = softmax(QK^T / sqrt(d)) V其中:
Q是 query;K是 key;V是 value;N是序列长度;d是每个 attention head 的维度。
真正贵的地方是 QK^T:
QK^T: [N, d] x [d, N] -> [N, N]它会生成一个 N x N 的注意力矩阵。也就是说,每个 token 都要和所有 token 做一次相似度计算。
当上下文长度比较短时,这个成本可以接受。但当上下文扩展到 32K、128K、1M 时,问题会非常明显:
- attention matrix 的计算量按
N^2增长; - 训练时中间激活显存压力很大;
- 推理时 KV cache 会随上下文长度增长;
- decode 阶段每个新 token 都要读取越来越长的历史 KV。
Linear Attention 想解决的就是这个问题:
能不能不显式构造 N x N attention matrix,
也能让当前 token 读取历史信息?答案是可以,但不是免费的。它用“压缩记忆”换来了效率,也带来了状态容量有限的问题。
2. 核心想法:把历史 KV 压成状态#
标准 attention 的直觉是:
当前 query 和所有历史 key 做匹配,
得到一组权重,
再按权重聚合所有 value。Linear Attention 换了一个角度:
先把所有历史 key-value 汇总成一个状态,
当前 query 只从这个状态里读取。为了做到这一点,它通常会引入一个非负特征映射 phi,把 query-key 相似度写成 kernel 形式:
sim(q_i, k_j) = phi(q_i)^T phi(k_j)于是单个 token 的输出可以写成:
o_i = sum_j phi(q_i)^T phi(k_j) v_j
---------------------------------
sum_j phi(q_i)^T phi(k_j)把和当前 query 无关的历史项提前聚合:
S = sum_j phi(k_j) v_j^T
z = sum_j phi(k_j)那么输出就变成:
o_i = phi(q_i)^T S
---------------
phi(q_i)^T z这一步是 Linear Attention 的核心。
标准 Attention 保存的是:
每个 query 对每个 key 的关系Linear Attention 保存的是:
历史 key-value 的压缩统计量也就是说,它不再显式存储 N x N 的注意力关系,而是把历史信息写进 S 和 z。
3. 为什么复杂度变成线性#
标准 attention 的主要计算路径是:
QK^T: [N, d] x [d, N] -> [N, N]
[N, N] x [N, d_v] -> [N, d_v]中间会出现 N x N 矩阵,所以对序列长度是二次复杂度。
Linear Attention 的计算路径变成:
K_phi^T V: [d, N] x [N, d_v] -> [d, d_v]
Q_phi (K_phi^T V): [N, d] x [d, d_v] -> [N, d_v]中间最大的状态从:
N x N变成:
d x d_v当 N 远大于 d 时,序列维度上的复杂度就从 O(N^2) 变成接近 O(N)。
这背后的数学关键是矩阵乘法结合律:
(QK^T)V -> Q(K^T V)但这里必须强调一个容易误解的点:
Linear Attention 不是把原始 softmax attention 无损改写成线性形式。
原因是 softmax 是非线性归一化,它夹在 QK^T 和 V 中间,不能直接把乘法顺序交换。Linear Attention 能这么做,是因为它改变了相似度函数,用 kernel feature map 替代或近似了原来的 softmax attention。
4. Causal Linear Attention 为什么像 RNN#
在自回归语言模型里,第 t 个 token 只能看到 1 ... t 的历史。
这时状态可以递推更新:
S_t = S_{t-1} + phi(k_t) v_t^T
z_t = z_{t-1} + phi(k_t)当前输出是:
o_t = phi(q_t)^T S_t
-----------------
phi(q_t)^T z_t这个形式和 RNN 很像:
h_t = update(h_{t-1}, x_t)区别在于,Linear Attention 的 hidden state 不是普通向量,而是一个保存 key-value 关联关系的矩阵状态。
所以在 causal 推理阶段,它可以不反复扫描完整历史 KV,而是维护一个递推状态:
读入当前 token
-> 生成 k_t 和 v_t
-> 更新状态 S_t 和 z_t
-> 用 q_t 从状态里读取输出这也是 Linear Attention 对推理系统有吸引力的地方:它把“随着上下文增长而增长的历史缓存”,变成了“随着 token 到来持续更新的状态”。
5. Gamma、Delta、Gate、Conv 在解决什么问题#
基础 Linear Attention 很干净,但也有一个明显问题:
所有历史都被压进有限状态,信息会混在一起。上下文越长,状态容量越紧张。后续很多改进,本质上都在解决同一个问题:
有限状态里,哪些信息应该写入?
哪些信息应该遗忘?
已经记住的信息还要不要重复写?
局部细节靠什么补?5.1 Gamma:让历史逐步衰减#
基础状态更新是:
S_t = S_{t-1} + phi(k_t) v_t^T这意味着所有历史信息都会不断累加。长序列下,旧信息和新信息容易混在一起。
Gamma 的思路是给旧状态加一个衰减系数:
S_t = gamma * S_{t-1} + phi(k_t) v_t^T其中 gamma 通常在 0 到 1 之间。
直观理解:
gamma越接近1,记忆保留越久;gamma越小,旧信息遗忘越快;- 不同 head 或 channel 可以学习不同的记忆时间尺度。
这和 RetNet、SSM 里常见的 decay / retention 思想很接近:模型不只是“写入历史”,还要控制历史保留多长。
5.2 Delta:写入误差,而不是完整覆盖#
最朴素的写入方式是:
S_t = S_{t-1} + k_t v_t^T但如果状态里已经能根据 k_t 读出接近 v_t 的内容,再完整写一遍就会冗余,甚至可能造成冲突。
Delta Rule 的想法是:先读,再写误差。
v_hat_t = S_{t-1} k_t
S_t = S_{t-1} + k_t (v_t - v_hat_t)^T这里的 v_t - v_hat_t 就是 delta。
它的直觉是:
状态已经能预测对的部分不用再写,
只把预测错的残差写进去。这样,状态就不再只是一个简单累加器,而更像一个在线更新的 associative memory。
5.3 Gate:控制写入强度#
不是每个 token 都同样重要。
Gate 的作用是控制“写多少”:
S_t = S_{t-1} + g_t * k_t (v_t - v_hat_t)^T其中 g_t 可以由当前 token 的 hidden state 生成。
它解决的是写入选择问题:
- 重要 token 强写入;
- 噪声 token 弱写入;
- 不同 channel 可以有不同写入强度;
- 有些结构会进一步区分 erase 和 write。
现代 Gated DeltaNet、Kimi Delta Attention 这类方法,基本都在把 gate 做得更细,让有限大小的状态更有效地使用。
5.4 Conv:补局部建模能力#
Linear Attention 擅长把长程历史压进状态,但它不一定擅长处理非常局部、非常尖锐的邻近 token 关系。
所以很多线性注意力或状态空间类架构会加短卷积:
x'_t = Conv(x_{t-w:t})可以粗略理解为:
Linear state 负责长程压缩记忆;
Conv 负责局部顺序和短距离模式;
Gate / Delta 负责让状态写入更有选择性。这也是很多现代架构的推理缓存会拆成两部分的原因:
- state cache:保存递推状态;
- conv cache:保存最近几个 token 的局部窗口。
6. Linear Attention 的 KV Cache 优势#
标准 MHA、GQA、MLA 在推理时通常要缓存历史 token 的 key 和 value。
所以 KV cache 大小和上下文长度相关:
KV cache size ∝ seq_len上下文越长,缓存越大。
Linear Attention 不缓存每个历史 token 的完整 KV,而是缓存递推状态,例如:
S_t, z_t因此它的推理缓存主要和这些结构参数相关:
- head 数;
- key dimension;
- value dimension;
- 是否有额外 gate state;
- 是否有 conv cache;
- tensor parallel 切分方式。
从系统角度看,这带来几个直接优势:
- decode 阶段不用维护随上下文线性增长的完整 KV cache。
- 长上下文下显存压力更低。
- 每 token 解码成本更稳定。
- 更适合百万级上下文或端侧低显存场景。
- 更容易做 recurrent 或 chunkwise recurrent 推理。
但代价也很明确:
状态大小固定或近似固定,意味着历史信息会被压缩。压缩带来效率,也带来信息损失。对于需要精确检索某个历史 token 的任务,Linear Attention 通常不如 full attention 稳。
7. 和标准 Attention 的本质区别#
| 维度 | 标准 Softmax Attention | Linear Attention |
|---|---|---|
| 历史表示 | 保留所有历史 KV | 压缩成递推状态 |
| 交互方式 | token 两两交互 | 当前 query 读取状态 |
| 中间矩阵 | N x N attention matrix | d x d_v state |
| 序列复杂度 | O(N^2) | O(N) |
| 推理缓存 | 随上下文长度增长 | 固定或近似固定状态 |
| 优势 | 精确检索能力强 | 长上下文效率高 |
| 代价 | 长上下文成本高 | 状态容量有限 |
如果只记一个区别,我会这样记:
标准 Attention 是显式检索历史。
Linear Attention 是压缩记忆后读取。8. 为什么现在常见做法是 Hybrid#
纯 Linear Attention 很高效,但它不一定适合所有任务。
比如这些任务往往更依赖 full attention 的精确检索能力:
- needle-in-a-haystack;
- 精确复制;
- 从长上下文中定位某个稀疏证据;
- 多跳检索;
- 需要严格引用原文片段的场景。
原因很直接:Linear Attention 的历史是压缩过的。压缩状态可以保留很多统计信息和模式,但不保证能像 full attention 那样精确回看任意一个历史 token。
所以很多现代架构会采用 hybrid 方案:
部分层使用 Linear Attention / Delta / SSM 类模块,
部分层保留 Full Attention 或 MLA。这样可以在两个目标之间折中:
- 用线性层降低长上下文计算和缓存成本;
- 用少量 full attention 层保留精确检索能力;
- 在线性层内部加入 Gamma、Delta、Gate、Conv 增强表达能力;
- 训练阶段尽量并行,推理阶段尽量递推。
这类设计的方向很清楚:
不要把 full attention 的能力全部丢掉,
而是在系统瓶颈最明显的地方用线性状态替代它。9. 常见误区#
误区一:Linear Attention 等价于 softmax attention#
不等价。
Linear Attention 通常改变了相似度函数,或者用 kernel feature map 近似 softmax。它不是把原始 softmax attention 原封不动地换一个计算顺序。
误区二:线性复杂度意味着一定更快#
不一定。
真实速度还取决于 kernel 实现、矩阵维度、batch size、硬件利用率、state 更新方式、是否 causal、是否 chunkwise、是否有额外 gate 和 conv。短序列下,标准 attention 的优化 kernel 可能反而更快。
误区三:Linear Attention 不需要缓存#
也不准确。
它通常不需要随序列长度增长的完整 KV cache,但仍然需要缓存递推状态、归一化状态,有些结构还需要 conv cache 或 gate 相关状态。
误区四:Linear Attention 可以完全替代 Full Attention#
理论上可以训练纯线性结构,工程上也有人这么做,但在很多需要精确检索的场景里,hybrid 通常更稳。
10. 总结一句话#
Linear Attention 是一种把 attention 从“显式两两检索”改造成“状态压缩读取”的机制。它通过 kernel feature map 和矩阵乘法结合律避免构造 N x N attention matrix,在 causal 推理时又可以写成 RNN 式递推状态,从而降低长上下文计算和 KV cache 压力。
如果按技术演进链路来看,可以这样记:
Softmax Attention
-> Kernel Linear Attention
-> RNN-like State
-> Gamma / Delta / Gate / Conv 增强
-> Linear + Full Attention Hybrid LLM它的价值很明确:长上下文更省、更稳、更容易推理部署。
它的代价也同样明确:历史被压缩后,状态容量有限,精确检索能力可能下降。
所以,理解 Linear Attention 最关键的不是记住某个公式,而是抓住这个工程取舍:
效率来自压缩,风险也来自压缩。参考资料#
- Katharopoulos et al., Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention: https://arxiv.org/abs/2006.16236
- Sun et al., Retentive Network: A Successor to Transformer for Large Language Models: https://arxiv.org/abs/2307.08621
- Kimi Linear: An Expressive, Efficient Attention Architecture: https://arxiv.org/abs/2510.26692