2016 - AlphaGo#
案件摘要#
2016 年 3 月,DeepMind 的 AlphaGo 在首爾以 4:1 擊敗圍棋世界冠軍李世乭(Lee Sedol)。圍棋有 \(10^{170}\) 量級的合法局面,暴力搜尋(1997-DeepBlue擊敗棋王.md 的路線)在此徹底失效。AlphaGo 的解法是三網一體:策略網路(policy net)+ 價值網路(value net)+ 蒙特卡洛樹搜尋(MCTS)。其訓練主幹是策略梯度:
價值網路則用回歸逼近 \(v_\theta(s) \approx \mathbb{E}[\text{win} \mid s]\) 。這樁案件的偵探意義:深藍靠 \(2\times10^8\) 步/秒的暴力,AlphaGo 靠 \(10^3\) 步/秒的直覺 + 評估——機器第一次展現了被稱為「棋感」的東西。
前因 -- 為什麼會有這個案子#
- 圍棋的不可搜尋性:西洋棋 branching factor ~35,深藍硬搜可解;圍棋 branching factor ~250,且形勢判斷(厚薄、地盤)難以用手工評估函數刻畫——1997-DeepBlue擊敗棋王.md 之後,圍棋成為「AI 的聖杯」,人類冠軍宣稱機器至少還要十年。
- 傳統圍棋程式的天花板:1990–2015 年,最強的圍棋程式(CrazyStone、Zen)用 MCTS + 手工模式,業餘高段水平,從未贏過職業頂尖。
- DeepMind 的賭注:2013-DQN打Atari.md 用同一個神經網路 + Q-learning 玩遍 49 款 Atari 遊戲,證明了深度強化學習的通用性;Demis Hassabis(前職業西洋棋童星)從創業起就宣稱目標是解決「一般智能」,圍棋是必經的試煉。
- 策略梯度的遺產:REINFORCE(1992)與 2013-DQN打Atari.md 提供了兩條 RL 路線——策略梯度與價值學習;AlphaGo 把兩者合流。
- 資料線索:KGS 圍棋伺服器的 3000 萬步人類棋譜——模仿人類直覺的教材。
線索與推理 -- 數學式、程式、理論#
第一條線索:策略網路——模仿人類的直覺#
用 13 層 CNN(2012-AlexNet影像革命.md 的捲積配方)在 3000 萬步人類棋譜上做監督學習,輸入是棋盤特徵平面(己方/對方棋子、氣、徵子等 48 個平面),輸出每個位置的落子機率:
監督策略網路在保留測試上預測人類落子的準確率達 57%——這是「棋感」的第一個數值化身。再用策略梯度自我對弈微調(RL 版):
自我對弈的 RL 策略網路在人類棋譜預測上只有 41%(開始偏離人類),但對戰勝率更高——它學的是贏,不是像人。
第二條線索:價值網路——評估整個局面#
MCTS 的葉節點需要形勢評估。傳統方法用快棋模擬(rollout),AlphaGo 訓練一個獨立的價值網路直接回歸:
訓練資料是 3000 萬個自我對弈局面(只用同一策略自我對弈的資料——混入人類棋譜會過擬合)。價值網路的評估與真實勝率的 MSE 僅 0.226,與一次完整 rollout 相當,但快 15000 倍。這是「用神經網路取代手工評估函數」的決定性一擊——1997-DeepBlue擊敗棋王.md 的手工評估在此被謀殺。
第三條線索:MCTS——三網一體的搜尋樹#
AlphaGo 在比賽時把三個網路塞進蒙特卡洛樹搜尋:
| MCTS 階段 | 運算 | 使用的網路 |
|---|---|---|
| 選擇(Selection) | \(a^* = \arg\max_a \big(Q(s,a) + u(s,a)\big)\) , \(u \propto p_\sigma(a\mid s)/N(s,a)\) | 策略網路(先驗) |
| 擴展(Expansion) | 葉節點展開,算先驗機率 | 策略網路 |
| 評估(Evaluation) | \(v_\theta(s)\) 與 rollout 混合 | 價值網路 + 快速策略 |
| 回傳(Backup) | \(N \mathrel{+}= 1\) , \(Q \mathrel{+}= \frac{1}{n}(v - Q)\) | — |
搜索量:單機 40 個 CPU + 8 GPU 約 \(10^3\) 步/秒(分佈式版 \(10^4\) ),對深藍的 \(2\times10^8\) ——少了五個數量級,卻贏了五個子。搜尋不再是暴力,而是「直覺引導的深度思考」。
訓練的三階段管線也值得記錄:先在 KGS 人類棋譜上做監督學習(SL policy net)→ 用自我對弈做策略梯度強化(RL policy net)→ 用自我對弈局面做價值回歸(value net)。三個網路共用 CNN 架構但獨立訓練——2017-AlphaZero自我對弈.md 之後會把三網合一,拋棄人類棋譜與 rollout。
第四條線索:第 37 手——超越人類的證據#
第二局第 37 手,AlphaGo 於第五路落子(人類絕不會下的位置,人類頂尖選手的估計勝率僅萬分之一)。李世乭愣了十七分鐘;解說的職業棋士起初都認為是失誤。最終 AlphaGo 以 4:1 獲勝(第四局李世乭以「神之一手」第 78 手扳回一城——人類尊嚴的最後一勝)。第 37 手證明了:機器不只是在模仿人類,它發現了人類棋譜之外的下法。
勝率的數學語言:AlphaGo 內部對每個候選手維護兩個量——平均勝率 \(Q(s,a)\) 與探索加成 \(u(s,a)\) :
第 37 手的先驗 \(p_\sigma\) 極低(策略網路認為人類不會下),但價值網路的評估 \(v_\theta\) 與 MCTS 的深入分析發現其真實勝率極高——當價值網路推翻了人類直覺,新時代的棋理就此誕生。
結案 -- 後果與影響#
- 圍棋易主:2016 年後,人類棋手全面跟隨 AI 的開局理論(點三三、外靠等 AI 定式成為主流);2017 年 AlphaGo 以 3:0 擊敗柯潔後退役,人類與頂尖 AI 的差距已被公認不可逆。
- AlphaGo Zero(2017):拋棄人類棋譜,從零自我對弈 40 天即超越所有舊版——證明了「自我對弈 + 規模化」的威力,詳見 2017-AlphaZero自我對弈.md。
- 深度強化學習的爆發:策略梯度 + 價值網路的組合成為標配(A3C、PPO);強化學習(科學與歷史/強化學習/)從玩具問題進入主戰場。
- 超越棋盤:DeepMind 的後續案件——AlphaZero(西洋棋、將棋)、AlphaStar(星海爭霸)、AlphaFold 蛋白質摺疊(2021-AlphaFold蛋白質摺疊.md)——把「直覺+評估+搜尋」的配方推向科學。
- 伏筆:AlphaGo 證明了 RL + 深度網路 + 規模化的三重奏;同樣的三重奏在 2022-ChatGPT與RLHF.md 中以人類回饋的形式重現——從學會下棋到學會對話,強化學習成為對齊人類意圖的關鍵工具,見「科學與歷史/人工智慧/」的對齊智能相關檔案。
關鍵人物與文獻#
- David Silver:AlphaGo 第一作者,強化學習大家,Sutton 的學生。
- Aja Huang:業餘六段棋手,AlphaGo 工程核心,代為落子的人機介面。
- Demis Hassabis:DeepMind 創辦人,圍棋西洋棋雙料背景的執棋者。
- 李世乭(Lee Sedol):十四冠世界冠軍,被擊敗的對照組。
- 樊麾(Fan Hui):歐洲圍棋冠軍,2015 年 5:0 被擊敗,是最早的人類對照組。
- Silver et al., Mastering the Game of Go with Deep Neural Networks and Tree Search, Nature, 2016.
- Silver et al., Mastering the Game of Go without Human Knowledge (AlphaGo Zero), Nature, 2017.
- Mnih et al., Human-level Control through Deep Reinforcement Learning (DQN), Nature, 2015.
- 相關案件:2013-DQN打Atari.md、1997-DeepBlue擊敗棋王.md、2012-AlexNet影像革命.md、2017-AlphaZero自我對弈.md、2021-AlphaFold蛋白質摺疊.md、2022-ChatGPT與RLHF.md
附錄線索:五局棋的偵探年表#
2016 年 3 月 9–15 日首爾四季酒店的五局對弈,每局都是一條線索:
| 局 | 勝者 | 關鍵手 | 偵探意義 |
|---|---|---|---|
| 第 1 局 | AlphaGo | 白 186 扳 | 人類首次不敵,李世乭自認一時失誤 |
| 第 2 局 | AlphaGo | 白 37(第五路) | 「AI 的手」現身,震動棋界 |
| 第 3 局 | AlphaGo | 白 78 跨 | 連下三城,勝負已定 |
| 第 4 局 | 李世乭 | 白 78「神之一手」(挖) | 觸發 AlphaGo 的致命誤判——人類尊嚴之勝 |
| 第 5 局 | AlphaGo | 黑 161 | 終局 4:1,時代易主 |
第四局暴露了 MCTS 混合評估的弱點:第 78 手挖是「兩步之後才顯現威力」的陷阱手,rollout 的淺層模擬與價值網路的統計評估都低估了它——機器的「棋感」仍有盲區。這條線索證明:AlphaGo 不是全知,它是在「直覺引導下搜尋」的機器,而直覺本身可以被欺騙。樊麾(2015 年 5:0 被擊敗的歐洲冠軍)事後的觀察最有偵探味:「我看它的棋,越看越像活的。」
補充 -- 程式實作(python + numpy)#
本案 MCTS+UCT(UCT = Q + c√(lnN(s)/N(s,a)))的最小可執行版本,見 _code/2016-AlphaGo.py(已實測可跑;以井字棋代替圍棋,rollout 以純隨機代替策略網路):
# 2016 - AlphaGo: 策略直覺 + MCTS 搜尋 (井字棋縮影)
import numpy as np
LINES = [(0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6),
(1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)]
def winner(b):
for a, c, d in LINES:
if b[a] != 0 and b[a] == b[c] == b[d]:
return b[a]
return 0 if 0 in b else 3 # 3=和棋
def legal(b):
return [i for i, v in enumerate(b) if v == 0]
def mcts_move(board, player, sims=300, c=1.4, seed=0):
"""以 player 視角做 MCTS: Q+UCT 選子, 隨機 rollout 評估."""
rng = np.random.default_rng(seed)
N = {a: 0 for a in legal(board)}
W = {a: 0.0 for a in legal(board)}
tot = 0
for _ in range(sims):
untried = [a for a in N if N[a] == 0]
a = rng.choice(untried) if untried else max(
N, key=lambda m: W[m] / N[m] + c * np.sqrt(np.log(tot) / N[m]))
b2 = board.copy()
b2[a] = player
turn = 3 - player
while winner(b2) == 0: # rollout: 隨機下完 (淺層模擬的極簡版)
b2[rng.choice(legal(b2))] = turn
turn = 3 - turn
w = winner(b2)
r = 1.0 if w == player else (0.5 if w == 3 else 0.0)
N[a] += 1
W[a] += r
tot += 1
return max(N, key=lambda m: W[m] / N[m])
def play(mcts_first=True, seed=0):
rng = np.random.default_rng(seed)
b = np.zeros(9, dtype=int)
turn, go_first = 1, mcts_first
while winner(b) == 0:
if go_first:
b[mcts_move(b, turn, seed=rng.integers(1e9))] = turn
else:
b[rng.choice(legal(b))] = turn
turn, go_first = 3 - turn, not go_first
return winner(b)
def main():
mcts_wins = draws = rand_wins = 0
for i in range(40): # MCTS 先後手各 20 局
w = play(mcts_first=(i % 2 == 0), seed=i)
mcts_side = 1 if i % 2 == 0 else 2
if w == 3:
draws += 1
elif w == mcts_side:
mcts_wins += 1
else:
rand_wins += 1
print(f"MCTS(300次模擬) vs 隨機走子 40局: 勝={mcts_wins} 和={draws} 負={rand_wins}")
print("結論: 搜尋即直覺的放大器 -- AlphaGo 把 rollout 換成策略/價值網路, 把井字棋換成圍棋")
if __name__ == "__main__":
main()
執行結果(python3 _code/2016-AlphaGo.py,numpy 2.4.5):
MCTS(300次模擬) vs 隨機走子 40局: 勝=36 和=4 負=0
結論: 搜尋即直覺的放大器 -- AlphaGo 把 rollout 換成策略/價值網路, 把井字棋換成圍棋
程式解說:mcts_move 即 AlphaGo 搜尋心的最小骨架——UCT 的前項 W/N 是利用(走勝率高的子)、後項 c√(lnN/N_a) 是探索(沒試過的子加分),兩者相加即「直覺引導下搜尋」。36 勝 4 和 0 負說明:即使 rollout 是純隨機(AlphaGo 用策略網路 rollout+價值網路評估,比這強得多),搜尋本身已是巨大的放大器。把井字棋換成圍棋、隨機 rollout 換成策略/價值網路、300 次換成上萬次——骨架不變,規模改寫結局;第 37 步肩衝、78 手挖,都是這同一個迴圈跑出來的。