上週,一位在 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 倍。但如果你只看到這個數字,就錯過了整個故事。
這對你來說意味著什麼
如果你在做長上下文工作(程式碼審查、文件分析、多輪代理),注意力架構會直接影響你的成本與輸出品質。
成本不是固定的。同樣的 1M token 上下文:KDA 的 KV cache 只有完整注意力的 25%。記憶體頻寬壓力降低,延遲和吞吐量都明顯改善。
長 ≠ 昂貴。K3 的 1M 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.