本文為開源工場與雷鋒字幕組合作的人工智慧專欄,原文發表於雷鋒網,原標題How to build your own AlphaZero AI using Python and Keras,作者David Foster。經授權發表於開源工場。

翻譯 | 黃偉聰  董星    校對 |  凡江  

教你用Python和Keras建立自己的AlphaZero

在這篇文章,我會試著闡明三件事:

  1. AlphaZero之所以是人工智慧前進一大步的兩個答案
  2. 怎樣生成一個 AlphaZero方法論的副本使其能玩Connect4
  3. 怎樣改代碼能使其插入其他遊戲仍然有用

AlphaGo → AlphaGo Zero → AlphaZero

在2016年三月,Deepmind 公司的 AlphaGo ,在超過2億人次觀看的比賽中,4比1打敗了18次世界冠軍的圍棋選手李世石。一個機器學會遠超人類的下圍棋策略,以前認為是不可能做到的,或者退一步,當時認為至少也要10年完成的。

教你用Python和Keras建立自己的AlphaZero

AlphaGo vs 李世石 比賽第三場

這本就是一個卓越的成就。但是,在 2017年10月18日,DeepMind 取得了更大的飛躍性成就。

在一篇名為 『Mastering the Game of Go without Human Knowledge(無師自通圍棋)』的論文公布了一種新的演算法,AlphaGo Zero 用其 100–0 大敗AlphaGo。不可思議的是,它僅僅靠自我博弈做到如此,從零開始並且逐漸找方法打敗舊版本。構建一個超越人類的人工智慧不再需要專家博弈時的資料庫。

教你用Python和Keras建立自己的AlphaZero

圖表來自 『Mastering the Game of Go without Human Knowledge』

僅僅48天之後,在2017年12月5日,DeepMind 放出另一篇論文 『Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm(通過使用通用的強化學習演算法,自我博弈來掌握國際象棋和日本象棋)』 ,文章展示了 AlphaGo Zero 如何成長,並最終能在國際象棋和日本象棋分別打敗世界冠軍程序StockFish和Elmo。整一個學習過程,AlphaGo Zero從第一次觀看比賽到成為世上最強象棋程序不到24小時。

由此,AlphaZero橫空出世 —而這個通用演算法,無需人類專家的先驗策略便能讓它快速掌握某些知識。

關於這個成就令人驚奇的兩點:

1. AlphaZero 無需以人類知識作為輸入

這點是非常重要的。這意味著 AlphaGo Zero 根本的方法論能適用於 任何  完全信息的遊戲(遊戲檯面總是完全公開可見)因為它除遊戲規則外無需知道其他專業的知識。

這就是DeepMind 為什麼能在原 AlphaGo Zero論文發表僅48天後,又發表國際象棋和日本象棋論文的原因。毫不誇張的說,要做得只是改變闡述博弈機制的輸入頭文件和調整與神經網路和蒙特卡洛搜索有關的超參數。

2. 這個演算法出人意料的簡潔

如果AlphaZero用的是世界上只有少數人能理解的超級複雜演算法,那麼這將是令人難以置信的成就。而讓它特別的是,實際上論文中許多理念遠沒有以前的版本複雜。它的核心思路正是下面簡單的學習口訣:

通過模擬演繹可能的未來場景,優先考慮有前景的路徑,同時考慮其他人對你行為最有可能做出的反應並繼續探索未知情況。

在到達一個陌生的場景後,評估所選位置有利程度並通過模擬路徑級聯先前位置的得分。

完成對未來可能性思考後,採取探索的最多次的行動。

遊戲結束,退回並且評估哪一步錯判了對未來的影響由此來更新認知。

這聽起來不像你當時學習玩遊戲的的過程? 當你下一步壞著,可能你錯判了著後位置對未來的影響,或者你錯誤預測了對手的某個行動,所以你沒有去想這種可能性。而這正是AlphaZero在遊戲中學習訓練的兩個方面。

怎樣構建你自己的AlphaZero

首先,為了得到較深層次AlphaGo Zero工作原理的理解,需要認真看AlphaGo Zero背後的文檔。當我們過代碼的每個部分時這很值得參考。這裡同樣有一篇好文章更詳細解釋 AlphaZero如何工作。

