ggaaooppeenngg

为什么计算机科学是无限的但生命是有限的

DeltaNet / KDA 这一系的 chunkwise 算法,数学上就建在三件事上:Householder 变换、WY 表示、以及把串行递推改写成闭式的 UT 变换。本文把这三层从定义推到可用于 kernel 的形式,并附两个可交互演示(广义 Householder 的 β\beta 系数、单位下三角求逆的前代法)。后续四篇 TileLang 实战可以直接回查本文的结论。

阅读全文 »

前三篇分别实现了无遗忘的 chunked 线性注意力、标量衰减、以及带删除项的 Gated DeltaNet。本篇是系列收尾:把 GDN 的标量αt\alpha_t 换成逐通道向量atRdk\bm{a}_t \in \mathbb{R}^{d_k}

St=St1Diag(at)(Iβtktkt)+βtvtkt\mathbf{S}_t = \mathbf{S}_{t-1}\operatorname{Diag}(\bm{a}_t)\big(\mathbf{I} - \beta_t\bm{k}_t\bm{k}_t^{\intercal}\big) + \beta_t\bm{v}_t\bm{k}_t^{\intercal}

改动只有一处:αt\alpha_t 变成了 Diag(at)\operatorname{Diag}(\bm{a}_t)。但这一处把前三篇积累的所有便利拆掉了–衰减不再能从矩阵里外提,Γ\GammaC×CC\times C 变成 C×C×dkC \times C \times d_k,而累积衰减积的通道离散度会直接把 fp16 打穿。

本篇聚焦实现。KDA 的数学推导(递推式、逐通道 WY 表示、UT 变换、下界衰减与满秩门控的动机)见《KDA 的来龙去脉》§3–§4,这里不重复;本文只做一件事:把那些公式落成能跑的 kernel,并量化每一处数值边界

前三篇见 Chunked 线性注意力标量衰减Gated DeltaNet

阅读全文 »

前两篇分别实现了无遗忘的 chunked 线性注意力,以及带标量衰减的版本。两者的状态更新都只做加法:新的键值对累加进状态,旧信息靠衰减系数被动遗忘。本篇补上最后一块–删除

递推式变成:

St=St1(αt(Iβtktkt))+βtvtkt\mathbf{S}_t = \mathbf{S}_{t-1}\Big(\alpha_t\big(\mathbf{I} - \beta_t \bm{k}_t\bm{k}_t^{\intercal}\big)\Big) + \beta_t\bm{v}_t\bm{k}_t^{\intercal}

比上一篇多出的是 βt\beta_t–一个删除力度的系数:它决定在 kt\bm{k}_t 这个方向上,旧内容被擦掉多少。

上两篇见《Chunked 线性注意力》与《标量衰减》,本文沿用其符号约定与四层参考验证框架。本篇会用到 Householder 变换、WY 表示与 UT 变换这些线性代数工具,背景推导见《线性注意力的线性代数前置知识》。

阅读全文 »