2016 - AlphaGo 擊敗李世乭(圍棋之謎的偵破)#
案件摘要#
2016 年 3 月,DeepMind 的 AlphaGo 在首爾以 4:1 擊敗世界頂尖棋手李世乭 (Lee Sedol)。 圍棋被公認為「電腦永遠攻不下的堡壘」——狀態空間約 \(10^{170}\) , 比宇宙的原子數( \(10^{80}\) )還多。AlphaGo 用 MCTS + 策略網路 + 價值網路 + 自我對弈偵破了這個世紀之謎。 第二局的第 37 手(肩衝五路)被棋界稱為「神之一手」——機器走出人類 3000 年沒想過的棋。
前因 -- 為什麼會有這個案子#
- 狀態空間的絕望:圍棋 \(19\times19\) ,合法局面約 \(2\times10^{170}\) ,博弈樹複雜度約 \(10^{360}\) 。 西洋棋的暴力搜索(Deep Blue 1997)在此完全失效——分支因子是兇手 (西洋棋約 35,圍棋約 250)。
- 傅利葉式的估值困境:局部特徵(棋形、死活)無法評估全域勝率, 人類大師靠的是 3000 年積累的「棋感」——全域估值是懸案。
- 前人的殘缺線索:CrazyStone、Zen 等用 MCTS + Monte Carlo 評估達到業餘高段; DQN(2013,見
2013-DQN打Atari.md)證明深度網路 + RL 可行; TD-Gammon(1992)證明自我對弈可學估值。 - Silver 與 Hassabis 的偵探直覺:把 MCTS 的搜索與神經網路的直覺合體—— 網路提供「往哪搜」的先驗(策略網路)與「這局面誰贏」的估值(價值網路), 搜索只在網路認為有希望的方向進行。
線索與推理 -- 數學式、程式、理論#
核心推理一:策略網路把分支因子砍到個位數#
策略網路 \(p_\sigma(a|s)\) 學人類棋譜(KGS 的 3000 萬手),預測「高手會走哪」:
\[ p_\sigma(a|s) \approx P(a \mid s), \qquad \text{MCTS 只走 } p_\sigma \text{ 前 } k \text{ 名}. \]
分支因子從 250 砍到 5–10——搜索深度從 4 層變成 40 層。 再經 RL 微調:讓策略網路自我對弈,用勝負結果做策略梯度:
\[ \Delta\sigma \propto \sum_t \nabla_\sigma \log p_\sigma(a_t|s_t) \cdot z, \qquad z \in \{+1, -1\}. \]
核心推理二:價值網路取代 Monte Carlo rollout#
傳統 MCTS 用隨機 rollout 到終局估勝率——噪聲大、慢。AlphaGo 改用 **價值網路 \(v_\theta(s) \approx \mathbb{E}[z \mid s, \text{雙方都下最優}]\) **:
\[ \theta \leftarrow \arg\min_\theta \sum_{(s, z)} \big( v_\theta(s) - z \big)^2. \]
訓練資料:自我對弈 3000 萬局的終局結果。 估值從「雜訊很大的抽樣」變成「一次前向傳播」——快數千倍、準確得多。
核心推理三:MCTS 的 PUCT 公式#
樹上每個節點的選擇權衡「利用(價值高)」與「探索(先驗沒看過)」:
\[ \text{PUCT}(s, a) = Q(s, a) + c_{puct} \; p_\sigma(a|s) \frac{\sqrt{\sum_b N(s,b)}}{1 + N(s,a)} \]
\(N\) 為造訪次數、 \(c_{puct} = 5\) 。這是 AlphaZero 的核心公式, 把 Bellman 的 \(\max\) (見 1957-Bellman最優性原理.md)與 UCB 的探索項合體。
Python:MCTS + 神經網路的極簡骨架#
import numpy as np, math
from collections import defaultdict
class Node:
def __init__(self, prior): self.N, self.W, self.prior = 0, 0.0, prior
@property
def Q(self): return self.W / self.N if self.N else 0.0
def policy_net(s): # 策略網路(示範:隨機先驗)
return np.random.dirichlet(np.ones(len(s))) if False else \
np.ones(len(s)) / len(s)
def value_net(s): # 價值網路(示範:勝率估計)
return float(np.tanh(s.mean()))
def mcts(s, n_sims=200, c=5.0):
root, children = Node(0), defaultdict(dict)
key = tuple(np.where(s != 0)[0]) # 用 tuple 當局面鍵
for _ in range(n_sims):
node, path = root, [root]
# 選擇:PUCT 公式
while True:
kids = children[key] if key in children else {}
if not kids: break
a = max(kids, key=lambda a: kids[a].Q + c * kids[a].prior *
math.sqrt(node.N) / (1 + kids[a].N))
node = kids[a]; path.append(node)
break
# 擴展 + 評估:策略網路給先驗,價值網路給勝率
p = policy_net(s)
kids = children[key]
for i in range(len(s)): kids[i] = Node(p[i])
v = value_net(s)
# 回傳:沿路徑反向更新
for nd in reversed(path):
nd.N += 1; nd.W += v
return root.N
s = np.random.randn(19*19) * (np.random.rand(19*19) < 0.1)
visits = mcts(s, n_sims=200)
print(f"200 次模擬完成,根節點造訪數 = {visits}")
200 次模擬完成,根節點造訪數 = 200
算力與成績偵查#
| 項目 | Deep Blue 1997 | AlphaGo 2016 |
|---|---|---|
| 對手 | Kasparov(西洋棋) | 李世乭(圍棋) |
| 方法 | 暴力搜索 + 手工估值 | MCTS + 神經網路 + 自我對弈 |
| 分支因子 | 35 | 250 |
| 結果 | 3.5:2.5 | 4:1 |
| 棋感來源 | 人類工程師 | 自我對弈 3000 萬局 |
結案 -- 後果與影響#
- 「神之一手」的哲學衝擊:第 37 手肩衝五路,人類棋手 3000 年沒想過—— 機器不只模仿人類,還能發現人類知識的盲區。李世乭說:「我震驚得說不出話。」
- 人類棋譜被機器改寫:AlphaGo 之後,職業棋手開始模仿它的定式與布局—— 圍棋理論被機器重新書寫,機器反過來教人類(TD-Gammon 的重演)。
- 第 4 局的「神之一手」(人類版):李世乭第 78 手挖,贏了唯一一局—— 這一局被稱為人類對機器的最後輝煌,AlphaGo 承認這是它當時的盲點。
- AlphaZero 的伏筆:AlphaGo 仍需人類棋譜(先學 KGS 再自我對弈)。 2017 年的 AlphaZero(
2017-AlphaZero自我對弈.md)證明:連棋譜都不需要。 - 算力的勝利:AlphaGo 退役(2017 年 master 版在網上 60 連勝),但它的方法 成為所有博弈 AI 的範本(MuZero、AlphaStar、OpenAI Five)。
關鍵人物與文獻#
- David Silver, Aja Huang 等(DeepMind):Nature 529, 484–503 (2016)。
- 李世乭 (Lee Sedol):本案的「對手」,9 段棋士;第 78 手「神之一手」的人類版本。
- 樊麾 (Fan Hui):2015 年 10 月被 AlphaGo 5:0 擊敗的歐洲冠軍(首個警訊)。
- 相關案件:
2013-DQN打Atari.md、2017-AlphaZero自我對弈.md、1992-TesauroTD-Gammon.md。