上周,一位 Baseten 推理工程师 @waterloo_intern 发表了一篇题为 「22,580:从 GPT-2 到 Kimi K3,全拆解」 的技术博客。短短几天内阅读量突破 240 万。
他没有写软文,而是直接放出可运行的 PyTorch 代码——从 GPT-2 的注意力模块开始,一步步展示每一代架构的改动,每一次迭代都对应一个问题与一次代价。这可能是目前最好的 Transformer 演进脉络讲解。
我通读了他的文章,并对照 5 篇原始论文逐一核实核心结论。下面是完整梳理。
22,580 倍的数字
2019 年 2 月,OpenAI 发布 GPT-2,参数量 1.24 亿。7 年后,Moonshot AI 开源 Kimi K3,参数量 2.8 万亿。一个 Kimi K3 可以塞下 22,580 个 GPT-2。
但这不是「堆算力」的故事,而是关于如何存储、更新和检索记忆的故事。
起点:GPT-2
class Block(nn.Module):
def forward(self, x):
x = x + self.attn(self.ln_1(x))
x = x + self.mlp(self.ln_2(x))
return x
Enter fullscreen mode Exit fullscreen mode
每次模型生成新 token,都要对全部历史 token 重新计算 Q、K、V 投影,再做 O(N²) 的 softmax attention。1~N-1 号 token 的 K、V 全部丢弃;N+1 号 token 到来时,再次全部重算。
这就是 KV Cache 诞生的原因。
KV Cache:存起来,别重算
简单思路:把已经算好的键和值缓存起来。下一次生成时,新 Q 只需和缓存的 K 做一次点积。
问题解决了,但新问题出现了:KV cache 随序列长度线性增长。1 M tokens × d_model × layers,轻松占用数十 GB VRAM。每次解码都要把全部 KV 从 HBM 读出来。
瓶颈不在算力,而在内存带宽。 这是理解后续所有优化的关键。
线性注意力:固定大小的记忆
能否把 O(N²D) 压缩成 O(ND²)?
思路:用特征映射替换 softmax。
# 标准 softmax(必须先算出 N×N)
attention = softmax(QKᵀ / √d) × V
# 线性注意力(先把 K 和 V 折叠)
Q' = ELU(Q) + 1
K' = ELU(K) + 1
output = (Q'(K')ᵀ × V') / (Q'(K')ᵀ × ones)
Enter fullscreen mode Exit fullscreen mode
现在可以先算 K'^T × V',得到固定大小的 D×D 矩阵,再乘以 Q'。历史 KV 信息被「折叠」进一个常数大小的状态矩阵,缓存不再随 N 增长。
代价:ELU+1 是对 softmax 核的近似,表达能力下降。但在长上下文任务上,这个权衡往往值得。
题外话:FlashAttention 没做这件事
常见误区。Ali 的文章提到「2020 年还没有 FlashAttention」,但 FlashAttention 与线性注意力解决的是根本不同的问题。
FlashAttention(Tri Dao,NeurIPS 2022)没有改注意力算法,而是优化了 GPU 的IO 模式——把 N×N 矩阵分块,让它永远不完整落到 HBM。它让 softmax 更快,但仍然是 O(N²)。
线性注意力重新定义了算法本身——用特征映射替换 softmax,从 O(N²D) 变成 O(ND²)。
一个优化 IO,一个改算法,二者正交。
DeltaNet:现在可以编辑记忆
线性注意力有一个致命缺陷:只能累加,不能更新。
新 token 只能把状态叠加:S = S + K'^T × V'。信息只增不减,就像一本只能写、不能擦或改的笔记本。
DeltaNet(Songlin Yang 等,NeurIPS 2024)解决了这个问题。
核心思想可追溯到 20 世纪 90 年代 Schmidhuber 的「Fast Weight Programmers」,后来 Schlag 等(ICML 2021)将其形式化为线性注意力与快权重之间的联系。DeltaNet 的做法:在写入前,先读出这个 key 当前存储的值。
v_old = k @ S_old # 读取当前 key 的值
delta = v_new - v_old # 计算差值
S_new = S_old + k^T @ delta # 只写入差值
Enter fullscreen mode Exit fullscreen mode
如果 v_new == v_old,delta 为零——什么都不变;如果完全不同,delta 等于 v_new——相当于覆盖;介于两者之间则是平滑插值。
这就是delta 规则:精确的内存更新,而不是粗暴的累加。
并行化技巧(Ali 说花了 7 小时才理解)
DeltaNet 的状态更新是严格串行的——每一步都依赖上一步的 S,看似无法并行。但其实可以。
方法:把序列切成大小为 C 的块。在块内使用普通掩码注意力(GPU 并行);块间使用状态矩阵 + 一次 matmul(Q @ S)。Householder 变换把 delta 更新重参数化,使得块内所有 delta 可以一次性算出。
复杂度:固定成本 2LD²(状态维护)+ 可变成本 2LCD(块内注意力)。C 越大,可变成本越高,但 GPU 利用率越好。实际中 C=64 或 128 效果最佳——FLOPs 不是唯一指标,tensor core 利用率同样重要。
Gated DeltaNet:现在可以遗忘
DeltaNet 可以精确编辑单个 key-value 对。但大规模遗忘呢?
想象在 1 M token 上下文中读完所有关于主题 A 的文档,再切换到主题 B。模型最好能「忘掉」主题 A,为 B 腾出空间。
DeltaNet 可以覆盖特定条目,但无法批量衰减全局记忆。Mamba-2(Dao & Gu,ICML 2024)可以:
cache = α × S_old + S_new
Enter fullscreen mode Exit fullscreen mode
α 是介于 0 和 1 之间的门控值,均匀衰减所有旧记忆。这是 Mamba-2「状态空间对偶」理论的核心——softmax 注意力与 SSM 在数学上是同一种东西的不同表达。Mamba-2 通过门控把二者统一。
Gated DeltaNet(Songlin Yang 等,ICLR 2025,NVIDIA)把 DeltaNet 的 delta 更新与 Mamba-2 的门控结合:
S_new = α × S_old + k^T @ delta # 先衰减,再精确写入
Enter fullscreen mode Exit fullscreen mode
α=1 是纯 DeltaNet;α=0 是内存清零;介于两者之间既遗忘又更新。
关键机制:一个在时刻 x 写入、在 x+t 读取的 token,会经历 t 轮累积 α 衰减(αₓ × αₓ₊₁ × … × αₓ₊ₜ)。不同时刻写入的信息以不同速度遗忘——最近的衰减少,久远的可能完全消失。
KDA:Kimi 的秘密武器
Kimi Linear(Moonshot AI,arXiv 2510.26692,2025 年 10 月)——K3 的前身——进一步把标量门控升级为逐维度门控。
Gated DeltaNet 用一个标量 α 控制所有记忆维度的遗忘速度。KDA 把 α 变成一个向量(或矩阵)。每个维度独立控制自己的遗忘率。哪些概念保留、哪些维度衰减——由模型自己学习。
论文中的关键数据:
| 指标 | 完整 MLA | Kimi Linear |
|---|---|---|
| KV Cache | 100% | -75% |
| 1 M 上下文解码吞吐 | 基线 | 6 倍 |
| 短上下文性能 | 基线 | 更优 |
| RL 扩展性 | 基线 | 更优 |
这是线性注意力首次在公平对比下全面超越完整注意力。不仅在长上下文,短上下文也更强。而「-75% KV cache」直接转化为推理成本节省。
我直接对照论文摘要核实了这一说法:「for the first time, outperforms full attention under fair comparisons across various scenarios.」——不是营销,而是核心结论。
K3 的最终混合架构
K3 的技术报告(arXiv 2607.24653,2026 年 7 月)确认:
- 3/4 层使用 KDA(线性),1/4 层使用 gated MLA(完整 softmax)
- MoE 路由:896 个专家,每 token 激活 16 个(约 1.8%),使用 Quantile Balancing 做负载均衡
- Attention Residuals:层可以「回看」特定更早层的表示
- MXFP4 权重 + MXFP8 激活,量化感知训练
K3 不是纯线性注意力模型,而是混合系统:KDA 负责主体处理(廉价、快速、固定状态),周期性 softmax 层做精确检索——找回线性压缩可能丢失的细节。这正是 Ali 分析的权衡:线性注意力 + 周期性 softmax 检索。
22,580 倍到底意味着什么?
Ali 的结论比我能写的任何话都更尖锐:
从 GPT-2 到 Kimi K3,每一代的核心进步都不是「更多参数」,而是重新设计如何访问记忆:如何存储、如何遗忘、如何检索。
演进一览表:
| 阶段 | 代表模型 | 记忆机制 | 解决的问题 |
|---|---|---|---|
| 1 | GPT-2 + KV Cache | 完整缓存,O(N) 增长 | 消除重复计算 |
| 2 | 线性注意力 | 固定状态,O(D²) | 缓存不再随 N 增长 |
| 3 | DeltaNet | delta 更新,可编辑 | 无法更新 → 可以更新 |
| 4 | Gated DeltaNet | 门控 + delta,可遗忘 | 无法遗忘 → 可以遗忘 |
| 5 | KDA / Kimi K3 | 逐维度门控 + 混合 | 线性超越完整注意力 |
参数增长了 22,580 倍。但如果你只看到这个数字,就错过了整个故事。
这对你意味着什么
如果你在做长上下文工作(代码审查、文档分析、多轮代理),注意力架构直接影响你的成本和输出质量。
成本不是固定的。 同样 1 M token 上下文:KDA 的 KV cache 仅为完整注意力的 25%。内存带宽压力更低,延迟和吞吐显著更好。
长 ≠ 贵。 K3 的 1 M token 上下文窗口不是「硬堆」出来的。75% 的工作走线性路径。
混合是趋势。 线性不会取代 softmax,而是互补。softmax 做精确检索,线性做批量处理。这个范式将普及。
核心要点
- 22,580 倍参数增长只是表象。真正的故事是内存管理:完整缓存 → 固定状态 → 精确写入 → 自适应遗忘。
- 脉络清晰:DeltaNet(NeurIPS 2024)→ GatedDeltaNet(ICLR 2025)→ Kimi Linear(2025 年 10 月)→ Kimi K3(2026 年 7 月)。
- KDA 是首个在公平对比下全面超越完整注意力的方案——覆盖短上下文、长上下文和 RL 扩展场景。不是「更便宜的替代品」。
- K3 的 75% 线性 / 25% softmax 混合是工程最优解,不是纸上谈兵。
- 下次评估模型时:问注意力架构,而不是参数量。它更重要。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.