代碼

套用這個包含我將引用代碼的Git庫。

開始學習流程之前,在Jupyter notebook頂部兩個面板運行run.ipynb 。一旦它建立了足夠的遊戲位置的來填補它的記憶,神經網路就會開始訓練。通過額外的自我博弈和訓練,它會逐漸在預測上變好,從而做出更好的決策和使總體遊戲行動更智能。

現在我們來更深入地了解代碼,並且展示一些AI隨著時間變強大的成果。

注意— 這是我自己基於上面參考文獻對AlphaZero工作原理的理解.。如果以下有任何錯誤,我請求原諒並且會儘力改正!

Connect4

我們演算法學習的遊戲是 Connect4 (或者Four In A Row)。遠沒有圍棋複雜… 但總計仍有 4,531,985,219,092種位置情況。

教你用Python和Keras建立自己的AlphaZero

connect 4

遊戲規則很簡單。玩家在棋盤輪流從有空位列的頂部放一個他們顏色的棋子。第一個達到同色四珠相串的玩家即贏(包括水平,豎直,對角線)。如果棋盤放滿也沒有四珠相串,則遊戲平局。

以下是組成代碼庫的核心文件總覽:

game.py

每個方塊被分配了一個從0到41的數字, 如下:

這個文件包含了connect4的遊戲規則。

教你用Python和Keras建立自己的AlphaZero

Connect4的行動方格

這個 game.py 文件提供了從一個遊戲狀態移動到另一個的邏輯,給出可選的動作。例如,給出一個空棋盤並進行放置38號空位,這個行動返回一個新的遊戲檯面,就是開始玩家的這枚棋子將在中間列底部。

你能用任何遊戲文件替換game.py文件,只要它適用於相同的API,並且演算法會在你給定的規則上通過自我博弈學會策略。

run.ipynb

這個文件包含了啟動學習過程的代碼。首先它會載入遊戲規則,然後迭代演算法的主循環,其中包含三個階段:

  1. 自我博弈
  2. 神經網路再訓練
  3. 神經網路評估

這個循環涉及到兩個智能體,最強玩家和當前玩家。

最強玩家擁有表現最優的神經網路,用來產生自我博弈的學習記憶。當前玩家在這些記憶的基礎上重新訓練它的神經網路,然後再與最強玩家進行比賽。如果它贏了,最強玩家內部的神經網路就會被切換到當前玩家的神經網路,再開啟新一輪循環。

agent.py

這段程序包含了智能體類(遊戲中的一個玩家)。初始時,每個玩家都有自己的神經網路和蒙特卡羅搜索樹。

模擬方法會運行蒙特卡羅樹搜索過程。具體地說,智能體將移動到樹的葉節點,用它的神經網路對節點進行評估,然後沿著樹向上填充節點的值。

行動方法會多次重複模擬方法,從而獲得從當前位置最有利的移動方式。接著,它將所選操作返回到遊戲中,並執行這個動作。

重玩方法利用以前遊戲中的記憶重新訓練神經網路。

model.py

教你用Python和Keras建立自己的AlphaZero

使用Keras構建的殘差卷積網路樣本

這個文件包含了Residual_CNN(殘差卷積神經網路)類,它定義了如何構建一個神經網路的實例。

它使用AlphaGoZero論文中神經網路架構的壓縮版-即一個卷積層,緊跟著是許多殘差層,然後分裂成一個數值和策略頭。

卷積濾波器的深度和數量可以在配置文件中設置。

Keras庫用來構建網路,它的後端是Tensorflow。

想要查看神經網路中的單個卷積濾波器和緊密相連的層,運行下面run.ipynb文本中的程序。

current_player.model.viewLayers()

教你用Python和Keras建立自己的AlphaZero

神經網路中的的卷積濾波器

MCTS.py

這段代碼包含節點、邊和MCTS類,構成了一個蒙特卡羅搜索樹。

MCTS類包含前面提到的moveToLeaf和backFill方法,並且Edge類的實例儲存了每個潛在移動方式的統計數據。

config.py

這段程序用來定義影響演算法的關鍵參數。

教你用Python和Keras建立自己的AlphaZero調整這些變數將影響運行時間、神經網路的準確性和演算法整體的成功。上面的參數生成了一個高水平Connect4玩家,但這要花很長時間才能做到。為了加快演算法的速度,請嘗試以下步驟。

