1. 概述

簡單來說,AlphaGo Zero 的訓練可以分為三個同時進行的階段:

  • 自我對戰
  • 再訓練網絡
  • 評估網絡

在自我對戰階段, AlphaGo Zero 創建一個訓練集合,自我完成對戰 25000 次。棋局每變動一次,博弈、搜索可能性和勝出者的信息將被存儲。

訓練網絡階段,是神經網絡權值得到優化的過程。在一次完整的訓練循環中, AlphaGo Zero 將從 50 萬局博弈中選取 2048 個移動位置作為樣品,並對這些位置的神經網絡進行訓練。之后,通過損失函數,來對比神經網絡預測與搜索可能性和實際勝出方的信息。每完成一千次這樣的訓練循環,就對神經網絡進行一次評估。

在評估網絡階段,測試新的神經網絡是否得到優化。在這個過程中,博弈雙方都通過各自的神經網絡評估葉節點,並使用蒙特卡洛樹搜索進行下一步棋路的選擇。



AlphaGo Zero結構圖





a 部分是利用初始化的神經網絡和MCTS進行自博弈,收集到對弈的數據以及勝負關系

程序自我對弈完成一個棋局產生一個狀態序列 \(s_1,…,s_T\) ,在 \(T\) 時刻棋局結束,產生了獲勝方,用 \(z\) 表示。在其中的每一個時刻 \(T\) ,棋局狀態用 \( s_t\) 表示,會在神經網絡 \( f_{\theta} \) 的引導下執行一次 MCTS 搜索 \({\alpha}_{\theta}\) ,通過 MCTS 搜索計算得到的概率 \(a_t \sim {\pi}_t\) 確定如何行為(在何處落子)

b 部分是利用收集到的數據訓練當前棋盤的價值和每一個走子的概率 (神經網絡的訓練過程)

神經網絡的輸入是某時刻 \(t\) 的棋局狀態 \(s_t\) 外加一些歷史和額外信息,輸出是一個行為概率向量 \( p_t\) 和一個標量 \(v_t\)

Alpha Zero 算法主體思想就是在策略迭代過程中重復使用上述兩個工具:神經網絡的參數得以更新,這樣可以使得神經網絡的輸出 \((p, v) = f_{\theta}(s) \) :移動概率和獲勝獎勵更接近與經過改善了的搜索得到的概率以及通過自我對弈得到的棋局結果,后者用 \( (\pi, z) \) 表示。得到的新參數可以在下一次自我對弈的迭代過程中讓搜索變得更加強大。

  • \(p\) (move probabilities) 在當前棋局狀態下采取每種可能落子方式的概率
  • \(v\) 當前棋局狀態 \(s\) 下棋手最終獲勝還是落敗(分別用 \(1\) 和 \(-1\) 表示)
  • \(\pi\) 表示經過神經網絡改善了的蒙特卡洛樹搜索輸出的選擇每一個 move 的概率
  • \(z\) 表示通過自我對弈得到的棋局結果

The vector of move probabilities \(p\) represents the probability of selecting each move a (including pass), \(p_a = Pr(a|s)\) . The value \(v\) is a scalar evaluation, estimating the probability of the current player winning from position \(s\) .

The MCTS search outputs probabilities π of playing each move. These search probabilities usually select much stronger moves than the raw move probabilities p of the neural network \(f_θ(s)\) ; MCTS may therefore be viewed as a powerful policy improvement operator. Self­play with search—using the improved MCTS­based policy to select each move, then using the game winner \(z\) as a sample of the value—may be viewed as a powerful policy evaluation operator.

 

2. 傳統蒙特卡洛樹搜索 MCTS

2.1 樹搜索

圍棋第一手有 \(361\) 種下法,第二手有 \(360\) 種,第三手有 \(359\) ,依次類推,即一共有 \(361!\) 種下法。這個一個天文數字,比目前可觀測宇宙的所有原子數還要多。要進行完全樹搜索,是不可能的。因此我們必須進行剪枝,並限制思考的深度。





所謂剪枝,就是指沒必要考慮每種下法,我們只需考慮最有價值的幾手下法。所謂限制思考的深度,就是我們最多只思考5步,10步,20步。常見的算法是Alpha-beta剪枝算法。但是,剪枝算法也有它的缺陷,它很有可能過早的剪掉了后期價值很大走法

 

2.2 蒙特卡洛方法

簡而言之,蒙特卡洛方法(Monte Carlo method),是一種“統計模擬方法”。

