线性注意力 · RWKV / KDA
LLM 架构 · 线性注意力

线性注意力:把不断增长的 KV cache 压成固定状态

softmax attention 每生成一个 token 都要读完整段历史,KV cache 随序列线性增长。 线性注意力换成一个与序列长度无关的矩阵状态,代价是状态容量有限,必须学会在写入时遗忘、在冲突时定向改写。 RWKV-4 用 time-mix/channel-mix 把这件事做成可训练的 RNN;RWKV-7 把更新写成向量门控的广义 delta rule;Kimi Linear 的 KDA 再把门细化到每个通道,并用 3:1 的 KDA:MLA 混合保住全局检索。

TL;DR · 30 秒抓住核心

线性注意力把历史压进一个 dk × dv 的矩阵状态:每来一个 token,用外积写入;查询时用 q 读出。 decode 阶段只读这个状态,不读历史,因此每步计算和显存都与序列长度无关。

但固定状态不会自己忘记。加性写入只叠加、不删除,序列一长,不同的 key 就会挤进同一片方向,检索时取回混合值。 补缺口的两条机制是:gating/decay 按比例缩小旧状态,delta rule 沿当前 key 定向删除再写入。

Gated DeltaNet 把标量门和 delta rule 合在一起;KDA 把标量门换成逐通道对角门,并把门放在 Householder 之前;RWKV-7 则把衰减和学习率都向量化,还允许删除 key 与写入 key 不同。 三者都把更新写成对角加秩一的 DPLR,从而能 chunked 并行。

Kimi Linear 用 3:1 的 KDA:MLA 混合:长上下文平均分 54.5 对 MLA 的 52.2,1M prefill 快 2.9×。 但解码加速原文给出 6×、2.3×、6.3× 三组数字,§06 并列呈现,不替作者合并。

75%
混合比例下 KV cache 用量最多减少
MLA 层仍保留随 T 增长的 KV
2.9×
Kimi Linear vs MLA 的 prefill 加速
序列越长收益越明显(§5.6)
128×128
KDA 每头状态大小,与序列长度无关
MLA 层仍保留随 T 增长的 KV cache
01

softmax 的 KV cache 随长度增长;固定状态省掉它,却要在写入时决定遗忘什么

先建立共同认知:线性注意力把历史压进一个与序列长度无关的矩阵状态;难点不是省显存,而是有限容量下如何选择性写入、定向删除。

softmax attention 在 decode 时要把每个历史 token 的 K/V 留在显存里,再让当前 query 与它们逐个打分。 Kimi Linear 的 §1 把这条代价写成两点:时间随序列二次增长,KV cache 随序列线性增长。 序列越长,每一步 decode 要读的 K/V 越多,显存也越难留给更大的 batch。

线性注意力换成另一套记账方式:维护一个矩阵状态 St,每来一个 token 就把它的 key/value 外积加进去;查询时用 q 从状态里读。 状态大小是 dk × dv,与已经处理了多少 token 无关。 Kimi 的 KDA 每个头取 128×128,decode 时只保留这一块状态。

St = St−1 + kt vt⊤      ot = St⊤ qt
最朴素的线性注意力:加性写入,没有遗忘;列向量约定见 Kimi Linear §2.2

问题出在「只加不减」。RWKV-7 的 §2 把这件事讲得很直接:旧状态不会被移除,只会因为新值不断叠加而变成数值上更小的一部分; 状态容量有限,最终不同的值会混在一起,按某个 key 取回时拿到的是多条关联的混合。 Gated DeltaNet 的 §1 用另一个说法描述同一件事:能同时存下的正交 key-value 对数量受维度限制,序列长度超过维度后,memory collision 不可避免。

所以一个可用的固定状态至少要做三件事:决定哪些旧记忆该淡出;决定当前 token 的写入强度;在需要时把某个 key 上的旧值替换掉,而不是继续叠加。 后面的 gating、delta rule 和 chunked 并行,都是围绕这三件事展开的。

容量账

固定状态省掉的是「随 T 增长的存储」,不是「容量无限」

KV cache 的大小与序列长度成正比;线性状态的大小只与 head 维度有关。前者可以精确保留每个 token 的 K/V,后者必须把历史压缩进固定秩的矩阵。 压缩比越高,检索越依赖「写什么、删什么」的策略。这不是实现细节,而是结构性的取舍。推断(由固定秩状态与 GDN §1 的容量上限推出)

