實現(xiàn)了一個中國象棋版本的 Alpha zero

先上代碼 github,這個項目現(xiàn)在仍然在積極開發(fā)和維護的階段,通過這個項目你可以組建自己的集群并且訓練自己的中國象棋 alpha go:

icyChessZero

中國有 13+億人,中國象棋的受眾也很廣,但是有關(guān)中國象棋 alpha go/zero 方面的開源項目其實并不多,國內(nèi)有名的更是幾根手指都能數(shù)過來,而且在內(nèi)容上高度相似,都是使用 alpha zero 的網(wǎng)絡 + alpha go 的訓練方式,列舉兩個相對突出一些的:

佳佳 zero: 是一個團隊在維護,把 Leela Zero(一個國際象棋 alpha zero 項目) 遷移來做中國象棋的項目,目前就 elo 分來說是最強的,有那么一丟丟商業(yè)化趨勢

cczero: 幾乎只有一個人在維護代碼,同樣是一個民間自發(fā)組成,維護的中國象棋項目,目標是最強開源項目

這兩個項目都是比較棒的,那么為什么我還要自己寫一個呢?這就要從更早說起了

早在 alpha go 出來之后,alpha zero 出來之前,我就有要用神經(jīng)網(wǎng)絡來做中國象棋的想法,不過那個時候其實大家都不太知道怎么做這個東西,畢竟象棋和圍棋很不一樣,我當時寫了一個比較幼稚的網(wǎng)絡,希望單純通過一個網(wǎng)絡,不加任何類似蒙特卡洛的算法來通過預測人類落子規(guī)律的方法來,畢竟在圍棋中一個單純的策略網(wǎng)絡就可以達到業(yè)余幾段的棋力水平,我追求的也并不是天下第一,業(yè)余幾段對于我來說,很 ok。

當時寫爬蟲爬了很多國內(nèi)比賽棋譜,包括了很多我們耳熟能詳?shù)南笃宕髱煹谋荣?,然后開始自己訓練一個網(wǎng)絡來預測人類的落子:

這個是我當時實現(xiàn)的那個很 naive 的網(wǎng)絡代碼:

icyElephant


我當時的方法是使用 2 個網(wǎng)絡來預測人類的一步,一個叫做 select 網(wǎng)絡(圖 1 中的網(wǎng)絡 1 )負責預測人類會移動哪個子,另一個叫 move 網(wǎng)絡,負責預測移動的子落子點在哪里,對比 alpha zero 的方法,alpha zero 使用一個網(wǎng)絡就完成了兩個工作:


從直覺上來說,似乎先預測選子,再預測落子的網(wǎng)絡邏輯更符合人類的思考過程,然而這兩個網(wǎng)絡,在實際使用真實對局數(shù)據(jù)訓練時準確率相差非常?。?/p>


并且我當時的方法( select-move 網(wǎng)絡)不適合用在蒙特卡洛樹搜索中預測每個走法的概率,所以后來在寫 icyChessZero 的時候也是用了 alpha zero 的策略網(wǎng)絡的形式。在訓練完這個網(wǎng)絡之后,我發(fā)現(xiàn),雖然象棋走法預測的準確率也不算很低,但是單純和這個預測走子的網(wǎng)絡對弈,我發(fā)現(xiàn)這個網(wǎng)絡雖然開局有模有樣,但是一旦到了中局和殘局,網(wǎng)絡經(jīng)常作出匪夷所思的送子行為,這個現(xiàn)象我認為是因為圍棋和象棋的差異性造成的,由于圍棋的局勢更適合直接從棋盤評估(所謂的“勢”),而象棋則更多涉及邏輯推理。

到這一步為止,其實還是有很多項目都可以做到,比如說之前知乎有一篇系列文章:

ENG Bo:28 天自制你的 AlphaGo

叫 28 天自制 alpha go 的文章(雖然這個系列文章后來太監(jiān)了,作者賣燈去了,估計是因為算力不夠),但是再往下做的話,其實是有一定門檻的,使用蒙特卡洛樹進行子對弈,并且進行神經(jīng)網(wǎng)絡的增強學習訓練,需要巨大的算力,這個門檻,其他的開源項目一般是通過眾籌訓練的方式解決的,比如 cczero 和佳佳 zero,但是有越過這個門檻的,也就有沒越過這個門檻的,比如之前知乎上的另一個項目:

程世東:AlphaZero 實踐——中國象棋(附論文翻譯)

這個項目就因為訓練增強學習所需要的巨量資源所限制,雖然代碼寫出來了,但是因為算力不夠,作者在燒了幾百美元之后只能作罷。

那么我是怎么面對這個問題的呢?我利用了我在校生的身份,把手深到了我能夠到的每一臺 gpu 機器,求爺爺告奶奶的搞到了四五臺機器,組了一個集群,雖然仍然算力不夠,但是至少可以開始訓練了。

想要從根本上解決這個問題,只能用巨量的算力,但是我們也能通過一些提高效率的方法來緩解一些這個問題,一些常用的方法比如:

使用 c/c++ 加速代碼

使用多進程同時跑多個網(wǎng)絡的前向

使用協(xié)程來將多個前向組成 batch,提高 gpu 利用效率

使用協(xié)程 /多進程的蒙特卡洛樹算法,提速蒙特卡洛樹的搜索速度

