論文筆記:Mastering the game of Go with deep neural net
背景:完全資訊博弈與MCTS演算法
要完全弄清AlphaGo背後的原理,首先需要了解一下AI在博弈遊戲中常用到的蒙特卡洛樹搜尋演算法——MCTS。
在一個完全資訊下的博弈遊戲中,如果所有參與者都採取最優策略,那麼對於遊戲中的任意一個局面ss,總有一個確定性的估值函式v∗(s)v∗(s)可以直接計算出最終的博弈結果。理論上,我們可以通過構建一棵博弈樹,遞迴地求解出v∗(s)v∗(s)。這就是Minimax演算法。然而在有些問題中,這棵搜尋樹往往十分巨大(例如在圍棋遊戲中達到了250150250150的搜尋空間),以至於窮舉的演算法並不可行。
有兩種策略可以有效地降低搜尋空間的複雜度:1. 通過一個evalutaion function對當前局面進行價值的評估以降低搜尋的深度;2. 剪枝以降低搜尋的寬度。然而,這些策略都需要引入一些先驗的知識。
於是,人們提出了蒙特卡洛樹搜尋(MCTS)演算法。MCTS是一類通用博弈演算法——理論上,它不需要任何有關博弈的先驗知識。
想象一下,你站在一堆老虎 機面前,每一臺老虎 機的reward都服從一個隨機的概率分佈。然而,一開始,你對這些概率分佈一無所知。你的目標是尋找一種玩老虎 機的策略,使得在整個遊戲的過程中你能獲得儘可能多的reward。很明顯,你的策略需要能夠在嘗試儘可能多的老虎 機(explore)與選擇已知回報最多的老虎 機(exploit)之間尋求一種平衡。
一種叫做UCB1的策略可以滿足這種需求。該策略為每臺老虎 機構造了一個關於reward的置信區間:
xi±2lnnni−−−−−√
xi±2lnnni
其中,xixi是對第ii臺老虎 機統計出來的平均回報;nn是試驗的總次數;nini是在第ii臺老虎 機上試驗的次數。你要做的,就是在每一輪試驗中,選擇置信上限最大對應的那臺老虎 機。顯然,這個策略平衡了explore與exploit。你的每一次試驗,都會使被選中的那臺老虎 機的置信區間變窄,而使其他未被選中的老虎 機的置信區別變寬——變相提升了這些老虎 機在下一輪試驗中被選中的概率。
蒙特卡洛樹搜尋(MCTS)就是在UCB1基礎上發展出來的一種解決多輪序貫博弈問題的策略。它包含四個步驟:
Selection。從根節點狀態出發,迭代地使用UCB1演算法選擇最優策略,直到碰到一個葉子節點。葉子節點是搜尋樹中存在至少一個子節點從未被訪問過的狀態節點。
Expansion。對葉子節點進行擴充套件。選擇其一個從未訪問過的子節點加入當前的搜尋樹。
Simulation。從2中的新節點出發,進行Monto Carlo模擬,直到博弈結束。
Back-propagation。更新博弈樹中所有節點的狀態。進入下一輪的選擇和模擬。
可以看出,通過Selection步驟,MCTS演算法降低了搜尋的寬度;而通過Simulation步驟,MCTS演算法又進一步降低了搜尋的深度。因此,MCTS演算法是一類極為高效地解決複雜博弈問題的搜尋策略。
關於MCTS演算法更多詳細的介紹,可參見部落格:Introduction to Monte Carlo Tree Search
AlphaGo的基本原理
圍棋是一類完全資訊的博弈遊戲。然而,其龐大的搜尋空間,以及局面棋勢的複雜度,使得傳統的剪枝搜尋演算法在圍棋面前都望而卻步。在AlphaGo出現之前,MCTS演算法算是一類比較有效的演算法。它通過重複性地模擬兩個players的對弈結果,給出對局面ss的一個估值v(s)v(s)(Monte Carlo rollouts);並選擇估值最高的子節點作為當前的策略(policy)。基於MCTS的圍棋博弈程式已經達到了業餘愛好者的水平。
然而,傳統的MCTS演算法的侷限性在於,它的估值函式或是策略函式都是一些局面特徵的淺層組合,往往很難對一個棋局有一個較為精準的判斷。為此,AlphaGo的作者訓練了兩個卷積神經網路來幫助MCTS算法制定策略:用於評估局面的value network,和用於決策的policy network。(後面會看到,這兩個網路的主要區別是在輸出層:前者是一個標量;後者則對應著棋盤上的一個概率分佈。)
首先,Huang等人利用人類之間的博弈資料訓練了兩個有監督學習的policy network:pσpσ(SL policy network)和pπpπ(fast rollout policy network)。後者用於在MCTS的rollouts中快速地選擇策略。接下來,他們在pσpσ的基礎上通過自我對弈訓練了一個強化學習版本的policy network:pρpρ(RL policy network)。與用於預測人類行為的pσpσ不同,pρpρ的訓練目標被設定為最大化博弈收益(即贏棋)所對應的策略。最後,在自我對弈生成的資料集上,Huang等人又訓練了一個value network:vθvθ,用於對當前棋局的贏家做一個快速的預估。
pipeline of neural networks
因此,用一句話簡單概括一下AlphaGo的基本原理:在MCTS的框架下引入兩個卷積神經網路policy network和value network以改進純隨機的Monte Carlo模擬,並藉助supervised learning和reinforcement learning訓練這兩個網路。
接下來將對AlphaGo的細節進行展開討論。
有監督學習的Policy Networks
Huang等人首先訓練了一個有監督的Policy Network用來模擬人類專家的走子。SL policy network是一個卷積神經網路;其輸出層是一個Softmax分類器,用來計算在給定的棋面狀態ss下每一個位置的落子概率pσ(a|s)pσ(a|s)。對一個棋面狀態ss的描述如下:
input features for policy networks
(這裡的Features對應著卷積神經網路裡的Channels。)
經過人類高手三千萬步圍棋走法的訓練後,SL policy network模擬人類落子的準確率已經達到了57%;相應地,網路的棋力也得到大大的提升。但是,如果直接用這個網路與人類高手,甚至是MCTS的博弈程式進行對弈,依然是輸面居多。而且,這個網路的走子太慢了!平均每步3ms3ms的響應時間,使得這個網路很難被直接用於MCTS的rollout中進行策略的隨機。因此,Huang等人通過提取一些pattern features又訓練了一個更快速(響應時間達到了2μs2μs)但準確率有所降低(24.2%)的rollout policy network: pπpπ。
強化學習的Policy Networks
接下來,為了進一步提高policy network的對弈能力,Huang等人又採用一種policy gradient reinforcement learning的技術,訓練了一個RL policy network:pρpρ。這個網路的結構與SL policy network的網路結構相同,依然是一個輸出為給定狀態下落子概率的卷積神經網路。網路的引數被初始化為pσpσ的引數;接下來,通過不斷地自我對弈(與歷史版本),網路的權重向著收益最大化的方向進化。此時,網路的學習目標不再是模擬人類的走法,而是更為終極的目標:贏棋。
具體來說,我們定義了一個reward function r(st)r(st):對於非終止的時間步t<Tt<T,總有r(st)=0r(st)=0。每一步的收益z(t)z(t)被定義為±r(sT)±r(sT):即對當前玩家而言對弈的最終結果(+1+1代表贏棋;−1−1代表輸棋)。網路的權重通過隨機梯度上升法進行調整:
Δρ∝∂logpρ(at|st)∂ρzt
Δρ∝∂logpρ(at|st)∂ρzt
通過這種方式訓練出來的RL policy network,在與SL policy network對弈時已有80%的贏面。即便是與依賴Monte Carlo搜尋的圍棋博弈程式相比,不依賴任何搜尋的RL policy network,也已經達到了85%的贏面。
強化學習的Value Networks
最後,Huang等人又開始尋求一個能快速預估棋麵價值(棋勢)的Value Network。一個棋面的價值函式vp(s)vp(s),被定義為在給定的一組對弈策略pp的情況下,從狀態ss出發,最終的期望收益(也即贏棋的概率):
vp(s)=E[zt|st=s,at...T∈p]
vp(s)=E[zt|st=s,at...T∈p]
顯然,理想情況下,我們想知道的是在雙方均採用最優策略的條件下得到的最優期望收益v∗(s)v∗(s)。然而,我們並不知道什麼才是最優的策略。因此,在實際應用中,Huang等人採用了目前最強的策略函式pρpρ(RL policy network )來計算一個棋面的價值vpρ(s)vpρ(s),並訓練了一個value network vθ(s)vθ(s)來擬合這個價值函式:vθ(s)≈vpρ(s)≈v∗(s)vθ(s)≈vpρ(s)≈v∗(s)。
Value Network的網路結構與前面的Policy Network類似,也是一個卷積神經網路,只是輸出層變成了一個單神經元的標量。我們可以通過構造一組(s,z)(s,z)的訓練資料,並用隨機梯度下降法最小化網路的輸出vθ(s)vθ(s)與目標收益zz的均方差,來調整網路的引數:
Δθ∝∂vθ(s)∂θ(z−vθ(s))
Δθ∝∂vθ(s)∂θ(z−vθ(s))
在構造訓練資料時有一些技巧。如果我們從人類對弈的完整棋局中抽取足夠數量的訓練資料,很容易出現過擬合的問題。這是因為,在同一輪棋局中的兩個棋面的相關性很強(往往只相差幾個棋子);此時,網路很容易記住這些棋面的最終結果,而對新棋面的泛化能力很弱。為了解決這個問題,Huang等人再次祭出強化學習的大殺器:通過RL policy network的自我對弈,產生了三千萬個從不同棋局中提取出來的棋面-收益組合的訓練資料。基於這份資料訓練出來的Value Network,在對人類對弈結果的預測中,已經遠遠超過了使用fast rollout policy network的MCTS的準確率;即便是與使用RL policy network的MCTS相比,也已是不遑多讓(而Value Network的計算效率更高)。
accuracy of value network
整合
到這裡,我們手頭上已經有一個牛逼但是巨慢的SL policy network;有一個不那麼牛逼但是很快的fast policy network;有一個一心只想著如何贏棋的RL policy network;還有一個能一眼洞穿棋局的value network。那麼,將這些networks放在一起互相補足,會得到什麼呢?
答案就是AlphaGo。而把這些networks整合在一起的框架,就是MCTS演算法。
與經典的MCTS演算法類似,APV-MCTS(asynchronous policy and value MCTS)的每一輪模擬也包含四個步驟:
Selection:APV-MCTS搜尋樹中的每條連邊(s,a)(s,a)都包含三個狀態:決策收益Q(s,a)Q(s,a),訪問次數N(s,a)N(s,a),和一個先驗概率P(s,a)P(s,a)。這三個狀態共同決定了對一個節點下行為的選擇:
at=argmaxa(Q(st,a)+u(st,a))
at=argmaxa(Q(st,a)+u(st,a))
其中,u(s,a)∝P(s,a)1+N(s,a)u(s,a)∝P(s,a)1+N(s,a)
Expansion:步驟1中的selection終止於葉子節點。此時,要對葉子節點進行擴充套件。這裡採用SL policy network pσpσ計算出葉子節點上每個行為的概率,並作為先驗概率P(sL,a)P(sL,a)儲存下來。
Evaluation。使用value network vθ(s)vθ(s)和fast rollout policy network pπpπ模擬得到的博弈結果對當前訪問到的葉子節點進行估值:
V(sL)=(1−λ)vθ(sL)+λzL
V(sL)=(1−λ)vθ(sL)+λzL
Backup。更新這一輪模擬中所有訪問到的路徑的狀態:
N(s,a)=∑i=1n1(s,a,i)
N(s,a)=∑i=1n1(s,a,i)
Q(s,a)=1N(s,a)∑i=1n1(s,a,i)V(siL)
Q(s,a)=1N(s,a)∑i=1n1(s,a,i)V(sLi)
其中,nn是模擬的總次數;1(s,a,i)1(s,a,i)標示第ii輪模擬中是否經過邊(s,a)(s,a);siLsLi是第ii輪模擬中訪問到的葉子節點。
下圖展示了一輪模擬的動態過程。
MCTS with policy networks and value networks
模擬結束後,演算法會選擇訪問次數N(s,a)N(s,a)最大的策略aa作為當前的走子策略。
值得注意的是,在整個模擬的過程中,我們見到了SL policy network(用於Expansion中先驗概率的計算);見到了fast rollout policy network(用於Evaluation中的快速走子);見到了value network(用於Evaluation中對棋勢的預估)。等等,RL policy network去哪了?為什麼不用RL policy network替代SL policy network?明明RL policy network有著更強的棋力啊(85%的贏面)?
這是因為,與RL policy network相比,由人類專家走法訓練出來的SL policy network在策略上的多樣性更強;因此更適用於MCTS中的搜尋。但是,用RL policy network的自我對弈結果訓練出來的value network的泛化能力就要比SL policy network訓練出來的value network要強得多了。
結語
回顧一下,我們發現AlphaGo本質上是CNN、RL、MCTS三者相結合的產物。其中,MCTS是AlphaGo的骨骼,支撐起了整個演算法的框架;CNN是AlphaGo的眼睛和大腦,在複雜的棋局面前尋找儘可能優的策略;RL是AlphaGo的血液,源源不斷地提供新鮮的訓練資料。三者相輔相成,最終4:1戰勝了人類圍棋世界冠軍李世石。其實還有很多細節我沒有詳細的展開,包括如何在分散式的機器上更高效地訓練;如何更新MCTS中的權重等等。然而,其背後的基本原理差不多就是這些了。