02

从固定衰减到标量门控,再到 delta rule:每一代只补上一个缺口

RWKV-4 证明线性 RNN 可以训练到 14B;Mamba-2 把衰减变成数据相关;DeltaNet 补上定向删除;GDN 把门控和 delta 合并。它们各自仍留下一个粒度问题。

RWKV-4 · §3.1

time-mix / channel-mix:固定衰减的 WKV

RWKV-4 的每个 block 由 time-mix 和 channel-mix 两个子块组成。time-mix 先做 token shift,把当前输入和上一时刻输入线性插值,再送进 WKV 算子:

wkvt = (Σi<t e−(t−1−i)w+ki ⊙ vi + eu+kt ⊙ vt) / (Σi<t e−(t−1−i)w+ki + eu+kt)

这里的 w 是每个通道一个的可学习衰减向量,u 是当前 token 的 bonus。它让模型能按相对位置指数衰减,但 w 不是输入的函数:同一层、同一通道的衰减曲线在训练完后固定。 channel-mix 则是一个带输出门的 ReLU² MLP。

它能以 O(BTd²) 的矩阵乘加 O(BTd) 的串行 scan 训练,也能在推理时写成逐 token 递推(§3.2–§3.3)。缺口是:衰减不能按输入变化,也不能只删掉某个 key 上的旧值。

Mamba-2 · §5.1 / §6

标量门控 + SSD 分块算法

Mamba-2 把线性注意力的状态更新写成带标量衰减的递推:St = αt St−1 + vt kt⊤,其中 αt 由输入决定。 Gated DeltaNet 的 §2.1 把这种形式概括为「Linear Attention with decay」。

Mamba-2 的贡献之一是把这类状态空间模型写成结构化矩阵,并给出 SSD 的分块算法(§5、§6):块内做矩阵乘,块间传递状态,从而在 GPU 上并行训练。 这套「chunked」思路后来被 GDN 和 KDA 继承。

缺口是粒度:αt 是一个标量,整张状态一起衰减。想只忘掉某条过期的 key-value 关联,它做不到,只能让所有关联一起变淡。

DeltaNet · GDN §2.2

delta rule:沿当前 key 定向替换

DeltaNet 把状态看成一张在线学习的 fast-weight 表,损失是 ½‖S⊤kt − vt‖²。对状态做一步梯度下降,得到:

St = (I − βt kt kt⊤) St−1 + βt kt vt⊤

(I − β k k⊤) 先把状态里沿 k 方向的分量消掉,再把新的 k v⊤ 写进去。β 控制替换强度:β=0 不写,β=1 完全替换。 这解决了「旧值擦不掉」的问题,但没有全局清空能力:上下文切换时,上一段的关联仍会留在其他方向上。

Gated DeltaNet · Eq.10

标量门 × delta:先整体缩放,再定向擦写

GDN 把两者合成一条规则:

St = St−1(αt(I − βt kt kt⊤)) + βt vt kt⊤

αt→0 时可以快速清空,αt→1 时退化为纯 delta rule。GDN 的 S-NIAH 实验正是用这两种失败模式来展示互补性:Mamba-2 在长序列上衰减太快,DeltaNet 在需要过滤时清不掉旧信息(§3.2)。

缺口仍在粒度:αt 是每个 head 一个标量。Kimi Linear 的 §1 把这一点称为「coarse head-wise forget gate」——一个 head 里的所有通道共享同一个遗忘率。

表 1 · 状态更新的谱系(按各文公式整理;GDN 原文用行向量状态,KDA 用列向量,表中保留各自写法)

