上週,一位在 Baseten 從事推論的工程師 @waterloo_intern 發表了一篇技術部落格,標題為 「22,580:從 GPT-2 到 Kimi K3,一次說清楚」。文章在短短幾天內就累積了 240 萬次瀏覽。

他並沒有寫新聞稿,而是寫了可直接執行的 PyTorch 程式碼——從 GPT-2 的注意力區塊開始,一步步帶過每一項架構變更,每一次迭代都解釋一個問題與一項成本。這是我看過最好的 Transformer 演進說明。

我讀完他的文章後,又對照了 5 篇原始論文,整理出完整的脈絡。

22,580 倍的數字

2019 年 2 月,OpenAI 釋出 GPT-2——1.24 億參數。七年後,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

進入全螢幕模式 離開全螢幕模式

每次模型產生新 token,都會為所有歷史 token 重新計算 Q、K、V 投影,再執行 O(N²) 的 softmax attention。token 1 到 N-1 的 K 和 V 呢?直接丟棄。當 token N+1 進來時?一切重算。

這就是 KV Cache 被發明的原因。

KV Cache:存起來,不要重算

簡單的想法:把已經算好的 key 和 value 快取起來。下一個 token 進來時,只需要把新 Q 跟快取的 K 做一次點積。

問題解決了——但又製造了新問題。KV cache 會隨序列長度線性成長。在 1M tokens × d_model × layers 的規模下,可能是數十 GB 的 VRAM。每次解碼都要從 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)

進入全螢幕模式 離開全螢幕模式

現在我們可以先算 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 et al., NeurIPS 2024)解決了這個問題。

核心想法可以追溯到 1990 年代 Schmidhuber 的「Fast Weight Programmers」,後來由 Schlag et al.(ICML 2021)將線性注意力與 fast weights 連結起來。DeltaNet 的做法是:在寫入前,先讀取這個 key 位置目前存放的內容。

v_old = k @ S_old           # 讀取目前 key 對應的值
delta = v_new - v_old       # 計算差值
S_new = S_old + k^T @ delta # 只寫入差異

進入全螢幕模式 離開全螢幕模式

如果 v_new == v_old,delta 就是零——什麼都不變。如果完全不同,delta 等於 v_new——等同於覆寫。中間的任何情況都是平滑的插值。

這就是delta rule:精確的記憶體更新,而不是粗暴的累加。

並行化的技巧(Ali 說他花了 7 小時才理解)

DeltaNet 的狀態更新是嚴格依序的——每一步都依賴前一步的 S,看起來不可能並行化。但其實可以。

方法是:把序列切成大小為 C 的區塊。在每個區塊內,使用普通的 masked attention(GPU 可並行)。區塊之間則使用狀態矩陣 + 一次矩陣乘法(Q @ S)。透過 Householder 變換重新參數化 delta 更新,讓區塊內的所有 delta 可以一次算完。

複雜度:固定成本 2LD²(狀態維護)+ 可變成本 2LCD(區塊內注意力)。C 越大,可變成本越高,但 GPU 效率越好。實務上 C=64 或 128 效果最佳——FLOPs 不是唯一的指標;tensor core 使用率也很重要。

Gated DeltaNet:現在你可以遺忘

DeltaNet 可以精確編輯個別的 key-value pair。那要怎麼做到大規模遺忘

想像你讀完 1M token 上下文裡所有關於 Topic A 的文件,然後切換到 Topic B。理想上,模型應該「忘記」Topic A,以釋放容量給 B。

DeltaNet 可以覆寫特定條目,但無法批量衰減全域記憶體。Mamba-2(Dao & Gu, ICML 2024)可以做到:

cache = α × S_old + S_new

進入全螢幕模式 離開全螢幕模式

α 是介於 0 和 1 之間的閘控值,會均勻衰減所有舊記憶。這是 Mamba-2「State Space Duality」理論的核心——softmax attention 和 SSM 在數學上是同一件事的不同表達。Mamba-2 透過閘控將兩者統一。

Gated DeltaNet(Songlin Yang et al., ICLR 2025, NVIDIA)結合了 DeltaNet 的 delta 更新與 Mamba-2 的閘控:

S_new = α × S_old + k^T @ delta   # 先衰減,再精確寫入

進入全螢幕模式 離開全螢幕模式

α=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%
1M 上下文解碼吞吐量 基準 6x
短上下文表現 基準 優於
RL 擴展 基準 優於

這是線性注意力首次在公平比較下,全面優於完整注意力。不只是長上下文,短上下文也一樣。而「-75% KV cache」直接轉化為推論成本的節省。

我直接對照論文摘要驗證了這個說法:「首次在各種情境下,公平比較中優於完整注意力。」這不是行銷,而是核心結論。

K3 的最終混合架構

K3 的技術報告(arXiv 2607.24653, 2026 年 7 月)確認:

  • 3/4 層使用 KDA(線性),1/4 層使用 gated MLA(完整 softmax)
  • MoE 路由:896 個專家,每個 token 啟動 16 個(約 1.8%),使用 Quantile Balancing 做負載分配
  • 注意力殘差:各層可以「回看」特定較早層的表示
  • 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. 成本不是固定的。同樣的 1M token 上下文:KDA 的 KV cache 只有完整注意力的 25%。記憶體頻寬壓力降低,延遲和吞吐量都明顯改善。

  2. 長 ≠ 昂貴。K3 的 1M token 上下文視窗不是「硬碰硬」做出來的。75% 的工作走線性路徑。

  3. 混合是趨勢。線性不會取代 softmax——它們會互相補充。精確檢索走 softmax,大量處理走線性。這個典範會擴散。

重點摘要

  1. 22,580 倍的參數成長只是表象。真正的故事是記憶體管理:完整快取 → 固定狀態 → 精確寫入 → 自適應遺忘。
  2. 脈絡很清楚:DeltaNet(NeurIPS 2024)→ GatedDeltaNet(ICLR 2025)→ Kimi Linear(2025 年 10 月)→ Kimi K3(2026 年 7 月)。
  3. KDA 是第一個在公平比較下超越完整注意力的模型——涵蓋短上下文、長上下文和 RL 擴展情境。它不是「比較便宜的替代方案」。
  4. K3 的 75% 線性 / 25% softmax 混合是工程上的最佳解,而不是紙上談兵。
  5. 下次評估模型時:問注意力架構,而不是參數數量。這更重要。

參考資料