انتقل إلى المحتوى الرئيسي

KataGo 的關鍵創新

KataGo 是 David Wu 於 2019 年發表的開源圍棋 AI,以更少的資源達到更強的棋力。本文將深入解析其技術創新。

KataGo 相對 AlphaGo 的關鍵創新在於完全開源(MIT 授權)、以約 30 GPU、19 天的高效訓練超越前作,並額外輸出目數、領地與多規則支援,使訓練效率與功能都大幅提升。

為什麼需要 KataGo?

AlphaGo 的問題

問題說明
閉源DeepMind 從未公開 AlphaGo 的程式碼
資源需求需要數千個 TPU 進行訓練
無法重現普通開發者無法自行訓練
功能有限只輸出策略和勝率

KataGo 的解決方案

特點說明
完全開源MIT 授權,程式碼公開
高效訓練30 GPU × 19 天 = 超越 Leela Zero
功能豐富勝率、目數、領地、多規則支援
持續更新社群分散式訓練持續改進

50 倍效率提升的秘密

效率對比

系統訓練資源達到棋力
AlphaGo Zero4 TPU × 3 天超越 AlphaGo
Leela Zero社群分散式 × 1 年接近 AlphaGo Zero
KataGo30 GPU × 19 天超越 Leela Zero

效率提升:約 50 倍(相對於 Leela Zero)

關鍵創新總覽

創新效果
整合式多頭網路減少計算量,增加輸出資訊
輔助訓練目標加速學習,提升局面理解
Playout Cap 隨機化提升泛化能力
全局池化更好的全局判斷
動態批次推理提升 GPU 利用率

創新 1:整合式多頭網路

與 AlphaGo Zero 的差異

AlphaGo Zero

輸入 → 共享卷積層 → Policy Head
→ Value Head

KataGo

輸入 → 共享卷積層 → Policy Head
→ Value Head
→ Score Head(目數)
→ Ownership Head(領地)

多頭網路架構

動畫對應

  • 🎬 E3:雙頭網路 ↔ 多任務學習
  • 🎬 E11:殘差塔 ↔ 多級處理
  • 🎬 D12:殘差連接 ↔ 電路並聯

多頭輸出的價值

輸出頭功能應用
Policy下一步的機率分布引導 MCTS 搜索
Value勝率預測評估局面
Score目數預測細微形勢判斷
Ownership領地預測視覺化分析

創新 2:輔助訓練目標

傳統方法的問題

AlphaGo Zero 只訓練兩個目標:

  • Policy:預測 MCTS 的搜索結果
  • Value:預測最終勝負

問題:學習信號稀疏,收斂慢。

KataGo 的解決方案

增加多個輔助訓練目標:

loss = (
policy_loss + # 預測搜索結果
value_loss + # 預測勝負
score_loss + # 預測目數差
ownership_loss + # 預測每點歸屬
auxiliary_loss_1 + ... # 其他輔助目標
)

輔助目標列表

目標說明效果
Score預測終局目數差更精確的形勢判斷
Ownership預測每點歸屬更好的局部理解
Future Position預測未來棋盤狀態更好的推理能力
TD Lambda多步時序差分更穩定的價值估計

動畫對應

  • 🎬 J1:策略熵 ↔ 夏農熵
  • 🎬 J2:KL 散度 ↔ 相對熵
  • 🎬 H7:TD 學習 ↔ 增量估計

創新 3:Playout Cap 隨機化

傳統方法的問題

AlphaGo Zero 訓練時:

  • 每局都用 固定次數 的 MCTS 搜索(如 800 次)
  • 神經網路只學會「有 800 次搜索時的最佳下法」
  • 可能過度依賴搜索

KataGo 的解決方案

隨機改變每局的搜索次數

def get_playout_cap():
# 隨機選擇搜索深度
caps = [20, 50, 100, 200, 400, 600, 800, 1000]
weights = [0.05, 0.1, 0.15, 0.2, 0.2, 0.15, 0.1, 0.05]
return random.choices(caps, weights)[0]

