此文也是接續前文繼續學習Go Further在githup提供的學習資料,需要不斷完善理解建模思想。
圍棋建模方案優化:
接上文提到使用CNN模仿人類下棋構建的模型存在學會臭棋的問題,據Aja Huang本人說,這個網絡的棋力大概相當于業余6段所有的的人類選手,遠遠未能超過當時最強的圍棋電腦程序CrazyStone。Aja Huang的老師Remi Colulum在2006年對圍棋AI做出的另一大重要突破《Efficient Selectivity and Backup Operators in Monte-Carlo Tree Search》,也就是蒙特卡洛搜索樹(Monte-Carlo Tree Search)。
蒙特卡洛搜索樹(Monte-Carlo Tree Search)基本思想是:
首先模擬一盤對決,使用的思路是:隨機。
當面對一個空白棋盤s0,最初對棋盤一無所知,假設所有落子的方法分值都相等,并設為1。
之后,隨機從361種方法(即棋盤位置)中選一種走法a0,在這一步后,棋盤狀態變為 s1,之后假設對方也和自己一樣,隨機走了一步,此時棋盤狀態變為s2。
重復以上步驟直到 sn,并且雙方分出勝負,此時便完整的模擬完了一盤棋,用變量r記錄此輪下棋結果,勝利記為1,失敗則為0。
那么此行為可轉化為,如果這一盤贏了,那意味著這一連串的下法比對面要明智一些,畢竟最后贏了,那么把這次落子方法 (s0,a0)記下來,并把它的分值變化:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 公式1:新分數=初始分數+r
同理,可以把之后所有隨機出來的落子方法 (si,ai)都應用公式1,即都加1分。之后開始第二次模擬,這一次,我們對棋盤不是一無所知了,至少在 s0狀態我們知道落子方法 a0的分值是2,其他都是1,我們使用這個數據的方法是:在這次隨機中,我們隨機到a0狀態的概率要比其他方法高一點。
之后,我們不斷重復以上步驟,這樣,那些看起來不錯(以最后的勝負來作為判斷依據)的落子方案的分數就會越來越高,并且這些落子方案也是比較有前途的,會被更多的選擇。
最后,當進行了10萬盤棋后,在此狀態選擇分數最高的方案落子,此時,才真正下了這步棋。這種過程在論文里被稱為Rollout。
Aja Huang很快意識到這種方法的缺陷在哪里:初始策略(或者說隨機的落子方式)太過簡單。人類對每種s(棋型)都要更強的判斷能力,那么我們是否可以用 P(s)來代替隨機呢?
Aja Huang改進了MCTS,每一步不使用隨機,而是現根據 P(s)(備注:此處P(s)是前文提到的模擬人類棋譜學習到的每個s對應的a)計算得到a可能的概率分布,以這兒概率為準來挑選下一個a。一次棋局下完之后,新分數按照下面的方式來更新
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 公式2:新分數=調整后的初始分+通過模擬的贏棋概率
如果某一步被隨機到很多次,就應該主要依據模擬得到的概率而非 P(s),就是說當盤數不斷的增加,模擬得到的結果可能會好于P(s)得到的結果。
所以 P(s)的初始分會被打個折扣,這也是公式2中的調整后的初始分的由來
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 公式3:調整后的初始分=P(s)/(被隨機到的次數+1)
如此一來,就在整張地圖上利用P(s)快速定位了比較好的落子方案,也增加了其他位置的概率。實際操作中發現,此方案不可行,因為計算這個P(s) 太慢了太慢了(此處所指太慢不是太理解,可能是指CNN訓練慢,但是據我了解提前訓練好之后是可直接使用結果,不需要在算的,此處先跳過留后續搞明白),一次P(s)的計算需要3ms,隨機算法1us,慢了3000倍,所以,Aja huang訓練了一個簡化版本的P(s),把神經網絡層數、輸入特征減少,耗時下降到2us,基本滿足了要求。
更多的策略是,先以 P(s)開局,走前面大概20步,之后再使用 P(s)走完剩下的到最后。兼顧速度和準確性。綜合了深度卷積神經網絡和MCTS兩種方案,此時的圍棋程序已經可以戰勝所有其他電腦,雖然和其他人類職業選手還有一定的差距。