Browse this library

Chinese source article

5.3.1 · 与 attention, SSM, RWKV, Titans 的边界

全注意力, 滑动窗口, 线性注意力, Mamba, DeltaNet, Gated DeltaNet, RWKV-7, Titans, TTT 系列, 都可以写成「一个状态, 一条写入规则, 一条读出规则」. 按状态是什么, 写入规则怎么擦怎么写来分类, 名字之间的边界就清楚了, 各自丢掉什么也清楚了.

View original Markdown ↗

1. 问题与统一记号

问题: 名字太多, 边界不清. 长上下文方法的命名来自不同的社区. 状态空间模型 (SSM) 来自控制和信号处理, 线性注意力来自 Transformer 的近似, fast weights 和 delta rule 来自 1990 年代的神经网络研究, TTT 来自视觉里的分布偏移, RWKV 来自开源社区对 RNN 的重新设计. 同一个数学对象常被不同论文叫成不同名字, 不同的对象又常被放在同一个名字下.

例如「线性注意力」既可以指 Katharopoulos 等 (2020) 带特征映射和归一化的版本, 也可以指去掉这两项的最简版本, 还常被用来泛指所有矩阵状态的线性 RNN. 「TTT」在第 4 章指在测试样本上做自监督更新, 在本章指一种序列层或一种长上下文方法. 「Titans」有时被说成 Transformer 的替代, 它的主架构 MAC 里其实有注意力.

这些方法可以沿四个问题比较: 状态是什么, 写入时擦掉什么、写入什么, 读出时如何查询, 以及状态的生命周期有多长.

统一记号. 设第 tt 个 token 投影出 query qtq_t, key ktk_t, value vtv_t, 维度都取 dd. 状态记 StS_t, 输出记 oto_t. 矩阵状态的方法用列向量约定, St∈Rd×dS_t \in \mathbb{R}^{d \times d}, 读出 ot=Stqto_t = S_t q_t.

一个方法由三件事确定: StS_t 的形状 (随长度增长还是固定), 写入 St=write(St−1,kt,vt)S_t = \text{write}(S_{t-1}, k_t, v_t), 读出 ot=read(St,qt)o_t = \text{read}(S_t, q_t). TTT layer 的论文把所有序列层拆成初始状态, 更新规则, 输出规则三部分, 这里沿用的就是这个拆法.

从不压缩到先擦后写. 全注意力: 不压缩的状态. 全注意力的状态是到目前为止所有的 (ks,vs)(k_s, v_s), 即 KV cache. 写入是追加, 读出是

ot=∑s=1texp⁡(ks⊤qt/d)∑s′=1texp⁡(ks′⊤qt/d) vs(1)o_t = \sum_{s=1}^{t} \frac{\exp(k_s^\top q_t / \sqrt{d})}{\sum_{s'=1}^{t} \exp(k_{s'}^\top q_t / \sqrt{d})}\, v_s \tag{1}

每个历史 token 都原样保留, 读出时用 softmax 权重从中检索. 它什么都不丢, 所以精确检索强. 代价是状态大小和每个 token 的读出开销都随 tt 线性增长, prefill 总计算 O(T2)O(T^2).

手算 KV cache 的大小. 设一个 32 层, 隐维 4096, 不用 GQA 的模型, FP16 存储. 每个 token 每层存 kk 和 vv 两个 4096 维向量:

2×32×4096×2 字节=524,288 字节=0.5 MB2 \times 32 \times 4096 \times 2\ \text{字节} = 524{,}288\ \text{字节} = 0.5\ \text{MB}

128K token 的上下文就是 0.5 MB×131,072=64 GB0.5\ \text{MB} \times 131{,}072 = 64\ \text{GB}, 而且这只是一条序列. GQA, MLA 一类方法压缩的是这个数, 不改变它随长度线性增长的性质.