教你用Python和Keras建立自己的AlphaZero

funcs.py

這段程序包含了 playMatches 和 playMatchesBetweenVersions 函數,可以進行兩個智能體之間的比賽。

教你用Python和Keras建立自己的AlphaZero

為了和你創造的玩家進行比賽,運行下面的代碼(它也在run.ipynb文本中)

initialise.py

當你運行該演算法的時候,所有的模型和內存文件都保存在根目錄的run文件夾中。

之後想要從這個節點重新啟動演算法,需要將run文件夾轉移到run_archive文件夾,並在文件夾名稱中添加一個運行編號。接著將運行號、模型版本號和內存版本號輸入到initialise.py文件,與run_archive文件夾中的相關文件位置相對應。正常運行演算法後將會從這個節點開始啟動。

memory.py

內存類的一個實例,存儲了之前的遊戲記錄,演算法可以用它來訓練當前玩家的神經網路。

loss.py

這份文件包含一個自定義的損失函數,在傳遞到交叉熵損失函數之前,它掩蓋了非法移動的預測。

settings.py

定義了run和run_archive文件夾的位置。

loggers.py

日誌文件保存在run文件夾中的log文件夾中。

想要啟動日誌記錄,將文件中的logger_disabled 變數值設置為False。

查看日誌文件可以幫助你理解演算法是如何工作的,並且參透它的「思想」。例如這裡有一個log.mcts文件的樣本。

教你用Python和Keras建立自己的AlphaZero

logger.mcts 文件輸出

在評估階段,同樣從logger.tourney文件中,可以看到每次移動的概率:

教你用Python和Keras建立自己的AlphaZero

logger.tourney 文件輸出

結果

經過幾天的訓練,我們得到了下面的損失vs小批量迭代次數關係圖。

教你用Python和Keras建立自己的AlphaZero

損失vs小批量迭代次數關係圖

最上面的線形圖是策略頭中的錯誤(MCTS移動概率的交叉熵vs神經網路的輸出)。最下麵線圖是值頭的誤差(實際遊戲值和神經網路推測值之間的平均平方誤差)。中間線圖是這兩者的平均值。

顯而易見,神經網路在預測每個遊戲狀態值和下一步可能動作方面表現越來越優異。為了展示它如何培養出一個逐步強大的玩家,我參加了17個玩家之間的一場聯賽,逐步使用神經網路的第1次到49次迭代。

每場比賽都進行兩次,雙方都有機會走第一步。

這是最後的排名:

教你用Python和Keras建立自己的AlphaZero

可以看出,神經網路後期版本贏得了大部分比賽,表現明顯要優於前期版本。同時,我們可以發現學習還沒有達到飽和——隨著訓練時間的增加,玩家將會逐步變強,學習越來越複雜的策略。

例如,儘早搶佔中間列是神經網路一直偏愛的一個清晰策略。讓我們觀察一下演算法的第1個版本和第30個版本之間的區別:

教你用Python和Keras建立自己的AlphaZero

神經網路第一次迭代

教你用Python和Keras建立自己的AlphaZero

神經網路第30次迭代

這是一個很好的策略,因為很多棋子相連成線都需要佔有中心列——搶先佔領它可以確保你的對手失去優勢。這是沒有任何人為輸入的情況下,由神經網路自己學會的策略。

學習一種不同的遊戲

在games文件夾中有一個game.py 文件,它是 『Metasquares』 的遊戲文件。這個遊戲需要在網格中放置X和O標記,以形成不同大小的正方形。大方塊比小方塊得分更多,當網格被填滿時,得分最多的玩家獲勝。

如果你將Connect4的game.py文件替換成Metasquares遊戲的 game.py文件,同樣的演算法也可以用來學習如何玩Metasquares。

博客原址

https://medium.com/applied-data-science/how-to-build-your-own-alphazero-ai-using-python-and-keras-7f664945c188


想成為雷鋒字幕組的一員,請添加微信號leiphonefansub,備註「我要加入」。

教你用Python和Keras建立自己的AlphaZero

本文轉自雷鋒網,如需轉載請至雷鋒網官網申請授權。