效果

搜索次數學習效果
低(20-50)神經網路必須「靠自己」判斷
中(100-400)平衡搜索與直覺
高(600-1000)學習精確的戰術

結果:神經網路在各種搜索深度下都表現良好,泛化能力更強。

動畫對應

  • 🎬 C2:大數法則 ↔ 收斂
  • 🎬 K6:SGD 噪聲 ↔ 隨機性
  • 🎬 L1:過擬合 ↔ 過度適應

創新 4:全局池化(Global Pooling)

傳統 CNN 的問題

卷積神經網路只看局部特徵:

  • 3×3 卷積核只看 9 個點
  • 即使堆疊很多層,感受野仍有限
  • 難以捕捉全局資訊(如整體目數、勢力範圍)

KataGo 的解決方案

在殘差塊中加入全局池化

實作細節

class GlobalPoolingBlock(nn.Module):
def forward(self, x):
# x: (batch, channels, 19, 19)

# 局部路徑
local = self.conv(x)

# 全局路徑
global_pool = x.mean(dim=[2, 3]) # (batch, channels)
global_fc = self.fc(global_pool) # (batch, channels')
global_broadcast = global_fc.unsqueeze(2).unsqueeze(3)
global_broadcast = global_broadcast.expand(-1, -1, 19, 19)

# 融合
return local + global_broadcast

動畫對應

  • 🎬 G1:高維表示 ↔ 向量空間
  • 🎬 D11:池化 ↔ 降採樣
  • 🎬 D14:注意力機制 ↔ 選擇性聚焦

創新 5:動態批次推理

MCTS 的瓶頸

MCTS 的搜索過程:

  1. 選擇節點
  2. 神經網路推理(最慢)
  3. 回傳更新
  4. 重複

問題:如果一次只推理一個位置,GPU 利用率很低。

解決方案:虛擬損失 + 批次處理

class ParallelMCTS:
def search(self, batch_size=8):
nodes_to_evaluate = []

# 同時選擇多個節點
for _ in range(batch_size):
node = self.select_with_virtual_loss()
nodes_to_evaluate.append(node)

# 批次推理
states = [n.state for n in nodes_to_evaluate]
policies, values = self.network.batch_evaluate(states)

# 回傳更新(移除虛擬損失)
for node, policy, value in zip(nodes_to_evaluate, policies, values):
node.backpropagate(value)
node.remove_virtual_loss()

動畫對應

  • 🎬 C9:虛擬損失 ↔ 排斥力
  • 🎬 E9:分散式訓練 ↔ 並行計算

技術創新總結

AlphaGo Zero vs KataGo

面向AlphaGo ZeroKataGo
網路架構2 頭(Policy + Value)4+ 頭(加 Score、Ownership)
全局資訊純卷積全局池化
搜索深度固定隨機化
訓練目標2 個多個輔助目標
推理效率單一推理批次推理

效率提升來源

效率提升 ≈ 50x

├── 多頭網路共享計算 ~2x
├── 輔助目標加速學習 ~3x
├── Playout Cap 隨機化 ~2x
├── 全局池化更好的表示 ~2x
└── 其他優化 ~2x

實用功能

多規則支援

KataGo 支援多種圍棋規則:

規則特點
中國規則數子法
日本規則數目法
韓國規則類似日本
AGA 規則美國規則
Tromp-Taylor電腦圍棋常用
New Zealand紐西蘭規則

棋力調整

{
"maxVisits": 100, // 降低搜索次數
"humanSLProfile": { // 模擬人類錯誤
"rank": "5d", // 模擬五段水平
"noise": 0.1
}
}

Analysis Engine

KataGo 的 Analysis Engine 提供豐富的 JSON API:

{
"id": "query1",
"moves": [["B", "Q16"], ["W", "D4"]],
"rules": "chinese",
"analyzeTurns": [0, 1, 2]
}

延伸閱讀