返回博客

/ LLM算法

[LLM算法-2] Gated DeltaNet:让线性注意力学会覆盖与遗忘

从线性注意力的固定状态出发,推导 Delta Rule 的误差驱动写入与 Gated DeltaNet 的全局衰减,解释其并行训练、递归推理、记忆容量,以及与 Transformer、Mamba 的关系。

8 minLLM · Gated DeltaNet · Linear Attention · Delta Rule

标准 Attention 把每个历史 token 的 key 和 value 留在 KV Cache 中,查询时再回看整段历史。它的检索能力很强,但训练时的注意力矩阵随序列长度二次增长,推理时的 KV Cache 也会越来越大。

Linear Attention 选择了另一条路:不再保存完整历史,而是把 key-value 关系压进一个固定大小的矩阵状态。这样,训练和推理对序列长度都可以做到线性复杂度,但新的问题也随之出现:如果状态只会做加法,已经写进去的错误或过期信息该怎么修改?

Gated DeltaNet 的答案是把两种记忆操作放进同一条递推公式:

  1. 用 Delta Rule 沿指定 key 的方向擦除旧值、写入新值;
  2. 用 decay gate 对整个状态做衰减,控制全局遗忘。

它的核心不是“用某种技巧近似 Softmax”,而是构造一个可以在线读写的固定容量关联记忆:

固定大小矩阵状态+内容寻址+定向覆盖+全局遗忘\boxed{ \text{固定大小矩阵状态} +\text{内容寻址} +\text{定向覆盖} +\text{全局遗忘} }

本文从最简单的线性注意力开始,一步步推导 Gated DeltaNet,并解释它为什么既像 Linear Attention,又像 RNN 和状态空间模型。

1. 起点:把历史 KV 压进一个状态#

先约定每个时刻的向量和状态维度:

符号维度含义
qtq_tdkd_k当前 token 的读取地址
ktk_tdkd_k当前 token 的写入地址
vtv_tdvd_v准备写入的内容
StS_tdv×dkd_v\times d_k截至时刻 tt 的压缩记忆

为保持公式简洁,本文省略 batch 和 head 下标,并采用 StqtS_tq_t 的矩阵方向约定。其他实现可能把状态转置成 dk×dvd_k\times d_v,此时公式的左右乘顺序会相反,但机制不变。

最简单的 causal linear attention 可以写成:

St=St1+vtkt,S_t=S_{t-1}+v_tk_t^\top, ot=Stqt.o_t=S_tq_t.

每个外积 vtktv_tk_t^\top 都把一组 key-value 关联写进状态。展开递推式可得:

St=i=1tviki.S_t=\sum_{i=1}^{t}v_ik_i^\top.

因此读取结果是:

ot=Stqt=i=1tvi(kiqt).o_t =S_tq_t =\sum_{i=1}^{t}v_i(k_i^\top q_t).

这仍然具有 Attention 的基本结构:用 query-key 相似度给历史 value 加权。区别在于,标准 Attention 显式保留每一项,Linear Attention 则提前把它们聚合进 StS_t

1.1 它为什么是线性的#

标准 Attention 需要形成一个 T×TT\times T 的相似度矩阵,序列维度上的计算量通常是 O(T2)O(T^2)。递推状态只需为每个 token 更新一次 StS_t,总计算量约为:

O(Tdkdv).O(Td_kd_v).

自回归推理时也不必保存随 TT 增长的完整 KV Cache,只需保留固定大小的 StS_t。这正是 Linear Attention 对长上下文有吸引力的原因。

1.2 纯加法状态的问题#

上述状态只能不断累加:

旧状态 + 新的 key-value 外积

如果模型先读到:

Alice lives in Paris.

后来又读到:

Alice moved to London.

理想行为是用 London 覆盖 Paris。纯加法更新却会把两条关联都叠加到状态中:

St=St1+vLondonkAlice.S_t =S_{t-1} +v_{\text{London}}k_{\text{Alice}}^\top.

