AlphaZero?國際象棋開源實現:Leela Chess
2017?年?12?月,DeepMind?發表了論文?[1712.01815] Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm,宣稱他們開發的新人工智慧?AlphaZero?通過?4?小時自我對弈,棋力超過?TCEC(頂尖國際象棋引擎錦標賽,在一台高性能伺服器上進行的引擎對戰,被認為是衡量引擎實力最公平的比賽)第九賽季冠軍,頂尖傳統國際象棋引擎?Stockfish(漢語譯名鱈魚乾)8。
論文一出,國際象棋引擎愛好者們炸開了鍋,同期進行的?TCEC?第十賽季決賽頓時變得索然無味。聊天室里被?AlphaZero?的話題霸佔,他們從最初的不服氣,到討論?AlphaZero?的真實實力究竟是高是低,甚至開始考慮讓?AlphaZero?進入?TCEC,接受來自傳統豪強的輪番挑戰。然而?DeepMind?從來不會為了證明自己去參加別人舉辦的比賽,這件事只能是愛好者們的幻想。
終於,幻想成為現實的可能性出現了。
Leela Chess?的誕生
AlphaGo Zero?發布後,就已經有了將強化學習應用於國際象棋的構想。西班牙開發者?Samuel Graván?於?2017?年?11?月(AlphaZero?論文發布前一個月)開發出?Zeta36/chess-alpha-zero,證明了國際象棋應用強化學習的可能性。AlphaZero?論文發布後,他看到了?AlphaGo Zero?開源實現,比利時開發者?Gian-Carlo Pascutto(也是國際象棋引擎?Sjeng?的開發者,Sjeng?的開源版本成為?macOS?自帶國際象棋遊戲的引擎內核)開發的?gcp/leela-zero?通過分散式訓練聚集愛好者的電腦算力,棋力進步迅速。於是?Samuel?到?Leela Zero?的問題收集區發布了他的構想:
What about a Leela(Chess) Zero? · Issue #369 · gcp/leela-zero這個構想立刻得到了?Gian-Carlo Pascutto?的回應:
Id be enormously interested in it - but Im extremely busy with this project right here already! So it seems likely someone in the chess community will have something before we finish our run.
I told the Stockfish people they can use the training, OpenCL etc code from this project but well see what they end up doing.
「我對此非常感興趣——但是我已經在這個項目(Leela Zero)里忙得不可開交!所以看上去很可能國際象棋社區的某個人會在我們完成我們的任務之前搞出些名堂來。
「我跟?Stockfish?的人說過他們可以用這個項目里的訓練、OpenCL?等等的代碼,不過我們得看他們最終會怎麼做。」
在一周的沉寂後,國際象棋引擎開發者?Benjamin Diamond?在這個問題中宣布自己結合?Stockfish?的位棋盤(bitboard)和著法生成代碼以及?Leela Zero?的架構,開發出一個原型?benediamond/leela-chess。Leela Chess?就這樣誕生了。但是由於移植過程中遇到了大量困難,這個原型只是能運行,大量的核心功能還沒有實現。Samuel?和其他開發者試圖協助他,但是進展緩慢。
Stockfish?的加入
Stockfish?分支自開源引擎?Glaurung(漢語譯名格勞龍),從第一個版本起就擁有較強實力。在提高棋力的過程中,Stockfish?採用了一種叫做?SPSA(Simultaneous Perturbation Stochastic Approximation,同時擾動隨機逼近)的自動調參方法,公佈於?2011?年。
SPSA?的核心是取一個或多個參數,通過預設的調參常數計算出一個不大的波動範圍。準備兩個當前版本的引擎,將引擎的參數分別調整到波動範圍的兩端,並進行對弈。如果一方獲勝,就將參數向獲勝方的方向通過一個很小的係數進行微調,兩個對弈引擎的參數對應地平移,然後重複對弈過程。通常經過數萬局對弈才可以得到穩定的結果。如此龐大的算力需求對個人開發者來說顯然是一個不小的負擔。
2013?年?2?月,加拿大國際象棋引擎開發者?Gary Linscott?開發出分散式訓練框架?Fishtest。這個框架不但可以用來調參,還可以對新代碼進行測試。
人們可以在伺服器上註冊自己的賬號。作為開發者的賬號可以發布調參和新代碼測試的任務。伺服器得到任務後會將任務需求的對弈局數進行分割,通常以?1000?局為單位,下發給運行客戶端程序的志願者。每局結束後,結果將立即被上傳到伺服器並在志願者的賬號上記錄消耗的?CPU?時間。總時間超過一萬小時的賬號會進入?Stockfish?的貢獻者名單。為了避免算力的浪費,伺服器還根據任務中指定的參數,通過?SPRT(sequential probability ratio test,序列概率比檢驗)決定何時對戰結果符合統計要求從而停止測試。
這樣的機制激發了愛好者的熱情,人們紛紛貢獻出電腦的空閑時間參與訓練。一年內?Stockfish?暴漲?200?多等級分,以開源引擎的身份加入國際象棋引擎的頂尖行列,與眾多商業引擎比肩。由於在?Fishtest?上做出的貢獻,Gary Linscott?被加入?Stockfish?的作者名單。
可以說,Stockfish?的成功依靠的是分散式訓練聚集志願者的電腦算力,與?Leela Zero?不謀而合。
2018?年?1?月,Gary Linscott?回復?Samuel Graván?在?Leela Zero?提出的問題,說自己已經根據?Benjamin Diamond?製作的原型進行進一步修改,開始完善各個功能。隨後他與?Gian-Carlo Pascutto?探討了開發方向上的問題,得到對方的積極回應。Leela Chess?項目染上了?Stockfish?的官方色彩。
Leela Chess Zero?的誕生與成長
在?1?月期間,Leela Chess?神經網路格式的移植問題得到了解決,TensorFlow?訓練腳本被修復,接著實現了監督學習(根據棋譜文件生成?TensorFlow?腳本的輸入數據),也就是對已有棋譜的學習。Gary Linscott?輸入較高水平的人類棋譜(2000?等級分左右)進行監督學習以驗證有效性,結果?Leela Chess?獲得了不錯的棋力,可以擊敗較低水平的引擎(如?GNU Chess)。他再接再厲,開發出自對弈生成輸入數據的功能。
引擎的基本功能搭建完畢後,Gary Linscott?投入了對分散式訓練平台的開發。由於?Leela Zero?的伺服器端沒有開源,他沒有參考?Leela Zero?的框架,而是自己動手,將?Fishtest?的賬號系統融合進來,重新設計了服務端和客戶端。
2?月?20?日,分散式訓練平台上線,以隨機生成的權重作為起點,進行完全基於自對弈的訓練。這個計劃被稱作?Leela Chess Zero(以下簡稱?LCZero)。
LCZero3?月?3?日,Samuel Graván?在他的?chess-alpha-zero?上宣布將精力轉移到?Leela Chess?的開發,意味著?chess-alpha-zero?最終被放棄。幾位優秀的開發者也聚集到?Leela Chess?項目,制定訓練計劃,負責伺服器維護,減輕了?Gary Linscott?的負擔。
在一個月的訓練中,LCZero?的中局從一開始的錯漏百出逐漸變得縝密,開局亂走邊兵的現象逐漸消失,業餘棋手逐漸難以戰勝它。越來越多的愛好者,有的從?Fishtest?轉移過來,有的是在?LCZero?變強後看好它的前景,開始將他們的電腦投入到?LCZero?的訓練中。
截至文章發布時(4?月?7?日),LCZero?的自評等級分如圖所示:
與?Stockfish 8?的差距如圖所示:
如果有興趣了解?LCZero?現在的棋力,可以到以下網址與?LCZero?對弈:
Play against LC0 !如果想要幫助?LCZero?訓練,請按照項目?Wiki?的指示下載客戶端:
Getting Started · glinscott/leela-chess Wiki最後也歡迎大家加入?Leela Chess?的非官方?QQ?群:700380723,這裡可以交流關於國際象棋、國際象棋引擎以及人工智慧的問題。
推薦閱讀:
※AlphaZero: 直覺是如何摧毀邏輯的
※AlphaZero最革命性的一點是,它沒有棋子的概念 | 陳經
TAG:國際象棋 | AlphaZero | TensorFlow |