MindSpore Reinforcement新特性:分布式训练和蒙特卡洛树搜索
MindSpore Reinforcement
MindSpore Reinforcement v0.5 版本提供了基于Dataflow Fragment的分布式訓練能力,通過擴展新的Fragment可以實現靈活的分布式訓練策略。在后續的版本迭代中,分布式架構會持續進行迭代優化,并提供全自動的大規模分布式訓練支持。此外,v0.5版本還提供了蒙特卡洛樹搜索算法的原生支持,通過此算法用戶可以實現類似AlphaGo等基于樹搜索的強化學習算法。
1、基于Dataflow Fragment的可擴展分布式訓練
1.1 背景
強化學習是一種通過智能體在未知環境中不斷地學習如何行動,來解決決策問題的機器學習技術。多智能體的深度強化學習算法需要訓練大量存在信息交互的智能體,每個智能體的策略一般由深度神經網絡表示。
圖1?強化學習流程示意圖
強化學習在游戲AI、生物建模、機器人和過程優化等不同領域的現實應用中均取得了顯著的成功。然而,這種進步需要依靠大量的計算資源。例如,使用強化學習將多人游戲AI訓練到具有人類職業玩家的水平,需要使用大量GPU進行訓練。
1.2 當前框架面臨的挑戰
現有的分布式強化學習平臺效率低下。如圖2所示,平臺通常以一組Python函數的方式來執行給定的強化學習算法(如PPO算法),這些函數將作為循環中的一部分在訓練中被調用。這種方式雖然為用戶帶來了直觀的編程API,但它失去了部分優化的機會,例如,
1)使用Ascend、GPU等硬件加速器來并行部分算法;
2)在多設備上并行執行。
圖2?Python函數式執行
1.3 MindSpore Reinforcement提供的思路
MindSpore Reinforcement Learning(下簡稱MSRL)?采取了不同的方式,將強化學習的算法定義與算法如何并行或分布式執行在硬件設備上進行了解耦。它通過一個新的抽象,即數據流片段圖(Fragmented Dataflow Graphs)來實現這一目標,該抽象用于MSRL將算法的不同片段映射到異構設備上,包括Ascend、GPU和多核CPU設備。
算法的每一部分都將成為數據流片段,并由MSRL靈活地分發與并行,如圖3所示。
圖3 Dataflow?Fragment式執行
1.3.1?MSRL的編程模型
在實現以上特性的同時,MSRL仍然為用戶保留了直觀的編程模型。如圖4代碼片段為MAPPO算法的實現,用戶仍可通過熟悉的算法概念來表達,如actors, learners 和 trainers等。
圖4?MSRL的編程模型
因此,MSRL同現有的強化學習框架保持了一定的算法概念兼容性。
1.3.2?MSRL基于Dataflow Fragment的分布式策略
因此,MSRL的一項獨特功能是,用戶可以輕易地更改強化學習算法的分布式并行策略。MSRL支持不同的分布式策略(DPs),這些策略規定了數據流片段與設備的映射關系。例如,相同的算法可以部署在一臺或多臺具有單個或多個GPU的計算機或集群上。
我們通過兩個分布式策略示例來說明MSRL對強化學習算法配置的靈活性。圖6 DP1將算法劃分為三個片段, actor和learner片段映射至不同GPU,environment片段映射至CPU。該策略可以在多個GPU上配置算法,這些GPU可能位于同一臺主機,也可能通過網絡連接。
圖7 DP2對相同算法進行了不同的擴展:它將actor和learner融合為單個GPU片段,并將此融合片段與CPU上的environment片段綁定。如果算法在訓練中需要進行數據規約,那么這種類型的部署策略會變的更加有效。現有框架可能需要通過重寫部分算法來實現不同的分布式需求,MSRL可以僅通過部署時更改分布式策略來滿足這一要求,算法實現不需要進行改動,并且不會犧牲訓練性能和擴展性。
1.4 實驗
在MSRL使用的靜態圖模式下,編譯器可以通過使用圖優化等技術來獲得更好的執行性能,有助于規模部署和跨平臺運行。實驗比較了不同的分布式策略在單/多卡上的訓練性能。
如圖8所示,我們從單卡擴展到64卡,并在使用上節描述的兩種不同的分布式策略驗證了PPO的episode訓練時間。從結果可知,隨著使用的GPU數量的增加,仍能保持不錯的加速比。
圖8 不同分布式策略在多卡上的訓練時間
詳情請見:
https://gitee.com/mindspore/reinforcement/tree/master/example/ppo
2、蒙特卡洛樹搜索
2.1?背景介紹
兩人零和博弈游戲都可以用一棵游戲樹來表示整個游戲的過程,若要獲得這個博弈中的最佳的步法(動作),傳統是利用極小化極大化算法來求解最優解。一些動作空間較小的游戲,如井字棋整棵游戲樹的復雜度上界為9!=362880(實際會小于這個值),可以通過現有的計算機算力遍歷整棵游戲樹來獲得最優解,但是對于圍棋這一類動作空間巨大的博弈游戲,如圍棋的搜索空間達到了3361,現有的計算機算力是根本沒有辦法通過遍歷整棵游戲樹來獲得最優解的。
圖9?圍棋游戲樹演示
(參考https://www.zhihu.com/question/39916945)
在2006年,研究者提出了基于樹結構的蒙特卡洛方法,即蒙特卡洛樹搜索(MCTS)。MCTS是一種通過樹來表達復雜的組合空間來做決策的搜索算法,每一個樹的節點表達環境的一個狀態。它以模擬的形式進行隨機采樣,然后更新節點,在后續的迭代中可以更加準確的做出決策。
圖10 蒙特卡洛樹搜索四步示意
(參考C. Browne, et al.,"A Survey of Monte Carlo Tree Search Methods" in IEEE Transactions on Computational Intelligence and AI in Games, vol. 4, no. 01, pp. 1-43, 2012.)
MCTS一般分為四步:
??Selection會從當前節點(當前狀態)根據提供的選擇策略,如Upper Confidence Bounds(UCB),Exploration-Exploitation with Exponential weights(EXP3),Rapid Value Action Estimation(RAVE)等,去選擇最優的動作到達子節點(下一個狀態)直到葉節點。
??Expansion會在Selection到達的葉節點進行擴展除非葉節點是終止節點。擴展的子節點的先驗概率(Prior)根據不同算法決定。
??Simulation隨機選擇動作推進游戲的進行,直到達到終止節點。終止節點獲得的收益將會用于下一步的更新。
??Backpropagation會將Simulation獲得的收益以固定策略更新到Selection經過的節點上。
因為MCTS通過隨機的對游戲進行推演來構建一棵不對稱的搜索樹,它大大的減少了搜索空間,并聚焦于更有可能獲勝的分支(動作)。通過MCTS構建的AI可以在圍棋中達到業余愛好者的水平,但遠達不到職業水平。
在2016年,DeepMind將MCTS與深度學習結合起來提出了AlphaGo,戰勝了人類最頂尖的圍棋玩家。它不僅僅被看做是在圍棋上的一個重大突破,也是在AI上的一個重大突破。在AlphaGo中,先驗概率的計算和Simulation中的使用到了通過監督學習訓練過的神經網絡。通過監督學習訓練的網絡,能更加精確的估計動作的先驗概率和評估當前局面。
在以MCTS為基礎的強化學習算法的成功之后,越來越多的研究者在強化學習中使用MCTS。
2.2?MindSpore Reinforcement的實現
2.2.1 介紹
MindSpore Reinforcement v0.5.0是原生支持通用MCTS的強化學習框架。現有的強化學習框架普遍采用Python或者動態圖來實現MCTS算法,MindSpore Reinforcement使用靜態計算圖來表達MCTS算法,通過C++實現高效執行。用戶可以直接在算法中調用框架內置的MCTS算法,也可以通過擴展來完成自定義邏輯。
2.2.2 使用方法
圖11?MindSpore Reinforcement MCTS API使用展示
在框架提供的接口中,用戶只需要創建指定類型的蒙特卡洛樹,然后調用mcts_search方法就能執行MCTS算法中的四步并獲取最優的動作。
2.2.3?MindSpore Reinforcement的方案
框架首先會通過MindSpore算子在C++側創建一棵指定類型的蒙特卡洛樹,后續的操作都會被應用在這棵樹上。
Selection和Backpropagation操作在Python側是以MindSpore算子的形式呈現出來的,實際會調用C++側定義的選擇策略和更新策略,去修改之前定義的樹。動作的先驗概率和Simulation的方法在Python側被定義和實現,它們分別被作為Expansion和Backpropagation的輸入去修改之前定義的樹。
圖12?MindSpore Reinforcement MCTS 結構
2.2.4?算法邏輯的擴展
MindSpore Reinforcement當前版本提供了傳統的MCTS。由于MCTS發展速度迅速,不同的算法選擇動作的策略和計算先驗概率的方法也不同。當框架內置的MCTS算法不能滿足用戶要求時,框架提供了MCTS算法邏輯注入的能力,來滿足用戶對MCTS變種算法的需求。
如圖12所展示,如何選擇子節點以及如何更新節點是在計算圖中被調用的,用戶需要以自定義算子的形式繼承框架提供的基類并重寫虛函數。自定義選擇策略和更新策略可以滿足不同MCTS算法,如背景章節提到的UCB,EXP3等方法。
如上文所說不同的算法計算先驗概率的方法也不同,如AlphaGo就使用了神經網絡,而普通MCTS則使用了平均概率,所以我們提供用戶可以在Python層定義先驗概率的計算和Simulation的方式。這兩個模塊的自定義使得MCTS框架有了足夠的泛化能力。
MCTS的示例請見:
https://gitee.com/mindspore/reinforcement/tree/master/example/mcts
MCTS的接口使用與介紹請見:
https://gitee.com/mindspore/reinforcement/blob/master/mindspore_rl/utils/mcts/mcts.py
總結
以上是生活随笔為你收集整理的MindSpore Reinforcement新特性:分布式训练和蒙特卡洛树搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享日历的制作方法
- 下一篇: 微信小程序实现带参数的分享功能