它写入了 London,却没有显式删除 Paris。随着上下文增长,冲突和干扰会不断积累。

2. Delta Rule:先读旧值,再写入误差#

Delta Rule 不直接写入完整的 vtv_t,而是先问:当前状态在 ktk_t 这个地址上已经存了什么?

从旧状态读取:

v^t=St1kt.\hat v_t=S_{t-1}k_t.

计算目标值和旧值之间的误差:

et=vtv^t.e_t=v_t-\hat v_t.

最后只把误差写回 ktk_t 对应的方向:

St=St1+βt(vtSt1kt)kt\boxed{ S_t =S_{t-1} +\beta_t \left(v_t-S_{t-1}k_t\right)k_t^\top }

其中 βt[0,1]\beta_t\in[0,1] 是更新强度:

  • βt0\beta_t\approx0:基本不修改当前关联;
  • βt1\beta_t\approx1:强烈覆盖当前关联;
  • 中间值:只完成一部分纠正。

与纯加法线性注意力相比,区别可以概括为:

纯加法:写入新值
Delta:写入“新值 - 当前读到的旧值”

2.1 展开后可以看到“擦除 + 写入”#

将 Delta 更新展开:

St=St1βtSt1ktkt+βtvtkt=St1(Iβtktkt)+βtvtkt.\begin{aligned} S_t &=S_{t-1} -\beta_tS_{t-1}k_tk_t^\top +\beta_tv_tk_t^\top\\ &=S_{t-1}\left(I-\beta_tk_tk_t^\top\right) +\beta_tv_tk_t^\top. \end{aligned}

这个形式把两个动作清楚地分开了:

St1(Iβtktkt)擦除 kt 方向的旧内容+βtvtkt写入新内容.\underbrace{ S_{t-1}\left(I-\beta_tk_tk_t^\top\right) }_{\text{擦除 }k_t\text{ 方向的旧内容}} + \underbrace{ \beta_tv_tk_t^\top }_{\text{写入新内容}}.

Delta Rule 并不是模糊地“忘掉一点历史”,而是根据当前 key 选择要修改的状态方向。

2.2 为什么 key 通常需要归一化#

kt2=1\lVert k_t\rVert_2=1,矩阵

IβtktktI-\beta_tk_tk_t^\top

具有清晰的几何意义:

  • ktk_t 方向上,缩放系数为 1βt1-\beta_t
  • 在与 ktk_t 正交的方向上,缩放系数为 11

因此,当 βt=1\beta_t=1 时,它会完全擦除 ktk_t 方向的旧内容;当 βt=0\beta_t=0 时,它保持状态不变。

更直接地,把更新后的状态重新作用到 ktk_t 上:

Stkt=St1kt+βt(vtSt1kt)ktkt=(1βt)St1kt+βtvt.\begin{aligned} S_tk_t &=S_{t-1}k_t +\beta_t(v_t-S_{t-1}k_t)k_t^\top k_t\\ &=(1-\beta_t)S_{t-1}k_t+\beta_tv_t. \end{aligned}

在 key 已归一化且 βt=1\beta_t=1 时:

Stkt=vt.\boxed{S_tk_t=v_t}.

不管这个地址之前存了什么,更新后都会被替换成新值。

2.3 用“搬家”例子重新理解#

假设状态已经记住:

St1kAlicevParis.S_{t-1}k_{\text{Alice}}\approx v_{\text{Paris}}.

读到 Alice 搬去 London 后,模型产生:

ktkAlice,vtvLondon.k_t\approx k_{\text{Alice}}, \qquad v_t\approx v_{\text{London}}.

于是更新量近似为:

βt(vLondonvParis)kAlice.\beta_t \left(v_{\text{London}}-v_{\text{Paris}}\right) k_{\text{Alice}}^\top.

它显式减去 Paris,再加入 London。这正是纯加法状态缺少的覆盖能力。

