國際象棋版AlphaZero出來了誒,還開源了Keras實現ヽ( `0′)ノ

原作 @Zeta36

Root 編譯自 全球最大同性交友網站

量子位 報道 | 公眾號 QbitAI

只用了不到4小時。

AlphaZero在去年底通過自我對弈,就完爆上一代圍棋冠軍程序AlphaGo,且沒有採用任何的人類經驗作訓練數據(至少DeepMind堅持這麼認為,嗯)。

昨天,GitHub有位大神@Zeta36用Keras造出來了國際象棋版本的AlphaZero,具體操作指南如下。

項目介紹

該項目用到的資源主要有:

  • 去年10月19號DeepMind發表的論文《不靠人類經驗知識,也能學會圍棋遊戲》
  • 基於DeepMind的想法,GitHub用戶@mokemokechicken所做的Reversi開發,具體前往https://github.com/mokemokechic
  • DeepMind剛發布的AlphaZero,從零開始掌握國際象棋:https://arxiv.org/pdf/1712.0181

之前量子位也報道過,AlphaZero僅用了4小時(30萬步)就擊敗了國際象棋冠軍程序Stockfish。是不是??賽雷(′?Д?)」

更多細節去wiki看唄。

筆記

我是這個信息庫(repositories,也簡稱repo)的創造者。

這個repo,由我和其他幾個小夥伴一起維護,並會盡我們所能做到最好。

repo地址:https://github.com/Zeta36/chess

不過,我們發現讓機器自己對弈,要燒很多錢。儘管監督學習的效果很好,但我們從來沒有嘗試過自我對弈。

在這裡呢,我還是想提下,我們已經轉移到一個新的repo,採用大多數人更習慣的AZ分散式版本的國際象棋(MCTS in C ++):https://github.com/glinscott/le

現在,項目差不多就要完成啦。

每個人都可以通過執行預編譯的Windows(或Linux)應用程序來參與。這個項目呢,我們趕腳自己做得還是不錯的。另外,我也很確定,在短時的分散式合作時間內,我們可以模擬出DeepMind結果。

所以呢,如果你希望能看到跑著神經網路的UCI引擎打敗國際象棋冠軍程序Stockfish,那我建議你去看看介個repo,然後肯定能增強你家電腦的能力。

使用環境

Python 3.6.3

tensorflow-gpu: 1.3.0

Keras: 2.0.8

最新結果 (在@Akababa用戶的大量修改貢獻後獲得的)

在約10萬次比賽中使用監督式學習,我訓練了一個模型(7個剩餘的256個濾波器塊),以1200個模擬/移動來估算1200 elo。 MCTS有個優點,它計算能力非常好。

下面動圖泥萌可以看到,我(黑色)在repo(白色)模型中對陣模型:

下面的圖,你可以看到其中一次對戰,我(白色,?2000 elo)在這個回購(黑色)中與模型對戰:

首個好成績

在用了我創建的新的監督式學習步驟之後,我已經能夠訓練出一個看著像是國際象棋開局的學習模型了。

下圖,大家可以看到這個模型的對戰(AI是黑色):

下面,是一場由@ bame55訓練的對戰(AI玩白色):

5次迭代後,這個模型就能玩成這樣了。這5次里,』eval』改變了4次最佳模型。而「opt」的損失是5.1(但結果已經相當好了)。

Modules

監督學習

我已經搞出來了一個監督學習新的流程。

從互聯網上找到的那些人類遊戲文件「PGN」,我們可以把它們當成遊戲數據的生成器。

這個監督學習流程也被用於AlphaGo的第一個和最初版本。

考慮到國際象棋算是比較複雜的遊戲,我們必須在開始自我對弈之前,先提前訓練好策略模型。也就是說,自我對弈對於象棋來說還是比較難。

使用新的監督學習流程,一開始運行挺簡單的。

而且,一旦模型與監督學習遊戲數據足夠融合,我們只需「監督學習」並啟動「自我」,模型將會開始邊自我對弈邊改進。

python src/chess_zero/run.py sl

如果你想使用這個新的監督學習流程,你得下載一個很大的PGN文件(國際象棋文件)。

並將它們粘貼到data / play_data文件夾中。BTW,FICS是一個很好的數據源。

您也可以使用SCID程序按照玩家ELO,把對弈的結果過濾。

為了避免過度擬合,我建議使用至少3000場對戰的數據集,不過不要超過3-4個運行周期。

強化學習

AlphaGo Zero實際上有三個workers:self,opt和eval。

self,自我模型,是通過使用BestModel的自我生成訓練數據。

opt,訓練模型,是用來訓練及生成下一代模型。

eval是評測模型,用於評估下一代模型是否優於BestModel。如果更好,就替換BestModel。

分散式訓練

現在可以通過分散式方式來訓練模型。唯一需要的是使用新參數:

輸入分散式:使用mini config進行測試,(參見src / chess_zero / configs / distributed.py)

分散式訓練時,您需要像下面這樣在本地運行三方玩家:

python src/chess_zero/run.py self —type distributed (or python src/chess_zero/run.py sl —type distributed)

python src/chess_zero/run.py opt —type distributed

python src/chess_zero/run.py eval —type distributed

圖形用戶界面(GUI)

  • uci啟動通用象棋界面,用於GUI。

為ChessZero設置一個GUI,將其指向C0uci.bat(或重命名為.sh)。例如,這是用Arena的自我對弈功能的隨機模型的屏幕截圖:

數據

  • data/model/modelbest: BestModel.
  • data/model/next_generation/: next-generation models.
  • data/playdata/play*.json: generated training data.
  • logs/main.log: log file.

如果您想從頭開始訓練模型,請刪除上述目錄。

使用說明

安裝

安裝庫

pip install -r requirements.txt

如果您想使用GPU,請按照以下說明使用pip3進行安裝。

確保Keras正在使用Tensorflow,並且你有Python 3.6.3+。根據您的環境,您可能需要運行python3 / pip3而不是python / pip。

基本使用

對於訓練模型,執行自我對弈模型,訓練模型和評估模型。

注意:請確保您正在從此repo的頂級目錄運行腳本,即python src / chess_zero / run.py opt,而不是python run.py opt。

自我對弈

python src/chess_zero/run.py self

執行時,自我對弈會開始用BestModel。如果不存在BestModel,就把創建的新的隨機模型搞成BestModel。

你可以這麼做

創建新的BestModel;

使用mini config進行測試,(參見src / chess_zero / configs / mini.py)。

訓練模型

python src/chess_zero/run.py opt

執行時,開始訓練。基礎模型會從最新保存的下一代模型中載入。如果不存在,就用BestModel。訓練好的模型每次也會自動保存。

你可以這麼做

輸入mini:使用mini config進行測試,(參見src / chess_zero / configs / mini.py)

用全套流程:指定整套流程的(小批量)編號,不過跑完全程會影響訓練的學習率。

評價模型

python src/chess_zero/run.py eval

執行後,開始評估。它通過玩大約200場對戰來評估BestModel和最新的下一代模型。如果下一代模型獲勝,它將成為BestModel。

你可以這麼做

輸入mini: 使用mini config進行測試,(請參閱src / chess_zero / configs / mini.py)

幾點小提示和內存相關知識點

GPU內存

通常來講,缺少內存會觸發警告,而不是錯誤。

如果發生錯誤,請嘗試更改src / configs / mini.py中的vram_frac,

self.vram_frac = 1.0

較小的batch_size能夠減少opt的內存使用量。可以嘗試在MiniConfig中更改TrainerConfig#batch_size。

最後,附原文鏈接,

github.com/Zeta36/chess

歡迎大家關注我們的專欄:量子位 - 知乎專欄

誠摯招聘

量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復「招聘」兩個字。

量子位 QbitAI · 頭條號簽約作者

?? ? 追蹤AI技術和產品新動態


推薦閱讀:

AlphaZero最革命性的一點是,它沒有棋子的概念 | 陳經
AlphaZero: 直覺是如何摧毀邏輯的

TAG:AlphaZero | 國際象棋 | Keras |