模型状态更新门控粒度定向删除出处
RWKV-4 st = e−w ⊙ st−1 + ekt ⊙ vt(逐通道向量状态) 通道级固定 w,非输入相关 否 §3.1.2
Mamba-2 St = αt St−1 + vt kt⊤ 标量 αt 否 GDN §2.1;Mamba-2 §5.1
DeltaNet St = St−1(I − βt kt kt⊤) + βt vt kt⊤ 无门控 是 GDN §2.2
Gated DeltaNet St = St−1(αt(I − βt kt kt⊤)) + βt vt kt⊤ 标量 αt 是 GDN Eq.10
RWKV-7 St = St−1(diag(wt) − κ̂t⊤(at ⊙ κ̂t)) + vt⊤ k̃t 向量 wt、at 是,且删除/写入 key 可不同 RWKV-7 Eq.17
KDA St = (I − βt kt kt⊤) Diag(αt) St−1 + βt kt vt⊤ 逐通道 αt 是 Kimi Linear Eq.1

这张表按状态更新公式排,不按性能排。RWKV-4 的状态是逐通道向量,不是矩阵,不能直接和后面几行的矩阵状态比容量。 表中把「门控」和「定向删除」并列,是为了看两者的分工;RWKV-7 和 KDA 分别把门控推进到向量级和通道级。

03

KDA 把门放到 Householder 之前:逐通道衰减 + 定向写入

记住两条更新链:GDN 的标量门 → KDA 的对角门;RWKV-7 的向量门 + 解耦删除/替换键。两者都把状态更新写成可 chunk 的 DPLR。

先看 GDN 的形式。它把标量门放在 Householder 更新外面,整张状态先乘 αt,再做 rank-1 修正:

St = αt(I − βt kt kt⊤) St−1 + βt kt vt⊤
Gated DeltaNet Eq.10(按列向量约定转写;原文 Eq.10 为行向量写法)

KDA 把 αt 从一个标量换成一个向量 αt ∈ [0,1]dk,并把 Diag(αt) 放到 Householder 之前:

St = (I − βt kt kt⊤) Diag(αt) St−1 + βt kt vt⊤
ot = St⊤ qt
Kimi Delta Attention Eq.1;αt 逐通道,βt 仍是每个 head 一个标量(§4)

这个顺序不是排版偏好。把 Diag(αt) 放在前面,KDA 可以把它和 rank-1 项合并成 DPLR: St = (Diag(αt) − βt kt kt⊤ Diag(αt)) St−1 + βt kt vt⊤, 对应 D = Diag(αt)、a = βt kt、b = kt ⊙ αt(§6.2)。 删除方向因此变成 k ⊙ α,而不是单独的 k;这是它和 GDN 标量门的形式差异。

delta rule 在做什么

先投影掉旧值,再写入新值

把 (I − β k k⊤)S 拆开看:S − β k(k⊤S)。第二项是状态在 k 方向上的投影,乘上 β 后从状态里减掉;后面再加 β k v⊤,把当前 token 的 value 写进同一个方向。 因此它不是「再加一条」而是「先擦后写」。β=1 时,旧投影被完全移除;β=0 时,状态不动。

gate 在做什么

乘积形式的记忆半衰期

αt 是乘法衰减。连续多步的累积衰减是 γt = ∏i≤t αi(Kimi Linear §2.1 的 Decay Formulation)。 α 越接近 1,旧记忆保留越久;α 越接近 0,越接近清空。KDA 把 α 变成逐通道向量后,每个特征维度可以有独立的衰减率,类似给每个通道一条自己的「位置频率」。

下面的交互把「固定 α、距离 d 之后还剩多少」单独拿出来。它是一个标量玩具模型,只保留累积乘积,不含 delta 写入。

衰减门控 · 保留比例αd × 100%
d = 1
90.00%
d = 10
34.87%
d = 50
0.515%
d = 100
0.0027%
d = 200
0.000000%
当前读数
α = 0.900,d = 10:保留 34.87%;d = 100:保留 0.0027%。

参数为页面自定,公式 αd 来自 §2.1 的累积衰减定义;这是简化模拟,不是 KDA kernel 的还原。

手算对账:两组 (α, d),JS 与手算同一套幂运算点开看每一步

组 A:α = 0.9,d = 10

  1. 0.92 = 0.81;0.94 = 0.6561;0.95 = 0.59049。
  2. 0.910 = 0.95 × 0.95 = 0.59049 × 0.59049 = 0.3486784401。
  3. 保留比例 = 0.3486784401 × 100 = 34.86784401% → 页面显示 34.87%。

组 B:α = 0.99,d = 100

  1. 0.99100 = 0.3660323413。
  2. 保留比例 = 0.3660323413 × 100 = 36.60323413% → 页面显示 36.60%。