3. Delta Rule 也可以看成在线梯度下降#

Delta Rule 并不是为神经网络凭空发明的更新。它与经典的 Widrow-Hoff Rule、Least Mean Squares 更新有直接联系。

把状态矩阵视为一个在线学习的线性映射:

v^t=St1kt.\hat v_t=S_{t-1}k_t.

当前 token 提供一条训练样本 (kt,vt)(k_t,v_t),其平方误差为:

Lt(S)=12vtSkt22.\mathcal L_t(S) =\frac12\left\lVert v_t-Sk_t\right\rVert_2^2.

SS 求梯度:

SLt=(vtSkt)kt.\nabla_S\mathcal L_t =-\left(v_t-Sk_t\right)k_t^\top.

βt\beta_t 为步长做一次梯度下降:

St=St1βtSLt(St1),S_t =S_{t-1}-\beta_t\nabla_S\mathcal L_t(S_{t-1}),

正好得到:

St=St1+βt(vtSt1kt)kt.S_t =S_{t-1} +\beta_t(v_t-S_{t-1}k_t)k_t^\top.

这给出了一个很有意思的理解:

模型的权重通过训练阶段的反向传播学习;模型的矩阵状态则在每次前向传播中执行一个微型在线学习算法。

外层网络负责学会生成什么 key、value 和步长,内层状态负责在上下文中快速建立或修正关联。

4. 为什么还要加 Gate#

Delta Rule 擅长修改某个 key 方向上的记忆,但它只是一种定向操作。如果上下文已经整体失效,一次秩一更新无法快速清理所有与 ktk_t 不对齐的旧信息。

例如:

  • 文档进入新章节;
  • 对话突然切换话题;
  • 一个 episode 或样本结束;
  • 旧工作记忆应随时间整体衰减;
  • 当前 token 相当于一次状态重置。

为此,Gated DeltaNet 引入衰减门 αt\alpha_t。其核心更新是:

St=αtSt1+βt(vtαtSt1kt)kt\boxed{ S_t =\alpha_tS_{t-1} +\beta_t \left(v_t-\alpha_tS_{t-1}k_t\right)k_t^\top }

等价地:

St=αtSt1(Iβtktkt)+βtvtkt\boxed{ S_t =\alpha_tS_{t-1} \left(I-\beta_tk_tk_t^\top\right) +\beta_tv_tk_t^\top }

这里通常有:

0<αt1,0βt1.0<\alpha_t\leq1, \qquad 0\leq\beta_t\leq1.

两种门控的职责不同:

组件回答的问题作用范围
αt\alpha_t旧上下文整体还应保留多少?整个状态
βt\beta_t当前地址需要被改写多少?ktk_t 对应的方向
ktk_t修改状态的哪里?写入地址
vtv_t写入什么?新内容
qtq_t从哪里读?读取地址

4.1 衰减门负责全局遗忘#

αt1\alpha_t\approx1 时,旧状态基本保留;当 αt0\alpha_t\approx0 时,旧状态被大幅清空。

如果暂时忽略 Delta 项,连续的门控递推为:

St=αtSt1+Bt.S_t=\alpha_tS_{t-1}+B_t.

更早写入的内容会乘上后续所有衰减门:

αi+1αi+2αt.\alpha_{i+1}\alpha_{i+2}\cdots\alpha_t.

因此,网络可以学习不同的记忆时间尺度:某些 head 快速遗忘,适合局部模式;另一些 head 长期保留,适合跨段依赖。

4.2 Delta 门负责定向覆盖#

βt\beta_t 决定当前 key 方向上擦除旧值和写入新值的强度。它不是简单的 input gate,因为它同时控制:

βtαtSt1ktkt-\beta_t\alpha_tS_{t-1}k_tk_t^\top

和:

+βtvtkt.+\beta_tv_tk_t^\top.

