簡介
最近AlphaGo Zero又火了一把,paper和各種分析文章都有了,有人看到了說不就是普通的Reinforcement learning嗎,有人還沒理解估值網絡、快速下子網絡的作用就放棄了。
實際上,圍棋是一種零和、信息對稱的combinatorial game,因此AlphaGo用的是蒙特卡羅樹搜索算法的一種,在計算樹節點Q值時使用了ResNet等神經網絡模型,只是在論文中也歸類為增強學習而已。
如果你想真正了解AlphaGo的原理(或者不被其他AI將統治人類的文章所忽悠),理解蒙特卡羅樹搜索(Monte Carlo Tree Search)、博弈論(Game Theory)、多臂laohu機(Multi-arm Bandit)、探索與利用(Exploration and Exploitation)等基礎必不可少。
MCTS初探
MCTS也就是蒙特卡羅樹搜索(Monte Carlo Tree Search),是一類樹搜索算法的統稱,可以較為有效地解決一些探索空間巨大的問題,例如一般的圍棋算法都是基於MCTS實現的。
這類算法要解決的問題是這樣的,我們把圍棋的每一步所有可能選擇都作為樹的節點,第零層只有1個根節點,第1層就有361種下子可能和節點,第2層有360種下子可能和節點,這是一顆非常大的樹,我們要在每一層樹節點中搜索出贏概率最大的節點,也就是下子方法。
那么樹搜索的算法有很多,如果樹的層數比較淺,我們可以窮舉計算每個節點輸贏的概率,那么可以使用一種最簡單的策略,叫做minmax算法。基本思路是這樣的,從樹的葉子結點開始看,如果是本方回合就選擇max的,如果是對方回合就是min的,實際上這也是假設對方是聰明的也會使用minmax算法,這樣在博弈論里面就達到一個納什均衡點。
這是搜索空間比較小的時候的策略,MCTS要解決的問題是搜索空間足夠大,不能計算得到所有子樹的價值,這是需要一種較為高效的搜索策略,同時也得兼顧探索和利用,避免陷入局部最優解。MCTS實現這些特性的方式有多種,例如經典的UCB(Upper Confidence Bounds)算法,就是在選擇子節點的時候優先考慮沒有探索過的,如果都探索過就根據得分來選擇,得分不僅是由這個子節點最終贏的概率來,而且與這個子節點玩的次數成負相關,也就是說這個子節點如果平均得分高就約有可能選中(因為認為它比其他節點更值得利用),同時如果子節點選中次數較多則下次不太會選中(因為其他節點選擇次數少更值得探索),因此MCTS根據配置探索和利用不同的權重,可以實現比隨機或者其他策略更有啟發式的方法。
到這里我們需要理解,蒙特卡羅樹搜索是一種基於樹數據結構、能權衡探索與利用、在搜索空間巨大仍然比較有效的的搜索算法。至於這個樹搜索算法主要包括Selection、Expansion、Simulation和Backpropagation四個階段,具體原理和實現會在后面介紹。
前面提到MCTS的使用場景需要是搜索空間巨大,因為搜索空間如果在計算能力以內,其實是沒必要用MCTS的,而真正要應用上還需要有其他的假設。涉及到博弈論的概念,我們要求的條件是zero-sum、fully information、determinism、sequential、discrete,也就是說這個場景必須是能分出輸贏(不能同時贏)、游戲的信息是完全公開的(不像打牌可以隱藏自己的手牌)、確定性的(每一個操作結果沒有隨機因素)、順序的(操作都是按順序執行的)、離散的(沒有操作是一種連續值),除了博弈論我們要求場景是類似多臂laohu機的黑盒環境,不能通過求導或者凸優化方法找到最優解,否則使用MCTS也是沒有意義。因此在討論蒙特卡羅樹搜索前,我們需要先有下面的理論基礎。
Game theory基礎
Game theory翻譯過來就是博弈論,其實是研究多個玩家在互相交互中取勝的方法。例如在耶魯大學的博弈論公開課中,有一個游戲是讓全班同學從0到100中選一個數,其中如果選擇的數最接近所有數的平均值的三分之一則這個玩家獲勝。首先大家應該不會選擇比33大的數,因為其他人都選擇100也不能贏不了,那么如果大家都選擇比33小,自己就應該選擇比11小的數,考慮到其他人也是這樣想的,那么自己應該選擇比11小很多的數,如果我知道別人也知道自己選擇比11小很多的數的話,那應該選擇更小的數。那么這個游戲的理想值是0,也就是納什均衡點,就是當對方也是深晦游戲規則並且知道你也很懂游戲規則時做出的最優決定,當然第一次游戲大家都不是完美的決策者(或者不知道對方是不是完美的決策者),因此不一定會選擇納什均衡點,但多次游戲后結果就是最終取勝的就是非常接近0的選擇。
那么前面提到的什么是納什均衡點呢?這是Game theory里面很神奇的概念,就是所有人已經選擇了對自己而言的最優解並且自己單方面做其他選擇也無法再提高的點。也就是說,如果玩家都是高手,能達到或者逼近納什均衡的策略就是最優策略,如果對手不是高手不會選擇最優策略,那么納什均衡點不一定保證每局都贏,但長遠來看極大概率會贏這樣的新手。
那么前面提到MCTS適用於特定的游戲場景,因此MCTS也是一種找到逼近納什均衡的搜索策略。那么逼近納什均衡點的策略還有很多,例如前面提到的minmax算法,還有適用於非信息對稱游戲的CFR(Counterfactual Regret)算法。像德州撲克我們就會考慮用CFR而不是MCTS,為什么呢?因為MCTS要求是一種Combinatorial Game而不能是信息不對稱的。
在博弈論里,信息對稱(Perfect information / Fully information)是指游戲的所有信息和狀態都是所有玩家都可以觀察到的,因此雙方的游戲策略只需要關注共同的狀態即可,而信息不對稱(Imperfect information / Partial information)就是玩家擁有只有自己可以觀察到的狀態,這樣游戲決策時也需要考慮更多的因素。
還有一個概念就是零和(zero-sum),就是所有玩家的收益之和為零,如果我贏就是你輸,沒有雙贏或者雙輸,因此游戲決策時不需要考慮合作等因素。
那么博弈論中,我們把zero-sum、perfect
information、deterministic、discrete、sequential的游戲統稱為Combinatorial Game,例如圍棋、象棋等,而MCTS只能解決Combinatorial Game的問題。
對博弈論感興趣的,可以在 網易公開課 參加耶魯大學博弈論公開課。
Black box optimization基礎
了解完Game theory,第二個需要了解的是Black box optimization,也就是黑盒優化。我們知道優化就是根據給定的數據集找到更好的選擇,例如機器學習就是典型的優化過程,但我們用的機器學習算法如LR、SVM、DNN都不是黑盒,而是根據數學公式推導通過對函數求導等方式進行的優化。如果我們能把問題描述成一個函數或者凸優化問題,那么我們通過數學上的求導就可以找到最優解,這類問題並不需要用到MCTS等搜索算法,但實際上很多問題例如圍棋就無法找到一個描述輸贏的函數曲線,這樣就無法通過純數學的方法解決。
這類問題統稱為黑盒優化問題,我們不能假設知道這個場景內部的函數或者模型結構,只能通過給定模型輸入得到模型輸出結果來優化。例如多臂laohu機(Multi-arm Bandit)問題,我們有多台laohu機可以投幣,但不知道每一台輸贏的概率,只能通過多次投幣來測試,根據觀察的結果預估每台機器的收益分布,最終選擇認為收益最大的,這種方法一般會比隨機方法效果好。
黑盒優化的算法也有很多,例如進化算法、貝葉斯優化、MCTS也算是,而這些算法都需要解決如何權衡探索和利用(Exploration and Exploitation)的問題。如果我們只有一個投幣,那么當前會選擇期望收益最高的laohu機來投(Exploitation),但如果我們有一萬個投幣,我們不應該只投一個laohu機,而應該用少量幣來探索一下其他laohu機(Exploration),說不定能跳過局部最優解找到更優解,當然我們也不能全部投幣都用來探索了。
對於Exploration和Exploitation,我在 一種更好的超參數調優方式 有更詳細的剖析,感興趣可以關注下 。
UCB算法基礎
前面講了Game theory和Black box optimization,這里再補充一個UCB算法基礎,這是MCTS的經典實現UCT(Upper Confidence bounds for Trees)里面用到的算法。
算法本身很簡單,公式如下。
其中v'表示當前樹節點,v表示父節點,Q表示這個樹節點的累計quality值,N表示這個樹節點的visit次數,C是一個常量參數(可以控制exploitation和exploration權重)。
這個公式的意思時,對每一個節點求一個值用於后面的選擇,這個值有兩部分組成,左邊是這個節點的平均收益值(越高表示這個節點期望收益好,越值得選擇,用於exploitation),右邊的變量是這個父節點的總訪問次數除以子節點的訪問次數(如果子節點訪問次數越少則值越大,越值得選擇,用戶exploration),因此使用這個公式是可以兼顧探索和利用的。
用Python也很容易實現這個算法,其中C常量我們可以使用 ,這是Kocsis、Szepesvari提出的經驗值,完整代碼如下。
這樣我們就有了MCTS的最基礎選擇算法實現了,下面討論完整的MCTS算法實現。
MCTS算法原理
首先,MCTS的完整實現代碼在 tobegit3hub/ml_implementation ,想直接看源碼或者測試的可以去下載運行。
然后,我們需要知道MCTS的算法步驟,可以參考論文 A Survey of Monte Carlo Tree Search Methods http://pubs.doc.ic.ac.uk/survey-mcts-methods/survey-mcts-methods.pdf 。
MCTS的算法分為四步,第一步是Selection,就是在樹中找到一個最好的值得探索的節點,一般策略是先選擇未被探索的子節點,如果都探索過就選擇UCB值最大的子節點。第二步是Expansion,就是在前面選中的子節點中走一步創建一個新的子節點,一般策略是隨機自行一個操作並且這個操作不能與前面的子節點重復。第三步是Simulation,就是在前面新Expansion出來的節點開始模擬游戲,直到到達游戲結束狀態,這樣可以收到到這個expansion出來的節點的得分是多少。第四步是Backpropagation,就是把前面expansion出來的節點得分反饋到前面所有父節點中,更新這些節點的quality value和visit times,方便后面計算UCB值。
基本思路就是這樣的,通過不斷的模擬得到大部分節點的UCB值,然后下次模擬的時候根據UCB值有策略得選擇值得利用和值得探索的節點繼續模擬,在搜索空間巨大並且計算能力有限的情況下,這種啟發式搜索能更集中地、更大概率找到一些更好的節點。下面是論文的偽代碼實現。
其中TREE_POLICY就是實現了Selection和和Expansion兩個階段,DEFAULT_POLICY實現了Simulation階段,BACKUP實現了Backpropagation階段,基本思路和前面介紹的一樣。
MCTS算法實現
最后我們看一下前面基於Python的MCTS代碼實現,源碼在 tobegit3hub/ml_implementation ,這是整理的代碼實現架構圖。
由於這是一棵樹,我們需要定義N叉樹的Node數據結構。
首先Node包含了parent和children屬性,還有就是用於計算UCB值的visit times和quality value,為了關聯游戲狀態,我們還需要為每個Node綁定一個State對象。Node需要實現增加節點、刪除節點等功能,還有需要提供函數判斷子節點的個數和是否有空閑的子節點位置。
而State的定義與我們使用MCTS的游戲定義有關,我們定義下面的數據結構。
每一個State都需要包含當前的游戲得分,可以繼續當前游戲玩到第幾輪,還有每一輪的選擇是什么。當然更重要的,它還需要實現is_terminal()方法判斷游戲是否結局,實現compute_reward()方法告訴用戶當前得分是多少,還有提供get_next_state()方法用戶進行游戲得到新的狀態,幾個函數與游戲場景游戲,這里簡單實現了一個“選擇數字保證累加和為1”的游戲。
要實現偽代碼提到的幾個方法,我們直接定義一個monte_carlo_tree_search()函數,然后依次調用tree_policy()、default_policy()、backup()這些方法實現即可。
為了避免程序無限搜索下去,我們需要定義一個computation budget,限制搜索次數或者搜索時間,這里限制只能向下搜索1000次,然后通過下面的方法來找到expansion node、計算reward、並且backpropation到所有有關的節點中。我們繼續看一下tree_policy()實現。
這里代碼很簡潔,實現了一個策略,就是檢查如果一個節點下面還有未探索的子節點,那么先expansion下面的子節點就可以了,如果沒有子節點,那么就用best_child()函數(其實也就是UCB算法)來得到下一個子節點,然后便利下直到有未探索的節點可以探索。
best_child()算法很簡單,就是根據Node的State獲取quality value和visit times,然后計算出UCB值,然后比較返回UCB值最大的子節點而已。
expand()函數實現稍微復雜些,實際上就是在當前節點下,選擇一個未被執行的Action來執行即可,策略就是隨機選,如果有隨機選中之前已經執行過的則重新選。
因此tree_policy()方法就是根據是否有未探索子節點和UCB值(也就是權衡和exploration和exploitation)后選出了expansion節點,然后就是用default_policy()來模擬剩下的游戲了。
在這個游戲種模擬也很簡單,我們直接調用State類中實現的隨機玩游戲策略,一直玩到最后得到一個reward值即可,當然對於AlphaGo等其他游戲可能需要實現一個更優的快速走子網絡實現類似的功能,后面會細談區別與AlphaGo的區別。
那么最后我們就需要把前面計算的這個reward反饋到“相關的”的節點上了,這個相關的意思是從根節點開始一直到這個expansion節點經過的所有節點,他們的quality value和visit times都需要更新,backup()函數實現如下。
這就是實現一個典型MCTS算法的完整實現,大概兩百多行代碼即可,可以通過它來玩搜索空間很大的游戲,並且在給定一定計算能力的基礎上找到較優的解。感興趣的還可以關注下 tobegit3hub/ml_implementation,里面有更多機器學習算法的實現源碼,也可以提Pull-request貢獻更多的算法代碼。
AlphaGo算法區別
前面我們實現的這種基於UCB的MCTS算法,實際上離訓練圍棋機器人的算法還是比較遠的,其中AlphaGo也是基於MCTS算法,但做了很多優化。
我簡單看了下 http://www.algorithmdog.com/alphago-zero-notes 的介紹,AlphaGo不僅替換了經典實現的UCB算法,而是使用policy network的輸出替換父節點訪問次數,同樣使用子節點訪問次數作為分母保證exploration,Q值也改為從快速走子網絡得到的所有葉子節點的均值,神經網絡也是從前代的CNN改為最新的ResNet,這樣復雜的神經網絡模型比一般的UCB算法效果會好更多。
首先,AlphaGo每個節點可選action太多了,selection階段不能像前面先遍歷完所有子節點再expansion,這里是用改進的UCB算法來找到最優的需要expansion子節點,算法基本類似也是有控制exploration/exploitation的常量C並且與該子節點visit times成反比。
其次,進行expansion時不會像前面這樣直接random選擇任意的action,而是這里也考慮到exploration/exploitation,一般前30步根據visit times成正比來選擇,這樣可以盡可能得先探索(根節點加入了狄利克雷分布保證所有點都經過),后面主要是根據visit times來走了。
第三,新版AlphaGo Zero去掉了基於handcraft規則的rollout policy,也就是快速走子網絡,以前是必須有快速走子直到完成比賽才能得到反饋,現在是直接基於神經網絡計算預估的winer value概率值,然后平均得到每個子節點的state-action value也就是Q值。
第四,AlphaGo在MCTS基礎上收集最終的比賽結果作為label,MCTS作為policy evalution和policy iteration來實現增強學習。
當然AlphaGo在MCTS上還可以做更懂優化,只是一旦我們理解了MCTS的核心原理,看這些paper和介紹就更加清晰明了。
總結
最后再次推薦蒙特卡羅樹搜索的論文 A Survey of Monte Carlo Tree Search Methods http://pubs.doc.ic.ac.uk/survey-mcts-methods/survey-mcts-methods.pdf ,里面提到MCTS適用於各種Combinatorial game的場景,當然也提到它的不足,例如在象棋游戲種就不如圍棋效果好。
希望大家看完有所啟發,也能用蒙特卡羅樹搜索做出更有意思的東西!!!
轉自:https://zhuanlan.zhihu.com/p/30458774
知乎對於人機大戰的關注度很高,所以寫這個系列,希望能讓大家對於人工智能和圍棋有更多的了解。如果有收獲,請記得點一下贊。
本系列已更新多篇,其它幾篇的傳送門:
- (1) : 圍棋 AI 基礎 知乎專欄
- (2) : 安裝 MXNet 搭建深度學習環境 知乎專欄
- (3) : 訓練策略網絡,真正與之對弈 知乎專欄
- (4) : 對於策略網絡的深入分析(以及它的弱點所在) 知乎專欄
- (4.5):后文預告(Or 為什么你應該試試 Batch Normalization 和 ResNet)知乎專欄
- (5):結合強化學習與深度學習的 Policy Gradient(左右互搏自我進化的基礎) 知乎專欄
網上很少見到關於 MCTS 的詳細介紹,而且許多看似詳細的介紹實際有錯誤,甚至許多人會混淆蒙特卡洛樹搜索和蒙特卡洛方法。這兩者有本質區別。用做過渲染器的朋友會理解的話來說:蒙特卡洛方法有偏差(Bias),而MCTS沒有偏差(Bias)。我們在后文會解釋。
一、極小極大(Minimax)搜索
先看傳統的博弈游戲樹搜索,著名的極小極大(Minimax)搜索,學過算法的朋友會清楚。看下圖,假設現在輪到黑棋,黑棋有b1和b2兩手可選,白棋對於b1有w1和w2兩手可選,白棋對於b2有w3 w4 w5三手可選:
然后假設走完w1/w2/w3/w4/w5后,經過局面評估,黑棋的未來勝率分別是 50%/48%/62%/45%/58%(等一下,這些勝率是怎么評估出來的?我們后文會說這個問題)。
請問,黑棋此時最佳的着法是b1還是b2?如果是用蒙特卡洛方法,趨近的會是其下所有勝率的平均值。例如經過蒙特卡洛模擬,會發現b1后續的勝率是49% = (50+48)/2,而b2后續的勝率是55% = (62+45+58)/3。
於是蒙特卡洛方法說應該走b2,因為55%比49%的勝率高。但這是錯誤的。因為如果白棋夠聰明,會在黑棋走b1的時候回應以w2(盡量降低黑棋的勝率),在黑棋走b2的時候回應以w4(盡量降低黑棋的勝率)。
所以走b1后黑棋的真實勝率是48%,走b2后黑棋的真實勝率是45%。黑棋的正解是b1。這就是 Minimax 搜索的核心思想:在搜索樹中,每次輪到黑棋走時,走對黑棋最有利的;輪到白棋走時,走對黑棋最不利的。由於圍棋是零和游戲,這就可以達到最優解。這是一個由底往上的過程:先把搜索樹畫到我們可以承受的深度,然后逐層往上取最大值或最小值回溯,就可以看到雙方的正解(如果勝率評估是准確的)。而實際編程的時候,是往下不斷生長節點,然后動態更新每個父節點的勝率值。
下圖是一個更多層的例子:
值得注意的是,在實際對局中,勝率評估會有不准確的地方,這就會導致“地平線效應”,即由於電腦思考的深度不夠,且勝率評估不夠准確,因此沒有看見正解。
Minimax 搜索還有許多后續發展,如課本會說的 Alpha-beta 剪枝,以及更進一步的 Null Window / NegaScout / MTD(f) 等等。可惜這些方法更適合象棋等棋類,對於圍棋的意義不大(除非已經接近終局),請讀者思考原因。
蒙特卡洛樹搜索和蒙特卡洛方法的區別在於:
- 如果用蒙特卡洛方法做上一百萬次模擬,b1和b2的勝率仍然會固定在49%和55%,不會進步,永遠錯誤。所以它的結果存在偏差(Bias),當然,也有方差(Variance)。
- 而蒙特卡洛樹搜索在一段時間模擬后,b1和b2的勝率就會向48%和45%收斂,從而給出正確的答案。所以它的結果不存在偏差(Bias),只存在方差(Variance)。但是,對於復雜的局面,它仍然有可能長期陷入陷阱,直到很久之后才開始收斂到正確答案。
二、蒙特卡洛樹搜索
如果想把 Minimax 搜索運用到圍棋上,立刻會遇到兩個大問題:
- 搜索樹太廣。棋盤太大了,每一方在每一步都有很多着法可選。
- 很難評估勝率。除非把搜索樹走到終局,這意味着要走夠三百多步(因為對於電腦來說,甚至很難判斷何時才是雙方都同意的終局,所以只能傻傻地填子,一直到雙方都真的沒地方可以走為止)。簡單地說,搜索樹也需要特別深。
蒙特卡洛樹搜索的意義在於部分解決了上述兩個問題:
- 它可以給出一個局面評估,雖然不准,但比沒有強。這就部分解決了第二個問題。
- 根據它的設計,搜索樹會較好地自動集中到“更值得搜索的變化”(注意,也不一定准)。如果發現一個不錯的着法,蒙特卡洛樹搜索會較快地把它看到很深,可以說它結合了廣度優先搜索和深度優先搜索,類似於啟發式搜索。這就部分解決了第一個問題。

