AI前線導讀:近日,UC伯克利的研究團隊RISELab在其Github的項目Ray Rlib 0.6.0中添加了面向多智能體強化學習(multi-agent Reinforcement Learning)的支持。本文由團隊成員Eric Liang首發于RISELab團隊主頁,AI前線翻譯整理。本文主要是關于多智能體強化學習的簡明教程,以及在RLib中的設計思路。
為什么要使用多智能體強化學習?
研究人員發現,在實際的強化學習設置中,很多問題都討論到使用多智能體學習是否有意義。在特定的環境中,與訓練單一策略的方案相比,多智能體方案能提供以下優點:
- 對問題的分解更具有可解釋性。舉個例子,假設現在需要在城市環境中訓練蜂窩天線仰角控制的策略。一種方案是訓練一個“超級智能體”在城市中控制所有的蜂窩天線,另一種方案是將每個天線建模成分離的智能體,后者顯然更加合理。因為只有相鄰的天線和用戶觀測到的天線需要彼此互聯,而其他個體之間則不需要復雜的響應機制。
- 對于可擴展性的潛力:首先,將一個龐大的、復雜的單一智能體分解為多個簡單的智能體不僅可以減少輸入和輸出的維度,同時也可以有效的增加每次迭代過程中訓練數據的輸入數量。其次,對每個智能體的操作和觀測空間進行分區,可以起到與時域抽象方法類似的作用,該方法成功地在單智能體策略中提高了學習效率。相對地,類似的分級方法可以顯式地實現為多智能體系統。最后,好的分解策略可以對環境變化具有更好的魯棒性,例如,單一的超智能體很容易對某個特定環境產生過擬合。
一些多智能體應用的例子:
減少交通擁堵:事實證明,智能化控制少數自動駕駛車輛的速度,我們可以大幅增加交通流量。多智能體是這種自動化策略的基礎,因為在混合自動化系統中,將交通信號燈和車輛建模為單個智能體是不現實的,因為這需要在一個廣泛區域內的所有智能體之間同步所有的觀測值和行為。
天線仰角控制:可以根據本地環境的用戶分布和拓撲結構來優化蜂窩基站的聯合配置。每個基站可以被建模為覆蓋城市的多個智能體之一。
OpenAI Five:Dota 2 AI智能體經過訓練,可以相互協調并與人類對抗。五個AI玩家中的每一個都作為單獨的神經網絡策略實施,并與大規模PPO一起訓練。
介紹RLib中的多智能體支持
本文主要針對RLib中的通用多智能體支持進行介紹,包括與Rlib中的大多數分布式算法(A2C/A3C、PPO、IMPALA、DQN、DDPG和Ape-X)的兼容性介紹。本文還討論了多智能體強化學習面臨的挑戰,并展示了如何使用現有算法訓練多智能體策略,同時還提供了針對非平穩環境和環境變化較多情況下的特定算法的實現。
由于當前可供使用的多智能體強化學習庫幾乎沒有,這就增加了基于多智能體方法的實驗成本。在科研和應用兩個領域中,RLib希望減少從單智能體模式轉為多智能體模式的矛盾并簡化轉變過程。
為什么支持多智能體很困難
為類似強化學習這種快速發展的領域開發軟件是極具挑戰性的,多智能體強化學習更甚之。這一工作的難點主要是針對處理多智能體學習中出現的核心問題的技術。
舉個例子:非平穩環境。在下圖中,紅色智能體的目標是學習如何調節整個交通流的速度。藍色智能體則只學習如何最小化它自己的行進時間。紅色智能體可以通過簡單地以所需速度駕駛來實現其目標。然而,在多智能體環境中,其他智能體將會學習如何達到其目標——例如藍色智能體通過繞行以縮短其時間。這是有問題的,因為從單智能體的視角來看(例如圖中紅色智能體),藍色智能體也是“環境的一部分”。事實上,從單智能體視角來看,環境的動態變化違反了馬爾可夫假設,而在Q-learning算法例如DQN中,這是整個算法設計的前提。
針對上述情況,很多算法被提出,例如LOLA、RIAL和Q-MIX。 從高層面講,強化學習模型的訓練過程中,這些算法會考慮其他智能體的行為。通常是在訓練階段部分集中化,在執行階段分散化處理。在實現方面,這意味著策略網絡之間是彼此依賴的,例如,Q-MIX算法中的網絡混合:
類似地,基于梯度策略的算法例如A3C和PPO等,可能無法兼容多智能體配置。因為隨著智能體數量的增加,置信度評價將變得越來越困難。考慮下圖中這種多智能體的所處的情況。可以看出,隨著智能體數量的增加,對智能體的激勵與其行為的相關性將會越來越小。此時,交通速度已經降為了0,但是智能體并不能作出正確的響應以打破僵局。
一類方法通過中心化值函數(如圖8中的“Q”框)來模擬其他智能體對環境中的影響,MA-DDPG則使用了這種方法。直觀地講,通過統計其他智能體的行為,可以有效減少對每個智能體進行優勢估計時的變化性。
到這里,本文已經介紹了研究多智能體強化學習所面臨的兩大挑戰與解決策略。在很多情況下,使用單智能體強化學習算法訓練多智能策略可以取得不錯的結果。例如,OpenAI Five就是利用了大規模PPO和特殊化網絡模型的組合。
在RLib中訓練多智能體
那么,在多智能體設置中如何使用特殊化算法與單智能體強化學習?RLib為此設計了簡單易行的方法。相關細則如下:
策略被表示為對象:在RLib中,所有的基于梯度的算法都會聲明一個策略圖對象,該對象包含一個策略模型πθ(ot)和一個軌跡后處理函數postθ(traj)以及策略損失L(θ; X)。該策略圖對象為分布式框架提供了足夠的內容與功能以執行環境部署(通過檢索πθ)、經驗整理(通過應用postθ)以及策略優化(通過減小策略損失)。
策略對象是黑箱:為了支持多智能體配置,在每個環境中,RLib僅管理多個策略圖的創建與執行,并在策略優化過程中對他們的損失進行累計。在RLib中,策略圖對象通常被當成黑箱,這就意味著可以用任何框架(包括TensorFlow和PyTorch)來實現它們。此外,策略圖可以在內部共享變量和層以實現Q-MIX和MA-DDPG等算法,而不需要特殊的框架支持。
更了更具體的說明這些細則,接下來的幾節將介紹一些RLlib中的多智能體API來執行大規模多智能體訓練的代碼示例。
多智能體環境模型
由于不確定標準的多智能體環境借口,因此RISELab將這個多智能體環境模型編寫為Gym接口的直接擴展。在多智能體環境中,每一步會存在多種行為實體。圖6所示的是一種交通控制場景,其中多個可控實體(例如,交通燈、自動駕駛車輛)一起工作以減少高速公路擁堵。
在該場景中:
- 每個智能體都可以在不同的時間尺度上作出響應(即,異步工作)。
- 智能體會隨時間進出該環境。
下面這段代碼是使用MultiAgentEnv接口的一個示例,該接口可以從多個就緒的智能體中返回觀測值和激勵:
# 示例:使用多智能體環境\u0026gt; env = MultiAgentTrafficEnv(num_cars=20, num_traffic_lights=5)# 觀測值是字典形式的,不是每一個智能體都需要在每個時間點被表示于字典中。\u0026gt; print(env.reset()){? ?\u0026quot;car_1\u0026quot;: [[...]],? ?\u0026quot;car_2\u0026quot;: [[...]],? ?\u0026quot;traffic_light_1\u0026quot;: [[...]],}# 每個智能體都需要定義一個行為來返回他們的觀測值\u0026gt; new_obs, rewards, dones, infos = env.step(actions={\u0026quot;car_1\u0026quot;: ...,?\u0026quot;car_2\u0026quot;: ...})# 同樣的,新的觀測值,激勵,完成的,信息等也是字典形式\u0026gt; print(rewards){\u0026quot;car_1\u0026quot;:?3,?\u0026quot;car_2\u0026quot;:?-1,?\u0026quot;traffic_light_1\u0026quot;:?0}# 獨立的智能體可以早早離開; 當\u0026quot;__all__\u0026quot;設置為True時,環境配置完成。\u0026gt; print(dones){\u0026quot;car_2\u0026quot;:?True,?\u0026quot;__all__\u0026quot;:?False}
OpenAI gym中的任何離散的Box、Dict或者Tuple都可以為這些獨立的智能體提供支持,每個智能體都允許接受多種類型的輸入(包括智能體間的通信)。
多級的API支持
在較高的層次上,RLib模型將智能體和策略建模為在一段持續時間內可以互相綁定的對象(如圖7所示)。用戶可以在不同程度上使用這一抽象的對象,從僅使用一個單智能體共享策略到多策略,再到完全自定義的策略優化:
級別1:多智能體,共享策略
如果環境中的所有智能體都是同質的(例如,在交通模擬中的多個獨立的車輛),則可以使用現有的單智能體算法進行訓練。由于只有一個策略被訓練,因此RLib只需要在策略優化之前在內部累積不同智能體的經驗,用戶方面的變化則很小。
單智能體的情況:
register_env(\u0026quot;your_env\u0026quot;,?lambda?c: YourEnv(...))trainer = PPOAgent(env=\u0026quot;your_env\u0026quot;)while?True:? ?print(trainer.train()) ?# distributed training step
多智能體的情況:
register_env(\u0026quot;your_multi_env\u0026quot;,?lambda?c: YourMultiEnv(...))trainer = PPOAgent(env=\u0026quot;your_multi_env\u0026quot;)while?True:? ?print(trainer.train()) ?# distributed training step
注意,此處的PPOAgent只是從單智能體API繼承的命名約定。它更像是智能體的一個訓練器而不是真正的智能體。
級別2:多智能體,多策略
這種情況下,需要定義每個智能體會被哪個策略處理。在RLib中可以通過策略映射函數處理此問題,該函數在智能體首次進入環境時將環境中的智能體分配給特定策略。下面的例子展示了一個分級控制設定,其中監督智能體將工作分配給它們監督的工作智能體。完成這一目標的所需配置是監督策略和工作策略的集合:
def?policy_mapper(agent_id):? ?if?agent_id.startswith(\u0026quot;supervisor_\u0026quot;):? ? ? ?return?\u0026quot;supervisor_policy\u0026quot;? ?else:? ? ? ?return?random.choice([\u0026quot;worker_p1\u0026quot;,?\u0026quot;worker_p2\u0026quot;])在本例中,我們通常將監督智能體與一個單獨的監督策略綁定,然后將其他工作智能體隨機分配給兩個不同的工作策略綁定。這些配置會在智能體首次進入環境時完成,并在智能體離開環境之前持續工作。最后,我們需要定義不止一個策略配置。這是作為上級智能體配置的一部分來完成的:trainer = PPOAgent(env=\u0026quot;control_env\u0026quot;, config={? ?\u0026quot;multiagent\u0026quot;: {? ? ? ?\u0026quot;policy_mapping_fn\u0026quot;: policy_mapper,? ? ? ?\u0026quot;policy_graphs\u0026quot;: {? ? ? ? ? ?\u0026quot;supervisor_policy\u0026quot;:? ? ? ? ? ? ? ? (PPOPolicyGraph, sup_obs_space, sup_act_space, sup_conf),? ? ? ? ? ?\u0026quot;worker_p1\u0026quot;: (? ? ? ? ? ? ? ?(PPOPolicyGraph, work_obs_s, work_act_s, work_p1_conf),? ? ? ? ? ?\u0026quot;worker_p2\u0026quot;:? ? ? ? ? ? ? ? (PPOPolicyGraph, work_obs_s, work_act_s, work_p2_conf),? ? ? ?},? ? ? ?\u0026quot;policies_to_train\u0026quot;: [? ? ? ? ? ? ?\u0026quot;supervisor_policy\u0026quot;,?\u0026quot;worker_p1\u0026quot;,?\u0026quot;worker_p2\u0026quot;],? ?},})while?True:? ?print(trainer.train()) ?# distributed training step
這將生成一個如圖5所示的配置。你可以為每個策略定制個性化的策略圖類,以及不同的策略配置字典。任何RLib的支持的定制(例如,自定義模型和預處理)都可以用于每個策略,以及新的策略類的批量定義。
其他示例:Sharing layers across policies、 Implementing a centralized critic
級別3:自定義訓練策略
對于一些高級的應用于研究情景,不可避免地會遇到一些框架方面的限制。
例如,假設需要多種訓練方法的情況:一些智能體將使用PPO進行學習,一些則使用DQN。這種情況下,可以通過在兩個不同的訓練器之間交換權重來完成(參考代碼),但這種方法的可擴展性較差,例如想加入新的算法或是想同時使用經驗對環境模型進行訓練的時候。
為了應對這種情況,RLib的底層系統Ray可以按需分配計算。Ray提供了兩個簡單的并行接口:
- Tasks,通過func.remote()被異步執行的Python函數。
- Actors,通過class.remote()在集群中被創建的Python類。Actor方法可以被actor.method.remote()調用。
RLib在Ray的tasks和actors上構建,為分布式強化學習提供工具包。其中包括:
- 策略圖(之前示例已展示)
- 策略評估:PolicyEvaluator類會對生成批量經驗的環境交互循環進行管理。當創建為Ray actors時,它可以用于在分布式環境中收集經驗。
- 策略優化:這一部分用于對策略的優化。你可以使用現有的優化器,也可以使用自定義策略。
例如,你可以創建策略優化器以收集多智能體的輸出,然后對他們進行處理以提高策略:
# 初始化一個單節點的Ray集群ray.init()# 為自定義策略圖創建局部實例sup, w1, w2 = SupervisorPolicy(), WorkerPolicy(), WorkerPolicy()# 創建策略優化器 (Ray actor進程會在集群中運行)evaluators = []for?i?in?range(16):? ?ev = PolicyEvaluator.as_remote().remote(? ? ? ?env_creator=lambda?ctx: ControlEnv(),? ? ? ?policy_graph={? ? ? ? ? ? \u0026quot;supervisor_policy\u0026quot;: (SupervisorPolicy, ...),? ? ? ? ? ??\u0026quot;worker_p1\u0026quot;: ..., ...},? ? ? ?policy_mapping_fn=policy_mapper,? ? ? ?sample_batch_size=500)? ?evaluators.append(ev)while?True:? ?# Collect experiences in parallel using the policy evaluators? ?futures = [ev.sample.remote()?for?ev?in?evaluators]? ?batch = MultiAgentBatch.concat_samples(ray.get(futures))? ?# \u0026gt;\u0026gt;\u0026gt; print(batch)? ?# MultiAgentBatch({? ?# ? ? \u0026quot;supervisor_policy\u0026quot;: SampleBatch({? ?# ? ? ? ? ?\u0026quot;obs\u0026quot;: [[...], ...], \u0026quot;rewards\u0026quot;: [0, ...], ...? ?# ? ? ?}),? ?# ? ? \u0026quot;worker_p1\u0026quot;: SampleBatch(...),? ? # ? ? \u0026quot;worker_p2\u0026quot;: SampleBatch(...),? ?# })? ?your_optimize_func(sup, w1, w2, batch) ?# Custom policy optimization? ?# Broadcast new weights and repeat? ?for?ev?in?evaluators:? ? ? ?ev.set_weights.remote({? ? ? ? ? ?\u0026quot;supervisor_policy\u0026quot;: sup.get_weights(),? ? ? ? ? ?\u0026quot;worker_p1\u0026quot;: w1.get_weights(),? ? ? ? ? ?\u0026quot;worker_p2\u0026quot;: w2.get_weights(),? ? ? ? })
總之,RLib提供了多個層級的API,旨在提高其可定制性。在最高層級,這里提供了幾個簡單的“開箱即用”的訓練過程,但用戶也可以從核心的多智能體抽象對象中選擇使用自定義的算法和訓練策略。這里有一些可以直接運行的腳本供使用:?multiagent_cartpole.py,?multiagent_two_trainers.py.
性能表現
RLlib旨在擴展到大型集群以及多智能體模式,同時也提供類似向量化這種針對單核心效率的優化。這允許在小型機器上高效地使用多智能體API。
為了說明這些優化方法的重要性,下圖分析了單核心策略評估與環境中智能體數量的關系。在這個基準測試中,觀測值是小浮點向量,策略是小型16*16的全連接網絡。每個智能體被隨機分配給10個這樣的策略網絡。RLib在每個環境中的10000個智能體上管理超過70k actions/s/core(此時Python的計算開銷就變成了瓶頸)。當向量化功能關閉的時候,經驗累積的速度降低了40倍:
RISELab還評估了在環境中使用多個不同策略網絡的更具挑戰性的情況。在這里,仍然可以利用向量化將多個TensorFlow調用融合為一個,從而獲得更穩定的單核性能,下圖是不同策略的數量從1擴展到50的評估結果:
結論
這篇博文介紹了一個快速,通用的多智能體強化學習框架。
RISELab目前正與BAIR,Berkeley FLow team和行業的早期用戶合作,以??進一步改進RLlib。
快嘗試使用’pip install ray [rllib]'快速安裝RLib,并運行你自己的測試用例吧。
有關RLlib和多代理支持的文檔,請訪問https://rllib.io。
查看英文原文:An Open Source Tool for Scaling Multi-Agent Reinforcement Learning