也就是说,增大 βt\beta_t 会同步加强“删旧”和“写新”。这保证覆盖操作前后一致。

4.3 为什么误差项里也有 αt\alpha_t#

Gated DeltaNet 先将旧状态衰减为 αtSt1\alpha_tS_{t-1},再计算这个衰减后状态在 ktk_t 上的旧值:

v^t=αtSt1kt.\hat v_t=\alpha_tS_{t-1}k_t.

因此误差应当是:

vtαtSt1kt,v_t-\alpha_tS_{t-1}k_t,

而不是 vtSt1ktv_t-S_{t-1}k_t。这使“全局遗忘后再定向覆盖”的语义保持一致。

5. 一条公式中的三种记忆操作#

把核心公式完全展开:

St=αtSt1保留并衰减旧状态αtβtSt1ktkt擦除指定方向+βtvtkt写入新关联.S_t =\underbrace{\alpha_tS_{t-1}}_{\text{保留并衰减旧状态}} -\underbrace{\alpha_t\beta_tS_{t-1}k_tk_t^\top}_{\text{擦除指定方向}} +\underbrace{\beta_tv_tk_t^\top}_{\text{写入新关联}}.

因此,Gated DeltaNet 每一步都可以执行三种操作:

  1. Retain:保留仍然有效的历史;
  2. Erase:删除某个地址上的旧内容;
  3. Write:把新内容写入这个地址。

可以用一段简化伪代码表示:

state = zeros(num_heads, value_dim, key_dim)
 
for x in sequence:
    q = query_projection(x)
    k = normalize(key_projection(x))
    v = value_projection(x)
 
    alpha = decay_gate(x)
    beta = update_gate(x)
 
    decayed_state = alpha * state
    old_value = decayed_state @ k
    error = v - old_value
 
    state = decayed_state + beta * outer(error, k)
    output = state @ q

真实模型会使用多头状态、输出门、归一化、短卷积、输出投影与残差连接,但最关键的记忆过程就是这几行。

6. 一个典型 Gated DeltaNet 层包含什么#

Gated DeltaNet 不是只有一条递推式。一个完整 block 通常可以抽象为:

输入
  -> 归一化
  -> Q / K / V 投影
  -> decay gate alpha
  -> update gate beta
  -> Gated Delta 状态更新
  -> query 读取状态
  -> 输出门与输出投影
  -> 残差连接
  -> MLP / SwiGLU
  -> 残差连接

多头实现为每个 head 维护一份独立状态:

St(h)Rdv(h)×dk(h).S_t^{(h)}\in\mathbb R^{d_v^{(h)}\times d_k^{(h)}}.

不同 head 可以学到不同的:

  • key-value 子空间;
  • 记忆时间尺度;
  • 写入强度;
  • 局部模式与长期依赖分工。

门控一般由输入动态生成。例如,更新门可以写成:

βt=σ(wβxt),\beta_t=\sigma(w_\beta^\top x_t),

衰减门则常采用能保证范围和数值稳定性的指数参数化,例如:

αt=exp(softplus(zt)).\alpha_t =\exp\left(-\operatorname{softplus}(z_t)\right).

具体代码库的参数化会不同,但目标相同:保证旧状态不会因为 gate 自身而无界放大,同时让模型能学习从短期到长期的衰减速度。

7. 训练为什么需要分块并行#

递推形式很适合 decode:每来一个 token,读取一次旧状态并更新一次即可。但如果训练时也逐 token 执行,GPU 会因为串行依赖而难以充分利用并行算力。

把更新统一写成:

St=St1At+Bt,S_t=S_{t-1}A_t+B_t,

其中:

At=αt(Iβtktkt),A_t=\alpha_t\left(I-\beta_tk_tk_t^\top\right), Bt=βtvtkt.B_t=\beta_tv_tk_t^\top.

连续展开可得:

St=S0A1A2At+i=1tBiAi+1At.S_t =S_0A_1A_2\cdots A_t +\sum_{i=1}^{t}B_iA_{i+1}\cdots A_t.

