國際象棋版AlphaZero出來了誒,還開源了Keras實現ヽ( `0′)ノ
原作 @Zeta36
Root 編譯自 全球最大同性交友網站量子位 報道 | 公眾號 QbitAI
只用了不到4小時。
AlphaZero在去年底通過自我對弈,就完爆上一代圍棋冠軍程序AlphaGo,且沒有採用任何的人類經驗作訓練數據(至少DeepMind堅持這麼認為,嗯)。
昨天,GitHub有位大神@Zeta36用Keras造出來了國際象棋版本的AlphaZero,具體操作指南如下。
項目介紹
該項目用到的資源主要有:
- 去年10月19號DeepMind發表的論文《不靠人類經驗知識,也能學會圍棋遊戲》
- 基於DeepMind的想法,GitHub用戶@mokemokechicken所做的Reversi開發,具體前往https://http://github.com/mokemokechicken/reversi-alpha-zero
- DeepMind剛發布的AlphaZero,從零開始掌握國際象棋:https://http://arxiv.org/pdf/1712.01815.pdf。
之前量子位也報道過,AlphaZero僅用了4小時(30萬步)就擊敗了國際象棋冠軍程序Stockfish。是不是??賽雷(′?Д?)」
更多細節去wiki看唄。
筆記
我是這個信息庫(repositories,也簡稱repo)的創造者。
這個repo,由我和其他幾個小夥伴一起維護,並會盡我們所能做到最好。
repo地址:https://http://github.com/Zeta36/chess-alpha-zero/graphs/contributors
不過,我們發現讓機器自己對弈,要燒很多錢。儘管監督學習的效果很好,但我們從來沒有嘗試過自我對弈。
在這裡呢,我還是想提下,我們已經轉移到一個新的repo,採用大多數人更習慣的AZ分散式版本的國際象棋(MCTS in C ++):https://http://github.com/glinscott/leela-chess
現在,項目差不多就要完成啦。
每個人都可以通過執行預編譯的Windows(或Linux)應用程序來參與。這個項目呢,我們趕腳自己做得還是不錯的。另外,我也很確定,在短時的分散式合作時間內,我們可以模擬出DeepMind結果。
所以呢,如果你希望能看到跑著神經網路的UCI引擎打敗國際象棋冠軍程序Stockfish,那我建議你去看看介個repo,然後肯定能增強你家電腦的能力。
使用環境
Python 3.6.3
tensorflow-gpu: 1.3.0Keras: 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 distributedpython 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。
最後,附原文鏈接,
https://github.com/Zeta36/chess-alpha-zero/blob/master/readme.md— 完 —
歡迎大家關注我們的專欄:量子位 - 知乎專欄
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復「招聘」兩個字。
量子位 QbitAI · 頭條號簽約作者
?? ? 追蹤AI技術和產品新動態
推薦閱讀: