线性注意力的线性代数前置知识
DeltaNet / KDA 这一系的 chunkwise 算法,数学上就建在三件事上:Householder 变换、WY 表示、以及把串行递推改写成闭式的 UT 变换。本文把这三层从定义推到可用于 kernel 的形式,并附两个可交互演示(广义 Householder 的 系数、单位下三角求逆的前代法)。后续四篇 TileLang 实战可以直接回查本文的结论。
DeltaNet / KDA 这一系的 chunkwise 算法,数学上就建在三件事上:Householder 变换、WY 表示、以及把串行递推改写成闭式的 UT 变换。本文把这三层从定义推到可用于 kernel 的形式,并附两个可交互演示(广义 Householder 的 β 系数、单位下三角求逆的前代法)。后续四篇 TileLang 实战可以直接回查本文的结论。
前三篇分别实现了无遗忘的 chunked 线性注意力、标量衰减、以及带删除项的 Gated DeltaNet。本篇是系列收尾:把 GDN 的标量门 αt 换成逐通道向量门 at∈Rdk。
St=St−1Diag(at)(I−βtktkt⊺)+βtvtkt⊺
改动只有一处:αt 变成了 Diag(at)。但这一处把前三篇积累的所有便利拆掉了–衰减不再能从矩阵里外提,Γ 从 C×C 变成 C×C×dk,而累积衰减积的通道离散度会直接把 fp16 打穿。
本篇聚焦实现。KDA 的数学推导(递推式、逐通道 WY 表示、UT 变换、下界衰减与满秩门控的动机)见《KDA 的来龙去脉》§3–§4,这里不重复;本文只做一件事:把那些公式落成能跑的 kernel,并量化每一处数值边界。
前三篇见 Chunked 线性注意力、标量衰减、Gated DeltaNet。
前两篇分别实现了无遗忘的 chunked 线性注意力,以及带标量衰减的版本。两者的状态更新都只做加法:新的键值对累加进状态,旧信息靠衰减系数被动遗忘。本篇补上最后一块–删除。
递推式变成:
St=St−1(αt(I−βtktkt⊺))+βtvtkt⊺
比上一篇多出的是 βt–一个删除力度的系数:它决定在 kt 这个方向上,旧内容被擦掉多少。
上两篇见《Chunked 线性注意力》与《标量衰减》,本文沿用其符号约定与四层参考验证框架。本篇会用到 Householder 变换、WY 表示与 UT 变换这些线性代数工具,背景推导见《线性注意力的线性代数前置知识》。