跳到主要內容

Kimi K3 深度拆解:2.8 兆參數開放權重、KDA 線性注意力與 896 專家稀疏路由如何撐起百萬 token 上下文

| FinStack

Kimi K3 深度拆解:2.8 兆參數開放權重、KDA 線性注意力與 896 專家稀疏路由如何撐起百萬 token 上下文

目錄

  1. 背景:開放權重競賽邁入三兆參數時代
  2. 核心架構總覽:K3 的設計哲學
  3. Stable Latent MoE:896 選 16 的稀疏經濟學
  4. KDA(Kimi Delta Attention):長上下文的算力平衡術
  5. AttnRes 注意力殘差:深層網路中的資訊傳遞
  6. 結論:不只模型,更是完整的工程解決方案

2026 年 7 月 27 日晚間,月之暗面(Moonshot AI)正式釋出了 Kimi K3 的完整模型權重,並同步發表了技術報告。這款模型成為全球首個實現落地的三兆參數量級開放權重模型,總參數高達 2.8 兆,原生支援多模態,並具備一百萬 token 的上下文處理能力。權重在 Hugging Face 上線後,迅速攀升至總趨勢榜首位。

回顧過去,開源模型領域的參數上限,此前由 DeepSeek V4 Pro 的 1.6 兆參數所保持,而 GLM-5.2 則為 7440 億參數。K3 的問世,直接將開放權重模型的規模上限,提升了將近一倍。

然而,這次開源最引人注目的,並非單純的參數規模。對於程式設計師而言,真正值得細細探究的,是 K3 如何在架構上實現以下三大核心設計,以驅動 2.8 兆參數的龐大模型,並將一百萬 token 融入上下文之中:

  • KDA(Kimi Delta Attention)混合線性注意力機制:解決長上下文處理下的算力成本問題。
  • Stable Latent MoE 極端稀疏路由:在 896 個專家模型中,僅激活 16 個,稀疏率低於 2%。
  • AttnRes 注意力殘差設計:確保資訊能夠在極深的網路結構中有效傳遞。

更重要的是,官方這次除了釋出模型權重外,也一併開源了高效能注意力算子、MoE 通訊庫,以及大規模 Agent 環境基礎設施程式碼。這表示此次開源所提供的,不僅僅是一個模型,而是一套「如何訓練與執行超大型稀疏模型」的完整工程解決方案。

這篇文章將以程式設計師的視角,深入剖析 K3 的各項技術細節,力求將每個技術點解釋到「能自己動手寫出一個玩具版」的程度。

---

背景:開放權重競賽邁入三兆參數時代

首先,讓我們釐清這次事件的時間線:

  • 7 月 16 日,Kimi K3 作為旗艦模型正式發布,並先行提供 API 服務。
  • 7 月 27 日晚間,模型的完整權重開放原始碼,同時釋出技術報告,以及注意力算子、MoE 通訊庫、Agent 環境基礎設施等配套程式碼。
  • 權重發布後,K3 迅速登頂 Hugging Face 的總趨勢榜首位。

從規模格局來看,情況也相當明朗:

模型總參數上下文開源狀態
Kimi K32.8 兆(MoE)100 萬 token開放權重
DeepSeek V4 Pro1.6 兆(MoE)100 萬 tokenMIT 開源
GLM-5.27440 億開源

在第三方評測機構 Artificial Analysis 的綜合智能指數排名上,K3 位列全球第三,僅次於兩個閉源模型:Claude Fable 5 和 GPT-5.6 Sol。然而,在 Frontend Code Arena(前端程式碼競技場)這項評測中,K3 以 1679 分反超 Claude Fable 5(1631 分)和 GPT-5.6 Sol(1618 分),一舉奪得全球第一。

作為一個開放權重模型,K3 能夠在特定細分場景中超越兩個最強大的閉源模型,這正是其引發熱烈討論的直接原因。然而,從工程角度來看,更具深意的一個問題是:一個擁有 2.8 兆參數的模型,究竟憑藉什麼才能夠高效運行,並降低使用成本?

