1. 概述

簡單來講,AlphaGo Zero 的訓練能夠分爲三個同時進行的階段:git

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

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

訓練網絡階段,是神經網絡權值獲得優化的過程。在一次完整的訓練循環中, 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 部分是利用收集到的數據訓練當前棋盤的價值和每個走子的機率 (神經網絡的訓練過程) app

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

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/十、5/八、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