假設我們要計算一個不規則形狀的面積,我們只需在包含這個不規則形狀的矩形內,隨機的擲出一個點,每擲出一個點,則 \(N+1\) ,如果這個點在不規則圖形內則 \(W+1\) 。落入不規則圖形的概率即為 \( W/N\) 。當擲出足夠多的點之后,我們可以認為: \(不規則圖形面積=矩形面積*W/N\) 。

要應用蒙特卡洛算法的問題,首先要將問題轉化為概率問題,然后通過統計方法將其問題的解估計出來。

 

2.3 蒙特卡洛樹搜索 MCTS

這種算法簡而言之是用蒙特卡洛方法估算每一種走法的勝率。如果描述的再具體一些,通過不斷的模擬每一種走法,直至終局,該走法的模擬總次數 \(N\) ,與勝局次數 \(W\) ,即可推算出該走法的勝率為 \(W/N\) 。



該算法的每個循環包含4個步驟:

  • 選擇: 從根節點往下走,每次都選一個“最值得看的子節點”(具體規則稍后說),直到來到一個“存在未擴展的子節點”的節點,如圖中的 \( 3/3 \) 節點。什么叫做“存在未擴展的子節點”,其實就是指這個局面存在未走過的后續着法。
  • 擴展: 我們給這個節點加上一個 \( 0/0 \) 子節點,對應之前所說的“未擴展的子節點”,就是還沒有試過的一個着法。
  • 仿真: 從上面這個沒有試過的着法開始,用快速走子策略(Rollout policy)走到底,得到一個勝負結果。按照普遍的觀點,快速走子策略適合選擇一個棋力很弱但走子很快的策略。因為如果這個策略走得慢(比如用 AlphaGo 的策略網絡走棋),雖然棋力會更強,結果會更准確,但由於耗時多了,在單位時間內的模擬次數就少了,所以不一定會棋力更強,有可能會更弱。這也是為什么我們一般只模擬一次,因為如果模擬多次,雖然更准確,但更慢。
  • 回溯: 把模擬的結果加到它的所有父節點上。例如第三步模擬的結果是 \(0/1\) (代表黑棋失敗),那么就把這個節點的所有父節點加上 \(0/1\) 。

 

2.4 上限置信區間算法 UCT

怎么選擇節點?和從前一樣:如果輪到黑棋走,就選對於黑棋有利的;如果輪到白棋走,就選對於黑棋最不利的。但不能太貪心,不能每次都只選擇“最有利的/最不利的”,因為這會意味着搜索樹的廣度不夠,容易忽略實際更好的選擇。

為了在最大勝率和新節點探索上保持平衡,UCT(Upper Confidence Bound,上限置信區間算法)被引入。所謂置信區間,就是概率計算結果的可信度。打個比方,如果擲了3次硬幣,都是正面朝上,我們就認為擲硬幣正面朝上概率是100%,那肯定是錯誤的,因為我們的樣本太少了。所以UCT就是用來修正這個樣本太少的問題。

具體公式如下:

$$\text{score = }\ \frac{w_i}{n_i}+c\sqrt{\frac{\ln N_i}{n_i}}$$

  • \(w_i\) 是 \(i\) 節點的勝利次數
  • \(n_i\) 是i節點的模擬次數
  • \(N_i\) 是所有模擬次數
  • \(c\) 是探索常數,理論值為 \(\sqrt{2}\) ,可根據經驗調整,\(c\) 越大就越偏向於廣度搜索,\(c\) 越小就越偏向於深度搜索

我們看例子說明這是什么意思,就看之前的圖吧。



假設根節點是輪到黑棋走。那么我們首先需要在 \(7/10、5/8、0/3\) 之間選擇 (即第二排):

  • 其中 \( 7/10 \) 對應的分數為 \(7/10 + C \cdot \sqrt{\frac{\log(21)}{10}} \approx 0.7 + 0.55 C\) 。
  • 其中 \( 5/8 \) 對應的分數為 \(5/8 + C \cdot \sqrt{\frac{\log(21)}{8}} \approx 0.625 + 0.62 C\) 。
  • 其中 \( 0/3 \) 對應的分數為 \(0/3 + C \cdot \sqrt{\frac{\log(21)}{3}} \approx 0 + 1.00 C\) 。
  • 可以注意到, \(C\) 越大,就會越照顧訪問次數相對較少的子節點。

如果 \(C\) 比較小,我們將會選擇 \(7/10\) ,接着就要在 \(2/4\) 和 \( 5/6 \) 間選擇。注意,由於現在是白棋走,需要把勝率估計倒過來:

  • 其中 \(2/4\) 對應的分數為 \((1-2/4) + C \cdot \sqrt{\frac{\log(10)}{4}} \approx 0.5 + 0.76 C\) 。
  • 其中 \(5/6\) 對應的分數為 \((1-5/6) + C \cdot \sqrt{\frac{\log(10)}{6}} \approx 0.17 + 0.62 C\) 。

