0
雷鋒網(wǎng) AI 科技評論按,本文作者一縷陽光,本文首發(fā)于知乎專欄強化學(xué)習(xí)知識大講堂,雷鋒網(wǎng) AI 科技評論獲其授權(quán)轉(zhuǎn)載。
2 個多月前,AlphaGo Zero 橫空出世,完全從零開始,僅通過自我對弈就能天下無敵,瞬間刷爆朋友圈,各路大神分分出來解讀,驚嘆于其思想的簡單、效果的神奇。很快就有大神放出了開源版的 AlphaGo Zero,但是只有代碼,沒有訓(xùn)練出來的模型,因為據(jù)大神推算,在普通消費級的電腦上想訓(xùn)練出 AlphaGo Zero 的模型需要 1700 年!然而 DeepMind 在 AlphaGo Zero 的論文里只強調(diào)運行的時候需要 4 個 TPU,而完全沒有提及訓(xùn)練過程的最大計算需求在于生成 self-play 數(shù)據(jù),還引起了一點小爭議。
還好,過了不到兩個月,在 12 月初,DeepMind 就在 Arxiv 上低調(diào)放出了更加通用的 AlphaZero 的論文。AlphaZero 幾個小時就征服圍棋、國際象棋和日本將棋的壯舉再次驚嘆世人,但同時 DeepMind 大方公開的 self-play 階段使用的 5000 個 TPU 也讓大家紛紛感嘆,原來是“貧窮限制了我們的想象力”!
扯得有點遠了,讓我們回到這篇文章的正題:AlphaZero 實戰(zhàn),通過自己動手從零訓(xùn)練一個 AI,去體會 AlphaZero 自我對弈學(xué)習(xí)成功背后的關(guān)鍵思想和一些重要技術(shù)細節(jié)。這邊選擇了五子棋作為實踐對象,因為五子棋相對比較簡單,大家也都比較熟悉,這樣我們能更專注于 AlphaZero 的訓(xùn)練過程,同時也能通過親自對陣,來感受自己訓(xùn)練出來的 AI 慢慢變強的過程。
經(jīng)過實踐發(fā)現(xiàn),對于在 6*6 的棋盤上下 4 子棋這種情況,大約通過 500~1000 局的 self-play 訓(xùn)練(2 小時),就能訓(xùn)練出比較靠譜的 AI;對于在 8*8 的棋盤上下 5 子棋這種情況,通過大約 2000~3000 局自我對弈訓(xùn)練(2 天),也能得到比較靠譜的 AI。所以雖然貧窮,但我們還是可以去親身感受最前沿成果的魅力!完整代碼以及 4 個訓(xùn)練好的模型已經(jīng)上傳到了 github:https://github.com/junxiaosong/AlphaZero_Gomoku
我們先來看兩局訓(xùn)練好的 AI 模型(3000 局 self-play 訓(xùn)練得到)對弈的情況,簡單感受一下:
從上面的對局樣例可以看到,AI 已經(jīng)學(xué)會了怎么下五子棋,知道什么時候要去堵,怎么樣才能贏,按我自己對陣 AI 的感受來說,要贏 AI 已經(jīng)不容易了,經(jīng)常會打平,有時候稍不留神就會輸?shù)簟?/p>
這里有一點需要說明,上面展示的兩局 AI 對弈中,AI 執(zhí)行每一步棋的時候分別只執(zhí)行了 400 次和 800 次 MCTS 模擬,進一步增大模擬次數(shù)能夠顯著增強 AI 的實力,參見 AlphaZero 論文中的 Figure 2(注:AlphaZero 在訓(xùn)練的時候每一步只執(zhí)行 800 次 MCTS simulations,但在評估性能的時候每一步棋都會執(zhí)行幾十萬甚至上百萬次 MCTS 模擬)。
下面,我結(jié)合 AlphaZero 算法本身,以及 github 上的具體實現(xiàn),從自我對局和策略價值網(wǎng)絡(luò)訓(xùn)練兩個方面來展開介紹一下整個訓(xùn)練過程,以及自己實驗過程中的一些觀察和體會。
完全基于 self-play 來學(xué)習(xí)進化是 AlphaZero 的最大賣點,也是整個訓(xùn)練過程中最關(guān)鍵也是最耗時的環(huán)節(jié)。這里有幾個關(guān)鍵點需要說明:
1. 使用哪個模型來生成 self-play 數(shù)據(jù)?
在 AlphaGo Zero 版本中,我們需要同時保存當前最新的模型和通過評估得到的歷史最優(yōu)的模型,self-play 數(shù)據(jù)始終由最優(yōu)模型生成,用于不斷訓(xùn)練更新當前最新的模型,然后每隔一段時間評估當前最新模型和最優(yōu)模型的優(yōu)劣,決定是否更新歷史最優(yōu)模型。
而到了 AlphaZero 版本中,這一過程得到簡化,我們只保存當前最新模型,self-play 數(shù)據(jù)直接由當前最新模型生成,并用于訓(xùn)練更新自身。直觀上我們可能會感覺使用當前最優(yōu)模型生成的 self-play 數(shù)據(jù)可能質(zhì)量更高,收斂更好,但是在嘗試過兩種方案之后,我們發(fā)現(xiàn),在 6*6 棋盤上下 4 子棋這種情況下,直接使用最新模型生成 self-play 數(shù)據(jù)訓(xùn)練的話大約 500 局之后就能得到比較好的模型了,而不斷維護最優(yōu)模型并由最優(yōu)模型生成 self-play 數(shù)據(jù)的話大約需要 1500 局之后才能達到類似的效果,這和 AlphaZero 論文中訓(xùn)練 34 小時的 AlphaZero 勝過訓(xùn)練 72 小時的 AlphaGo Zero 的結(jié)果也是吻合的。
個人猜測,不斷使用最新模型來生成 self-play 數(shù)據(jù)可能也是一個比較有效的 exploration 手段,首先當前最新模型相比于歷史最優(yōu)模型一般不會差很多,所以對局數(shù)據(jù)的質(zhì)量其實也是比較有保證的,同時模型的不斷變化使得我們能覆蓋到更多典型的數(shù)據(jù),從而加快收斂。
2. 如何保證 self-play 生成的數(shù)據(jù)具有多樣性?
一個有效的策略價值模型,需要在各種局面下都能比較準確的評估當前局面的優(yōu)劣以及當前局面下各個 action 的相對優(yōu)劣,要訓(xùn)練出這樣的策略價值模型,就需要在 self-play 的過程中盡可能的覆蓋到各種各樣的局面。
前面提到,不斷使用最新的模型來生成 self-play 數(shù)據(jù)可能在一定程度上有助于覆蓋到更多的局面,但僅靠這么一點模型的差異是不夠的,所以在強化學(xué)習(xí)算法中,一般都會有特意設(shè)計的 exploration 的手段,這是至關(guān)重要的。
在 AlphaGo Zero 論文中,每一個 self-play 對局的前 30 步,action 是根據(jù)正比于 MCTS 根節(jié)點處每個分支的訪問次數(shù)的概率采樣得到的(也就是上面 Self-play 示意圖中的 ,有點類似于隨機策略梯度方法中的探索方式),而之后的 exploration 則是通過直接加上 Dirichlet noise 的方式實現(xiàn)的(
,有點類似于確定性策略梯度方法中的探索方式)。在我們的實現(xiàn)中,self-play 的每一步都同時使用了這兩種 exploration 方式,Dirichlet noise 的參數(shù)取的是 0.3,即
, 同時
.
3. 始終從當前 player 的視角去保存 self-play 數(shù)據(jù)
在 self-play 過程中,我們會收集一系列的 數(shù)據(jù),
表示局面,
是根據(jù) MCTS 根節(jié)點處每個分支的訪問次數(shù)計算的概率,
是 self-play 對局的結(jié)果,其中
和
需要特別注意從每一步的當前 player 的視角去表示。比如
中用兩個二值矩陣分別表示兩個 player 的棋子的位置,那么可以是第一個矩陣表示當前 player 的棋子位置,第二個矩陣表示另一個 player 的棋子位置,也就是說第一個矩陣會交替表示先手和后手 player 的棋子位置,就看
局面下誰是當前 player。
也類似,不過需要在一個完整的對局結(jié)束后才能確定這一局中每一個
中的
,如果最后的勝者是
局面下的當前 player,則
,如果最后的敗者是
局面下的當前 player,則
,如果最后打平,則
.
4. self-play 數(shù)據(jù)的擴充
圍棋具有旋轉(zhuǎn)和鏡像翻轉(zhuǎn)等價的性質(zhì),其實五子棋也具有同樣的性質(zhì)。在 AlphaGo Zero 中,這一性質(zhì)被充分的利用來擴充 self-play 數(shù)據(jù),以及在 MCTS 評估葉子節(jié)點的時候提高局面評估的可靠性。但是在 AlphaZero 中,因為要同時考慮國際象棋和將棋這兩種不滿足旋轉(zhuǎn)等價性質(zhì)的棋類,所以對于圍棋也沒有利用這個性質(zhì)。
而在我們的實現(xiàn)中,因為生成 self-play 數(shù)據(jù)本身就是計算的瓶頸,為了能夠在算力非常弱的情況下盡快的收集數(shù)據(jù)訓(xùn)練模型,每一局 self-play 結(jié)束后,我們會把這一局的數(shù)據(jù)進行旋轉(zhuǎn)和鏡像翻轉(zhuǎn),將 8 種等價情況的數(shù)據(jù)全部存入 self-play 的 data buffer 中。這種旋轉(zhuǎn)和翻轉(zhuǎn)的數(shù)據(jù)擴充在一定程度上也能提高 self-play 數(shù)據(jù)的多樣性和均衡性。
所謂的策略價值網(wǎng)絡(luò),就是在給定當前局面 的情況下,返回當前局面下每一個可行 action 的概率以及當前局面評分的模型。前面 self-play 收集到的數(shù)據(jù)就是用來訓(xùn)練策略價值網(wǎng)絡(luò)的,而訓(xùn)練更新的策略價值網(wǎng)絡(luò)也會馬上被應(yīng)用到 MCTS 中進行后面的 self-play,以生成更優(yōu)質(zhì)的 self-play 數(shù)據(jù)。兩者相互嵌套,相互促進,就構(gòu)成了整個訓(xùn)練的循環(huán)。下面還是從幾個點分別進行說明:
1. 局面描述方式
在 AlphaGo Zero 中,一共使用了 17 個 的二值特征平面來描述當前局面,其中前 16 個平面描述了最近 8 步對應(yīng)的雙方 player 的棋子位置,最后一個平面描述當前 player 對應(yīng)的棋子顏色,其實也就是先后手。
在我們的實現(xiàn)中,對局面的描述進行了極大的簡化,以 的棋盤為例,我們只使用了 4 個
的二值特征平面,其中前兩個平面分別表示當前 player 的棋子位置和對手 player 的棋子位置,有棋子的位置是 1,沒棋子的位置是 0。然后第三個平面表示對手 player 最近一步的落子位置,也就是整個平面只有一個位置是 1,其余全部是 0。 第四個平面,也就是最后一個平面表示的是當前 player 是不是先手 player,如果是先手 player 則整個平面全部為 1,否則全部為 0。
其實在最開始嘗試的時候,我只用了前兩個平面,也就是雙方的棋子的位置,因為直觀感覺這兩個平面已經(jīng)足夠表達整個完整的局面了。但是后來在增加了后兩個特征平面之后,訓(xùn)練的效果有了比較明顯的改善。個人猜想,因為在五子棋中,我方下一步的落子位置往往會在對手前一步落子位置的附近,所以加入的第三個平面對于策略網(wǎng)絡(luò)確定哪些位置應(yīng)該具有更高的落子概率具有比較大的指示意義,可能有助有訓(xùn)練。同時,因為先手在對弈中其實是很占優(yōu)勢的,所以在局面上棋子位置相似的情況下,當前局面的優(yōu)劣和當前 player 到底是先手還是后手十分相關(guān),所以第四個指示先后手的平面可能對于價值網(wǎng)絡(luò)具有比較大的意義。
2. 網(wǎng)絡(luò)結(jié)構(gòu)
在 AlphaGo Zero 中,輸入局面首先通過了 20 或 40 個基于卷積的殘差網(wǎng)絡(luò)模塊,然后再分別接上 2 層或 3 層網(wǎng)絡(luò)得到策略和價值輸出,整個網(wǎng)絡(luò)的層數(shù)有 40 多或 80 多層,訓(xùn)練和預(yù)測的時候都十分緩慢。
所以在我們的實現(xiàn)中,對這個網(wǎng)絡(luò)結(jié)構(gòu)進行了極大的簡化,最開始是公共的 3 層全卷積網(wǎng)絡(luò),分別使用 32、64 和 128 個 的 filter,使用 ReLu 激活函數(shù)。然后再分成 policy 和 value 兩個輸出,在 policy 這一端,先使用 4 個
的 filter 進行降維,再接一個全連接層,使用 softmax 非線性函數(shù)直接輸出棋盤上每個位置的落子概率;在 value 這一端,先使用 2 個
的 filter 進行降維,再接一個 64 個神經(jīng)元的全連接層,最后再接一個全連接層,使用 tanh 非線性函數(shù)直接輸出
之間的局面評分。整個策略價值網(wǎng)絡(luò)的深度只有 5~6 層,訓(xùn)練和預(yù)測都相對比較快。
3. 訓(xùn)練目標
前面提到,策略價值網(wǎng)絡(luò)的輸入是當前的局面描述 ,輸出是當前局面下每一個可行 action 的概率
以及當前局面的評分
,而用來訓(xùn)練策略價值網(wǎng)絡(luò)的是我們在 self-play 過程中收集的一系列的
數(shù)據(jù)。
根據(jù)上面的策略價值網(wǎng)絡(luò)訓(xùn)練示意圖,我們訓(xùn)練的目標是讓策略價值網(wǎng)絡(luò)輸出的 action 概率 更加接近 MCTS 輸出的概率
,讓策略價值網(wǎng)絡(luò)輸出的局面評分
能更準確的預(yù)測真實的對局結(jié)果
。
從優(yōu)化的角度來說,我們是在 self-play 數(shù)據(jù)集上不斷的最小化損失函數(shù): ,其中第三項是用于防止過擬合的正則項。既然是在最小化損失函數(shù),那么在訓(xùn)練的過程中,如果正常的話我們就會觀察到損失函數(shù)在慢慢減小。
下圖展示的是一次在 棋盤上進行五子棋訓(xùn)練的過程中損失函數(shù)隨著 self-play 局數(shù)變化的情況,這次實驗一共進行了 3050 局對局,損失函數(shù)從最開始的 4 點幾慢慢減小到了 2.2 左右。
在訓(xùn)練過程中,除了觀察到損失函數(shù)在慢慢減小,我們一般還會關(guān)注策略價值網(wǎng)絡(luò)輸出的策略(輸出的落子概率分布)的 entropy 的變化情況。
正常來講,最開始的時候,我們的策略網(wǎng)絡(luò)基本上是均勻的隨機輸出落子的概率,所以 entropy 會比較大。隨著訓(xùn)練過程的慢慢推進,策略網(wǎng)絡(luò)會慢慢學(xué)會在不同的局面下哪些位置應(yīng)該有更大的落子概率,也就是說落子概率的分布不再均勻,會有比較強的偏向,這樣 entropy 就會變小。
也正是由于策略網(wǎng)絡(luò)輸出概率的偏向,才能幫助 MCTS 在搜索過程中能夠在更有潛力的位置進行更多的模擬,從而在比較少的模擬次數(shù)下達到比較好的性能。
下圖展示的是同一次訓(xùn)練過程中觀察到的策略網(wǎng)絡(luò)輸出策略的 entropy 的變化情況。
另外,在漫長的訓(xùn)練過程中,我們最希望看到的當然是我們訓(xùn)練的 AI 正在慢慢變強。所以雖然在 AlphaZero 的算法流程中已經(jīng)不再需要通過定期評估來更新最優(yōu)策略,在我們的實現(xiàn)中還是每隔 50 次 self-play 對局就對當前的 AI 模型進行一次評估,評估的方式是使用當前最新的 AI 模型和純的 MCTS AI(基于隨機 rollout)對戰(zhàn) 10 局。
pure MCTS AI 最開始每一步使用 1000 次模擬,當被我們訓(xùn)練的 AI 模型 10:0 打敗時,pure MCTS AI 就升級到每一步使用 2000 次模擬,以此類推,不斷增強,而我們訓(xùn)練的 AlphaZero AI 模型每一步始終只使用 400 次模擬。在上面那次 3050 局自我對局的訓(xùn)練實驗中,我們觀察到:
經(jīng)過 550 局,AlphaZero VS pure_MCTS 1000 首次達到 10:0
經(jīng)過 1300 局,AlphaZero VS pure_MCTS 2000 首次達到 10:0
經(jīng)過 1750 局,AlphaZero VS pure_MCTS 3000 首次達到 10:0
經(jīng)過 2450 局,AlphaZero VS pure_MCTS 4000 取得 8 勝 1 平 1 負
經(jīng)過 2850 局,AlphaZero VS pure_MCTS 4000 取得 9 勝 1 負。
OK,到這里整個 AlphaZero 實戰(zhàn)過程就基本介紹完了,感興趣的小伙伴可以下載我 github 上的代碼進行嘗試。為了方便大家直接和已經(jīng)訓(xùn)練好的模型進行對戰(zhàn)體驗,我專門實現(xiàn)了一個純 numpy 版本的策略價值前向網(wǎng)絡(luò),所以只要裝了 python 和 numpy 就可以直接進行人機對戰(zhàn)啦,祝大家玩的愉快!^_^
參考文獻:
AlphaZero: Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm
AlphaGo Zero: Mastering the game of Go without human knowledge
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。