这说明一段 token 的更新可以被组合成“输入状态到输出状态”的整体变换。实际实现通常会:

  1. 把长序列切成多个 chunk;
  2. 在 chunk 内组合低秩状态变换;
  3. 用大矩阵乘法并行计算 chunk 内输出;
  4. 在 chunk 之间递推或扫描状态。

由于每个 AtA_t 都是“衰减后的单位阵减秩一矩阵”,实现可以利用这种低秩结构和紧凑表示,避免显式形成所有稠密状态转移矩阵。

最终,同一个模型通常有两种等价执行路径:

场景执行方式特点
训练 / PrefillChunkwise Parallel用矩阵乘法提高吞吐
自回归 DecodeRecurrent每个 token 只维护固定状态

工程上最重要的验证之一,就是确保 parallel、chunkwise 和 recurrent 三条路径在数值误差范围内一致。

8. 复杂度与推理状态#

对单个 head,状态大小为:

dvdk.d_vd_k.

单 token 更新需要矩阵-向量乘和外积,主要计算量约为:

O(dvdk).O(d_vd_k).

长度为 TT 的序列总计算量约为:

O(Tdvdk),O(Td_vd_k),

对序列长度是线性的。自回归推理时,缓存大小不随上下文长度增长。

但“线性复杂度”不等于在所有场景中都更快。真实性能还取决于:

  • 每个 head 的状态维度;
  • chunk 大小;
  • batch size 和序列长度;
  • kernel 是否融合;
  • GPU 对矩阵乘法的利用率;
  • 是否包含短卷积和额外门控;
  • 当前阶段是 prefill 还是 decode。

短序列上,高度优化的 FlashAttention 可能仍然更快;长序列和长时间 decode 才更容易体现固定状态的优势。

9. 与其他架构的关系#

9.1 与普通 Linear Attention#

最简单的线性注意力是:

St=St1+vtkt.S_t=S_{t-1}+v_tk_t^\top.

它只能累加。Gated DeltaNet 则增加了两种删除能力:

St=αtSt1(Iβtktkt)+βtvtkt.S_t =\alpha_tS_{t-1} \left(I-\beta_tk_tk_t^\top\right) +\beta_tv_tk_t^\top.

αt\alpha_t 做全局衰减,βtktkt\beta_tk_tk_t^\top 做定向擦除。

9.2 与门控线性注意力#

普通门控线性注意力常写成:

St=αtSt1+vtkt.S_t=\alpha_tS_{t-1}+v_tk_t^\top.

它可以整体遗忘,却不能精确替换某个 key 的旧 value。DeltaNet 刚好相反:定向覆盖很强,但缺少独立的全局衰减。Gated DeltaNet 将两者合并。

模型状态转移 AtA_t主要能力
纯线性注意力II不断累加
门控线性注意力αtI\alpha_tI全局衰减
DeltaNetIβtktktI-\beta_tk_tk_t^\top定向覆盖
Gated DeltaNetαt(Iβtktkt)\alpha_t(I-\beta_tk_tk_t^\top)全局衰减 + 定向覆盖

9.3 与 Transformer#

Transformer 显式保存每个历史位置:

K=[k1,,kt],V=[v1,,vt].K=[k_1,\ldots,k_t], \qquad V=[v_1,\ldots,v_t].

Gated DeltaNet 则将历史压缩进:

StRdv×dk.S_t\in\mathbb R^{d_v\times d_k}.
TransformerGated DeltaNet
保存 token 级 KV 历史保存固定大小的压缩状态
可以直接访问历史位置通过内容方向访问关联记忆
Attention 通常随 T2T^2 增长序列计算量通常随 TT 增长
KV Cache 随上下文增长Decode 状态大小固定
精确检索能力强可能受容量与干扰限制