FlashAttention 经常被误归到「高效注意力」里和线性方法并列. 它是精确注意力的一种实现: 通过分块和重计算, 避免把 T×TT \times T 的注意力矩阵写到显存, 额外显存从 O(T2)O(T^2) 降到 O(T)O(T), 显存读写次数也大幅减少, 计算量仍是 O(T2)O(T^2), 输出与式 (1) 完全一致. 它不压缩状态, 不改变模型.

滑动窗口: 截断的状态. Longformer 等使用的滑动窗口注意力只保留最近 kk 个 token 的 KV. 状态大小固定为 kk 个 token, 每个 token 的开销 O(k)O(k), prefill 总计算 O(Tk)O(Tk), 对 TT 是线性的. 写入是追加加淘汰最旧的一个, 丢掉的是窗口外的全部信息, 一点不剩. 多层堆叠时感受野可以超过 kk, 但信息要逐层传递.

滑动窗口在本章出现了很多次: LaCT 和 TTT-E2E 都用它处理块内依赖, Gated DeltaNet 和 Mamba-2 的混合版本也用它. 原因是它在局部精确, 在远程完全缺失, 正好和压缩类状态的特性互补.

线性注意力: 只写不擦. 去掉 softmax, 式 (1) 变成 ot=∑svs(ks⊤qt)o_t = \sum_s v_s (k_s^\top q_t). 交换求和与乘法的顺序:

ot=(∑s=1tvsks⊤)qt=Stqt,St=St−1+vtkt⊤(2)o_t = \Big(\sum_{s=1}^{t} v_s k_s^\top\Big) q_t = S_t q_t, \qquad S_t = S_{t-1} + v_t k_t^\top \tag{2}

历史被压成一个 d×dd \times d 的矩阵, 写入是加一个外积, 读出是一次矩阵乘. 每个 token 的开销 O(d2)O(d^2), 与长度无关. 5.1 的定理 1 证明了 TTT-Linear 用 batch GD 时就是式 (2).

式 (2) 是最简版本. Katharopoulos 等的原始写法保留了核函数和归一化: 把 exp⁡(k⊤q)\exp(k^\top q) 换成特征映射的内积 ϕ(k)⊤ϕ(q)\phi(k)^\top \phi(q), 取 ϕ(x)=elu(x)+1\phi(x) = \text{elu}(x) + 1 保证非负, 输出是