答案,正隱藏在其獨特的架構設計之中。

---

核心架構總覽:K3 的設計哲學

根據官方技術報告與公開資料,K3 的核心規格重點如下:

  • 總參數量:高達 2.8 兆(約為上一代 K2.5 的三倍)。
  • 架構:採用 Stable Latent MoE 稀疏專家系統,內含 896 個專家模型,每個 token 僅激活其中 16 個。
  • 注意力機制:整合了 KDA(Kimi Delta Attention)混合線性注意力,並輔以 AttnRes 注意力殘差設計。
  • 上下文窗口:支援 100 萬 token 的超長上下文;最大輸出長度為 128K token。
  • 多模態能力:原生支援視覺理解,而非傳統的外部視覺編碼器拼接的「膠水方案」。
  • 訓練方式:採用 MXFP4 量化訓練;官方宣稱在相同算力條件下,整體擴展效率比 K2 提升約 2.5 倍。

將這些規格串聯起來,我們可以發現 K3 的設計哲學呈現出高度的一致性:所有的架構決策,都在嘗試回答同一個核心問題——如何在既定算力不變的前提下,進一步提升模型的有效智能上限。

具體而言:

  • 追求大參數規模:模型需要足夠的參數來承載複雜的知識與能力。→ 但推論算力不能因此暴增。→ 解決方案是採用極端稀疏的 MoE 架構,使得 2.8 兆的總參數中,每次推論只動用一小部分。
  • 支援超長上下文:對於理解複雜情境和處理大量資訊至關重要。→ 但注意力機制的計算成本不能呈平方級增長。→ 解決方案是採用混合線性注意力 KDA
  • 構建深層網路:有助於提取更高層次的特徵。→ 但資訊在深層網路中不能發生衰減。→ 解決方案是加入注意力殘差 AttnRes
  • 優化訓練成本:對於大規模模型訓練至關重要。→ 解決方案是採用 MXFP4 低精度量化訓練

接下來,我們將逐一深入剖析這些核心技術。

---

Stable Latent MoE:896 選 16 的稀疏經濟學

3.1 為何選擇極端稀疏設計

MoE(Mixture of Experts,專家混合)的核心思想已廣為人知:將傳統的 FFN(Feed-Forward Network)層分解為 N 個獨立的「專家」,每個 token 經由一個路由器(router/gate)的引導,僅選擇其中 k 個專家進行處理。這樣一來,模型的總參數量等於所有專家參數的總和,而實際激活的參數量則約為 k/N 的比例。

K3 的配置是從 896 個專家中激活 16 個,其激活比例約為 1.8%。我們可以對比幾個常見的 MoE 模型配置:

  • Mixtral 8x7B:在 8 個專家中激活 2 個,激活比例為 25%。
  • DeepSeek-V3 系列:約在 256 個專家中激活 8 個,激活比例約為 3%。
  • Kimi K3:在 896 個專家中激活 16 個,比例約為 1.8%。

從這些數據中可以觀察到一個明顯的趨勢:專家的數量正在呈指數級增長,而激活的比例則持續降低。這背後的原因,是一條被反覆驗證的經驗規律——在激活算力(FLOPs)保持不變的前提下,增加模型的總參數量(即增加專家數量)依然能夠帶來模型能力的顯著提升。因此,稀疏度可以被視為一種「白白撿到的容量」。

然而,極端稀疏的 MoE 設計面臨著兩個主要的工程挑戰:

  • 路由不穩定性:當專家數量越多時,路由器越容易出現「偏科」現象——某些熱門專家可能因過度擁擠而過載,而另一些冷門專家則可能長期處於閒置狀態,這會導致訓練過程中的震盪與不穩定。
  • 通訊開銷:專家模型通常分佈在數百甚至數千張加速卡上。當 token 需要跨卡分發(all-to-all)給不同的專家時,專家的數量越多,通訊的拓撲結構就越複雜,進而導致通訊開銷大幅增加。