JS 用 Math.pow(alpha, d) * 100,再按数值大小选择小数位;上面两组都落在两位小数区间,切换参数后与手算逐位相同。 αd 是常数 α 下的累积乘积,逐通道 α 的完整形式见 §2.1。

这个模拟覆盖了什么、没覆盖什么覆盖分支与差异清单

覆盖:常数 α 下的累积衰减 αd;d = 1/10/50/100/200 的保留比例;滑块与读数的联动。

未覆盖:α 随输入变化;逐通道不同的 α;归一化项;delta rule 的写入;状态数值范围与低精度误差;真实 KDA kernel 的分块与显存访问。

因此它是简化模拟,只回答「固定 α 下,距离 d 后的记忆还剩多少」。

RWKV-7 走的是另一条向量化路线。它把状态更新写成:

St = St−1(diag(wt) − κ̂t⊤(at ⊙ κ̂t)) + vt⊤ k̃t
RWKV-7 Eq.17;行向量约定,St−1 在左、更新矩阵在右

这里有三个向量:wt 是逐通道衰减,at 是逐通道 in-context learning rate,κ̂t 是归一化后的 removal key。 k̃t 是 replacement key,可以写成 kt ⊙ lerp(1, at, α)(Eq.7)。 删除用的是 κ̂,写入用的是 k̃,两者不必相同;这是 RWKV-7 相对经典 delta rule 多出来的自由度(§3)。

转移矩阵 Gt = diag(wt) − κ̂t⊤(at ⊙ κ̂t) 不再是标准 Householder,而是带缩放的近似; 论文的 Eq.19 把它写成 (I − κ̂t⊤(at/wt ⊙ κ̂t)) diag(wt),并说明特征值落在 [−1,1](Appendix C)。

位置信息

KDA 的逐通道门同时充当可学习的位置编码

Kimi Linear §6.1 把 gated delta rule 的转移矩阵解释为一种数据相关的乘法位置编码:查询和键之间的相对位置,由中间这些转移矩阵的乘积体现。 RoPE 用固定频率的旋转矩阵做同样的事;KDA 把频率换成可学习的逐通道衰减,因而能表达更细的 position bias。 Kimi Linear 因此在 MLA 层使用 NoPE:位置信息由 KDA 层承担(§4、§6.1)。

把两条链并排看:KDA 的门是 Diag(αt),β 仍是标量,删除和写入共用 kt;RWKV-7 的门是 diag(wt),学习率 at 也是向量,删除和写入的 key 还可以分开。 两者都不是对方的简单特例;它们各自选择把哪一维向量化,以换取表达力和 kernel 效率的平衡。推断(由两条更新公式的维度差异直接看出)

04

chunked 形式把串行步数从 T 降到 T/C,代价是三角逆与中间量

递推适合 decode,不适合训练;chunked 形式用块内 matmul + 块间状态传递,把序列维的串行长度缩到块数。KDA 的约束 DPLR 正是为了让这套 kernel 跑得快。

同一个状态更新有三种写法。递推形式每 token 一步,decode 时最省,但训练时不能在序列维并行;并行形式把整段序列的注意力矩阵显式写出来,训练能并行,代价是 O(T²) 的矩阵;chunked 形式取中间:块内用矩阵乘并行,块间只传状态。 Gated Linear Attention 的并行形式是 ((Q ⊙ Γ)(K/Γ)⊤ ⊙ M)V(Kimi Linear Table 6 的 GLA 行);delta rule 则需要 WY 表示来处理那一串 rank-1 更新。

KDA 的 chunked 算法把每个块内的更新压成 W、U 两个中间量,再用 UT transform 求一个下三角逆(Eq.6–7),块间状态递推是:

S[t+1] = Diag(γ[t]C) S[t] + (Γ[t]1→C ⊙ K[t])⊤(U[t] − W[t] S[t])
Kimi Linear Eq.8;块内 W = M(Γ ⊙ K)、U = MV,M 由 Eq.6 的三角逆得到(原文 Eq.8 上标为 i→C;同文 Eq.6–7、Eq.9 为 1→C,此处按 1→C 转写)

输出也分成块间和块内两部分:

