1. 程式人生 > 實用技巧 >RL論文閱讀19 - AlphaGo Zero原理淺顯分析

RL論文閱讀19 - AlphaGo Zero原理淺顯分析

最近偶然看到一個寫輕量版(5*5)圍棋的問題,當時第一時間就想到了當年(2015年吧)讓世界震驚的AlphaGo。好奇心驅使,查了一下相關理論。發現AlphaGo已經被它的新一代版本AlphaGo Zero(2017)給打敗了。懷著對科研前輩瞻仰的心情,淺顯的研究了一下AlphaGo Zero的原理。原來,AlphaGo Zero才是真正的棋神

文章目錄

Tittle

image-20201016191207594

分析:

AlphaGo Zero主要是有兩部分組成:MCTS+神經網路。

MCTS是什麼東西?

那麼博弈論中,我們把zero-sum、perfect、information、deterministic、discrete、sequential的遊戲統稱為Combinatorial Game,例如圍棋、象棋等,而MCTS只能解決Combinatorial Game的問題。

​ MCTS全程Monte Carlo tree search,就是一個處理決策的搜尋演算法。我們在下圍棋的時候,每一個落子都是一個決策的過程。
source

​ 以5x5的棋盤為例,一開始棋盤為空,那麼為初始窗臺s0,s0向下可以有25個地方放置黑子,那麼s0下實際上有25個子狀態(s0有25個兒子),同理,在s0的孫子輩,就改下白子了,那麼每個兒子下面都有24個子狀態,s0有25*24個孫子。這樣來看,如果對於國際圍棋來19x19來說,它的子子孫孫無窮匱也!這將是一個又寬、又深的一顆樹。

​ 暫且先不考慮多深,所有棋局都是從s0開始,黑白雙方每次落子一次,都會決定分支的走向。當棋局結束,實際上就是走過了這顆大樹的某一個分支而已。

​ 每次完成一個對局,我們都記錄這個分支,那麼根據對局的結果,就可以知道這個分支是黑棋贏了還是白棋贏了。一旦我們完成這個樹的所有分支,我們就可以得到每一個樹的節點的黑白棋輸贏概率。假設我們知道了每個節點黑棋的勝率,我們如果作為黑方,就一直選擇勝率高的方向。如果作為白方,我們就一直選擇黑棋勝率低的方向。其實這就是MinMax策略

​ 但是當搜尋空間巨大,就像圍棋這種,我們不能窮舉出這個樹的每一個節點,那麼我們就無法準確計算每個節點的黑棋贏的概率。這時,在迭代的時候,我們可以使用UCB(Upper Confidence Bound)演算法來兼顧探索利用。該演算法的思路是如果存在沒有被探索的節點,我們先去嘗試探索他,如果都被探索了,我們就根據訪問次數等綜合指標來評價去選擇哪個子節點(找哪個兒子的問題)。

arg ⁡ max ⁡ v ′ ∈ c h i l d r e n o f v Q ( v ′ ) N ( v ′ ) + c 2 ln ⁡ N ( v ) N ( v ′ ) \arg \max_{v' \in children of v} \frac{Q(v')}{N(v')} + c \sqrt{\frac{2 \ln N(v)}{N(v')}} argvchildrenofvmaxN(v)Q(v)+cN(v)2lnN(v)

Q是我們這個節點的累計quality值。例如黑棋如果贏了,我們給他1的獎勵。那麼這個獎勵就會從葉子節點不斷往上回溯,增加該路徑每個節點的Q值

N 該節點的訪問次數

c 常數 1 / 2 1/\sqrt 2 1/2 經驗值。

v代表節點

MCTS流程:

