1. 程式人生 > >蒙特卡洛樹搜尋(MCTS)

蒙特卡洛樹搜尋(MCTS)

許多人會混淆蒙特卡洛樹搜尋和蒙特卡洛方法。這兩者有本質區別。用做過渲染器的朋友會理解的話來說:蒙特卡洛方法有偏差(Bias),而MCTS沒有偏差(Bias)。
而蒙特卡洛樹搜尋在一段時間模擬後,b1和b2的勝率就會向48%和45%(或者其他概率)收斂,從而給出正確的答案

下圖是一個例子

這裡寫圖片描述

上圖中每個節點代表一個局面。而 A/B 代表這個節點被訪問 B 次,黑棋勝利了 A 次。例如一開始的根節點是 12/21,代表總共模擬了 21 次,黑棋勝利了 12 次。
我們將不斷重複一個過程(很多萬次):

1,這個過程的第一步叫選擇(Selection)。從根節點往下走,每次都選一個“最值得看的子節點”(如果輪到黑棋走,就選對於黑棋有利的;如果輪到白棋走,就選對於黑棋最不利的。但不能太貪心,不能每次都只選擇“最有利的/最不利的”,因為這會意味著搜尋樹的廣度不夠,容易忽略實際更好的選擇,我們使用UCB選擇公式,調節引數C,兼顧廣度和深度),直到來到一個“存在未擴充套件的子節點”的節點,如圖中的 3/3 節點。什麼叫做“存在未擴充套件的子節點”,其實就是指這個局面存在未走過的後續著法。
(注意,如果是對方棋子走,需要把勝率估計倒過來,上圖有錯誤)

2,第二步叫擴充套件(Expansion),我們給這個節點加上一個 0/0 子節點,對應之前所說的“未擴充套件的子節點”,就是還沒有試過的一個著法。

3,第三步是模擬(Simluation)。從上面這個沒有試過的著法開始,用快速走子策略(Rollout policy)走到底,得到一個勝負結果。按照普遍的觀點,快速走子策略適合選擇一個棋力很弱但走子很快的策略。因為如果這個策略走得慢(比如用 AlphaGo 的策略網路走棋),雖然棋力會更強,結果會更準確,但由於耗時多了,在單位時間內的模擬次數就少了,所以不一定會棋力更強,有可能會更弱。這也是為什麼我們一般只模擬一次,因為如果模擬多次,雖然更準確,但更慢。

4,第四步是回溯(Backpropagation)。把模擬的結果加到它的所有父節點上。例如第三步模擬的結果是 0/1(代表黑棋失敗),那麼就把這個節點的所有父結點加0/1。

注意:最終應該選擇訪問量最大的節點,而不是勝率最高的節點,簡單地說是因為訪問量最大的節點的結果更可靠