O[t] = (Γ[t]1→C ⊙ Q[t]) S[t] + Tril((Γ[t]1→C ⊙ Q[t])(K[t]/Γ[t]1→C)⊤)(U[t] − W[t] S[t])
Kimi Linear Eq.9;第一项读块间状态,第二项算块内因果注意力,括号里的 U − WS 是「伪 value」项

KDA 相对一般 DPLR 的工程优势来自「把 a、b 都绑定到 k」。一般 DPLR 在 chunked 形式里要做二阶分块来处理 1/Γ 的数值问题;KDA 把二级分块从四次降到两次,并去掉约三次额外矩阵乘(§3.2),kernel 速度约为 DPLR 的 2×(§6.2 的 Kimi Figure 2 报的是 64k 以内接近 2×)。

复杂度上,Kimi Linear §6.3 给出单头、长度 T、块大小 C、head 维 dh 的 KDA FLOPs:

FLOPsKDA(T; C, dh) = 6Tdh2 + 3TCdh + TC2      FLOPsAttn(T; dh) = 2T2dh
Kimi Linear Eq.13–14;C = 64 见 §6.3

表 2 · 单头 FLOPs 公式在 T = 1M、dh = 128、C = 64 下的取值(页面按 Eq.13–14 计算,不是实测)

项公式取值
KDA 状态项6Tdh²9.83×10¹⁰
KDA 块内项3TCdh2.46×10¹⁰
KDA mask 项TC²4.10×10⁹
KDA 合计Eq.131.27×10¹¹
全注意力2T²dh2.56×10¹⁴
比值Attn / KDA≈2016×

这组数字只比较单头、单层的理论 FLOPs,且全注意力一项是 dense attention 的公式,不是 MLA 的实测。Kimi Linear 的 3:1 混合里只有 1 层是 MLA,不能把 2016× 直接当成端到端加速;它说明的是「序列越长,二次项越占主导」这个方向。

RWKV-7 的 kernel 数据更偏工程实测:在 H100、batch 8、head dim 64、model dim 4096(64 个 wkv head)的条件下,优化后的 RWKV-7 kernel 比官方 RWKV-6 kernel 快约 3×。 序列长度 16k 时,forward 不存状态为 7.9 ms,存状态为 11.2 ms,backward 为 22.5 ms,Flash Attention v3 forward 为 33.9 ms。 按论文的变量计数,RWKV-7 是 18 个变量当量,FA3 是 10 个(§8);换来的收益是序列维线性增长。

下面的交互把 chunked scan 缩成一个标量玩具模型。它只保留 St = αt(1−βt)St−1 + βtvt(即 key 固定为 1 的标量情形),用来对照「逐 token 递推」和「块内闭式 + 块间状态」是否给出同一个状态。

C = 3,块内并行,块间递推
t = 1
S = 1.00
v 1 · α 0.9 · β 1
t = 2
S = 1.90
v 3 · α 0.8 · β 0.5
t = 3
S = 1.71
v 2 · α 0.9 · β 0
t = 4
S = 5.00
v 5 · α 0.7 · β 1
t = 5
S = 4.25
v 4 · α 0.9 · β 0.5
t = 6
S = 3.40
v 6 · α 0.8 · β 0
递归 vs 分块
t = 6:递归 S = 3.40;C = 3 的块边界 S = 1.71(t=3)、3.40(t=6)。

序列 v = [1,3,2,5,4,6]、α = [0.9,0.8,0.9,0.7,0.9,0.8]、β = [1,0.5,0,1,0.5,0] 是页面自定的玩具输入,不是论文数据。 公式是 §3.1 的标量特例;这是简化模拟,不是 KDA kernel 的还原。

手算对账:C = 3 与 C = 2 两种分块,块边界状态与递归相同点开看每一步

组 A:C = 3,整段序列

  1. 记 at = αt(1−βt)、bt = βtvt。t1: a=0, b=1;t2: a=0.4, b=1.5;t3: a=0.9, b=0。
  2. 递归:S1 = 1.00;S2 = 0.4×1 + 1.5 = 1.90;S3 = 0.9×1.90 + 0 = 1.71。
  3. 块内闭式:p = 0×0.4×0.9 = 0;S3 = 0×S0 + 0.4×0.9×1 + 0.9×1.5 + 0 = 0.36 + 1.35 = 1.71。
  4. 第二块:t4 a=0, b=5;t5 a=0.45, b=2;t6 a=0.8, b=0。S4 = 5.00;S5 = 0.45×5 + 2 = 4.25;S6 = 0.8×4.25 = 3.40。
  5. 块内闭式:p = 0×0.45×0.8 = 0;S6 = 0.45×0.8×5 + 0.8×2 + 0 = 1.8 + 1.6 = 3.40。

