1. 程式人生 > 其它 >自學如何使用Python和Keras構建你自己專屬的AlphaZero系統

自學如何使用Python和Keras構建你自己專屬的AlphaZero系統

近日,Applied Data Science的聯合創始人David Foster發表了一份詳細的教程,意在教你搭建一套屬於自己的AlphaZero系統。以下是教程的完整內容。

在本文中,我將嘗試介紹三件事:

1.為什麼AlphaZero是人工智慧向前邁出的一大步 2.如何構建一個AlphaZero方法論來玩“四子連珠(Connect4)”對弈遊戲 3.如何調整程式碼以插入其他遊戲

AlphaGo → AlphaGo Zero → AlphaZero 2016年3月,Deepmind的AlphaGo在一場由2億多人觀看的比賽中以4-1的戰績擊敗了18次世界圍棋冠軍李世石。一臺機器已經學會了玩圍棋這樣的超人類戰略,這一壯舉以前被認為是不可能的,或者至少是在10年之後才能完成的。

AlphaGo與李世石的第三場比賽

這本身就是一項了不起的成就。然而,在2017年10月18日,DeepMind又邁出了一大步。

在沒有人類知識的情況下,一篇“在沒有人類知識的情況下掌握圍棋(Mastering the Game of Go without Human Knowledge)”的論文揭示了一種新的演算法——AlphaGo Zero以100-0的成績擊敗了AlphaGo。令人難以置信的是,它是通過獨自學習,開始“tabula rasa”(空白狀態)的學習,並逐漸找到能夠打敗前身的自我戰略。

  • 論文地址:https://deepmind.com/research/publications/mastering-game-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。整個學習過程,從第一次看比賽,到成為世界上最好的電腦程式,只花了不到24小時。

  • 論文地址:https://arxiv.org/pdf/1712.01815.pdf

這樣,AlphaZero就誕生了——它是一種通用的演算法,能快速地獲得一些東西,而不需要任何人類專家策略的先驗知識。關於這一成就,有兩件令人驚異的事情:

1.AlphaZero需要零專業知識的人作為輸入

這一點是不可能被誇大的。這意味著,AlphaGo Zero的根本方法可以應用於任何擁有完美資訊的博弈中(博弈狀態在任何時候都是完全已知的),因為除了遊戲規則之外,不需要任何專業技能。

這就是在最初的AlphaGo Zero論文發表48天之後,DeepMind才有可能釋出國際象棋和日本象棋的論文。從字面上來說,需要改變的是輸入檔案,它描述了博弈的機制,並調整了與神經網路和蒙特卡洛樹搜尋相關的超引數。

2.這個演算法非常“優雅”

如果AlphaZero使用的是超級複雜的演算法,世界上只有少數人能夠理解,那麼它仍然是一項了不起的成就。讓它與眾不同的是,論文中的許多想法實際上遠沒有以前的版本那麼複雜。從本質上來說,下面是一個簡單的學習方法:

在可能的未來場景中,考慮到可能的下棋路徑,同時考慮其他人最可能對你的行為作出反應並繼續探索未知的情況。

在到達一個不熟悉的狀態後,評估你對這個位置的看法。

當你已經思考了未來的可能性之後,採取你已經探索過的行動。

在博弈結束時,回過頭來評估一下你對未來位置價值的誤判,並據此更新你的理解。

這聽起來是不是很像你學習下圍棋的方式? 當你做了一個糟糕的下棋動作時,要麼是因為你錯誤地判斷了結果位置的未來值,要麼是你錯誤地判斷了你的對手會採取某種行動的可能性,所以沒有考慮去探索這種可能性。這正是AlphaZero被訓練去學習的博弈性的兩個方面。

如何構建你自己的AlphaZero 首先,請檢視AlphaGo Zero的“作弊單”,以瞭解AlphaGo Zero是如何工作的。當我們檢視程式碼的每個部分時,都需要引用這些內容。這裡還有一篇很棒的文章,解釋了AlphaZero如何更詳細地工作。

  • 作弊單(需訪問外國網站):https://medium.com/applied-data-science/alphago-zero-explained-in-one-diagram-365f5abf67e0
  • 文章地址:http://tim.hibal.org/blog/alpha-zero-how-and-why-it-works/
  • 本文要引用的程式碼:https://github.com/AppliedDataSciencePartners/DeepReinforcementLearning

要啟動學習過程,請在run.ipynb Jupyter notebook中執行前兩個面板。一旦它建立起足夠的博弈形勢,神經網路就會開始訓練。通過更多的自我對弈和訓練,它將逐漸從任何位置預測博弈值和棋手的下一步動作,從而做出更好的決策。

現在,我們將更詳細地瞭解程式碼,並展示一些結果,以證明人工智慧隨著時間的推移變得越來越強大。

注意:這是我自己對AlphaZero如何工作的理解,基於上面提到的論文中所提供的資訊。

Connect4 我們的演算法將學會玩的遊戲是Connect4(四子連珠)。雖然不像圍棋那樣複雜,但仍然有4531,985,219,092種遊戲位置。

Connect4

遊戲規則是這樣的:玩家輪流在任何一欄的頂部放置自己的顏色的棋子。誰最先在垂直、水平或對角線上都放置了同一種顏色,那麼你就贏了。如果不是,遊戲平局。

下面是組成程式碼庫的關鍵檔案的摘要:

GAME.PY 這個檔案包含了Connect4的遊戲規則。每個方塊被分配了一個從0到41的數字,如下:

給定一個選擇的動作,game.py檔案給出了從一個博弈狀態移動到另一個博弈狀態的邏輯。例如,給定空棋盤和38號動作,takeAction方法返回到一個新的博弈狀態,也就是底部一行的中心位置。

