[譯]什麼是蒙特卡洛樹搜索

什麼是蒙特卡洛樹搜索

蒙特卡洛樹搜索(MCTS)是一種在人工智能問題中進行決策優化的方法,一般是對於那些在組合遊戲中須要移動規劃的部分。蒙特卡洛樹搜索將隨機模擬的通用性與樹搜索的準確性進行告終合。html

馮·諾依曼於 1928 年提出的極小化極大理論(minimax)爲以後的對抗性樹搜索方法鋪平了道路,而這些在計算機科學和人工智能剛剛成立的時候就成爲了決策理論的根基。蒙特卡洛方法經過隨機採樣解決問題,隨後在 20 世紀 40 年代,被做爲了一種解決模糊定義問題而不適合直接樹搜索的方法。Rémi Coulomb 於 2006 年將這兩種方法結合,來提供一種新的方法做爲圍棋中的移動規劃,現在稱爲蒙特卡洛樹搜索(MCTS)。前端

近期因爲它在計算機圍棋上的成果和對某些難題具備解決的潛力,科研領域對於 MCTS 的研究興趣快速上升。它的應用領域已不止於博弈,並且理論上 MCTS 能夠應用於任何可以以 {狀態,動做} 形式描述,經過模擬來預測結果的領域。java


基本算法

最基本的 MCTS 算法自己就是簡單的:根據模擬出來的結果,創建一棵節點相連的搜索樹。整個過程能夠被分解爲以下幾步:python

1.選擇react

從根節點 R 開始,遞歸地選擇最優子節點(下面會解釋)直到一個葉子節點 L 爲止。android

2.擴展ios

若是 L 不是終止節點(就是說,博弈還沒有結束)那麼就建立一個或多個子節點,並選擇其中一個 C。git

3.模擬github

從 C 執行一次模擬推出(譯者注:一般稱爲 playout 或 rollout)直到獲得一個結果。算法

4.反向傳播

用模擬出來的結果更新當前的移動序列。

每個節點必須包含兩部分重要的信息:基於模擬所得結果的估值,和被訪問的次數

在最簡單和最大化利用內存的執行中,MCTS 會在每次迭代中添加一個子節點。注意,在某些狀況下每次迭代增長多個子節點可能會更有益。


節點的選擇

老虎機與 UCB 算法

在樹遞歸地向下發展時的節點的選擇,是取決於該節點是否最大化了某些數量,相似於多臂老虎機問題:即玩家每回合都要選擇那個可以帶給他們最大化收益的老虎機。接下來的上限置信區間(Upper Confidence Bounds, UCB)公式一般會被用到:

其中 vi 是節點的估值,ni 是節點被訪問的次數而 N 是它的父親節點被訪問的總次數。C 是可調的偏置參數。

利用性 vs 探索性

UCB 公式在利用性探索性之間提供了不錯的平衡,鼓勵訪問不曾訪問過的節點。獎勵是基於隨機模擬的,因此節點在變的可靠以前必須被訪問必定的次數。MCTS 估值每每在開始的表現會很是不可靠,但隨着足夠多的時間而逐漸向可靠的估值收斂,如有無限多的時間則能夠收斂至最優估值。

蒙特卡洛樹搜索(MCTS)與上限置信區間樹(UCT)

Kocsis 和 Szepervari (2006)首先利用 UCB 提出了一個完整的 MCTS 算法並命名爲上限置信區間樹(UCT)的方法。這個方法正是現在被大多數人採用於 MCTS 的實施中的算法。
UCT 能夠被描述爲 MCTS 的一種特殊狀況,即:

UCT = MCTS + UCB

優勢

MCTS 相對傳統樹搜索方法具備一些不錯的優勢。

上下文無關

MCTS最大的好處就在於它無需知道該博弈(或者其餘問題領域)的任何戰術或策略。這個算法能夠無需知道任何該博弈的信息(除了可進行的動做和終止條件)。這意味着任何的 MCTS 的實現方案能夠在僅僅修改一小部分後便移植到其餘的博弈中,對於全部的博弈問題來講 MCTS 的這個特性也是一種隱形的好處。

非對稱樹增加(Asymmetric Tree Growth)

MCTS 表現出一種非對稱的樹增加來適應搜索空間的拓撲。算法會訪問其更‘感興趣’的節點,並將搜索空間集中於更加相關的部分。

這使得 MCTS 很適合於擁有大量影響因素的博弈中,如 19x19 大小的圍棋。如此巨大的空間組合每每會使得標準的深度或廣度搜索方法出現問題,但 MCTS 的適應特性意味着它會(最終)找到那些更爲優秀的移動(動做)並專一於那裏的搜索。

優雅的退出

算法能夠在任意時間停止並返回當前最佳的評估策略。創建的搜索樹能夠被拋棄或爲之後的複用而保留。

易用性

算法很是易於實現,可見教程。(譯者注:pythonjava 源碼及相關知識點可在此找到)


缺點

MCTS 雖然只有少許缺陷,但他們能夠很嚴重(影響樹搜索的效果)。

博弈強度

MCTS 算法,在最基本的形式下,即便針對中等複雜度的博弈也有可能在必定時間內不可以給出很好的決策。這極可能是因爲決策空間的絕對大小和關鍵樹節點在沒有被訪問足夠多的次數的狀況下不可以給出可靠的估值的緣由。

幸運的是,算法的表現能夠經過一些技巧來提高。


提高方法

這裏有兩種方法可能有益於提高 MCTS 的實現:一個是對於特定領域,另外一個對於全部的領域。

特定的領域(知識)

對於特定博弈的領域知識一般會在進行模擬的階段被開發出來,這樣獲得的推出或決策(playout)會與人類的選手的動做更加類似。這意味着推出的結果會變的比隨機模擬更加的真實而且節點會在更少的迭代後產生真實可靠的估值。

特定的領域知識提高方法每每須要知道當前博弈已知的一些技巧,如圍棋中的捕捉動做或者六貫棋中的橋指令。它們對當前博弈有巨大的提高效果,不過同時也犧牲了通用性。

領域獨立(提高方法)

領域獨立提高方法有着很大的應用範圍,是 MCTS 算法研究中的聖盃,也是當今不少研究所瞄準的方向。許多這樣的提高被提出並與不一樣層面的成功相吻合,從簡單(博弈並獲勝的移動/避免在推出中可能失敗的移動)到複雜的節點初始化和選擇方法,還有元策略。
能夠經過瀏覽提高列表來查看 MCTS 更多提高的細節


成立的研究課題

MCTS 還是研究領域中的新的部分,有許多正在進行的研究課題。

算法提高

幾乎全部針對基本算法作出的提高建議都須要更多的研究。能夠參考該提高列表

自動化調參

最簡單的一個問題是,如何動態地調整搜索參數,如 UCB 中的偏置參數,來最大化算法效果,而且是否其餘方面的搜索算法也能相似地被參數化呢。

節點擴展

有些應用適合於每次迭代擴展一個節點,而有些則適合多個。至今還沒有有清晰的指導來告訴咱們哪些狀況下應該使用哪一個策略,而且是否能夠被自動化。

節點可靠性

若能基於情景和節點在搜索樹中的相對位置,知道一個節點要被訪問了多少次以後纔會變得可靠,會很是有用處。

樹形狀分析

咱們在這一方面已經針對 UCT 樹會不會根據所給博弈的特定而產生另外一些特徵,進行了初步的研究(Williams 2010)。有着不錯的結果。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索