组 B:C = 2,同一序列

  1. 块 1(t1–t2):p = 0×0.4 = 0;S2 = 0.4×1 + 1.5 = 1.90。
  2. 块 2(t3–t4):p = 0.9×0 = 0;S4 = 0×S2 + 0 + 5 = 5.00。
  3. 块 3(t5–t6):p = 0.45×0.8 = 0.36;S6 = 0.36×5 + 0.8×2 + 0 = 1.8 + 1.6 = 3.40。

JS 按同一顺序做乘加,块边界再用闭式重算;两组参数下保留两位小数的结果与手算相同。序列是页面自定的玩具输入,公式来自 §3.1 的 chunkwise 展开。

这个模拟覆盖了什么、没覆盖什么覆盖分支与差异清单

覆盖:标量状态、key 固定为 1 的简化情形;递归更新 St = atSt−1 + bt;块内闭式 Send = (∏ai)Sstart + Σ(∏i>jai)bj;C = 2/3/6 三种分块的块边界对照。

未覆盖:向量/矩阵状态;delta rule 的 (I−βkk⊤) 定向投影;KDA 的对角门 Diag(α);RWKV-7 的解耦 key;WY/UT 三角逆;1/Γ 的数值精度;真实 CUDA kernel 与显存访问;MLA 与 3:1 混合层。

因此它是简化模拟,只回答「分块扫描与逐 token 递归在标量情形下是否给出同一个状态」。

05

Kimi Linear 的 3:1 层栈:KDA 管位置与记忆,MLA 管全局检索

看一张图:RWKV-7 是单层 time-mix + channel-mix;Kimi Linear 是 3 层 KDA + 1 层 NoPE MLA 的重复块。比例决定显存与检索能力的折中。

RWKV-7 单层 Kimi Linear 4 层一循环 x_t → Token Shift lerp(x_t, x_{t−1}, μ) Time Mix:WKV 状态 S_t = S_{t−1}(diag(w_t) − κ̂_t^T(a_t ⊙ κ̂_t)) + v_t^T k̃_t 向量门 w_t、a_t;删除/写入 key 解耦 Channel Mix:ReLU² MLP 隐藏维 4D(§4.2) 残差 + LayerNorm → 下一层 每头状态 64×64(RWKV-7 Figure 2 注) decode:固定状态,无 KV cache 训练:chunked WKV kernel §8:16k forward 7.9 ms,backward 22.5 ms KDA 层 1 · 固定状态 每头 128×128(§6.3) KDA 层 2 · 固定状态 每头 128×128(§6.3) KDA 层 3 · 固定状态 每头 128×128(§6.3) MLA 层 · NoPE 1 层保留 KV cache,随 T 增长 3 : 1 层数比 3×KDA + 1×MLA(NoPE) MoE:256 experts,8 active(含 1 shared) 48B total / 3B active(§5.4) prefill:chunk kernel;decode:recurrent KDA 状态不随 T 增长;MLA 层仍存 KV 3:1 层数比 → 更少 KV cache 128k 起 prefill 快于 MLA(§5.6) 1M prefill 2.9×(Kimi Figure 7)
图 1 · RWKV-7 单层与 Kimi Linear 的 3:1 层栈。依据 RWKV-7 Figure 1、Kimi Linear §4 与 Kimi Figure 3 重绘;MoE 路由细节未展开。 图中数字分别来自 RWKV-7 Figure 2 注与 §8、Kimi Linear §5.4、§5.6 与 §6.3、Kimi Figure 7。
  1. RWKV-7 的 token-mix:输入先做 token shift,生成 r, k, v, d, a, g 六路 token-shifted 表示(其中 d、a、g 与 value residual v 走低秩 MLP);wt = exp(−e−0.5 sigmoid(dt)) 限制在 (exp(−e−0.5), 1),at 是逐通道 sigmoid,κt = kt ⊙ ξ,k̃t = kt ⊙ lerp(1, at, α)(§4.1)。 这些量进入 WKV 递推,输出再过 LayerNorm、bonus 和输出门。
  2. RWKV-7 的 channel-mix:它不再是 RWKV-4 的门控 channel-mix,而是两层 MLP:ReLU(k′)2Wv′,隐藏维 4D(§4.2)。论文同时去掉了 token shift 的数据依赖和 channel-mix 的 receptance gating,以换取训练/推理速度(§3)。
  3. Kimi Linear 的 KDA 层:q/k/v 走 ShortConv + Swish,q/k 再 L2Norm;αt 由低秩投影加 decay 函数生成,βt 是 sigmoid 标量;输出过 head-wise RMSNorm 和数据相关门(§4)。 KDA 的 head 维是 128,状态是 128×128。
  4. 3:1 的层栈:Kimi Linear 按整层交替,每 3 层 KDA 接 1 层 full MLA;论文说 layerwise 比 headwise 更容易做基础设施、训练也更稳(§4)。 MLA 层用 NoPE,推理时可以转成纯 MQA;位置信息由 KDA 层承担(§4、§6.1)。
  5. 训练与推理:1.4T token、4,096 上下文预训练,最终 checkpoint 扩到 5.7T token、支持 1M 上下文(§5.4.1)。 prefill 用 chunk kernel,decode 切到 recurrent kernel;这也是 KDA 能同时拿到训练并行和推理常数状态的原因(§6.3)。