那么我們下一步肯定應該選 2/4。所以說這張圖是錯誤的,因為制圖的人並沒有注意到要把勝率倒過來。

 

3. 深度強化學習

 

3.1 神經網絡與MCTS的結合

常見的MCTS分為4個步驟:選擇,擴展,模擬和反向傳播。

神經網絡用來指導MCTS進行判斷,主要目的是用神經網絡的輸出代替四個步驟中的擴展和模擬這兩步。

神經網絡的輸出是落子概率和局面評估。從根節點開始,選擇到葉節點,然后判斷是否代表這結束,如果沒有結束,則根據神經網絡輸出的評分進行更新,同時根據神經網絡給出的落子策略進行擴展。如果結束,則根據玩家的勝負進行更新。

但是對於傳統的MCTS,我們沒有好的策略,所以只能大規模的搜索。在到達葉節點所代表的局面的時候,我們需要使用隨機策略進行多次模擬,一直模擬到對局結束才能得到局面的評估。這需要消耗大量的計算資源和時間。所以引入神經網絡來代替模擬步驟。

所以總的來說,落子的選擇整體是根據MCTS來的。神經網絡的作用是幫助縮短MCTS所需要的時間。

沒有 MCTS 相當於職業棋手只憑棋感不做計算走快棋。神經網絡提供幾個候選的走法,MCTS 再算一算到底哪個點更好。

 

3.2 神經網絡架構

由殘差模塊構成的 CNN,輸入為 \(19\times 19\times 17\)

17 是 17 個特征,使用了既往 8 個回合的 16 個特征以及一個當前玩家信息特征 \((8 \times 2 + 1 = 17)\) :

$$s_t = [X_t , Y_t , X_{t−1}, Y_{t−1}, …, X_{t−7}, Y_{t−7} , C]$$

其中 \(X_t\) 內包含的是當前棋手的數據:

加入當前棋手執黑棋,那么此時棋盤上所有黑棋對應的位置取值1,白棋和空白位置取值0。類似的 \( Y_t \) 反映的就是白棋信息,當前棋盤上所有白棋的位置取值1,黑棋和空白處取值0。

\(C\) 內的所有 \((19\times 19)\) 個數據要么都是1,要么都是0,如果此時是黑棋要落子則取1,白棋落子則取0。

網絡的共同部分多數是用 \(3\times 3\) 的卷積核(stride = 1),256個特征數,后接 BatchNormalization 和 Relu 單元。每一個殘差單元包括 (參見下圖):

  • 策略端:輸出特征數為 \(19\times 19+1\),分別代表在棋盤上所有可能位置落子的可能性以及 Pass 的可能性。
  • 價值端:全連接一個256個特征的隱藏層,最后以tanh的激活方式輸出 \([-1,1]\) 之間的值。

網絡的前20層左右,是常見的神經網絡結構。然后跟着是兩個“頭”,一個頭取走了前20層的輸出,然后產生了下一步的落子概率,另一個頭基於同樣的數據,輸出當前局面的獲勝概率。

 




 

訓練數據:自我對弈產生大量的 \(( s,\pi,z )\) 數據對,通過 Mini-batch 采樣。

損失函數:

$$ l=(z-v)^{2}-\pi^{T}log(p)+c||\theta||^{2} $$

  • 第一項:通過最小二乘最小化獲勝概率誤差
  • 第二項:通過交叉熵最大化先驗走子概率與提升后走子概率一致性
  • 第三項:L2范數權值衰減防止過擬合。
 

 

3.3 過程細節

為了在 self play 每一步得到,MCTS 需要完成1600次搜索。搜索樹中每一節點 \(s\) 針對合法操作保存以下數據結構

$$\{N(s,a),W(s,a),Q(s,a),P(s,a) \}$$

  • \(s\ \) 樹的每一個節點代表了一種棋盤布局
  • \(a\ \) 每一個邊代表了在一種布局 \(s\) 下的一種落子方式
  • \(N(s,a)\ \) 記錄邊的訪問次數
  • \(W(s,a)\ \) 合計行動價值
  • \(Q(s,a)\ \) 平均行動價值
  • \(P(s,a)\ \) 選擇該條邊的先驗概率

