用深度學習預測專業棋手走法
來源: ofollow,noindex">Pexels
我不擅長國際象棋。
我父親在我年幼的時候教過我,但我猜他是那些一直讓他們的孩子獲勝的爸爸之一。為了彌補世界上最受歡迎的遊戲之一的技能的缺乏,我做了任何資料科學愛好者會做的事情:建立一個人工智慧來擊敗我無法擊敗的人。遺憾的是,它不如AlphaZero(甚至普通玩家)好。但我想看看國際象棋引擎在沒有強化學習的情況下如何做,以及學習如何將深度學習模型部署到網路上。
獲取資料
FICS 擁有一個包含3億場比賽,個人走法,結果以及所涉玩家評級的資料庫。我下載了所有在2012年的比賽,其中至少有一名玩家超過2000 ELO。這總計約97000場比賽,有730萬個走子。勝利分配是:43000次白方勝利,40000次黑方勝利和14000次平局。
極小極大演算法
瞭解如何做一個深度學習象棋AI,我必須首先了解傳統象棋AI程式。來自於極小極大演算法。Minimax是“最小化最大損失”的縮寫,是博弈論中決定零和博弈應如何進行的概念。
Minimax通常用於兩個玩家,其中一個玩家是最大化者,另一個玩家是最小化者。機器人或使用此演算法獲勝的人假設他們是最大化者,而對手是最小化者。該演算法還要求有一個棋盤評估函式,來衡量誰贏誰輸。該數字介於-∞和∞之間。最大化者希望最大化此值,而最小化者希望最小化此值。這意味著當你,最大化者,有兩個走法可以選擇的時候,你將選擇一個給你更高評估的那個,而最小化者將做相反的選擇。這個遊戲假設兩個玩家都發揮最佳狀態並且沒有人犯任何錯誤。
以上面的GIF為例。你,最大化者(圓圈)有三個你可以選擇的走法(從頂部開始)。你直接選擇的走法取決於你的對手(方塊)在走子後將選擇的走法。但是你的對手直接選擇的走法取決於你走子後選擇的走法,依此類推,直到遊戲結束。玩到遊戲結束會佔用大量的計算資源和時間,所以在上面的例子中,選擇一個深度,2。如果最小化者(最左邊的方塊)選擇左移,你有1和-1可供選擇。你選擇1,因為它會給你最高分。如果最小化者選擇正確的走法,則選擇0,因為它更高。現在是最小化者的回合,他們選擇0因為這更低。這個遊戲繼續進行,一直進行到所有的走子都完成或你的思維時間耗盡。對於我的國際象棋引擎來說,假設白方是最大化者,而黑方是最小化者。如果引擎是白方,則演算法決定哪個分支將給出最高的最低分數,假設人們在每次走子時選擇最低分數,反之亦然。為了獲得更好的效能,該演算法還可以與另一種演算法結合使用: alpha-beta剪枝 。 Alpha-beta剪枝截止系統適用於決定是否應該搜尋下一個分支。
深度學習架構
我的研究始於 Erik Bernhardsson關於國際象棋深度學習的優秀文章 。他講述了他如何採用傳統方法制作AI下棋並將其轉換為使用神經網路作為引擎。
第一步是將棋盤轉換為輸入層的數字形式。我借用了Erik Bernhardsson的編碼策略,其中棋盤是一個熱編碼,每一個方塊中都有一個棋子。這總計為768個元素陣列(8 x 8 x 12,因為有12種棋子)。
Bernhardsson選擇將輸出圖層設為1表示白方勝利,-1表示黑方勝利,0表示平局。他認為遊戲中的每個板位置都與結果有關。如果黑方贏了,每個棋的位置都被訓練成“支援黑方”,如果白方贏了,則“支援白方棋”。這允許網路返回介於-1和1之間的值,這將告訴你該位置是否更有可能導致白贏或黑贏。
我想用稍微不同的評估函式來解決這個問題。網路是否能夠看到不是白方還是黑方獲勝,而是能夠看到哪個走子將導致勝利?首先,我嘗試將768元素的棋盤表示放入輸出,其中一個位置是輸入,下一個位置是輸出。當然,這沒有用,因為這把它變成了一個多分類問題。這導致引擎適當地選擇合法走子時出現太多的錯誤,因為輸出層中的所有768個元素可以是1或0。因此,我查閱了Barak Oshri和Nishith Khandwala的斯坦福大學論文 《利用卷積神經網路預測國際象棋中的運動》 ,瞭解他們如何解決這個問題。他們訓練了7個神經網路,其中1個網路是棋子選擇器網路。這個網路決定哪一個方格最有可能被移動。其他六個網路專門針對每一個棋子型別,並決定將一個特定的棋子移動到哪裡。如果棋子選擇器選擇了一個帶有兵的方格,那麼只有棋子神經網路會響應最有可能移動到的方格。
我從他們的想法中借鑑了兩個卷積神經網路。第一個,從網路移動,將被訓練成採用768元素陣列表示並輸出專業棋手移動的方格(在方塊0和方塊63之間)。 第二個網路:移動到網路,將做同樣的事情,除了輸出層將是專業棋手移動到的地方。我沒有考慮誰贏了,因為我認為訓練資料中的所有移動都是相對最優的,無論最終結果如何。
我選擇的架構是兩個128卷積層,帶有2x2濾波器,後面是兩個1024神經元完全連線層。我沒有應用任何池,因為池提供位置不變性。圖片左上角的貓就像圖片右下角的貓一樣。然而,對於國際象棋,,棋子國王的值是完全不同於車兵。隱藏圖層的啟用功能是RELU,而我將softmax應用到最後一層,因此我基本上得到一個概率分佈,其中所有方格的概率總和加起來達到100%。
我的訓練資料是訓練集的600萬個位置,其餘130萬個位置用於驗證集。在訓練結束時,我從網路上獲得了34.8%的驗證準確率,並且在轉移到網路時獲得了27.7%的驗證準確率。這並不意味著70%的時間它沒有學習合法的走子,這隻意味著AI沒有像驗證資料中的專業玩家那樣做出相同的舉動。相比之下,Oshri和Khandwala的網路平均驗證準確率為37%。
將深度學習與Minimax結合起來
因為現在這是一個分類問題,其中輸出可以是64個類之一,這就留下了很大的錯誤空間。關於訓練資料(來自高級別玩家的比賽)的一個警告是,優秀的棋手很少會玩到“將軍”。他們知道什麼時候輸了,通常沒有必要跟進整場比賽。這種缺乏平衡的資料使得網路在最終遊戲結束時非常混亂。它會選擇車來移動,並試圖沿對角線移動。如果失敗,網路甚至會試圖指揮對手的棋子(厚顏無恥!)。
為了解決這個問題,我命令輸出的概率。然後,我使用python-chess庫獲取給定位置的所有合法走子的列表,並選擇具有最高結果概率的合法走子。最後,我應用了一個帶有懲罰的預測分數方程式,用於選擇較不可能的走子:400(選擇的走子指數之和)。名單上的合法走子越遠,其預測得分就越低。例如,如果從網路移動的第一個索引(索引0)與移動到網路的第一個索引相結合是合法的,那麼預測分數是400(0 + 0),這是最高可能分數:400。
在與材料分數結合使用數字後,我選擇了400作為最大預測分數。材料分數是一個數字,可以判斷所做的走子是否會捕獲一個棋子。根據捕獲的棋子,走子的整體得分將得到提升。我選擇的材料價值如下:
兵:10,馬:500,象:500,車:900,後:5000,王:50000。
這特別有助於殘局。在將殺走子將是第二個最可能的合法行動且預測得分較低的情況下,國王的物質價值將超過它。兵的分數如此之低,因為網路在早期比賽中考慮得足夠充分,所以如果它是戰略舉措,它將會採用兵。
然後我將這些分數結合起來,以返回給定任何潛在走子的棋盤的評估。我通過深度為3的minimax演算法(使用alpha-beta修剪)提供了這個,並得到了一個可以將殺的可執行國際象棋引擎!
我在Youtube上使用了 Bluefever Software的指南 ,展示瞭如何通過向flask伺服器發出AJAX請求來製作javascript國際象棋UI並通過它來路由我的引擎。 我使用Heroku將python指令碼部署到Web並將其連線到我的自定義域: Sayonb.com 。
結論
雖然引擎的效能沒有我希望的那麼好,但是我學到了很多關於AI的基礎知識,將機器學習模型部署到web上,以及為什麼AlphaZero不使用卷積神經網路來玩遊戲!
可以通過以下方式進行改進:
-
通過使用bigram模型LSTM將從網路移動和移動到網路中的時間序列組合在一起。 這可能有助於將移出和移動到決策中,因為每個目前都是獨立接近的。
-
通過新增奪取的棋子的位置來改進棋子的賦值(奪取棋盤中心的兵比它在邊緣時奪取更有利)。
-
在使用神經網路預測分數和子力分值之間切換,而不是在每個節點使用兩者。這可以允許更高的極小極大演算法搜尋深度。
- 考慮邊緣情況,例如:減少孤立自己的兵的可能性,增加馬靠近棋盤中心的可能性。
檢視程式碼,或者在 GitHub repo 用自己的訓練資料自己訓練一個新網路!
如果你有任何批評或問題,可以通過 LinkedIn 或我的 個人網站 與我聯絡。
本文由北郵 @愛可可-愛生活 老師推薦, 阿里云云棲社群 組織翻譯。
文章原標題《 Predicting Professional Players ’Chess Moves with Deep Learning 》
作者: Sayon Bhattacharjee
譯者:Viola ,審校:。
文章為簡譯,更為詳細的內容,請檢視 原文