RWKV-7 和 Kimi Linear 的取舍不同。RWKV-7 把整个模型都做成线性 RNN,单层里没有全局注意力;Kimi Linear 把长上下文检索列为纯线性结构的主要瓶颈,因此在每 4 层里保留 1 层 full MLA 作为全局通路(§4)。 这样做的代价是那层 MLA 仍然要存 KV;换来的是全局检索通路。

06

长上下文是分水岭:KDA 混合抬分,RWKV-7 用更少 token 追平同尺寸

分开读三组数字:Kimi 的长上下文与效率、RWKV-7 的英文/多语基准、以及两者都没能消除的例外。差异统一用「点」表示,不混用相对百分比。

Kimi Linear:长上下文平均分 54.5,MLA 为 52.2

这张表是 Kimi [email protected] 与 full-attention MLA 在 128k 上下文下的对照。两边都是 1.4T token 预训练的模型,评测在同一套 long-context benchmark 上(Kimi Table 5)。 差值列是页面用 Kimi − MLA 算的;正数表示 Kimi 高,负数表示 MLA 高。

表 3 · Kimi Linear 与 MLA 的长上下文对照(Kimi Table 5;128k 上下文,1.4T token)

BenchmarkMLAKimi Linear差值(点)
RULER81.384.3+3.0
MRCR22.629.6+7.0
HELMET-ICL88.090.0+2.0
LongBench V236.135.0−1.1
Frames60.558.8−1.7
RepoQA63.068.5+5.5
Long Code Arena (Lib)32.837.1+4.3
Long Code Arena (Commit)33.232.7−0.5
Avg.52.254.5+2.3

这张表里并非每一项都高:LongBench V2 和 Frames 上 MLA 更高,Long Code Arena 的 Commit 子项也略低。平均分的 +2.3 点主要来自 MRCR(+7.0)、RepoQA(+5.5)和 Long Code Arena (Lib)(+4.3);RULER 为 +3.0。 论文把长上下文检索列为纯线性结构的主要瓶颈,并用 3:1 混合把一部分压力交回给 full MLA(§4)。

SFT 后的短上下文结果也有类似的结构。Kimi Table 4 里,Kimi Linear 在 GPQA-Diamond(Avg@8)上是 62.1,MLA 是 57.1;MMLU-Pro 是 67.4 对 65.7。 但 LiveBench(Pass@1)为 45.2,低于 MLA 的 45.7;MATH500(Acc.)为 81.2,低于 GDN-H 的 83.0;EvalPlus 为 61.0,低于 MLA 的 62.6。 预训练 Kimi Table 3 里 EvalPlus 也是 GDN-H 更高:Kimi 60.2,GDN-H 63.1。