Gated DeltaNet 不是 Softmax Attention 的无损重排,也不是简单的 kernel approximation。它更像是用一种固定容量记忆系统替换显式 token 检索。

9.4 与 Mamba 和状态空间模型#

选择性状态空间模型可以抽象为:

ht=Atht1+Btxt,h_t=A_th_{t-1}+B_tx_t, yt=Ctht.y_t=C_th_t.

Gated DeltaNet 同样是输入相关的循环状态更新,但它的状态是矩阵,且转移结构具有明确的 key-value 解释:

At=αt(Iβtktkt).A_t=\alpha_t(I-\beta_tk_tk_t^\top).

两者的共同点包括:

  • 推理状态大小固定;
  • 输入决定状态保留、写入和读取;
  • 训练依赖并行扫描或分块算法;
  • 适合长序列和流式推理。

区别在于,Mamba 更强调选择性状态空间动力学,Gated DeltaNet 更强调内容寻址的关联记忆和 Delta Rule。论文标题中的“Improving Mamba2 with Delta Rule”也正是在说明:它保留类似 Mamba2 的门控衰减,再把纯衰减状态转移增强为可定向覆盖的低秩变换。

10. 固定状态的代价:容量与干扰#

固定状态带来线性推理和固定缓存,也意味着任意长历史都必须被压缩进有限维矩阵。它不可能无损保存无限多条独立关联。

假设两个 key 很接近:

kikj1.k_i^\top k_j\approx1.

更新 kjk_j 对应的 value 时,也容易影响 kik_i 方向的记忆。如果两者接近正交:

kikj0,k_i^\top k_j\approx0,

它们才能相对独立地共存。

因此,实际记忆容量取决于:

  • key 和 value 的维度;
  • key 的分布是否容易冲突;
  • head 数量与子空间划分;
  • 门控是否学会及时删除过期信息;
  • 同时需要保留多少条独立关联;
  • 任务需要模式记忆还是逐字精确回忆。

这揭示了 Gated DeltaNet 最根本的工程取舍:

用有损压缩换取固定缓存和线性序列复杂度\boxed{ \text{用有损压缩换取固定缓存和线性序列复杂度} }

11. 优势、局限与适用场景#

11.1 主要优势#

线性序列复杂度。 不需要构造 T×TT\times T 注意力矩阵,更适合长序列。

固定大小的推理状态。 自回归生成时,状态不会像 KV Cache 一样随上下文持续增长。

能够覆盖旧记忆。 Delta Rule 显式计算新旧值误差,比纯加法状态更适合事实修正、变量赋值和状态更新。

同时支持局部与全局遗忘。 βt,kt\beta_t,k_t 负责定向擦除,αt\alpha_t 负责整体衰减。

具有内容寻址能力。 query、key 和矩阵状态保留了 Linear Attention 的键值记忆语义。

11.2 主要局限#

精确回忆能力受限。 随机字符串复制、稀疏证据定位和逐字引用等任务,显式 Attention 往往更有优势。

状态干扰不可避免。 不同 key 不完全正交时,写入一条关联可能破坏另一条关联。

状态本身并非免费。 每层、每个 head 都要维护 dv×dkd_v\times d_k 矩阵;维度设计不当时,固定状态仍可能很大。

高效训练实现复杂。 理论递推很简洁,实际却依赖 chunkwise 算法、数值稳定处理和高质量 GPU kernel。

难以还原 token 级来源。 历史已经混合进矩阵状态,不像 Attention map 那样容易观察当前输出来自哪个具体位置。

11.3 更适合的场景#

  • 长文本语言建模;
  • 流式输入和持续到达的时间序列;
  • 长时间自回归生成;
  • KV Cache 成为显存瓶颈的部署;
  • 需要在线修改工作记忆的任务;
  • 对固定内存占用有要求的推理环境。

11.4 更需要谨慎的场景#

  • 必须无损保留大量历史细节;
  • 需要从超长上下文精确复制原文;
  • 强依赖随机位置访问;
  • 中短序列且 FlashAttention 已经非常高效;
  • 任务主要瓶颈不在 Attention 或 KV Cache。

