大语言模型的基石:Transformer 入坑笔记(五) - 线性注意力(Linear Attention) 的优化

💡 原文中文,约45700字,阅读约需109分钟。
📝

内容提要

本文梳理线性注意力的优化路线:Performer用正交随机特征逼近softmax;DeltaNet按当前Key修正旧映射;GLA按Key通道门控衰减并分块并行;Mamba-2/SSD以标量衰减统一递推与矩阵计算;Gated DeltaNet结合整体遗忘与Delta规则,用WY表示和三角求解实现分块;KDA进一步采用逐通道衰减加Delta更新,兼顾表达力与硬件效率,并与MLA混合使用。

🔎

延伸解读

从近似到改写:线性注意力优化的两条路径

文章梳理的优化路线可分为两类:一类如 Performer,用随机特征逼近 softmax 的指数核,但固定状态中的写入干扰依然存在;另一类如 DeltaNet、GLA、Mamba-2 等,直接设计状态的写入与遗忘规则。前者关注相似度函数的近似质量,后者关注有限状态如何保留和更新信息。理解这一分野,有助于判断不同模型改进的侧重点。

分块计算:线性注意力落地的关键

GLA、Mamba-2/SSD 和 Gated DeltaNet 都采用分块策略:块内组织成并行矩阵运算,块间传递递推状态。这样既避免了逐 token 递推的串行依赖和小规模计算,又不必像全注意力那样形成整张注意力矩阵。文章给出的复杂度对比显示,分块方案在块长 C 固定时总运算量仍随序列长度线性增长,但实际吞吐还受 kernel 实现和硬件影响。

KDA 的改进:逐通道衰减加 Delta 更新

KDA 在 Gated DeltaNet 的基础上,将标量衰减替换为逐通道衰减,使每个 Key 特征维度可以独立控制遗忘速度,表达力更强。同时保留 Delta 规则,按当前 Key 修正旧映射。文章推导了其分块形式,利用 WY 表示和三角求解将递推转化为矩阵乘法。Kimi Linear 将 KDA 与 Gated MLA 混合使用,Kimi K3 的公开配置也列出了 KDA 层与全注意力层的组合。

注意近似误差与数值稳定性

Performer 的随机特征估计在固定查询和 Key 时是无偏的,但注意力输出是分子分母的比值,其期望未必等于真实归一化输出,且误差会跨层传播。GLA 和 KDA 的分块实现中,累积衰减可能非常小,直接求逆或逐元素相除会带来数值问题,因此论文采用 log 空间和二级分块处理。阅读相关公式时,需留意这些工程细节对实际效果的影响。

❓

Q&A

线性注意力既然已经降低了计算量,为什么还需要进一步优化?

线性注意力把历史K/V压进固定大小的状态,避免遍历完整历史,但带来两个问题:有限状态如何保留和更新信息,以及如何把递推计算组织成GPU擅长的大块矩阵运算。纯加法递推没有衰减因子,相近Key的写入会相互干扰,归一化后信息权重可能变小。

Performer 是如何用随机特征逼近 softmax 注意力的?

Performer 用正随机特征逼近 softmax 归一化前的指数相似度分数。先对 q、k 缩放,利用高斯矩生成函数推导出 exp(x^T y) 的期望形式,再采样 m 个高斯向量 ω_i,定义 φ(x) = (1/√m) exp(Wx - ||x||^2/2 · 1_m),其中 W 由 ω_i 堆叠而成。FAVOR+ 进一步采用正交采样降低估计方差。

DeltaNet 的 Delta 规则和普通的加法更新有什么不同?

DeltaNet 引入可训练学习率 β_t,把状态 S 视为从 Key 特征到 value 的线性映射,对当前样本定义重构损失并做一步梯度下降,得到 S_t = (I - β_t k_t k_t^T) S_{t-1} + β_t k_t v_t^T。与全局遗忘 S_t = α_t S_{t-1} + k_t v_t^T 的区别在于:标量 α_t 对整个旧状态统一缩放,而 Delta 规则根据当前 Key 修正该 Key 方向上的旧映射。

GLA 的门控是怎么设计的,为什么按 Key 特征行衰减?

GLA 采用按 Key 特征行衰减的门控:S_t = Diag(α_t) S_{t-1} + k_t v_t^T,其中 α_t ∈ (0,1)^{d_k}。为每个 token 生成完整 G_t 参数开销大且难以高效矩阵乘,GLA 选择中间粒度,让 G_t 的每一行恒定,逐元素相乘等价于左乘对角阵。门控参数化为 α_t = σ(W_g x_t + b_g)^{1/τ},τ=16,使同样的 logits 对应更慢的遗忘。

Gated DeltaNet 是如何把整体遗忘和 Delta 规则结合起来的?

Gated DeltaNet 将 Mamba-2 式的标量整体遗忘与 DeltaNet 的 Delta 规则结合,得到 S_t = α_t (I - β_t k_t k_t^T) S_{t-1} + β_t k_t v_t^T,其中 α_t, β_t ∈ (0,1)。它先对旧状态整体衰减,再用衰减后的状态预测当前 value,写入预测误差。α_t 控制整体保留多少,β_t 控制当前 Key 方向上的修正强度。

KDA 相比 Gated DeltaNet 主要改进了什么?

KDA 将 GDN 中的标量衰减 α_t 替换为逐通道(逐 Key 特征维度)的向量衰减,公式为 S_t = (I - β_t k_t k_t^T) Diag(α_t) S_{t-1} + β_t k_t v_t^T。这样兼顾了 GLA 按 Key 特征行衰减的表达力与 DeltaNet 的修正能力,同时通过分块算法(WY 表示、三角求解)保持硬件效率,并可与 MLA 混合使用。

🏷️

标签

➡️

继续阅读