预训练的短上下文平均趋势则偏向 Kimi:MMLU 73.8 对 MLA 71.6,BBH 72.9 对 71.6。 这组差异分别是 +2.2 点和 +1.3 点;它们和上面的负项一起看,才是完整的 Kimi Linear 结果,而不是一句「全面更好」。

RWKV-7:用更少的训练 token 追平同尺寸 Qwen2.5

RWKV-7 的对照条件不同:0-shot(MMLU 为 5-shot)、fp32、lm-eval v0.4.8(§7.1)。RWKV-7 Table 3 是英文平均,RWKV-7 Table 4 是多语平均。 三行模型的训练 token 数分别是 5.6T、18.0T、15.0T,不能把分数差直接归因于架构。

表 4 · RWKV-7 2.9B 与同尺寸 Qwen2.5-3B / Llama3.2-3B 的平均分(英文 RWKV-7 Table 3,多语 RWKV-7 Table 4)

模型训练 token英文平均多语平均
RWKV7-World3-2.9B5.6T71.561.1
Qwen2.5-3B18.0T71.455.6
Llama3.2-3B15.0T67.858.1

RWKV-7 英文平均 71.5,比 Qwen2.5-3B 的 71.4 高 0.1 点,比 Llama3.2-3B 的 67.8 高 3.7 点; 多语平均 61.1,比 Qwen2.5-3B 的 55.6 高 5.5 点,比 Llama3.2-3B 的 58.1 高 3.0 点。 英文差 0.1 点,多语差 5.5 点;三行模型的训练数据和 token 数不同,不能把差距单独归因于架构。推断(由 RWKV-7 Table 3、RWKV-7 Table 4 的 token 数差异推出)

效率:prefill 2.9×,decode 的数字原文给了多组口径

Kimi Linear 的 prefill 在 512k 时是 MLA 的 2.3×,1M 时是 2.9×;4k–16k 区间两者接近(§5.6)。 论文报告优势随序列长度增大(§5.6)。

解码加速在原文有多组不同写法,页面并列,不替作者合并:

§6.3 给了差异的口径:2.3× 是 batch size = 1 的 I/O-bound 解码(Kimi Figure 7(b)),6.3× 是省下 KV cache 后支持更大 batch 的理论上限(Kimi Figure 1(b))。但 §1 的 Kimi Figure 1(b) caption 又用 1.84 ms vs 11.48 ms 的实测 TPOT 支持 6.3×,原文自身「理论 vs 实测」的标签并不完全一致。页面保留这些原标签,不合并成一个加速比。

对照:GDN 的 S-NIAH 与 RWKV-4 的 LRA

GDN 的实验能说明「门控 + delta」的分工。1.3B 模型、4K 序列下,S-NIAH-2 上 GDN 为 92.2,DeltaNet 为 18.6;S-NIAH-3 上 GDN 为 27.6,Mamba2 为 4.6(GDN Table 2)。 前者说明只有 delta、没有门控时,长上下文里的旧信息清不掉;后者说明只有衰减、没有 delta 时,复杂 value 记不牢。

RWKV-4 的 LRA 平均分是 72.07,同表 Transformer 是 53.66,S4 是 86.09;Path-X 一栏为 ✗(RWKV-4 Table 4)。 它在自然语言类任务上接近 S4,但在 Image、Pathfinder、Path-X 上明显落后,说明固定状态的压缩并不是对所有长序列任务都等价。

07

固定状态的边界:检索、精度与混合比例都还在还债

把适用边界写清楚:状态容量有上限;混合模型仍依赖全注意力层;chunked kernel 有数值和实现代价;RWKV-7 的发布模型还有训练阶段的限制。

一句话判据

什么时候值得用

负载是长上下文、decode 占主导、且能接受「固定状态 + 少量全注意力层」的混合结构时,线性注意力最直接:Kimi Linear 的 3:1 混合在 128k 以上的检索任务上有分数收益,prefill 延迟和 decode 的 KV cache 压力也随序列长度拉开。 反过来,如果任务要求在超长上下文中精确回忆每个 token、或者序列本来就很短、或者团队没有对应的 chunk kernel 与训练稳定性经验,纯线性或仓促替换都不划算。