K3 所採用的「Stable Latent MoE」架構,其名稱中的「Stable」正是針對第一個問題的解決方案,而「Latent」則暗示了路由決策是在一個壓縮的潛在空間中進行的。這表示模型會先將 token 的表示投影到一個低維度的潛在空間,然後再進行路由決策。這種方法不僅降低了路由計算的成本,也使得路由訊號更加平滑,減少了被單一維度雜訊干擾的風險。儘管官方尚未完全公開路由的詳細細節,但這個方向與近年來「路由應在解耦的低維空間進行」的研究共識是相符的。

3.2 建立直覺:玩具版 top-k 路由實作

為了幫助讀者建立對 top-k MoE 層的直觀理解,我們可以用 PyTorch 撰寫一個最小可用的簡化版本(此處省略了負載均衡損失與容量因子的複雜性):

python

import torch

import torch.nn as nn

import torch.nn.functional as F

class Expert(nn.Module):

"""單個專家:本質上就是一個標準的 FFN 層"""

def __init__(self, d_model: int, d_ff: int):

super().__init__()

self.w1 = nn.Linear(d_model, d_ff, bias=False)

self.w2 = nn.Linear(d_ff, d_model, bias=False)

def forward(self, x):

return self.w2(F.silu(self.w1(x)))

class TopKMoE(nn.Module):

def __init__(self, d_model=1024, d_ff=4096,

n_experts=64, top_k=4, d_latent=128):

super().__init__()

self.d_model = d_model

self.n_experts = n_experts

self.top_k = top_k

# 路由器:將 token 投影到潛在空間,然後透過線性層選擇專家

self.router = nn.Linear(d_model, n_experts, bias=False)

# 定義多個專家模型

self.experts = nn.ModuleList([Expert(d_model, d_ff) for _ in range(n_experts)])

# Latent Router 的額外層,如果需要更複雜的潛在空間路由

# self.latent_projection = nn.Linear(d_model, d_latent, bias=False)

# self.latent_router = nn.Linear(d_latent, n_experts, bias=False)

def forward(self, x):

batch_size, seq_len, d_model = x.shape

x_flat = x.view(-1, d_model) # (Batch*SeqLen, d_model)

# 步驟一:計算路由分數

# 這裡簡化為直接從 d_model 路由,K3 的 Latent 概念會在此處引入一個低維投影

routing_logits = self.router(x_flat) # (Batch*SeqLen, n_experts)

routing_weights = F.softmax(routing_logits, dim=-1) # (Batch*SeqLen, n_experts)

# 步驟二:選取 Top-K 專家

top_k_weights, top_k_indices = torch.topk(routing_weights, self.top_k, dim=-1) # (Batch*SeqLen, top_k)

# 正規化 Top-K 權重,確保總和為 1

top_k_weights_normalized = top_k_weights / top_k_weights.sum(dim=-1, keepdim=True)

# 步驟三:將 token 分配給專家並進行計算

output = torch.zeros_like(x_flat) # (Batch*SeqLen, d_model)

# 為了效率,通常這裡會進行 batching,將相同專家的 token 收集起來批量處理

# 為了簡潔,這裡使用迴圈遍歷每個 token 和其選定的專家

for i, (weights_i, indices_i) in enumerate(zip(top_k_weights_normalized, top_k_indices)):

expert_output_i = torch.zeros(d_model, device=x.device)

for j in range(self.top_k):

expert_idx = indices_i[j]

weight = weights_i[j]

expert_output_i += weight * self.experts[expert_idx](x_flat[i])

output[i] = expert_output_i

return output.view(batch_size, seq_len, d_model)

<h1>範例使用</h1>

if __name__ == "__main__":

d_model = 1024

d_ff = 4096

n_experts = 896 # K3 的專家數量

top_k = 16 # K3 的激活專家數量

moe_layer = TopKMoE(d_model=d_model, d_ff=d_ff, n_experts=n_experts, top_k=top_k)

# 模擬輸入:一個批次,序列長度為 128