上圖中每個節點代表一個局面。而 A/B 代表這個節點被訪問 B 次,黑棋勝利了 A 次。例如一開始的根節點是 12/21,代表總共模擬了 21 次,黑棋勝利了 12 次。
我們將不斷重復一個過程(很多萬次):
- 這個過程的第一步叫選擇(Selection)。從根節點往下走,每次都選一個“最值得看的子節點”(具體規則稍后說),直到來到一個“存在未擴展的子節點”的節點,如圖中的 3/3 節點。什么叫做“存在未擴展的子節點”,其實就是指這個局面存在未走過的后續着法。
- 第二步叫擴展(Expansion),我們給這個節點加上一個 0/0 子節點,對應之前所說的“未擴展的子節點”,就是還沒有試過的一個着法。
- 第三步是模擬(Simluation)。從上面這個沒有試過的着法開始,用快速走子策略(Rollout policy)走到底,得到一個勝負結果。按照普遍的觀點,快速走子策略適合選擇一個棋力很弱但走子很快的策略。因為如果這個策略走得慢(比如用 AlphaGo 的策略網絡走棋),雖然棋力會更強,結果會更准確,但由於耗時多了,在單位時間內的模擬次數就少了,所以不一定會棋力更強,有可能會更弱。這也是為什么我們一般只模擬一次,因為如果模擬多次,雖然更准確,但更慢。
- 第四步是回溯(Backpropagation)。把模擬的結果加到它的所有父節點上。例如第三步模擬的結果是 0/1(代表黑棋失敗),那么就把這個節點的所有父節點加上 0/1。
三、重要細節
怎么選擇節點?和從前一樣:如果輪到黑棋走,就選對於黑棋有利的;如果輪到白棋走,就選對於黑棋最不利的。但不能太貪心,不能每次都只選擇“最有利的/最不利的”,因為這會意味着搜索樹的廣度不夠,容易忽略實際更好的選擇。
因此,最簡單有效的選擇公式是這樣的:
其中 x 是節點的當前勝率估計(注意,如前所述,要考慮當前是黑棋走還是白棋走!),N 是節點的訪問次數。C 是一個常數。C 越大就越偏向於廣度搜索,C 越小就越偏向於深度搜索。注意對於原始的 UCT 有一個理論最優的 C 值,但由於我們的目標並不是最小化“遺憾”,因此需要根據實際情況調參。
我們看例子說明這是什么意思,就看之前的圖吧。假設根節點是輪到黑棋走。那么我們首先需要在 7/10、5/8、0/3 之間選擇:
- 其中 7/10 對應的分數為
。
- 其中 5/8 對應的分數為
。
- 其中 0/3 對應的分數為
。
- 可以注意到,C越大,就會越照顧訪問次數相對較少的子節點。
- 其中 2/4 對應的分數為
。
- 其中 5/6 對應的分數為
。
那么我們下一步肯定應該選 2/4。所以說之前的圖是錯誤的,因為制圖的人並沒有注意到要把勝率倒過來(有朋友會說是不是可以認為它的白圈代表白棋的勝率,但這樣它的回溯過程就是錯的)。
最后,AlphaGo 的策略網絡,可以用於改進上述的分數公式,讓我們更准確地選擇需擴展的節點。而 AlphaGo 的價值網絡,可以與快速走子策略的模擬結果相結合,得到更准確的局面評估結果。注意,如果想寫出高效的程序,這里還有很多細節,因為策略網絡和價值網絡的運行畢竟需要時間,我們不希望等到網絡給出結果再進行下一步,在等的時候可以先做其它事情,例如 AlphaGo 還有一個所謂 Tree policy,是在策略網絡給出結果之前先用着。
相信大家現在就可以寫出正確的 MCTS 程序了(注意:最終應該選擇訪問量最大的節點,而不是勝率最高的節點,簡單地說是因為訪問量最大的節點的結果更可靠)。如果要寫一個高效的程序,你會發現必須自己寫一個內存池。關於 MCTS 還有很多話題可以說,這篇就到這里吧。
本系列已更新多篇,其它幾篇的傳送門:
- (1) : 圍棋 AI 基礎 知乎專欄
- (2) : 安裝 MXNet 搭建深度學習環境 知乎專欄
- (3) : 訓練策略網絡,真正與之對弈 知乎專欄
- (4) : 對於策略網絡的深入分析(以及它的弱點所在) 知乎專欄
- (4.5):后文預告(Or 為什么你應該試試 Batch Normalization 和 ResNet)知乎專欄
- (5):結合強化學習與深度學習的 Policy Gradient(左右互搏自我進化的基礎) 知乎專欄
轉自:https://zhuanlan.zhihu.com/p/25345778