你可以將game.py檔案替換為任何符合相同原則的API和演算法的博弈檔案,根據你所給出的規則,通過自我對弈學習策略。

run.ipynb 這個檔案包含了啟動學習過程的程式碼。它載入博弈規則,然後迭代演算法的主迴圈,其中包含三個階段:

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

在這個迴圈中有兩個agent,分別為best_player和current_player。

best_player包含了最好的神經網路,並被用來產生自我對弈的記憶。然後,current_player在這些記憶中重新訓練它的神經網路,然後與best_player進行對抗。如果它贏了,best_player內部的神經網路被交換到current_player的神經網路中,而這個迴圈又將開始。

agent.py 這個檔案包含了博弈中的一個參賽者的agent class。每個參賽者都有自己的神經網路和蒙特卡洛搜尋樹。

模擬方法執行蒙特卡洛樹搜尋過程。具體地說,agent將移動到樹的葉節點(moveToLeaf),用它的神經網路對節點進行評估,然後通過樹回填(backFill)節點的值。

act方法重複模擬多次,以瞭解從當前位置移動最有利的位置。然後,它將所選擇的動作返回到遊戲中,來執行這個動作。

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

model.py 這個檔案包含了Residual_CNN類,它定義瞭如何構建一個神經網路的例項。

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

它使用了AlphaGo Zero論文中的一個壓縮版的神經網路體系結構,也就是一個卷積層,然後是許多殘差層,然後分解為價值和策略兩個分支。

可以在配置檔案中指定卷積過濾的深度和數量。

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

要在神經網路中檢視單個卷積過濾和密集連線的層,請在run.ipynb notebook中執行以下內容:

current_player.model.viewLayers()

神經網路的卷積過濾

MCTS.py 它包含節點、邊緣和MCTS類,構成了一個蒙特卡洛搜尋樹。

MCTS類包含前面提到的moveToLeaf和backFill方法,並且邊緣類的例項儲存每個可能的移動的統計資訊。

config.py 這是你設定影響演算法的關鍵引數的地方。

調整這些變數將影響演算法的執行時間、神經網路的準確性和整體的成功。上面的引數產生了一個高質量的Connect4玩家,但是要花很長時間才能完成。為了加快演算法的速度,請嘗試以下引數。

funcs.py 包含playMatches和playMatchesBetweenVersions函式兩個agent之間的對弈。如果要對你的建立進行操作,請執行以下程式碼(它也在run.ipynb notebook中):

from game import Game
from funcs import playMatchesBetweenVersions
import loggers as lg
env = Game()
playMatchesBetweenVersions(
env
, 1 # the run version number where the computer player is located
, -1 # the version number of the first player (-1 for human)
, 12 # the version number of the second player (-1 for human)
, 10 # how many games to play
, lg.logger_tourney # where to log the game to
, 0 # which player to go first - 0 for random
)

initialise.py 當你執行該演算法時,所有的模型和記憶體檔案都儲存在run資料夾中,在根目錄中。

稍後要從這個檢查點重新啟動演算法,將run資料夾轉移到run_archive資料夾中,將一個執行編號(run number)附加到資料夾名稱。然後,將執行編號、模型版本號和Memory版本號輸入到initialise.py檔案中,對應於run_archive資料夾中相關檔案的位置。像往常一樣執行這個演算法,然後從這個檢查點開始。

memory.py Memory類的一個例項儲存了以前博弈的記憶,這個演算法用來訓練current_player的神經網路。

loss.py 這個檔案包含一個自定義的損失函式,它在傳遞到交叉熵損失函式之前,掩蓋了非法移動的預測。

settings.py run和run_archive資料夾的位置。

loggers.py 日誌檔案被儲存到run資料夾中的log資料夾中。要開啟日誌記錄,將logger_disabled變數的值設定為“False”。檢視日誌檔案將幫助你瞭解演算法的工作原理,並瞭解它的“思想”。

從logger.mcts檔案輸出

你可以看到在評估期間每次(博弈)下法的概率。

結果 在幾天內進行的訓練會產生以下的關於小批量(mini-batch)迭代編號的損失圖表:

對小批量迭代數的損失

最上面的線是策略端的誤差(MCTS的交叉熵移動概率與神經網路的輸出相對應)。下面的線是價值端的誤差(實際博弈值與神經網路值之間的均方差)。中間的線是兩者的平均值。

很明顯,神經網路在預測每個博弈狀態的價值和可能的下一步動作方面做得越來越好。為了展示這一結果如何變得更加強大,我在17個參賽者之間進行了一場聯賽,從首次迭代的神經網路到第49次迭代,每對搭檔都交手了兩次,兩名玩家都有機會先上場。

以下是最終排名:

很明顯,神經網路的後期版本比以前的版本要優越,贏得了大部分的比賽。同時,學習還沒有達到飽和——隨著訓練時間的增加,參賽者將會繼續變得更加厲害,學習越來越複雜的策略。

例如,神經網路一直偏愛的一個清晰的策略是儘早搶佔中心欄。看看下面演算法的首個版本和第30個版本之間的區別:

神經網路的首個版本:

神經網路的第30個版本:

這是一個很好的策略,因為很多下棋線路都需要中心欄——提前宣告,確保你的對手不能利用這一點。這是由神經網路學會的,沒有任何人類的輸入。

學習一種不同的博弈遊戲 在game.py檔案中的games資料夾裡,有一個叫做“Metasquares”的遊戲。這個遊戲是在網格中放置X和O標記,以嘗試形成不同大小的方塊。方塊越大,玩家分數越高。

如果把Connect4的game.py檔案替換成Metasquares的game.py檔案,同樣的演算法就開始學習玩新的Metasquares遊戲。