DeepMind公布官方教程,開始創建自己的AlphaZero AI吧
2016年3月,Deepmind的AlphaGo以4比1的比分戰勝18屆圍棋世界冠軍李世石,這場比賽吸引到全球超過2億觀眾。機器學會圍棋策略,並擊敗人類頂尖高手,這在以往被視為一種不可能的壯舉——或者至少被認為要到十年後才有可能實現。
AlphaGo對李世石第三盤比賽
這本身已經成就了歷史性時刻。但2017年10月18日,DeepMind又再次邁出新的一大步。
在《無需人類知識掌握圍棋遊戲》論文當中,DeepMind公布了一種新的演算法變種,即AlphaGo Zero——其能夠以100比0的比分狂虐AlphaGo。令人難以置信的是,AlphaGo Zero完全通過自學掌握了圍棋技藝,即以「白板」狀態起步通過戰勝自我進行學習。如此一來,無需人類圍棋專家提供的資料庫,超人類AI即可成為現實。
僅僅48天之後,DeepMind於2017年12月5日發布了另一篇題為《通過自我強化學習演算法掌握國際象棋與將棋》的論文,展示了AlphaGo Zero如何在國際象棋與將棋領域分別擊敗最強程序StockFish與Elmo。更可怕的是,其整個學習過程是——從一竅不通到成為世界上最強的下棋程序——僅用了24個小時。
憑藉如此恐怖的實力,AlphaZero正式誕生——這種通用型演算法能夠在無需人類專家策略作為知識基礎的前提下,快速建立起適用於特定目標的一般性解決方法。
這項成就之所以值得稱道,主要有以下兩點原因:
1. AlphaZero無需任何人類專家策略作為輸入內容
這樣的能力無論如何誇大都不為過。這意味著AlphaGo Zero的底層方法能夠利用完美信息(即比賽雙方皆可隨時了解全盤信息)適應任何遊戲,即除遊戲規則之外不再需要任何預先提供的專業指導。
也正因為如此,DeepMind才能夠在初始AlphaGo Zero論文發布的短短48天之後,發布國際象棋與將棋版本。毫不誇張地講,我們需要做的僅僅是變換用於描述遊戲機制的輸入文件,同時調整與神經網路以及蒙特卡洛樹搜索相關的超參數。
2.該演算法極為優雅
如果說AlphaZero所使用的超複雜演算法全世界只有少數人能夠理解,仍然不會影響到這項卓越的成就。而更難能可貴的是,其核心實際上相當簡單,甚至可以總結成以下幾句概括:
通過潛在的未來場景設計遊戲思維,優先考慮更具前景的途徑,同時考慮對方可能選擇的反應行為,同時繼續探索未知。
在達成某種陌生狀態後,評估對當前優勢位置的信心,並將評分與此前採取的達成當前狀態的思維途徑進行映射。
在完成對未來可能性的思考之後,採取探索程度最高的行動。
在遊戲結束時,返回並評估一切錯誤的未來位置價值評估,並相應更新自身理解。
這聽起來正是我們每個人遊玩遊戲時的學習過程,對吧?當做出錯誤判斷時,很可能是由於我們未能準確把握所佔據位置的未來價值,或者錯誤判斷了對手執行某種操作的可能性,因此錯過了搶佔先機的機會。而這些,正是成就 Alpha Zero遊戲學習訓練的兩大根基。
如何構建您自己的AlphaZero
在今天的文章中,我將嘗試探討以下三項內容:
AlphaZero之所以標誌著人工智慧發展一大步的兩個理由。
如何重現AlphaZero方法以掌握Connect4遊戲。
如何調整代碼以適應其它遊戲。
首先,查看AlphaGo Zero備忘清單以深入理解AlphaGo Zero的工作原理。我們顯然有必要對代碼中的各個組成部分進行遍歷。
代碼
克隆此Git庫,其中包含我所引用的代碼。
要開始整個學習過程,首先請運行run.ipyng Jupyter記事本中的前兩面。在建立起足夠的遊戲位置以填充自身記憶之後,神經網路即可開始訓練。通過更多自我對抗及訓練,其將能夠慢慢提升遊戲價值以及後續潛在位置移動判斷方面的能力,從而做出更好的決策並獲得更強大的遊戲水平。
現在我們將查看具體代碼內容,並展示一些結果,用以證明AI確實隨著時間推移而變得愈發強大。
備註——這只是我個人對於AlphaZero工作原理的理解,這些理解主要基於前文提到的論文內容。如果以下存在任何謬誤,我向大家誠摯道歉,並期待您能夠加以糾正!
Connect4
在本示例中,我們的演算法將要學習如何進行Connect4遊戲(或者叫四連棋)。其複雜程度當然無法與圍棋相提並論……但其中仍然包含總計4531985219092個遊戲位置。
遊戲規則非常簡單。玩家輪流在可用位置上放入自己顏色的棋子,第一個將四個己方棋子連成一排的玩家獲勝——垂直、水平或者斜向皆可。如果整個棋盤都被填滿但仍未出現四連一排,則遊戲打成平局。
下面來看構成代碼庫的關鍵文件摘要:
game.py
此文件包含Connect4遊戲的基本規則。
每個方格被分配一個數字,範圍為由0到41,如下所示:
Connect4行動方塊
Game.py文件提供遊戲狀態間的轉移邏輯,並給出可選行動範圍。舉例來說,若當前為空棋盤且將棋子放在38號位,則takeAction方法會返回一個新的遊戲狀態,且起手玩家位於中央列的底部。
您可以利用任何擁有同樣API的遊戲文件替換game.py,演算法會自動根據您提供的規則進行自我學習並逐步掌握遊戲策略。
run.ipynb
本文件中包含開始學習過程的相關代碼。其會載入遊戲規則,而後通過主演算法循環進行迭代,具體分為以下三個階段:
1. 自我對抗
2. 重新訓練神經網路
3. 評估神經網路
此循環當中主要涉及兩個代理,分別為best_player與current_player。
其中best_player包含表現最好 神經網路,並將被用於生成自我對抗記憶。而current_player隨後會根據記憶重新訓練其神經網路,而後做出最好的選擇。如果贏了,那麼best_player當中的神經網路會被切換為current_player中的神經網路,而後再次開始循環。
agent.py
此文件當中包含Agent類(遊戲中的一位玩家)。每個玩家都會利用自己的神經網路與蒙特卡洛樹進行初始化。
其中simulate方法運行蒙特卡洛樹搜索過程。具體來講,該代理移動至對的葉節點,利用其神經網路評估該節點,而後通過該樹回填該節點的值。
而act方法則多次重複模擬,從而理解當前哪個位置為最優行動。此後,其會將選定的行動返回給遊戲,並實際加以執行。
最後是replay方法,其負責利用原有遊戲記憶對神經網路進行重新訓練。
model.py
此文件包含Residual_CNN類,其負責定義如何構建神經網路實例。
它利用AlphaGo Zero論文當中提到的一種神經網路架構縮寫形式——即卷積層,而後為大量剩餘層,最終拆分為一個值與策略標頭。
各卷積過濾器的深度與數量可以在配置文件當中指定。
Keras庫負責構建該網路,後端則由TensorFlow充當。
要查看該神經網路當中的各獨立卷積過濾器以及密集連接層,請在run.ipyng記事本當中運行以下命令:
current_player.model.viewLayers()
神經網路中的卷積過濾器
MCTS.py
其中包含Node、Edge與MCTS類,其共同構成蒙特卡洛搜索樹。
MCTS類包含之前提到的moveToLeaf與backFill方法,且Edge類的各實例存儲與每項潛在移動相關的統計信息。
config.py
在此文件中,大家可以設置將對演算法造成影響的關鍵參數。
調整上述變數會對運行時間、神經網路準確性以及演算法的整體成功率造成影響。上述參數能夠產生高質量Connect4玩家,但需要很長時間才能學習完成。要加快演算法速度,請嘗試使用以下參數。
funcs.py
此文件當中包含 playMatches與playMatchesBetweenVersions函數,負責實現兩個代理間的對抗。
要進行自我對抗,請運行以下代碼(同樣位於run.ipynb記事本當中):
from game importGame
from funcs importplayMatchesBetweenVersions
importloggers as lg
env = Game()
playMatchesBetweenVersions(
env
, 1 #計算機玩家所在的運行版本號
, -1 #第一玩家版本號(-1為人類)
, 12 #第二玩家的版本號(-1為人類)
, 10 #進行多少盤遊戲
, lg.logger_tourney #遊戲日誌記錄位置
, 0 #哪個玩家先起手,-0為隨機
)
initialise.py
在運行演算法時,所有模型與記憶文件都將被保存在root目錄下的run文件夾內。
若需要稍後從此檢查點重新啟動演算法,請將run文件夾移動至run_archive文件夾,並在文件夾名稱中添加運行編號。接下來,在initialise.py文件中輸入運行編號、模型版本號以及記憶版本號,對應於run_archive文件夾中相關文件的位置。這樣如往常一樣運行演算法後,即可從此檢查點開始。
memory.py
Memory類的一個實例,用於存儲以往遊戲的記憶,以供演算法對current_pkayer神經網路進行重新訓練。
loss.py
此文件中包含一項自定義丟失函數,其會在將預測結果發送至交叉熵丟失函數之前地其進行模糊,從而避免出現非法移動。
settings.py
Run與run_archive文件夾的位置。
loggers.py
日誌文件被保存在run文件夾當中的log文件夾內。
要啟動日誌記錄,請在文件中將logger_disabled變數的值設置為False。
查看日誌文件將幫助我們理解演算法的工作狀態並掌握其「思路」。舉例來說,以下為logger.mcts文件樣本。
來自logger.mcts文件的輸出結果
在logger.tourney當中,您可以看到評估階段當中每項移動的具體可能性:
來自logger.tourney文件的輸出結果
結果
通過幾天的訓練,以下為小批量迭代後產生的圖表:
小批量迭代中的丟失情況
第一行為策略標頭中的誤差(MCTS移動可能性中的交叉熵,針對來自神經網路的輸出結果)。最下一行則為值標頭(實際遊戲價值與神經網路預測值之間的均方誤差)誤差。中間一行則為二者的平均值。
很明顯,該神經網路在預測每種遊戲狀態值以及潛在下一動移動方面表現得越來越好。為了顯示這一結果的提升過程,我從第1次迭代到第49次迭代當中選出17個玩家組成聯盟。每個玩家進行兩次配對,並在其中獲得一次起手權。
以下為最終排名:
很明顯,該神經網路的新版本要比初始版本更勝一籌,贏得了大部分遊戲。另外,學習似乎還沒有飽和——隨著訓練時間的進一步延長,其遊戲水平變得更為強大,並能夠學習到愈發複雜的策略。
舉例來說,神經網路在學習過程中發現的第一項明確策略在於儘早搶佔中央列。觀察該演算法最初版本與第30次迭代版本間的差異,會發現:
神經網路最初版本
神經網路第30次迭代版本
這是一項很好的策略,因為大多四連排布都需要經過中間列——因此應儘早阻止對手利用這一點。神經網路在無需任何人為輸入的前提下發現了這項規律。
學習其它遊戲
項目的games文件夾當中有一個面向「Metasquares」遊戲的game.py文件,其基本規則是在網格當中畫下X與O,從而儘可能形成不同大小的正方形。正方形面積越大,得分則越高。當網格被畫滿時,得分最高的玩家獲勝。
如果您將Connect4 game.py文件切換為Metasquares game.py文件,即可通過同樣的演算法學習如何玩轉Metasquares遊戲。
來源:medium.com
作者:David Foster
編譯整理:科技行者


※科學家、英特爾人工智慧負責人:我們現在只看到AI全貌的不到10%
※我覺得AI開發藥物炒過頭了,無論哈佛還是斯坦福,我用論文說話
TAG:科技行者 |