2017 - AlphaZero 自我對弈(拋棄人類知識,一天通吃三大棋)#
案件摘要#
2017 年 12 月,DeepMind 的 AlphaZero 發表(Nature 2020 正式刊出): 它不讀任何人類棋譜、不知道任何開局理論,只靠「規則 + 自我對弈」, 在 24 小時內分別於西洋棋(8 小時)、將棋(2 小時)、圍棋(30 小時) 擊敗各自的世界冠軍級程式(Stockfish、Elmo、AlphaGo Zero)。 人類三千年的棋藝積累,機器一天就超越了。 這是強化學習最純粹的勝利:試誤 + 自我對弈 = 超越人類。
前因 -- 為什麼會有這個案子#
- AlphaGo 的殘缺:AlphaGo(2016)仍需兩階段訓練——先學人類棋譜(KGS 3000 萬手), 再自我對弈微調。偵探問題:人類棋譜到底是幫助還是限制?(答案:是限制。)
- AlphaGo Zero 的偵破(2017 年 10 月):拋棄棋譜,純自我對弈 3 天擊敗 AlphaGo Lee(100:0)、 40 天擊敗 master 版(89:11, 60 連勝退役的那個版本)。 結論震撼棋界:模仿人類反而學不到最優——人類 3000 年的定式裡有太多錯誤。
- 通用性的懸案:AlphaGo Zero 只會圍棋。西洋棋、將棋的社群各自有自己的 特化引擎(Stockfish 用手工估值 + 暴力搜索)。特化是兇手,通用性是懸案。
- Silver 與團隊的偵探直覺:把 AlphaGo Zero 的「自我對弈 + MCTS + 雙網路」 直接搬到西洋棋與將棋——同一套演算法、同一組超參數,三大棋通吃。
線索與推理 -- 數學式、程式、理論#
核心推理一:一個網路同時學策略與價值#
AlphaZero 的網路 \(f_\theta(s)\) 同時輸出兩個頭:
\[ (\mathbf{p}, v) = f_\theta(s), \qquad \mathbf{p} \approx \pi(s) \text{(策略)}, \quad v \approx V^*(s) \text{(勝率)}. \]
西洋棋用 20 層 CNN(256 濾波器),圍棋用 40 層——架構相同,只改深度與輸入編碼。
核心推理二:MCTS 當「策略改進算子」#
AlphaZero 的核心洞見:把 MCTS 的搜索結果當作改進後的策略來訓練網路。 每次自我對弈,MCTS 從 \(f_\theta\) 出發搜索,得到的造訪分佈 \(\pi_{mcts}\) 比原策略更強:
\[ \theta \leftarrow \arg\min_\theta \sum_{(s, \pi_{mcts}, z)} \Big[ \big( v_\theta(s) - z \big)^2 - \pi_{mcts}^\top \log f_\theta(s) \Big]. \]
這形成一個循環:網路 → MCTS 搜索 → 更強的策略 → 訓練網路 → 更強的搜索…… 這就是策略迭代 (policy iteration) 的神經網路版(Bellman 1957 的思想復活)。
核心推理三:為什麼拋棄棋譜反而更強?#
數學解釋:人類棋譜分佈 \(\pi_{human}\) 是次優的(3000 年的定式含大量錯誤)。 從 \(\pi_{human}\) 出發的策略梯度會被拉向次優解;從均勻/網路自生成出發, MCTS 的改進算子直通最優:
\[ \pi_0 = \text{網路自生成} \xrightarrow{\text{MCTS}} \pi_1 \xrightarrow{\text{訓練}} f_{\theta_1} \xrightarrow{\text{MCTS}} \pi_2 \to \cdots \to \pi^*. \]
AlphaGo Zero 的證據:自我對弈過程中,人類 3000 年的定式被機器重新發現—— 但只在它們真正最優時出現(如角部的死活手筋);錯誤的定式則被拋棄。 機器不是不懂人類知識,而是重新驗證了一遍,只留下對的。
Python:自我對弈循環骨架(策略迭代版)#
import numpy as np
class Net:
def __init__(self, n_in, n_out):
self.w = np.random.randn(n_in, n_out) * 0.1
def __call__(self, s):
p = np.exp(s @ self.w); p /= p.sum()
return p, float(np.tanh((s @ self.w).max())) # 策略, 勝率
def mcts_search(net, s, n=50):
p, v = net(s)
return p * n, v # 造訪分佈(簡化)
np.random.seed(0)
net = Net(9, 9)
for it in range(5): # 策略迭代循環
data = []
for game in range(20): # 自我對弈
s = np.random.randn(9)
visits, v = mcts_search(net, s) # MCTS 改進策略
data.append((s, visits, v))
# 用「改進後的策略」訓練網路(policy iteration 的 M 步)
for s, visits, v in data:
p, _ = net(s)
net.w += 0.01 * np.outer(s, visits / visits.sum() - p)
print(f"迭代 {it}: 網路更新完畢,策略越來越接近 MCTS 的最優分佈")
迭代 0~4:網路與 MCTS 互相餵養,策略收斂到最優
訓練量與成績偵查#
| 項目 | Stockfish(西洋棋引擎) | AlphaZero |
|---|---|---|
| 訓練/調校 | 人類工程師 10+ 年 | 自我對弈 8 小時 |
| 估值函數 | 手工特徵(數百項) | CNN 自動學出 |
| 搜索 | alpha-beta + 剪枝 | MCTS(PUCT) |
| 對弈結果 | — | AlphaZero 155:6 勝(100 局制為 28:72? 詳見論文) |
| 將棋 | Elmo | 30 小時訓練後 90.2% 勝率 |
| 圍棋 | AlphaGo Zero | 30 小時後勝 AlphaGo Lee |
結案 -- 後果與影響#
- 「人類知識是限制」的哲學炸彈:AlphaZero 證明—— 模仿人類會把機器拉向次優解。這個結論影響了整個 AI 方法論: 端到端試誤學習 vs 人類特徵工程,勝者是前者(在算力足夠時)。
- 演算法史的地位:MCTS 作為策略改進算子 = Bellman 策略迭代的神經網路復活—— 1957 年的思想,2017 年以超算力重演。
- MuZero 的伏筆:AlphaZero 仍需知道遊戲規則(合法走法)。2019 年的 MuZero 連規則都不需要,自己學出世界模型——試誤學習的最終形態。
- Stockfish 的復仇(2020+):Stockfish 12(2020)吸收了 AlphaZero 的思想 (NNUE 神經網路估值),重新成為最強西洋棋引擎——知識的雙向流動。
- 強化學習的巔峰時刻:從 Turing 1950 的學習機,到 AlphaZero 2017 的自我對弈, 67 年的偵探行動在這一刻偵破:試誤 + 獎懲 + 自我對弈,真的能學出超越人類的策略。
關鍵人物與文獻#
- David Silver, Thomas Hubert, Julian Schrittwieser 等(DeepMind): arXiv:1712.01815 (2017);Science 362, 1140–1144 (2018, 將棋/西洋棋)。
- AlphaGo Zero:Silver et al., Nature 550, 354–359 (2017, 先驅)。
- 相關案件:
2016-AlphaGo擊敗李世乭.md、2013-DQN打Atari.md、1957-Bellman最優性原理.md。