文章摘要
【轻量化复刻大模型】线性注意力(LinearAttention)线性注意力并非单一研究成果,而是一条逐步演进的技术路线。核心研究成果如下:文献标题作者/机构年份会议/arXivLinearAttent

【轻量化复刻大模型】线性注意力(Linear Attention)

线性注意力并非单一研究成果,而是一条逐步演进的技术路线。核心研究成果如下:

文献

标题

作者/机构

年份

会议/arXiv

Linear Attention

Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention

Katharopoulos, Vyas, Pappas, Fleuret (EPFL)

2020

ICML / arXiv:2006.16236

DeltaNet

Linear Transformers are Secretly Fast Weight Programmers

Schlag, Irie, Schmidhuber (IDSIA)

2021

ICML / arXiv:2102.11174

Gated Linear Attention

Gated Linear Attention

Yang, Wang, Shen, Panda, Kim (MIT)

2023

NeurIPS / arXiv:2312.06635

Parallel DeltaNet

Parallelizing Linear Transformers with the Delta Rule over Sequence Length

Yang, Wang, Zhang, Shen, Kim (MIT)

2024

arXiv:2406.06484

Kimi Linear / KDA v1

Kimi Linear

Moonshot AI

2025

arXiv:2510.26692

KDA v2 / K3

Kimi K3

Moonshot AI

2025

arXiv:2607.24653


项目仓库和系列博客是研究人员的探索尝试,也是学习过程的体现,研究人员会持续反思改进,欢迎读者提出宝贵意见。

  • 涉及 KIMI K3,DeepSeek V4,PI0.5,PI0.7 等模型,后续会跟踪新模型进展。

  • 全 CPU 复刻,不涉及 GPU,也不涉及大规模训练和硬件,重点是模型组件的小型化与近似替代。

  • 模型组件尽量是原始大模型的缩小版,若组件无开源版本则用近似组件替代。

  • 会解释每个组件解决的问题、难点、解法原理,以及组件间的衔接逻辑,重点是理解主线而非记忆名词。

  • 每个主要组件都有可直接运行的 Gradio demo——无需 GPU。另有若干可视化脚本,可生成静态图。

  • 所有文件行号基于本地源码快照,源码后续变化时,行号可能移动,但函数名和调用关系仍可作为定位入口。

  • 为保证文章相对独立,部分内容会在不同文章中重复,可能存在系列层面的冗余,还请理解。


0x01 演进脉络与定位

1.1 前身与痛点

标准 softmax Attention 的计算复杂度为 O(T²D),当序列长度 T 达到百万级时,二次方规模的矩阵会带来极大的存储和计算压力。线性注意力通过核方法替换 softmax,结合矩阵结合律,将复杂度降低到 O(TD²),同时用固定大小的状态矩阵 S 替代随序列增长的 KV Cache,避免了长序列下的存储膨胀问题。

  • 痛点:计算和内存复杂度 O(T²),T=100 万时 T² 矩阵难以存储。

1.2 同期竞品对比

方案名

核心机制

优势

劣势

FlashAttention

分块 + online softmax,不物化 O(T²) 矩阵

保持 softmax 精度

复杂度仍 O(T²),KV cache 仍线性

稀疏 Attention

只计算部分 token 对

降低常数

破坏全局性,需选择策略

Linear Attention

核方法替换 softmax,O(T)

真正的线性复杂度

纯加性无法覆写

RetNet / RWKV

递推状态

O(T)

表达力受限

1.3 定位一句话

不同于标准 softmax 注意力通过 O(T²) 显式计算所有 token 对的做法,线性注意力通过核函数 + 递推状态(R=φ(K)^T V)将复杂度降到 O(T),其中 DeltaNet/KDA 进一步用可修正的 Delta Rule 替代纯加性更新,实现了 O(1) 状态下的可覆写记忆。

1.4 演进总结

线性注意力的演进是逐步解决局限的过程:纯加性无法修改 → 加门控实现遗忘 → Delta Rule 实现纠错 → 门控+Delta 结合 → 并行化提升表达力 → KDA 实现工程化精细控制,每一步都弥补了上一代的不足。

每一步都是在解决上一步的局限:不能改 → 不能忘 → 遗忘不灵活 → 衰减不够激进。


0x02. 原理讲解

2.1 直觉类比视角

想象一间黑板教室,普通注意力是“老师每讲一句,就把所有旧板书重抄一遍”——随着课越讲越长,重抄的代价越来越大(O(T²))。线性注意力换了个思路:老师只维护一块固定大小的黑板(状态矩阵 S),每讲一句新知识,就在黑板上加/改几笔(O(1)),不再重抄。