主要有四個關鍵步驟:

  • 選擇:如果有沒被探索的,就選擇沒探索過的,否則通過UCB進行選擇,一直選到一個沒有兒子的節點A。
  • 擴張Expand:選中的子節點A下建立該節點的兒子節點B。
  • 模擬Simulation:因為創建出新節點B,我們需要確定這個節點的Q值,這時候我們進行一個模擬,自己心裡在這走棋,然後得到這個子節點的Q值。
  • 回溯Backpropagation:新建立的節點B的Q值估計出來了,那麼我們就開始一直反向回溯更新它的父節點、爺爺節點、太爺爺節點、太太爺爺節點…的Q值。

image

其中TREE_POLICY就是實現了Selection和和Expansion兩個階段,DEFAULT_POLICY實現了Simulation階段,BACKUP實現了Backpropagation階段

source

AlphaGo Zero

​ AlphaGo Zero進步於AlphaGo的地方是它完全不需要任何的背景知識! AlphaGo還需要喂入棋譜,AlphaGo Zero完全是自我博弈的結果。其實他的原理很簡單,就是一刻決策樹,但是在訓練的時候,對這棵樹進行了處理,使他不必去探索很多無用的節點!

MCTS+NN

​ 他有一個神經網路,這個神經網路輸入端是當前的棋局狀態S,輸入端有兩個值:p(選擇每個動作的概率)和v(當前狀態s下玩家(例如黑棋)的贏的概率)。神經網路使用了很多殘差網路和卷積網路以及batch normalisation等。

​ 在MCTS的simulations過程中,使用神經網路進行模擬。

​ 在每個節點選擇中,使用的最大化UBC :
Q ( s , a ) + U ( s , a ) w h e r e U ( s , a ) ∝ P ( s , a ) / ( 1 + N ( S , a ) ) Q(s,a) + U(s,a) \\ where \quad U(s,a) \propto P(s,a)/(1+N(S,a)) Q(s,a)+U(s,a)whereU(s,a)P(s,a)/(1+N(S,a))

儲存在邊上的幾個資料:(實現的時候,儲存在子節點裡就可以,因為父節點到子節點只要一個邊,一個動作)

Q(s,a) : action-value, 動作價值

N(s,a): 訪問次數

P(s,a): 先驗概率(神經網路生成的。將神經網路的生成動作概率也作為一個參考)

image-20201016204222746

​ 新的節點被建立之後,通過神經網路生成先驗概率和和價值V。 ( P ( s ′ , ⋅ ) , V ( s ′ ) ) = f θ ( s ′ ) (P(s',·), V(s')) = f_\theta (s') (P(s,),V(s))=fθ(s) .然後開始到c的反向傳播,更新Q值以及訪問次數N。 Q ( s , a ) = 1 / N ( s , a ) ∑ s ′ ∣ s , a → s ′ V ( s ′ ) Q(s,a) = 1/N(s,a) \sum_{s'|s, a \rightarrow s'}V(s') Q(s,a)=1/N(s,a)ss,asV(s)

​ 也就是說,AphaGo Zero和傳統的MCTS不同之處是Select和SImulation時,都有神經網路的參與。

image-20201016210317266

​ 神經網路的訓練,是MCTS回溯後,從下向上的進行訓練網路。因為我們的value值就是從下往上推的,所以訓練也要從下往上邊回溯邊訓練。因為MCTS搜尋之後的結果一定好於神經網路,所以他的結果能夠知道神經網路的訓練。反過來,被訓練的神經網路又能促進MCTS得到更好的搜尋結果。

​ 就這樣經過很多很多次的迭代訓練,就能得到一個較好的搜尋樹。減少了樹的寬度和搜尋的深度,使其探索的分支更加有意義。其中還有很多其他的技巧,但是大致的思路就是MCTS+NN

後記

​ 具體的效能對比,在論文總都有寫到,主要總結就是Zero NB, 在圍棋領域應該遠遠超越了人類。Silver David團隊還把Zero的思路用在了國際象棋上,也取得了不錯的成績。

Reference

  1. Silver, David, et al. “Mastering the game of Go without human knowledge.” Nature 550.7676 (2017): 354-359.

  2. survey-mcts-methods

  3. 自我對弈的 AlphaGo Zero

  4. blog