多次模擬過程會在獨立線程並行運行。搜索算法在 \(a,b,c\) 三步迭代多次后,根據搜索結果選擇落子 \(d\) 。

 



  • a 每次模擬選擇的分支,有最大 \(Q+U\) , 其中 \(Q\) 是動作價值, \(U\) 是上限置信, \(U\) 依賴於一個存儲在分支上的優先概率 \(P\) 和該分支的訪問次數 \(N\) (每訪問一次 \(N+1\))
  • b 擴展葉節點,神經網絡 \((P(s, .), V(s)) = f_θ(s)\) 評估 \(s\) ; 將向量 \(P\) 的值被存儲在 \(s\) 的擴展邊上
  • c 根據 \(V\) 更新動作價值(action-value) \(Q\),反映所有該動作的子樹的平均值
  • d 一旦搜索結束,搜索概率 \(\pi\) 被返回,與 \(Ν^{(1/τ)}\) 成正比, \(N\) 是每個分支的訪問次數,而 \(τ\) 是一個參數控制着溫度(temperature)

這里先知曉有這樣的神經網絡結構 \((p,v)=f_{\theta}(s)\) (初始狀態參數 \(\theta\) 隨機賦值)

在自我對弈的每一步,根據深度神經網絡計算出落子概率(先驗概率 \(p\) ),如對狀態 \(s_{1}\) 得到 \((p_{1},v_{1}) \) ;然后通過 MCTS(蒙特卡羅搜索樹算法)進行 policy
improvement,MCTS 搜索的輸出是當前狀態 \(i\) 下不同位置落子的概率 \( \pi_{i} \) ,該落子概率會優於該狀態下先驗概率 \(p_{i}\) ,然后基於 \( \pi_{i} \) 完成當前步驟落子,之后每步均如此過程直到完成當前對局得到最終結果 \(z( z\in[-1,1] )\) 。



神經網絡通過使用 MCTS 搜索的自我對弈強化學習來進行訓練。一開始神經網絡的參數被隨機設置稱 \(\theta_0 \) ,在隨后的每一次迭代中 \( i\geq1 \) ,會通過自我對弈產生許多完整的棋局,在其中每一個完整棋局的一個時間步 \( T \) 時,都會利用上一個神經網絡的參數來產生搜索策略 \( \pi_t = \alpha_{i-1}(s_t) \) ,並且用這個策略的采樣產生實際自我對弈時的行為。

發生下列任意情況之一,游戲終止於時間 \( T \) :

  • 雙方都 Pass
  • 搜索 value 降低至一個被 resignation(割舍?)的閾值
  • 游戲對弈達到設定的最大步數

游戲結束后,會給出一個最終獎勵 \(r_T \in \{ -1, +1 \}\) , 每一個時間步 T 的數據以 \( (s_t, \pi_t, z_t) \) 的形式保存,其中 \(z_t = \pm r_T\) 是從 \(T\) 時刻玩家的立場得到的勝利者的獎勵(是不是可以理解成: \(T \) 時刻不管是白方還是黑方,只要最終贏得棋局, \( z_t = 1 \) 即成立?)。

不過需要在一個完整的對局結束后才能確定這一局中每一個 \( (s, \pi, z) \) 中的 \(z\) ,如果最后的勝者是 \( s \) 局面下的當前 player,則 \( z=1 \) ,如果最后的敗者是 \( s\) 局面下的當前 player,則 \(z=-1\) ,如果最后打平,則 \(z=0\)

自我對弈過程中的最后幾次迭代過程中產生的數據 \( (s,\pi,z) \) 將會以均等的概率被選中來訓練神經網絡。

AlphaGo Zero 里面的神經網絡實際上是把 AlphaGo 里面的 Policy Network 和 Value Network 糅合在一起了,所以這個神經網絡也有兩個目標,神經網絡的訓練目標就是要盡可能的縮小兩方面的差距:

  • 讓網絡輸出的落子概率向量 \(p\) 和 MCTS 搜索輸出 \(\pi\) 越接近越好
  • 讓網絡預測的當前棋手的最終結果 \(v\) 和最終游戲贏家 \(z\) 越接近越好

神經網絡的損失函數由下式確定:

$$l = (z-v)^{2} - {\pi}^\top logP + c ||\theta||^2 $$
  • \(c \) 是控制參數 L2 正則項的一個系數。

網絡訓練得到的新參數會被用來知道下一輪迭代中自我對弈時的 MCTS 搜索。

AlphaGo Zero 每1000步會將一個神經網絡存檔,並且把這個存檔和歷史最優版本比較,如果勝率超過歷史最優的55%,這個版本將會被更新為歷史最優。並且在生成數據時,只使用歷史最優的神經網絡的 self-play 數據作為深度網絡的訓練數據。這樣可以增加算法的優化速度。

 

4. 搜索階段算法

 



 