难点在于:如果两句讲的是同一件事但答案不同,怎么改(以 Delta Rule 为例)?纯加性只会越写越糊(混叠);Delta Rule 则先"看清黑板上的旧答案"(检索),算出"差多少"(误差),再精准擦掉旧答案写下新的(修正)。

2.2 专业水平视角

线性注意力的基本想法,是不再保存所有历史 Token 的完整 Key-Value,而是把历史信息累积到一个固定大小的状态矩阵中。

普通的 Full Attention 在读取历史时,需要访问历史上的许多 Key 和 Value。上下文越长,KV Cache 通常也越大。线性注意力则把历史压缩成一个固定形状的状态 S,之后的新 Token 只需要读取和更新这个状态,而不需要逐个访问全部历史 Token。

最基本的状态更新可以写成:

这里:k_t 是当前 Token 的 Key,用来表示这条信息应该通过什么模式被寻址;v_t 是当前 Token 的 Value,表示真正要存储的内容;v_t k_t^⊤ 是一个外积矩阵,把当前的 Key-Value 关联写入状态;S_t 是处理完第 t 个 Token 后的记忆状态。

这个更新具有一个重要特征:当前 Token 的 v_t 和 k_t 在完成外积并累积到状态后,就可以立即丢弃。之后的计算只依赖状态矩阵 S_t,不需要保留随上下文长度增长的完整 KV Cache。不过,前面的短卷积仍然需要保留固定长度的、卷积之前的 qkv 输入。也就是说,线性注意力不代表所有中间状态都完全不需要保存;它主要消除了完整历史 Key-Value 的逐 Token 存储。

输入输出:

  • 输入:Q, K, V ∈ R^{B, H, T, D}(batch, heads, 序列, 每头维度)

  • 输出:O ∈ R^{B, H, T, D}

核心推导:softmax 可以近似为核函数的乘积:softmax(q·k^T) ≈ φ(q)·φ(k)^T,则 Attention(Q,K,V) = φ(Q) · (φ(K)^T · V) = φ(Q) · S,其中 S = φ(K)^T · V ∈ R^{D×D} 固定大小。

写成递推:S_t = S_{t-1} + φ(k_t)^T v_t(纯加法),o_t = φ(q_t) S_t

与标准做法的公式级对比:

标准

线性

计算

softmax(QK^T/√d)V

φ(Q)(φ(K)^T V)

复杂度

O(T²D)

O(TD²)

状态

无(每步重算)

S ∈ R^{D×D} 递推

写成递推:S_t = S_{t-1} + φ(k_t)^T v_t(纯加法),o_t = φ(q_t) S_t

这个更新具有一个重要特征:当前 Token 的 v_t 和 k_t 在完成外积并累积到状态后,就可以立即丢弃。之后的计算只依赖状态矩阵 S_t,不需要保留随上下文长度增长的完整 KV Cache。不过,前面的短卷积仍然需要保留固定长度的、卷积之前的 qkv 输入。也就是说,线性注意力不代表所有中间状态都完全不需要保存;它主要消除了完整历史 Key-Value 的逐 Token 存储。

S 是所有方法共享的同一个抽象:这是一个 (B, H, Dk, Dv) 的大小固定的"记忆矩阵",替代了标准 Transformer 中随序列长度增长的 KV Cache。每一步的操作都是:读 S → 改 S → 返回输出。

S 又像一个普通线性层的权重矩阵:它通过矩阵乘法作用在 Query 上。因此,从 fast-weight 的角度看,S 可以理解为:一组随上下文快速更新的权重;一个动态的 Key-Value 关联记忆;一个在推理过程中在线变化的线性模型。

如果初始状态为 S_0=0,把递推展开可得 S_t = Σ_{i=1}^{t}v_i k_i^T

如果 S_0 不为零,还需要在右侧加上初始状态 S_0。

用 Query 读取历史:状态乘以任意 Query q,得到的结果是 o_t = S_t q_t,这相当于根据 Query 与历史 Key 的匹配程度,对历史 Value 做加权聚合。

它表示第 i 个历史 Key 与当前 Query 的匹配程度,匹配程度决定对应 Value 被取出的比例。因此,v_i k_i^⊤ 可以看成向状态中写入一条 Key-Value 关联;S_t q 可以看成根据 Query 与历史 Key 的匹配程度,对历史 Value 做加权聚合。

<p style="padding-top: 8px;padding-bottom: 8px;color: black;margin: 10px 10px;line-height: 1.75;letter-spacing: 0.2em;font-size: 14px;word-spacing: 0.1em
以上内容不代表本平台立场,仅供读者参考