ot=(∑s=1tvsϕ(ks)⊤)ϕ(qt)(∑s=1tϕ(ks))⊤ϕ(qt)(2’)o_t = \frac{\Big(\sum_{s=1}^{t} v_s \phi(k_s)^\top\Big) \phi(q_t)}{\Big(\sum_{s=1}^{t} \phi(k_s)\Big)^\top \phi(q_t)} \tag{2'}

分子是式 (2) 的矩阵状态, 分母多维护一个 dd 维向量 zt=zt−1+ϕ(kt)z_t = z_{t-1} + \phi(k_t), 作用是 softmax 分母的替代, 让各个 value 的权重之和为 1. 状态从一个矩阵变成一个矩阵加一个向量, 写入和读出仍是 O(d2)O(d^2). 论文报告在很长序列的自回归预测上比 softmax 注意力快到 4000 倍. 后来的 GLA, DeltaNet 等工作大多去掉了 ϕ\phi 和分母, 改用对 q,kq, k 做归一化来控制数值范围, 所以下文都从式 (2) 出发.

Schlag, Irie & Schmidhuber (2021) 指出式 (2) 就是 fast weight programmer: StS_t 是 fast weights, 外积是写入. 他们同时分析了容量. 若所有 key 两两正交且单位长度, StqS_t q 在 q=ksq = k_s 时恰好返回 vsv_s, 但 dd 维空间里最多只有 dd 个两两正交的向量. 写入超过 dd 对关联后, key 之间必然有非零内积, 读出就会混入其他 value. 5.1 的手算里同一个 key 写两次, 读出 (1,1)⊤(1, 1)^\top, 就是这种干扰的最极端情况.

1.1. 固定状态有多大

和前面 KV cache 的手算对照. 仍取 32 层, 隐维 4096 的模型, 实际实现里矩阵状态按 head 分开: 设 32 个 head, 每个 head 维度 dh=128d_h = 128, 每个 head 的状态是 128×128=16,384128 \times 128 = 16{,}384 个数. 每层 32 个 head 共 524,288524{,}288 个数, FP16 下 1 MB; 32 层合计 32 MB. 这个数与上下文长度无关.

KV cache 每个 token 0.5 MB, 所以长度到 32 MB/0.5 MB=6432\ \text{MB} / 0.5\ \text{MB} = 64 个 token 时两者一样大; 到 128K 时, KV cache 是矩阵状态的 2048 倍. 反过来看, 128K 个 token 的全部信息要挤进 32 MB, 平均每个 token 只分到 256 字节, 约 128 个 FP16 数, 远小于一个 4096 维的隐向量. 有损是必然的, 问题只在丢什么.

按 head 切分还有一个容量上的后果: 每个 head 的 key 只有 dh=128d_h = 128 维, 上一段说的「最多 dd 对无干扰关联」在这里是每个 head 128 对. 这也是 5.2 里 LaCT 强调状态大小 (每块最大 12d212d^2, 占参数 40%), TTT-E2E 选择更新完整 MLP 而不是多头小 MLP 的原因之一.

再算 decode 时每个 token 在这一层上的计算. 全注意力: 算 tt 个分数 ks⊤qtk_s^\top q_t 要 t⋅dt \cdot d 次乘加, 加权求和 ∑sαsvs\sum_s \alpha_s v_s 又是 t⋅dt \cdot d 次, 合计约 2td2td 次乘加. 按 head 切分的线性注意力: 每个 head 写入一个外积 vk⊤v k^\top 是 dh2d_h^2 次乘加, 读出 SqS q 又是 dh2d_h^2 次, HH 个 head 合计 2Hdh2=2d dh2 H d_h^2 = 2 d, d_h 次. 两者相等时 t=dh=128t = d_h = 128. 也就是说, 只看这一层, 上下文超过 128 个 token 后线性注意力每个 token 就更省, 到 128K 时省 1000 倍. 投影矩阵和 MLP 的计算两者相同, 不随 tt 变, 所以整个网络的差距比这一层小. TTT-MLP 和 TTT-E2E 的写入是一次反向传播, 常数比 2d dh2 d, d_h 大得多, 交叉点相应后移.

门控: 先衰减再写. 给旧状态乘一个衰减, 让早期信息逐渐淡出, 为新信息腾出容量. Gated DeltaNet 论文 Table 1 把几种方法的写入规则列在一起 (这里统一成列向量约定):

方法 写入规则
线性注意力 St=St−1+vtkt⊤S_t = S_{t-1} + v_t k_t^\top
Mamba-2 St=αtSt−1+vtkt⊤S_t = \alpha_t S_{t-1} + v_t k_t^\top
DeltaNet St=St−1(I−βtktkt⊤)+βtvtkt⊤S_t = S_{t-1}(I - \beta_t k_t k_t^\top) + \beta_t v_t k_t^\top
Gated DeltaNet St=St−1(αt(I−βtktkt⊤))+βtvtkt⊤S_t = S_{t-1}\big(\alpha_t (I - \beta_t k_t k_t^\top)\big) + \beta_t v_t k_t^\top

αt∈(0,1)\alpha_t \in (0, 1) 是由输入决定的衰减 (门), βt\beta_t 是由输入决定的写入强度.

Mamba-2 的 αt\alpha_t 是每个 head 一个标量; GLA 的衰减是对角矩阵 Diag(αt)\text{Diag}(\alpha_t), 每个维度一个衰减率 (5.2 的 LaCT 对照表里列了它的写入规则). RetNet 用的是与输入无关的固定衰减: 每个 head 一个常数 γ\gamma, 按 γ=1−2−5−i\gamma = 1 - 2^{-5-i} (ii 是 head 编号) 取值, 编号小的 head 衰减快, 只看近处, 编号大的 head 衰减慢, 能看得更远. 因为 γ\gamma 不依赖输入, 一个 token 进来时状态被衰减多少是预先定好的, 与它的内容无关. 门控解决了「状态被写满」的问题, 代价是衰减对所有旧信息一视同仁: 一个重要的早期关联和一个无关的早期关联以同样速率淡出.

Mamba: 从 SSM 出发. Mamba (Gu & Dao, 2023) 的出发点是状态空间模型. 它对每个输入通道维护一个 NN 维状态 (默认 N=16N = 16), 离散化后的递推是 ht=Aˉtht−1+Bˉtxth_t = \bar{A}t h{t-1} + \bar{B}_t x_t, 输出 yt=Cthty_t = C_t h_t, 其中 Aˉt=exp⁡(ΔtA)\bar{A}_t = \exp(\Delta_t A), 步长 Δt\Delta_t 和 Bt,CtB_t, C_t 都由当前输入决定, 这就是「选择性」. AA 是对角的, 所以 Aˉt\bar{A}_t 是逐元素的衰减. 把所有通道的状态并起来, 它也是一个矩阵状态, 写入是「衰减加外积」的形式, 只是 key 和 query 的角色由 BtB_t 和 CtC_t 扮演. Mamba-2 把 AA 限制成标量乘单位阵, 证明了这种 SSM 与一类带掩码的线性注意力等价 (structured state space duality), 于是得到上表里的形式.

选择性有一个工程代价. Aˉt,Bˉt\bar{A}_t, \bar{B}_t 随输入变化后, 原先 S4 一类 SSM 可以把递推展开成一个固定卷积核做 FFT 的办法用不了, 只能按时间递推. Mamba 的做法是写一个硬件感知的并行扫描: 把 Δ,A,B,C\Delta, A, B, C 读进 GPU 的片上 SRAM, 在 SRAM 里完成离散化和扫描, 只把输出 yy 写回显存, 中间状态 hth_t 不落显存, 反向时重算. 论文报告推理吞吐是同规模 Transformer 的 5 倍, Mamba-3B 在语言建模上好于同规模 Transformer, 与两倍规模的 Transformer 相当. 这些数字的口径是论文里的预训练困惑度和零样本常识类下游任务, 长文检索类任务不在其中.

5.1 里 TTT layer 论文对照的就是 Mamba: 在 Books 上 16k 之后 Mamba 的逐位置困惑度变平. 门控衰减让早期信息淡出是一个可能的原因, 下一节 Gated DeltaNet 论文对 Mamba-2 检索结果的解释也是「衰减历史太快」.

delta rule: 先擦后写. DeltaNet 的写入规则可以展开成

St=St−1−βt(St−1kt−vt)kt⊤(3)S_t = S_{t-1} - \beta_t (S_{t-1} k_t - v_t) k_t^\top \tag{3}

St−1ktS_{t-1} k_t 是当前状态对 ktk_t 的预测, St−1kt−vtS_{t-1} k_t - v_t 是预测误差. 写入量与误差成正比: 状态已经存了正确的 vtv_t, 就不写; 存了错的, 就按误差修正. 5.1 的式 (5) 已经说明, 式 (3) 就是 TTT-Linear 在 ℓ=∥Sk−v∥2\ell = \lVert S k - v \rVert^2 上走一步梯度, βt=2η\beta_t = 2\eta. DeltaNet 的并行训练算法见 Yang 等 (2024).

Gated DeltaNet 把衰减和 delta rule 合在一起. 论文给出的理由是两者互补: 门控能快速整体清空记忆, delta rule 能针对单个关联精确修改. 论文用 RULER 的 S-NIAH 做了一个 1.3B 的案例分析 (Table 2), 三个观察:

  • S-NIAH-1 (重复的合成上下文, 考长期保持): DeltaNet 在所有长度上接近满分; Mamba-2 在 2K 之后明显下降, 因为它衰减历史太快; Gated DeltaNet 下降较少.
  • S-NIAH-2/3 (真实文章做上下文, 要存很多可能有用的信息): DeltaNet 在长序列上大幅下降, 原因是不会清空, 固定状态里的信息互相叠加, 难以区分; Mamba-2 和 Gated DeltaNet 好得多.
  • S-NIAH-3 (value 从数字换成 UUID, 考复杂模式的记忆): Mamba-2 下降快, Gated DeltaNet 更好, 说明 delta rule 记忆能力更强.

这三条把写入规则的差别落到了可测的现象上: 只衰减, 记不久; 只擦写不衰减, 装满后互相干扰; 两者都有, 在两类任务上都不差.

在线学习的视角. Gated DeltaNet 论文还按 Liu 等 (2024, Longhorn) 的框架, 把每条写入规则写成对某个在线学习目标的一步最优化. 例如 DeltaNet 的目标是 ∥St−St−1∥F2−2⟨Stkt,βt(vt−St−1kt)⟩\lVert S_t - S_{t-1} \rVert_F^2 - 2\langle S_t k_t, \beta_t (v_t - S_{t-1} k_t) \rangle, 前一项要求新状态别离旧状态太远, 后一项要求新状态对 ktk_t 的输出往误差方向移动. 线性注意力的目标里第二项是 −2⟨Stkt,vt⟩-2\langle S_t k_t, v_t \rangle, 不含误差, 所以只写不擦. 论文还指出, Gated DeltaNet 的 αt\alpha_t 相当于在 SGD 更新里加了一个自适应的权重衰减, 并提到同期的 Titans 在 RNN 的推理阶段 SGD 更新里加了权重衰减.

这个视角把「门控 RNN」和「推理阶段做梯度下降」放进了同一个框架. 下一节的 TTT 和 Titans 就是把这里的 SS 换成非线性模型.

RWKV: 从按通道衰减到广义 delta rule. RWKV 的几个版本跨越了上面好几类. RWKV-4 (Peng 等, 2023) 的时间混合是按通道指数衰减的加权平均, 状态是每个通道上的累积量, 属于向量状态加固定衰减. RWKV-5/6 (Eagle 和 Finch) 改成矩阵状态, RWKV-6 的衰减由输入决定, 与 GLA 同属门控一类.

RWKV-7 (Peng 等, 2025) 的写入规则是 (论文的行向量约定)

St=St−1(diag(wt)+zt⊤bt)+vt⊤kt(4)S_t = S_{t-1}\big(\text{diag}(w_t) + z_t^\top b_t\big) + v_t^\top k_t \tag{4}

wtw_t 是由输入决定的向量衰减 (比 Gated DeltaNet 的标量更细), zt⊤btz_t^\top b_t 是一个秩一的修正项, 承担 delta rule 里擦除旧值的作用. 论文把它称为广义 delta rule: 衰减按通道, 学习率按通道 (向量值的 in-context learning rate), 擦除用的 key 与写入用的 key 可以不同. 转移矩阵仍是「对角加秩一」, 所以可以沿用 DeltaNet 的并行算法. 论文证明 RWKV-7 能做状态追踪, 能识别所有正则语言, 在标准复杂度猜想下超过了 Transformer 所属的 TC0\mathsf{TC}^0 类. 模型规模 0.19B 到 2.9B, 训练语料 3.1T token. 论文报告 2.9B 模型在多语言任务上取得 3B 规模的新最好成绩, 英文下游任务与当时 3B 最好水平持平, 而训练用的 token 明显少于对照模型.

所以「RWKV」指的机制随版本变化, 讨论时要说是哪一版.

梯度下降写入: TTT, Titans, LaCT, TTT-E2E. ### 1.2. TTT-Linear 与 TTT-MLP

5.1 已经说明: ff 是线性的, 不加 LN 和残差, 块大小 1, 就是 DeltaNet. TTT-Linear 在此基础上加了 LN 和残差 (让 ff 变成非线性), 块大小 16, 可学习的初始化和学习率. TTT-MLP 把 ff 换成两层 MLP, 状态不再是一个矩阵, 而是一个小网络的全部权重. 到这里, 写入规则不再能写成「对角加低秩」的矩阵递推, 上面那些线性 RNN 的并行算法不再适用, 只能靠 mini-batch 和 dual form.

两个变体的状态大小可以直接算. TTT-MLP 的隐层是输入的 4 倍, 每个头的状态是 d×4dd\times4d 和 4d×d4d\times d 两个矩阵, 共 8d28d^2 个元素 (不计偏置), 是 TTT-Linear 的 d×dd\times d 的 8 倍. 5.1 的实验里, 在匹配训练 FLOPs 的条件下, TTT-MLP 在短上下文比 TTT-Linear 差, 在长上下文更好; 但 MLP 结构让墙钟时间比 FLOPs 涨得快, Sun 等把内存 I/O 列为 TTT-MLP 的主要问题. 状态变大换来的容量, 只有在上下文足够长时才用得上.

Titans. Titans (Behrouz, Zhong & Mirrokni, 2024) 来自 Google Research. 它的长期记忆模块 M\mathcal{M} 是一个 LM≥1L_\mathcal{M} \ge 1 层的 MLP, 在推理阶段学习 key-value 关联, 损失是

ℓ(Mt−1;xt)=∥Mt−1(kt)−vt∥22,kt=xtWK, vt=xtWV(5)\ell(\mathcal{M}_{t-1}; x_t) = \big\lVert \mathcal{M}_{t-1}(k_t) - v_t \big\rVert_2^2, \qquad k_t = x_t W_K,\ v_t = x_t W_V \tag{5}

最朴素的写入是 Mt=Mt−1−θt∇ℓ\mathcal{M}t = \mathcal{M}{t-1} - \theta_t \nabla \ell, 论文把梯度叫做「惊讶度」: 输入与过去越不同, 梯度越大, 越值得记. 只用当前梯度有一个问题: 连续几个惊讶的 token 之后梯度可能变得很小, 紧随其后的重要信息会被错过. Titans 把惊讶度拆成「过去的惊讶」和「此刻的惊讶」, 再加遗忘:

Mt=(1−αt) Mt−1+St,St=ηtSt−1−θt∇ℓ(Mt−1;xt)(6)\mathcal{M}_t = (1 - \alpha_t)\, \mathcal{M}_{t-1} + S_t, \qquad S_t = \eta_t S_{t-1} - \theta_t \nabla \ell(\mathcal{M}_{t-1}; x_t) \tag{6}

StS_t 就是带动量的梯度下降里的动量项, ηt\eta_t 控制过去惊讶的衰减, θt\theta_t 控制此刻惊讶的比重, αt∈[0,1]\alpha_t \in [0, 1] 是遗忘门 (αt→0\alpha_t \to 0 不遗忘, αt→1\alpha_t \to 1 清空), 三者都由输入决定. 读出不更新权重, 只做前向: yt=M∗(qt)y_t = \mathcal{M}^*(q_t), qt=xtWQq_t = x_t W_Q. 并行训练的做法与 TTT 的 mini-batch 相同: 块内梯度都相对块开始时的权重求, 动量项是以块内梯度为输入的线性递推, 可以用并行扫描算.

把式 (6) 退化到矩阵记忆 M=W\mathcal{M} = W, 不用动量 (ηt=0\eta_t = 0), 对照 Gated DeltaNet. 代入式 (5) 的梯度 2(Wkt−vt)kt⊤2(W k_t - v_t) k_t^\top:

Wt=(1−αt)Wt−1−2θt(Wt−1kt−vt)kt⊤=Wt−1((1−αt)I−2θtktkt⊤)+2θtvtkt⊤(7)W_t = (1 - \alpha_t) W_{t-1} - 2\theta_t (W_{t-1} k_t - v_t) k_t^\top = W_{t-1}\big((1 - \alpha_t) I - 2\theta_t k_t k_t^\top\big) + 2\theta_t v_t k_t^\top \tag{7}

Gated DeltaNet 是 St−1(αI−αβ kk⊤)+βvk⊤S_{t-1}(\alpha I - \alpha\beta, k k^\top) + \beta v k^\top (这里 α\alpha 是保留率). 令 1−αtTitans=αGDN1 - \alpha_t^{\text{Titans}} = \alpha^{\text{GDN}}, 2θt=αGDNβ2\theta_t = \alpha^{\text{GDN}} \beta, 两者的擦除项对上了, 写入项差一个系数 αGDN\alpha^{\text{GDN}}: Gated DeltaNet 的衰减只作用在旧状态上, 新写入的 βvk⊤\beta v k^\top 不衰减; 式 (7) 的写入强度 2θt2\theta_t 与擦除强度绑在一起. 所以矩阵版, 无动量的 Titans 与 Gated DeltaNet 是同一族写入规则, 参数化略有不同. Titans 多出来的是动量和深层 MLP 记忆, 论文认为矩阵记忆等价于在线线性回归, 只能拟合线性依赖, 深层记忆 (LM≥2L_\mathcal{M} \ge 2) 表达力更强.

Titans 在长期记忆之外还有 persistent memory: 一组与输入无关的可学习向量, 拼在序列开头, 推理阶段固定, 存的是任务相关的知识. 长期记忆怎么接进架构, 论文给了三种:

  • MAC (memory as context): 序列分段, 每段内用全因果注意力; 用当前段的 query 从长期记忆里读出历史信息, 和 persistent memory 一起拼在段前作为注意力的上下文. 注意力再决定哪些信息写进长期记忆.
  • MAG (memory as gate): 滑动窗口注意力当短期记忆, 神经记忆当长期记忆, 两路用门控合并.
  • MAL (memory as layer): 把记忆模块当作一层, 与注意力层串联.

论文报告 Titans 在语言建模, 常识推理, 需要回忆的任务, needle-in-a-haystack, 时间序列和 DNA 建模上好于 Transformer 和现代线性 RNN 及其混合版本, 并能扩展到超过 2M 的上下文. TTT-E2E 论文把 Titans 归入与 TTT-KVB 相同的构造: 每层一个以 KV 重建为损失的可更新模块, 加滑动窗口注意力.

LaCT 与 TTT-E2E. LaCT …11577 tokens truncated… token。线性无门状态允许代数减外积,带衰减要乘上后续转移,非线性梯度记忆通常只能重放。

比较真实运行与删除反事实,得到单条 token 对最终输出的因果贡献。它比梯度热图更接近「这条信息是否被使用」。代价随重放长度增长,可在评测样本上离线完成。

交换读取与写入组件. 混合模型常同时有窗口 attention 与压缩状态。关闭写入但保留状态读出,观察已有历史还能服务多久;关闭读出但继续写入,随后重新打开,检查信息是否确实存下。若关闭读出期间的 token 在重新打开后可被查询,写入通道独立工作;若不能,写入可能依赖读出反馈。

对 TTT/Titans,还可固定内损失、随机化 query 投影,或保留 query、打乱训练 target。前者破坏读取地址,后者破坏写入内容。性能下降模式能把「学会写」与「学会读」拆开。

谱视角下的记忆时间与干扰. 线性递推的记忆由传播矩阵决定. 对一般线性时变状态 ht=Atht−1+bth_t=A_th_{t-1}+b_t,位置 ss 的写入传播到 tt 的系数为 AtAt−1⋯As+1A_tA_{t-1}\cdots A_{s+1}。该乘积的奇异值描述不同方向保存或放大的程度。所有奇异值都快速衰减,模型只有短记忆;少数方向接近一,状态保留低维长期摘要;方向大于一,微小误差与噪声也会被放大。

特征值只适合固定且正规矩阵。数据依赖 AtA_t 一般不对易,逐步特征值都小于一也可能出现瞬态放大。长序列稳定性更应估计实际矩阵乘积的最大奇异值,或用随机向量连续乘 Jacobian。SSM、RWKV 与门控 delta 网络都能放在这个传播框架下;TTT/Titans 则把 AtA_t 换成优化更新对参数状态的 Jacobian。

多个时间尺度对应多组衰减接近一的方向。若任务要求同时保存句内、段落与文档级信息,单一标量衰减很难兼顾。通道化衰减、复数模态和输入选择门提供更丰富的谱。时间尺度丰富仍不等于随机访问:模型知道某个方向保留很久,不代表能从同一方向分离许多相似事实。

delta 擦除是方向选择性遗忘. 线性 delta 更新可写成 St=St−1(I−βtktkt⊤)+βtvtkt⊤S_t=S_{t-1}(I-\beta_tk_tk_t^\top)+\beta_tv_tk_t^\top。旧状态右乘 I−βkk⊤I-\beta kk^\top,只削弱键方向,正交方向保持不变。与全局标量衰减相比,它能在更新某个地址时少伤害无关地址。

若键归一化且 β=1\beta=1,kk 方向的旧预测被完全擦除,再写入新值;0<β<10<\beta<1 只做部分替换。键相关时,擦除方向也覆盖其他关联。连续键 k1,…,ktk_1,\ldots,k_t 形成一串投影乘积,顺序会影响最终状态,因为这些投影一般不对易。

这条式子解释了 Gated DeltaNet、现代 RWKV 矩阵状态和 TTT-Linear 的共同核心,也指出它们的差别来源。门控 delta 直接生成 β,k,v\beta,k,v;TTT 用损失梯度得到等价项;带额外衰减的方法还在方向擦除外施加全局遗忘。对比实验若没有匹配这些门与衰减,只匹配矩阵大小,机制仍未对齐。

动量引入第二个传播系统. Titans 或带动量 TTT 的状态包含 (Mt,mt)(M_t,m_t)。线性化后,它是一个分块递推系统:

[δMtδmt]=[(1−αt)I−ηt(1−βt)Ht−ηtβtI(1−βt)HtβtI][δMt−1δmt−1].(27)\begin{bmatrix}\delta M_t\\\delta m_t\end{bmatrix} = \begin{bmatrix} (1-\alpha_t)I-\eta_t(1-\beta_t)H_t & -\eta_t\beta_t I\\ (1-\beta_t)H_t & \beta_t I \end{bmatrix} \begin{bmatrix}\delta M_{t-1}\\\delta m_{t-1}\end{bmatrix}. \tag{27}

参数记忆与动量互相耦合,稳定性由整个分块矩阵决定。β\beta 大会延长梯度方向的寿命,也可能形成复特征值和振荡;α\alpha 拉回参数,却未直接消除动量。只分析 MM 的范数会漏掉一半动力学。

可对固定小网络显式计算局部 Jacobian 谱,再用长序列实测验证。若谱预测稳定而实际爆炸,非线性轨迹已离开局部区域;若局部就存在大于一的方向,降低学习率、动量或增加遗忘具有直接依据。

不同路线还需要在上下文长度扫描中寻找交叉点. 短序列上 exact attention 的 kernel 更成熟, 固定状态的理论复杂度优势未必转化为延迟;长度扩大后 KV 与二次计算成为主要成本, 递归状态才逐渐占优. 同时画 loss、精确检索、状态字节和端到端速度, 能避免用单一复杂度符号决定架构选择.

参考文献