input_tensor = torch.randn(2, 128, d_model)

output_tensor = moe_layer(input_tensor)

print(f"輸入形狀: {input_tensor.shape}")

print(f"輸出形狀: {output_tensor.shape}")

# 驗證激活參數量

total_params = sum(p.numel() for p in moe_layer.parameters())

print(f"MoE 層總參數量: {total_params / 1e6:.2f} M")

# 這裡的 "激活參數量" 概念對於 MoE 需要更精確的定義

# 一般指的是 Inference 時實際被計算的參數量,難以直接從上面的簡易程式碼中直接統計

# 實際激活參數量約為 (d_model n_experts + n_experts d_model) for router + top_k (d_model d_ff + d_ff * d_model) for experts

# 相較於一個單一 FFN (d_model d_ff + d_ff d_model),總參數規模是巨大的,但激活計算量可控。

這個玩具範例展示了 MoE 層的核心邏輯:一個路由器負責為每個輸入 token 計算分配給各個專家的分數,然後選擇分數最高的 top_k 個專家。每個選定的專家獨立處理 token,最終將這些專家的輸出根據路由分數進行加權求和。K3 的 Stable Latent MoE 在此基礎上,進一步將路由過程引入低維潛在空間,並強調了路由的穩定性,這在實際大規模訓練中至關重要。

---

KDA(Kimi Delta Attention):長上下文的算力平衡術

對於 Transformer 架構而言,注意力機制是其核心所在。然而,標準的自注意力(Self-Attention)機制,其計算複雜度會隨著上下文長度 N 的增加,呈 O(N^2) 的平方級增長。這意味著在處理百萬級 token 的超長上下文時,傳統注意力機制的計算成本會變得極其高昂,甚至無法承受。

KDA(Kimi Delta Attention)正是為了解決這個問題而設計的混合線性注意力機制。它的目標是將注意力機制從 O(N^2) 的複雜度,降低到接近 O(N) 的線性或準線性複雜度,從而能夠在可控的算力下處理超長序列。

KDA 的具體實作細節,官方技術報告中雖未完全揭露其所有層次,但從「混合線性注意力」這個描述可以推斷,它很可能整合了多種線性注意力技術的優點,例如:

  • 基於核函數的方法(Kernel-based methods):這類方法通過引入特定的核函數,將注意力機制的 QK 向量投影到一個高維空間,並在該空間中計算其內積,從而避免了直接計算 Q K^T 矩陣乘法,將複雜度從 O(N^2) 降至 O(N)。常見的例子包括 Performer、Linear Transformer 等。
  • 稀疏注意力(Sparse Attention):不對所有 QK 進行計算,而是基於某些策略(如固定模式、局部關注、或基於內容的稀疏化)只計算部分相關的注意力權重。
循環/片段式注意力(Recurrent/Segmented Attention):將超長序列切分成多個片段,並在片段之間引入循環機制或記憶機制,使得模型能夠整合來自先前片段的資訊,同時保持每個片段內部的計算為 O(L^2) (L為片段長度),整體則為 O(N)O(N log N)。

KDA 的「Delta Attention」部分可能暗示了其在計算注意力時,並非每次都從頭計算所有 token 的交互,而是可能利用增量更新或差異計算的方式,特別是在處理長序列時,可以只關注與當前 token 相關的「delta」(變化量)資訊,或者利用已經計算過的資訊來加速後續計算。

結合「混合」這個詞,KDA 最有可能的做法是:在不同的層次或不同的任務中,彈性地選擇和組合不同的注意力機制。例如,在處理局部上下文或關鍵資訊時,可能仍然採用傳統的自注意力來保持高精度;而在處理遠距離依賴或冗餘資訊時,則切換到計算效率更高的線性注意力機制。這種混合策略能夠在保持模型性能的同時,大幅降低長序列處理的算力開銷。

K3 能夠實現 100 萬 token 的上下文,KDA 絕對是其核心支撐技術之一。它解決了 Transformer 模型在處理超長序列時最根本的計算瓶頸,使得大規模語言模型能夠在實際應用中處理更廣闊的資訊視窗。