12. 为什么 Hybrid 往往是务实选择#

Linear Recurrent 模块与 Full Attention 并不是非此即彼。一个自然的混合架构是:

多数层:Gated DeltaNet / Linear Attention / SSM
少数层:Full Attention

多数线性层承担模式建模、局部处理和低成本状态传播;少量 Full Attention 层提供精确 token 检索。这样可以在三方面折中:

  • 降低长上下文计算和缓存成本;
  • 保留一定的精确回看能力;
  • 避免要求固定状态承担所有历史细节。

是否需要 Hybrid,最终取决于模型要解决的问题。如果任务更像“持续维护世界状态”,Delta Rule 很自然;如果任务更像“从档案库中精确找回某一行文字”,显式 Attention 更自然。

13. 常见误区#

13.1 Gated DeltaNet 等价于 Softmax Attention#

不等价。它没有保存完整 token 级 KV,也没有执行相同的 Softmax 归一化。两者采用的是不同记忆机制。

13.2 Delta Rule 就是一个普通写入门#

不准确。普通 input gate 只控制写入多少,Delta Rule 同时根据当前读到的旧值执行定向擦除和纠错写入。

13.3 有 Gate 就不需要 Delta Rule#

全局 decay gate 能让所有旧信息一起变弱,却不能精确替换某个 key 对应的 value。两种机制解决的问题不同。

13.4 固定状态意味着零缓存#

不准确。模型仍要缓存矩阵状态,有些实现还包含卷积状态。准确说法是:主要递推状态通常不随上下文长度增长。

13.5 线性复杂度意味着一定更快#

不一定。短序列、较大状态维度或缺少优化 kernel 时,Full Attention 可能具有更高的实际吞吐。

13.6 能覆盖就等于不会遗忘重要信息#

覆盖能力只是提供了一种操作。模型仍需通过训练学会生成合适的 key、αt\alpha_tβt\beta_t;错误门控同样会导致过早遗忘或记忆污染。

14. 最后用一条演进链路记住#

从最简单的状态开始:

Linear Attention:St=St1+vtkt.\text{Linear Attention:} \qquad S_t=S_{t-1}+v_tk_t^\top.

它只能增加信息。DeltaNet 改成:

DeltaNet:St=St1+βt(vtSt1kt)kt.\text{DeltaNet:} \qquad S_t =S_{t-1} +\beta_t(v_t-S_{t-1}k_t)k_t^\top.

它可以覆盖指定地址。Gated DeltaNet 再加入全局衰减:

Gated DeltaNet:St=αtSt1+βt(vtαtSt1kt)kt\boxed{ \text{Gated DeltaNet:} \qquad S_t =\alpha_tS_{t-1} +\beta_t(v_t-\alpha_tS_{t-1}k_t)k_t^\top }

于是,五个变量各自回答一个明确问题:

变量问题
αt\alpha_t旧状态整体保留多少?
ktk_t修改哪个记忆地址?
βt\beta_t这个地址修改多少?
vtv_t写入什么新内容?
qtq_t从状态的哪里读取?

如果只记一句话,可以记成:

Gated DeltaNet 是一个由神经网络控制的在线关联记忆:它用固定大小的矩阵压缩历史,用 query-key 做内容寻址,用 Delta Rule 覆盖具体记忆,再用 decay gate 决定整个过去还值得保留多少。

参考资料#

  1. Yang et al., Gated Delta Networks: Improving Mamba2 with Delta Rule, 2024.
  2. Yang et al., Parallelizing Linear Transformers with the Delta Rule over Sequence Length, 2024.
  3. Dao and Gu, Transformers are SSMs: Generalized Models and Efficient Algorithms Through Structured State Space Duality, 2024.
  4. Katharopoulos et al., Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention, 2020.