先上代碼 github歼秽,這個項目現(xiàn)在仍然在積極開發(fā)和維護的階段应役,通過這個項目你可以組建自己的集群并且訓練自己的中國象棋 alpha go:
中國有 13+億人,中國象棋的受眾也很廣燥筷,但是有關(guān)中國象棋 alpha go/zero 方面的開源項目其實并不多,國內(nèi)有名的更是幾根手指都能數(shù)過來箩祥,而且在內(nèi)容上高度相似,都是使用 alpha zero 的網(wǎng)絡(luò) + alpha go 的訓練方式肆氓,列舉兩個相對突出一些的:
佳佳 zero: 是一個團隊在維護袍祖,把 Leela Zero(一個國際象棋 alpha zero 項目) 遷移來做中國象棋的項目,目前就 elo 分來說是最強的谢揪,有那么一丟丟商業(yè)化趨勢
cczero: 幾乎只有一個人在維護代碼蕉陋,同樣是一個民間自發(fā)組成,維護的中國象棋項目捐凭,目標是最強開源項目
這兩個項目都是比較棒的,那么為什么我還要自己寫一個呢凳鬓?這就要從更早說起了
早在 alpha go 出來之后茁肠,alpha zero 出來之前,我就有要用神經(jīng)網(wǎng)絡(luò)來做中國象棋的想法缩举,不過那個時候其實大家都不太知道怎么做這個東西垦梆,畢竟象棋和圍棋很不一樣,我當時寫了一個比較幼稚的網(wǎng)絡(luò)蚁孔,希望單純通過一個網(wǎng)絡(luò)奶赔,不加任何類似蒙特卡洛的算法來通過預測人類落子規(guī)律的方法來,畢竟在圍棋中一個單純的策略網(wǎng)絡(luò)就可以達到業(yè)余幾段的棋力水平惋嚎,我追求的也并不是天下第一杠氢,業(yè)余幾段對于我來說,很 ok另伍。
當時寫爬蟲爬了很多國內(nèi)比賽棋譜鼻百,包括了很多我們耳熟能詳?shù)南笃宕髱煹谋荣悾缓箝_始自己訓練一個網(wǎng)絡(luò)來預測人類的落子:
這個是我當時實現(xiàn)的那個很 naive 的網(wǎng)絡(luò)代碼:
我當時的方法是使用 2 個網(wǎng)絡(luò)來預測人類的一步摆尝,一個叫做 select 網(wǎng)絡(luò)(圖 1 中的網(wǎng)絡(luò) 1 )負責預測人類會移動哪個子温艇,另一個叫 move 網(wǎng)絡(luò),負責預測移動的子落子點在哪里堕汞,對比 alpha zero 的方法勺爱,alpha zero 使用一個網(wǎng)絡(luò)就完成了兩個工作:
從直覺上來說,似乎先預測選子讯检,再預測落子的網(wǎng)絡(luò)邏輯更符合人類的思考過程琐鲁,然而這兩個網(wǎng)絡(luò),在實際使用真實對局數(shù)據(jù)訓練時準確率相差非常腥俗啤:
并且我當時的方法( select-move 網(wǎng)絡(luò))不適合用在蒙特卡洛樹搜索中預測每個走法的概率围段,所以后來在寫 icyChessZero 的時候也是用了 alpha zero 的策略網(wǎng)絡(luò)的形式。在訓練完這個網(wǎng)絡(luò)之后投放,我發(fā)現(xiàn)奈泪,雖然象棋走法預測的準確率也不算很低,但是單純和這個預測走子的網(wǎng)絡(luò)對弈灸芳,我發(fā)現(xiàn)這個網(wǎng)絡(luò)雖然開局有模有樣涝桅,但是一旦到了中局和殘局,網(wǎng)絡(luò)經(jīng)常作出匪夷所思的送子行為烙样,這個現(xiàn)象我認為是因為圍棋和象棋的差異性造成的冯遂,由于圍棋的局勢更適合直接從棋盤評估(所謂的“勢”),而象棋則更多涉及邏輯推理误阻。
到這一步為止债蜜,其實還是有很多項目都可以做到晴埂,比如說之前知乎有一篇系列文章:
叫 28 天自制 alpha go 的文章(雖然這個系列文章后來太監(jiān)了,作者賣燈去了寻定,估計是因為算力不夠)儒洛,但是再往下做的話,其實是有一定門檻的狼速,使用蒙特卡洛樹進行子對弈琅锻,并且進行神經(jīng)網(wǎng)絡(luò)的增強學習訓練,需要巨大的算力向胡,這個門檻恼蓬,其他的開源項目一般是通過眾籌訓練的方式解決的,比如 cczero 和佳佳 zero僵芹,但是有越過這個門檻的处硬,也就有沒越過這個門檻的,比如之前知乎上的另一個項目:
這個項目就因為訓練增強學習所需要的巨量資源所限制拇派,雖然代碼寫出來了荷辕,但是因為算力不夠,作者在燒了幾百美元之后只能作罷件豌。
那么我是怎么面對這個問題的呢疮方?我利用了我在校生的身份,把手深到了我能夠到的每一臺 gpu 機器茧彤,求爺爺告奶奶的搞到了四五臺機器骡显,組了一個集群,雖然仍然算力不夠曾掂,但是至少可以開始訓練了惫谤。
想要從根本上解決這個問題,只能用巨量的算力遭殉,但是我們也能通過一些提高效率的方法來緩解一些這個問題石挂,一些常用的方法比如:
使用 c/c++ 加速代碼
使用多進程同時跑多個網(wǎng)絡(luò)的前向
使用協(xié)程來將多個前向組成 batch,提高 gpu 利用效率
使用協(xié)程 /多進程的蒙特卡洛樹算法险污,提速蒙特卡洛樹的搜索速度
使用多臺機器分布式跑棋譜痹愚,利用更多 gpu
除了 C/C++加速的方法我還沒有使用,其他的方法我都使用了蛔糯,細節(jié)參考:
在實現(xiàn)了使用蒙特卡洛樹搜索走子的功能之后拯腮,我讓監(jiān)督學習的網(wǎng)絡(luò) 和 監(jiān)督學習+蒙特卡洛樹的兩種算法進行了對戰(zhàn),結(jié)果如下:
在 29 盤對局中蚁飒,蒙特卡洛樹一盤都沒有輸动壤,平的 5 局都是超出當時的步數(shù)限制( 100 步,為了節(jié)省時間)判和的淮逻,判和時無一例外都是 mcts 優(yōu)勢琼懊。這明確證明蒙特卡洛樹能夠有效提升 policy 網(wǎng)絡(luò)的棋力阁簸。
這個項目原理簡單敢会,但是實現(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)絡(luò)才是有價值的(當然如果有資源能夠訓練最強的我也不介意 [手動捂臉] )镐依,探究在這個訓練過程中的優(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)崇堰,比如:
寫這個項目的目的也是希望在探索的路上多走一條道沃于,多一個人。
最后給其他對 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)載請注明出處遭赂。