使用多臺機器分布式跑棋譜,利用更多 gpu

除了 C/C++加速的方法我還沒有使用,其他的方法我都使用了,細節(jié)參考:

深入理解 alpha go 的方法并應用到中國象棋

在實現(xiàn)了使用蒙特卡洛樹搜索走子的功能之后,我讓監(jiān)督學習的網(wǎng)絡 和 監(jiān)督學習+蒙特卡洛樹的兩種算法進行了對戰(zhàn),結(jié)果如下:


在 29 盤對局中,蒙特卡洛樹一盤都沒有輸,平的 5 局都是超出當時的步數(shù)限制( 100 步,為了節(jié)省時間)判和的,判和時無一例外都是 mcts 優(yōu)勢。這明確證明蒙特卡洛樹能夠有效提升 policy 網(wǎng)絡的棋力。

這個項目原理簡單,但是實現(xiàn)起來全是邏輯,我從三月(存疑)開始寫,一直沒時間寫,斷斷續(xù)續(xù)的寫,5 月跑了幾天,出了一些 bug,后來一堆事情又涌上來,這項目就又擱置了起來,到 7,8 月,我意外的發(fā)現(xiàn)終于又有一些時間了,于是終于,我完成了我的中國象棋 alpha go zero 的第一版。

然后開始了漫長的訓練過程,由于我的算力非常有限,到目前為止也只是一個 4,5 臺 gpu server 的集群在訓練這個版本的 alpha zero,我一開始的評估結(jié)果是以實驗室的資源大概至少 10 年能跑出來吧,后來隨著計算越來越精確,我發(fā)現(xiàn)在短短一年,甚至半年之內(nèi)完成訓練是很有可能的(我的目標只是達到中上人類水平,由于收到算力和時間的限制),但是一臺機器肯定不夠,需要有很多機器,于是我寫了分布式版本,甚至花了一周時間重構(gòu)了很多代碼,這次重構(gòu)以后一些 bug 莫名其妙的消失了,elo 曲線總算開始正常上升。




ps 一句:如果你在北郵有閑置的 GPU 服務器的權(quán)限,又有意愿加入集群一起訓練,希望能夠聯(lián)系我

我認為,并不是只有訓練出一個最強的網(wǎng)絡才是有價值的(當然如果有資源能夠訓練最強的我也不介意 [手動捂臉] ),探究在這個訓練過程中的優(yōu)化點,考究 alpha zero 這個強化學習過程中是否有不合理的地方,這些都是有價值的。

這次開源的代碼同時包含了集群 master 和 slave 的代碼,一個組建集群的 minimal sample 我已經(jīng)上傳到了 google drive:

colab.research.google.com/drive/1sC-g…

這個 minimal sample 可以直接用 google colab (免費)運行,只要把這個文件存到自己的 google drive 之后用 colab 打開就行(注意開啟 gpu 加速):


在 google colab 中運行這個 minimal sample 的所有代碼,應該能夠看到類似下面的結(jié)果,說明一個隨機的權(quán)重已經(jīng)被初始化并且用于蒙特卡洛樹的子對弈:


根據(jù)其他項目的進度和情況,想要達到我的小目標應該需要 4000 ~ 5000 elo 的分數(shù),現(xiàn)在這個項目已經(jīng)達到了 700elo 左右的分數(shù),所以達到目標并不是不可能的。

另外這個項目參考了很多同類項目的實現(xiàn),比如:

zhuanlan.zhihu.com/p/34433581

cczero.org/

github.com/junxiaosong…

寫這個項目的目的也是希望在探索的路上多走一條道,多一個人。

最后給其他對 alpha zero 算法感興趣的人一點建議:

如果沒有足夠算力的話,沒事不要碰象棋,圍棋這種復雜游戲,可以從五子棋這種簡單游戲入手訓練,五子棋這種簡單游戲?qū)λ懔Φ拈T檻要求會低很多。

另外,如果想探討一些技術(shù)問題可以站內(nèi)私聊,評論,或者通過icybee@yeah.net聯(lián)系我

作者:icybee

鏈接:https://juejin.im/post/5b727fdd518825614653b471

來源:掘金

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 2016年3月,Alpha Go Master擊敗最強的人類圍棋選手之一李世石。擊敗李的版本,在訓練過程中使用了大...
    桂糊涂閱讀 11,822評論 0 7
  • 作者簡介:王晶,Google廣告大數(shù)據(jù)部門資深工程師,從事機器學習算法研發(fā),2014年博士畢業(yè)于波士頓大學,主要研...
    hzyido閱讀 3,267評論 0 12
  • 今天收到我家先生送的花,心情嘛自然是好的不要不要的,畢竟這是他除了結(jié)婚送我的手捧花以外,第一次另外單獨送花給我,雖...
    坤凝閱讀 376評論 0 0
  • 09/28/2017 周四 丁酉年 八月初九日
    媽媽熊閱讀 99評論 0 0
  • 溫庭筠 晨起動征鐸,客行悲故鄉(xiāng)。 雞聲茅店月,人跡板橋霜。 槲葉落山路,枳花明(照)驛墻。 因思杜陵夢,鳧雁滿回...
    木蕭蕭兮_初霽閱讀 777評論 0 0

友情鏈接更多精彩內(nèi)容