---

AttnRes 注意力殘差:深層網路中的資訊傳遞

隨著模型層數的增加,深度網路面臨的一個普遍問題是資訊衰減。在 Transformer 模型中,每經過一個層,資訊都會被重新轉換和傳遞。當網路足夠深時,早期的輸入資訊可能會在層層傳遞的過程中逐漸「稀釋」或「遺失」,導致模型難以捕捉到長距離的依賴關係,也可能讓訓練變得困難。

殘差連接(Residual Connection),即著名的「殘差網路(ResNet)」,正是為了解決這個問題而引入的。它允許資訊在網路中直接「跳過」一些層,從而保證原始資訊能夠直接傳遞到更深層次,有助於梯度在反向傳播時更順暢地流動,緩解梯度消失問題,並使得訓練深層網路變得可行。

K3 所採用的「AttnRes 注意力殘差」是這種殘差連接概念在注意力機制上的特定應用。它並非簡單地將注意力層的輸出加到輸入上,而是在注意力模塊內部或注意力模塊間設計了特定的殘差路徑。

傳統的 Transformer 層結構通常是:

Output = LayerNorm(Input + Attention(Input)) Output = LayerNorm(Output + FFN(Output))

而 AttnRes 可能意味著在注意力機制內部,或者注意力與後續的 FFN 之間,引入了額外的殘差路徑,例如:

  • 注意力模塊內部的殘差:可能是在計算 Q、K、V 之後,輸出與輸入在某個階段進行殘差連接,以確保原始特徵在注意力計算過程中不完全被轉換。
  • 注意力輸出與 FFN 輸入之間的殘差強化:除了傳統的殘差,可能還有額外的通道,將注意力機制處理過的部分資訊或原始輸入特徵更直接地傳遞給 FFN,確保 FFN 能夠同時接收到轉換後的注意力特徵和未經注意力轉換的原始特徵。
  • 多頭注意力(Multi-Head Attention)各頭之間的殘差或共享機制:這可以確保不同注意力頭捕捉到的資訊能夠有效整合,避免某些頭的資訊被其他頭完全覆蓋。

AttnRes 的目標非常明確:在 K3 這種擁有數百層的超深網路中,確保資訊能夠高效、無損地從輸入層傳遞到輸出層,特別是對於百萬 token 的長上下文,更需要保證模型能夠在數百個注意力層的處理後,依然保留對上下文各部分的精確理解。

透過 AttnRes,K3 能夠在維持其龐大而深邃的網路結構的同時,確保資訊的有效流動,這對於模型的訓練穩定性和最終的性能表現,尤其是在處理長距離依賴和複雜推理任務時,具有關鍵性的作用。這也是 K3 能夠實現高性能的另一個重要基石。

---

結論:不只模型,更是完整的工程解決方案

綜觀 Kimi K3 的核心技術,無論是 2.8 兆參數的 Stable Latent MoE、處理長上下文的 KDA 混合線性注意力,還是確保深層網路資訊流暢的 AttnRes 注意力殘差,這些設計都圍繞著一個核心目標:在保持或提升模型能力的同時,極大化算力效率。

月之暗面此次開源的不僅僅是一個強大的模型權重。更重要的是,它提供了一整套「如何訓練和運行超大型稀疏模型」的工程解決方案。配套開源的高性能注意力算子、MoE 通訊庫和大規模 Agent 環境基礎設施程式碼,為廣大開發者和研究者提供了一個前所未有的視角,去理解和實踐如何在大規模 AI 時代,平衡模型性能、算力成本與工程複雜度。

這次開放,不僅將開源模型的參數規模推向了新的高峰,更為整個業界展示了在超大模型時代,如何通過精巧的架構設計和底層優化,突破算力瓶頸,將模型的智能上限再度提升。這對於開放原始碼社群而言,無疑是一份極具價值的技術寶藏,將深刻影響未來大型語言模型的研究與發展。

熱門文章