a 選擇 Select

每一次模擬的第一個階段起自搜索樹的根節點 \(s_0\) ,在第 L 個時間步結束於搜索樹的葉節點 \(s_L\) 。對於其中的任意時間 \(t<L\) ,根據搜索樹內的統計數據來決定選擇哪一個模擬行為

$$a_t = \underset{a}{argmax}(Q(s_t, a) + U(s_t, a))$$

其中:
$$U(s,a) = c_{puct}P(s,a)\frac{\sqrt{\sum_{b}{N(s,b)}}}{1+N(s,a)}$$

  • \(c_{puct}\) 是決定探索程度的一個系數

this search control strategy initially prefers actions with high prior probability and low visit count, but asympotically prefers actions with high action value.

 

b 擴展和評估 Expand & Evaluate

葉節點 \(s_L\) 將會等待來自神經網絡的評估 \((d_i (p), v) = f_\theta (d_i (s_L )) \),其中 \(d_i \) 是一個 dihedral reflection 或 rotation, \(i\in[1,2,3,…,8] \) 。

其中通過一個1至8的隨機數來表示雙方向鏡面和旋轉(因為圍棋在棋盤旋轉和鏡像之后的勝率估算情況是一樣的,如下圖所示)



這些等待評估的狀態會被送入一個隊列,在神經網絡評估隊列里的狀態時(使用 mini_batch_size=8),搜索將被暫時鎖定。當神經網絡得到結果后,該葉節點會被展開,同時每一條可能的邊 \((s_L,a)\) 會以下面的數據進行初始化:

$$\{ N(s_L,a)=0,W(s_L,a)=0,Q(s_L,a)=0,P(s_L,a)=P_a \}$$

同時來自神經網絡的對該葉節點的價值估計也會影響路徑中每一個節點的統計數據 \(W\)(見下),隨后進行回溯過程。

AlphaGo Zero 會根據前面的落子規則不斷的落子,這就相當於棋手在腦海中進行推演。但是圍棋的搜索空間即使對於計算機來說也是太大,AlphaGo zero 只會推演(仿真)到一定步數就停止了。假設最后的布局是 \(s’\) , 那么 AlphaGo Zero 會調用深度神經網絡來預測這局推演結束時自己的勝率 \(v(s’) \) 。這樣的推演過程會進行多次。

 

c 回溯 Backup

等一次推演結束后,AlphaGo zero 會根據推演的結果更新自己的知識,也就是值函數 \(Q(s,u)\)

對於 \( t \leq L \) ,每一個邊的統計結果將被更新。

$$ N(s_t,a_t) = N(s_t,a_t)+1$$

$$ W(s_t,a_t) = W(s_t,a_t)+v $$

$$Q(s_t,a_t) = \frac{W(s_t,a_t)}{N(s_t,a_t)}$$

 

$$N(s,a) :\ 記錄邊的訪問次數 $$

$$W(s,a) :\ 合計行動價值 $$

$$Q(s,a) :\ 平均行動價值 $$

 

d 產生實際行為 Play

路徑中所有節點統計數據得到更新后(搜索結束后), AlphaGo Zero 在根節點 \(s\) 處選擇 \(a\) 操作進行落子,根據最新的統計數據來產生一個實際的行為 \(\pi_{a}\) ,與訪問次數成冪指數比例:
$$\pi(a|s)=\frac{N(s,a)^{1/\tau}}{\sum_{b}^{}{N(s,b)^{1/\tau}}}$$

\(\pi_{a}\ (\pi(a|s))\) 是落子到位置 \(a\) 的概率

\(\tau \) 為溫度參數,控制探索的程度, \( \tau\) 越大,不同走法間差異變小,探索比例增大,反之,則更多選擇當前最優操作。

在隨后的時間步 (time_steps) 中,這個搜索樹將會繼續使用,對應於實際所采取的行為的子節點將變成根節點,該子節點下的子樹的統計數據將會被保留,而這顆樹的其余部分將會丟棄 (discarded)。

另外,如果該子樹的根節點和最佳價值子節點的價值低於某一個閾值 \( v_{resign}\),AlphaZero 將放棄搜索某子樹。

 

參考

  1. AlphaGo Zero去掉蒙特卡洛搜索樹會怎么樣?
  2. 蒙特卡洛樹搜索中神經網絡是如何指導蒙特卡洛樹搜索進行判斷的
  3. AlphaGo Zero 簡明工作原理
  4. 初步認識AlphaGo Zero原理
  5. AlphaGo Zero論文筆記
  6. AlphaGo Zero解讀
  7. Code:AlphaZero_Gomoku