https://blog.csdn.net/natsu1211/article/details/50986810, 感謝分享!node
Intro
最近阿法狗和李師師的人機大戰着實火了一把,還順帶捧紅了柯傑,古力等一干九段。雖然我從小學的是象棋,對圍棋也只是略知一二,可是棋魂仍是對我影響頗深的啓蒙漫畫,因而仍是湊熱鬧看了幾盤大戰。其中蒙特卡洛樹搜索(Monte Calro Tree Search, MCTS)就屢次被各路磚家說起。想必各位選過AI課的同窗都知道Minimax tree和Alpha-beta剪枝等各類技巧。歸根到底,這些傳統AI技術仍是暴力搜索,將遊戲中全部的可能性表示成一棵樹,樹的第N層就表明着遊戲中的第N步。樹的node數是隨着樹的深度成指數增加的,不考慮剪枝,每一個node都是須要進行估值的。
Minimax tree在諸如象棋,黑白棋等傳統遊戲中取得了巨大的成功,主要緣由仍是有兩個,
1. 遊戲自己的探索空間相對較小(好比象棋大概是10^50),配合剪枝,開局和殺棋棋譜,非平衡樹探索等優化技術,加上並行計算和Iterative Deepening,使得探索到樹的深層甚至底層成爲可能。
2. 搜素的最終目的就是找出對本身最有利的一步,而判斷是否是有利天然須要必定的評判標準。通常咱們用一個評價函數來做爲標準。象棋等遊戲的子有不一樣的強弱,而且有明確的目的性(諸如殺死對方的王),容易人工設計出或者經過機器學習得出一個良好的評價函數來正確評估一步落子所引起的後續局面。算法
可是圍棋爲何一直搞不定?主要緣由也仍是那兩個,
1. 圍棋的棋盤是19x19,除去不能下在眼裏,圍棋第N步的可能下法有362-N種,探索空間要大不少(大概是10^171)。傳統方法往下算幾層基本就算不動了,難以正確找到最有利的下法。
2. 難以找到一個合適的評價函數。和象棋的子有強弱不一樣,圍棋中的每一個子很難給予一個明確的價值,因此對整個局面也難以作出一個正確的判斷。網絡
因此傳統方法一直沒法攻克圍棋的難關。既然之前的路是死路一條(感興趣的同窗能夠看看[2],裏面有前人在這條路上的各類探索,他們根據圍棋的規則對盤面上的子進行各類抽象,創造出了很是複雜的評價函數,而且制定了一些IF-THEN規則來教程序下棋,惋惜依然沒法達到專業棋手的水平),那麼只能另闢蹊徑,這條蹊徑就是蒙特卡洛樹探索(下文MCTS)了。可是MCTS到底是個什麼玩意?蒙特卡洛方法用到樹探索裏?老實說看直播的時候我還不是很清楚。最後仍是翻看了一些資料和論文,包括阿法狗的論文,才終於明白是怎麼一回事。機器學習
Pure Monte Calro Go
首先,蒙特卡洛方法你們都知道,利用隨機採樣的樣本值來估計真實值,理論基礎是中心極限定理。先不考慮樹搜索的事,就單純的用蒙特卡洛方法來下棋[1, 2](最先在1993年被提出,後在2001被再次提出)。咱們能夠簡單的用隨機比賽的方式來評價某一步落子。從須要評價的那一步開始,雙方隨機落子,直到一局比賽結束。爲了保證結果的準確性,這樣的隨機對局一般須要進行上萬盤,記錄下每一盤的結果(好比接下來的落子是黑子,那就根據中國規則記錄黑子勝了或輸了多少子),最後取這些結果的平均,就能獲得某一步棋的評價。最後要作的就是取評價最高的一步落子做爲接下來的落子。也就是說爲了決定一步落子就須要程序本身進行上萬局的隨機對局,這對隨機對局的速度也提出了必定的要求。和使用了大量圍棋知識的傳統方法相比,這種方法的好處顯而易見,就是幾乎不須要圍棋的專業知識,只需經過大量的隨機對局就能估計出一步棋的價值。再加上諸如All-Moves-As-First等優化方法,基於純蒙特卡洛方法的圍棋程序已經可以匹敵最強的傳統圍棋程序。ide
Monte Carlo Tree Search
既然蒙特卡洛的路彷佛充滿着光明,咱們就應該沿着這條路繼續前行。MCTS也就是將以上想法融入到樹搜索中,利用樹結構來更加高效的進行節點值的更新和選擇。通常來講,MCTS操做分爲4個部分[3], 函數
Selection
從root node開始,根據Tree Policy依次選擇最佳的child node,直到到達leaf node。Tree Policy就是選擇節點(落子)的策略,它的好壞直接影響搜索的好壞,因此是MCTS的一個研究重點。好比上面說的選擇平均贏子數最多的走法就是一種Tree Policy。而目前普遍採用的策略有UCT,後面會詳說。
Expansion
擴展leaf node,將一個或多個可行的落子添加爲該leaf node的child node。具體如何暫開,各個程序各有不一樣。
Simulation
根據Default Policy從擴展的位置下棋到終局。徹底隨機落子就是一種最簡單的Default Policy。固然徹底隨機天然是比較弱的,經過加上一些先驗知識等方法改進這一部分可以更加準確的估計落子的價值,增長程序的棋力。
Backpropagation
將Simulation的結果沿着傳遞路徑反向傳遞迴root node。
UCT & UCB
那麼目前普遍採用的UCT的又是個什麼呢。UCT的全稱是UCB for Trees [4],UCB指的是Upper Confidence Bounds [5],不過光看名字果真仍是不明因此。
其實這個算法是有很深入的背景的,bandit你們都玩過吧,假設有一排總共K臺bandit,每臺機子的指望收益是不同的而且是固定的,可是咱們並不知道各臺機子的設置(不知道收益的分佈),假設每次投入的本金都是同樣的,那麼如何規劃每次玩哪臺機子來使本身得到最大收益呢,這就是K-armed bandit problem了。
容易想到,若是咱們每次都可以將本金投入到指望收益最高的那臺機子上,天然能夠得到理論上最大的收益。可是惋惜咱們並不知道哪臺機子是最好的,因此一方面咱們須要分出成本去了解各個機子的收益狀況,可是在收益不高的機子上投入太多成本天然是虧損的,因此也須要在當前發現的收益最高的bandit上投入成本。這是一個exploitation-exploration(收穫-探索)困局。咱們須要一個好的策略來掌握好探索和收穫之間平衡。而UCB是一個(準確說是一類)能有效解決這個問題的方法。雖然要說清楚這個方法並不容易,不過仍是讓咱們再深刻一點,
首先,將因爲沒有選中最佳機器所形成的累積虧損記爲regret(t),t爲玩bandit的總次數。這個問題有一個理論極限,在t足夠大的時候,必定有辦法將regret(t)抑制在ln(t)數量級上,可是不可能比ln(t)數量級還要小。固然,要達到理論值是很是麻煩的,UCB可以用一個相對簡單的方法讓維持在ln(t)數量級上(雖然常數項要大一些)。UCB的基本想法是不選取平均收益最高,而是選取置信上限最高的機器。爲何要這麼作呢,舉一個極端的例子,假若有兩臺bandit,一臺有0.8機率中獎的機子和一臺只有0.2機率中獎的機子,咱們能夠簡單的把每臺機子各玩兩次,可是很不幸的是機率0.8的那臺機子兩次都沒能中獎,而0.2機率的機子兩次都中獎了,若是咱們採用取最高均值的策略,那麼0.2機率的那臺機子將會被選中,而且由於這臺機子的平均值不會變爲0,勝率較高的那臺機器就沒有機會被選中了。這個方法的問題在於沒有進行足夠的探索,而是將成本都投入到了收穫中。實際上,平均收益只是對實際收益指望的一個估計,特別是採樣數較少的時候 ,均值極可能會與指望產生較大的偏離,咱們不該該直接把樣本的均值當成實際的指望,而是要對指望給出一個置信區間和置信水平(機率)。至於要如何計算這個置信區間,就要運用Chernoff-Hoeffding bound了(推導能夠參見[6]),
P(1n∑ni=1Xi≤μ−a)≤e−2a2nP(1n∑i=1nXi≤μ−a)≤e−2a2n
其中n表明樣本數(放在bandit問題裏面就是該臺機子被選中的次數),μ表明指望,稍微變形一下,
P(μ≥1n∑ni=1Xi+a)≤e−2a2nP(μ≥1n∑i=1nXi+a)≤e−2a2n
這個式子能夠用來肯定指望的置信上界,UCB方法中的UCB1使用置信水平1t41t4,根據等式1t4=e−2a2n1t4=e−2a2n,就能夠解出a=2lntn−−−√a=2lntn,
加上目前的平均收益,就獲得了收益指望的置信上限,同時也是UCB1的定義,
xj¯+2lntnj−−−√xj¯+2lntnj
其中j是bandit的編號。學習
若是咱們樂觀一些,認爲指望可以達到置信上限,那麼選擇具備最高UCB1的bandit就成爲了一個更好的策略。同時,咱們能夠注意觀察一下UCB1的定義,前半部分是當前的平均收益,這表明着收益,後半部分則是相對於平均收益的偏移,被選中次數越少則偏移會變得越大,有更大的可能被選中,這就保證了當前收益不是那麼高的機器也可以被探索到。這就很好的達成了收穫和探索之間的平衡。固然,UCB的思想並不只限運用於bandit,在圍棋中,從多種可能落子中選擇一步最好的一樣是相似的問題,也須要掌握好收穫與探索的平衡(可是也並不徹底相同 1.bandit問題的目的是要儘可能小的累積regret,而圍棋只要能找到最好的那一步就夠了,並不在意探索途中的regret。2. 指望是會變更的。因此UCT對UCB1進行了必定的變更,實際使用的是xj¯+2Cplntnj−−−√xj¯+2Cplntnj,也就是給偏移部分加上了一個正常數項)。而UCT就是將上述的UCB的思想運用到了樹搜索中,在Selection的階段, 老是選擇UCB值最大的node,直至leaf node。
弄明白了MCTS和UCT的原理,這裏咱們直接用wiki上面的例子來走一遍MCTS的操做,Tree Policy用的就是UCT,
首先,已經有必定量的節點被加入到樹中,從root node開始逐層往下選擇UCB值最高的node(圖中的11/21, 7/10, 5/6, 3/3),直到遇到leaf node(圖中的3/3),爲該節點添加子節點(圖中的0/0),隨後今後節點開始進行simulation,獲得結果並按照搜索下來的路徑將結果返回(注意這裏的結果和純蒙特卡洛方法並不同,只記錄勝負結果而不是子數,勝返回1,負則返回0),更新在路徑上的每個節點,在到達結束條件以前,這些操做會一直循環進行下去。能夠注意到MCTS是逐步構建搜索樹的,而且樹是非平衡發展的,更優的node有可能被搜索的更深。
確實MCTS的出現讓圍棋AI的棋力獲得了進步,最強的圍棋程序們也都通通採用了MCTS,可是它們的棋力離頂尖棋手依然有很遠的距離。優化
AlphaGo
就在MCTS的發展彷佛也要山窮水盡的時候,深度學習的發展讓AlphaGo橫空出世。可是仔細想一想又不算是橫空出世,一做Huang正是十年前最強的圍棋程序CrazyStone的做者,爲MCTS發展作出了貢獻的Coulom的學生,David Silver也是早在10年前就開始將強化學習運用在MoGo等程序中。可謂十年磨一劍了。人機大戰的結果咱們也都看見了,相比以前的Zen,CrazyStone等程序,阿法狗的棋力有了飛躍性的提高(從nature的那篇論文[7]中能夠看到,阿法狗對這些以前最強的程序的勝率幾乎達到100%,應該能夠說這是深度學習的威力)。
我對深度學習並不瞭解,並且已經有一篇田博士的講解文章了[8]。這裏我只想說說對MCTS部分的認識,
1. 在AlphaGo中,使用的Tree Policy能夠算是變形的UCT,
at=argmaxa(Q(st,a)+u(st,a))at=argmaxa(Q(st,a)+u(st,a))
這裏的s指的是一個state,表明一個盤面。a是指action,指下一步棋。從一個state作一個action,就會遷移到另外一個state,固然本質上和咱們以前用大白話作的分析沒啥區別。Q是累積平均勝率,u則是對於Q的偏移,也就是選擇讓Q+u最大的一步棋。Q在論文中的定義以下,
N(s,a)=∑ni=11(s,a,i)N(s,a)=∑i=1n1(s,a,i)
Q(s,a)=1N(s,a)∑ni=11(s,a,i)V(siL)Q(s,a)=1N(s,a)∑i=1n1(s,a,i)V(sLi)
V(sL)=(1−λ)vθ(sL)+λzLV(sL)=(1−λ)vθ(sL)+λzL
1(s,a,i)1(s,a,i)函數表明第i次simulation中邊(s,a)(s,a)所通向的節點有沒有被訪問到(論文中用的是邊(s,a)(s,a),也沒有本質區別。由於以前的分析用的都是節點,這裏爲了方便也說是節點),N(s,a)N(s,a)天然是全部的simulation中(s,a)所指向節點的訪問次數。
而V(sL)V(sL)則是一次simulation後,那個leaf node的勝率(也就是反向傳遞回去的結果),可是這裏的勝率並不簡單是simulation的結果(zLzL),而是綜合了估值網絡所給出的勝率(vθ(sL)vθ(sL)),λλ是權重係數。
而u(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)
P(s,a)P(s,a)是策略網絡輸出的當前局面s下落子a的機率。正如[8]中所說,說明探索剛開始時,策略網絡的影響比較大,而隨着探索的進行,策略網絡的影響慢慢下降,偏移慢慢變小,而真正在simulation中取得更好勝率的落子會更容易被選中。
2. [8]中提到的訪問leaf node累積訪問到40次才進行expansion,這是一個implementation上的細節,不過倒是很重要的。.net
References
[1] Monte Carlo Go, Bernd Brugmann, 1993
[2] Computer Go: An AI oriented survey, Bruno Bouzy et al., 2001
[3] A Survey of Monte Carlo Tree Search Methods, Cameron Browne et al., 2012
[4] Bandit based Monte-Carlo Planning, Levente Kocsis et al., 2006
[5] Finite-time Analysis of the Multiarmed Bandit Problem, PETER AUER et al., 2002
[6] https://www.zybuluo.com/qqiseeu/note/109942
[7] Mastering the game of Go with deep neural networks and tree search, David Silver et al., 2016
[8] http://zhuanlan.zhihu.com/yuandong/20607684
(至於格式嘛,請容許我偷個懶= =)
---------------------
做者:natsu1211
來源:CSDN
原文:https://blog.csdn.net/natsu1211/article/details/50986810
版權聲明:本文爲博主原創文章,轉載請附上博文連接!設計