伯克利開源工具庫RLib現已支持大規模多智能體強化學習

AI前線導讀:近日,UC伯克利的研究團隊RISELab在其Github的項目Ray Rlib 0.6.0中添加了面向多智能體強化學習(multi-agent Reinforcement Learning)的支持。本文由團隊成員Eric Liang首發於RISELab團隊主頁,AI前線翻譯整理。本文主要是關於多智能體強化學習的簡明教程,以及在RLib中的設計思路。

爲什麼要使用多智能體強化學習?

研究人員發現,在實際的強化學習設置中,很多問題都討論到使用多智能體學習是否有意義。在特定的環境中,與訓練單一策略的方案相比,多智能體方案能提供以下優點:

  • 對問題的分解更具有可解釋性。舉個例子,假設現在需要在城市環境中訓練蜂窩天線仰角控制的策略。一種方案是訓練一個“超級智能體”在城市中控制所有的蜂窩天線,另一種方案是將每個天線建模成分離的智能體,後者顯然更加合理。因爲只有相鄰的天線和用戶觀測到的天線需要彼此互聯,而其他個體之間則不需要複雜的響應機制。
  • 對於可擴展性的潛力:首先,將一個龐大的、複雜的單一智能體分解爲多個簡單的智能體不僅可以減少輸入和輸出的維度,同時也可以有效的增加每次迭代過程中訓練數據的輸入數量。其次,對每個智能體的操作和觀測空間進行分區,可以起到與時域抽象方法類似的作用,該方法成功地在單智能體策略中提高了學習效率。相對地,類似的分級方法可以顯式地實現爲多智能體系統。最後,好的分解策略可以對環境變化具有更好的魯棒性,例如,單一的超智能體很容易對某個特定環境產生過擬合。

image

圖 1:單智能體方法(a)和(b)與多智能體強化學習(c)。

一些多智能體應用的例子:

減少交通擁堵:事實證明,智能化控制少數自動駕駛車輛的速度,我們可以大幅增加交通流量。多智能體是這種自動化策略的基礎,因爲在混合自動化系統中,將交通信號燈和車輛建模爲單個智能體是不現實的,因爲這需要在一個廣泛區域內的所有智能體之間同步所有的觀測值和行爲。

image

圖 2:交通流量模擬,上圖爲沒有自動駕駛車輛的情況,下圖爲有自動駕駛車輛的情況。

天線仰角控制:可以根據本地環境的用戶分佈和拓撲結構來優化蜂窩基站的聯合配置。每個基站可以被建模爲覆蓋城市的多個智能體之一。

image

圖 3:天線仰角控制系統

OpenAI Five:Dota 2 AI智能體經過訓練,可以相互協調並與人類對抗。五個AI玩家中的每一個都作爲單獨的神經網絡策略實施,並與大規模PPO一起訓練。

image

圖 4:電腦玩家進行Dota 2遊戲

介紹RLib中的多智能體支持

本文主要針對RLib中的通用多智能體支持進行介紹,包括與Rlib中的大多數分佈式算法(A2C/A3C、PPO、IMPALA、DQN、DDPG和Ape-X)的兼容性介紹。本文還討論了多智能體強化學習面臨的挑戰,並展示瞭如何使用現有算法訓練多智能體策略,同時還提供了針對非平穩環境和環境變化較多情況下的特定算法的實現。

由於當前可供使用的多智能體強化學習庫幾乎沒有,這就增加了基於多智能體方法的實驗成本。在科研和應用兩個領域中,RLib希望減少從單智能體模式轉爲多智能體模式的矛盾並簡化轉變過程。

爲什麼支持多智能體很困難

爲類似強化學習這種快速發展的領域開發軟件是極具挑戰性的,多智能體強化學習更甚之。這一工作的難點主要是針對處理多智能體學習中出現的核心問題的技術。

舉個例子:非平穩環境。在下圖中,紅色智能體的目標是學習如何調節整個交通流的速度。藍色智能體則只學習如何最小化它自己的行進時間。紅色智能體可以通過簡單地以所需速度駕駛來實現其目標。然而,在多智能體環境中,其他智能體將會學習如何達到其目標——例如藍色智能體通過繞行以縮短其時間。這是有問題的,因爲從單智能體的視角來看(例如圖中紅色智能體),藍色智能體也是“環境的一部分”。事實上,從單智能體視角來看,環境的動態變化違反了馬爾可夫假設,而在Q-learning算法例如DQN中,這是整個算法設計的前提。

image

圖 5:環境中的非平穩過程:最開始在(a)中,紅色智能體通過減速來控制整個交通流的速度。然而,緊接着藍色智能體會學習繞過紅色智能體(b),這時,紅色智能體的處理機制將無法有效的應對當前環境。

針對上述情況,很多算法被提出,例如LOLA、RIAL和Q-MIX。 從高層面講,強化學習模型的訓練過程中,這些算法會考慮其他智能體的行爲。通常是在訓練階段部分集中化,在執行階段分散化處理。在實現方面,這意味着策略網絡之間是彼此依賴的,例如,Q-MIX算法中的網絡混合:

image

圖 6:Q-MIX混合網絡結構,具體可參考:QMIX: Monotonic Value Function Factorisation for Deep Multi-Agent Reinforcement Learning。獨立的Q-估測通過單調的混合網絡進行累積,從而高效地進行最終行爲的計算。

類似地,基於梯度策略的算法例如A3C和PPO等,可能無法兼容多智能體配置。因爲隨着智能體數量的增加,置信度評價將變得越來越困難。考慮下圖中這種多智能體的所處的情況。可以看出,隨着智能體數量的增加,對智能體的激勵與其行爲的相關性將會越來越小。此時,交通速度已經降爲了0,但是智能體並不能作出正確的響應以打破僵局。

image

圖 7:複雜情況下的優勢估測:在上圖的交通阻塞情況中,難以判斷哪個智能體是主要原因,在阻塞情況被解決後,同樣無法確定應當給哪個智能體分配更高的置信度。

一類方法通過中心化值函數(如圖8中的“Q”框)來模擬其他智能體對環境中的影響,MA-DDPG則使用了這種方法。直觀地講,通過統計其他智能體的行爲,可以有效減少對每個智能體進行優勢估計時的變化性。

image

圖 8:MA-DDPG基本框架,選自Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments。在執行階段,僅使用局部信息,但在訓練階段需要使用全局信息進行優化。

到這裏,本文已經介紹了研究多智能體強化學習所面臨的兩大挑戰與解決策略。在很多情況下,使用單智能體強化學習算法訓練多智能策略可以取得不錯的結果。例如,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所示的是一種交通控制場景,其中多個可控實體(例如,交通燈、自動駕駛車輛)一起工作以減少高速公路擁堵。

在該場景中:

  • 每個智能體都可以在不同的時間尺度上作出響應(即,異步工作)。
  • 智能體會隨時間進出該環境。

image

圖 9:RLib多智能體環境可以模擬多個獨立智能體隨時間進出環境的情況。不同的智能體可以被賦予不同的策略。

下面這段代碼是使用MultiAgentEnv接口的一個示例,該接口可以從多個就緒的智能體中返回觀測值和激勵:

# 示例:使用多智能體環境
> env = MultiAgentTrafficEnv(num_cars=20, num_traffic_lights=5)

# 觀測值是字典形式的,不是每一個智能體都需要在每個時間點被表示於字典中。
> print(env.reset())
{
   "car_1": [[...]],
   "car_2": [[...]],
   "traffic_light_1": [[...]],
}

# 每個智能體都需要定義一個行爲來返回他們的觀測值
> new_obs, rewards, dones, infos = env.step(
actions={"car_1": ..., "car_2": ...})

# 同樣的,新的觀測值,激勵,完成的,信息等也是字典形式
> print(rewards)
{"car_1": 3, "car_2": -1, "traffic_light_1": 0}

# 獨立的智能體可以早早離開; 當"__all__"設置爲True時,環境配置完成。
> print(dones)
{"car_2": True, "__all__": False}

OpenAI gym中的任何離散的Box、Dict或者Tuple都可以爲這些獨立的智能體提供支持,每個智能體都允許接受多種類型的輸入(包括智能體間的通信)。

多級的API支持

在較高的層次上,RLib模型將智能體和策略建模爲在一段持續時間內可以互相綁定的對象(如圖7所示)。用戶可以在不同程度上使用這一抽象的對象,從僅使用一個單智能體共享策略到多策略,再到完全自定義的策略優化:

image

圖10:RLib中的多智能體執行與單智能體執行模型對比

級別1:多智能體,共享策略

如果環境中的所有智能體都是同質的(例如,在交通模擬中的多個獨立的車輛),則可以使用現有的單智能體算法進行訓練。由於只有一個策略被訓練,因此RLib只需要在策略優化之前在內部累積不同智能體的經驗,用戶方面的變化則很小。

單智能體的情況:

register_env("your_env", lambda c: YourEnv(...))
trainer = PPOAgent(env="your_env")
while True:
   print(trainer.train())  # distributed training step

多智能體的情況:

register_env("your_multi_env", lambda c: YourMultiEnv(...))
trainer = PPOAgent(env="your_multi_env")
while True:
   print(trainer.train())  # distributed training step

注意,此處的PPOAgent只是從單智能體API繼承的命名約定。它更像是智能體的一個訓練器而不是真正的智能體。

級別2:多智能體,多策略

這種情況下,需要定義每個智能體會被哪個策略處理。在RLib中可以通過策略映射函數處理此問題,該函數在智能體首次進入環境時將環境中的智能體分配給特定策略。下面的例子展示了一個分級控制設定,其中監督智能體將工作分配給它們監督的工作智能體。完成這一目標的所需配置是監督策略和工作策略的集合:

def policy_mapper(agent_id):
   if agent_id.startswith("supervisor_"):
       return "supervisor_policy"
   else:
       return random.choice(["worker_p1", "worker_p2"])
在本例中,我們通常將監督智能體與一個單獨的監督策略綁定,然後將其他工作智能體隨機分配給兩個不同的工作策略綁定。這些配置會在智能體首次進入環境時完成,並在智能體離開環境之前持續工作。最後,我們需要定義不止一個策略配置。這是作爲上級智能體配置的一部分來完成的:
trainer = PPOAgent(env="control_env", config={
   "multiagent": {
       "policy_mapping_fn": policy_mapper,
       "policy_graphs": {
           "supervisor_policy":

                (PPOPolicyGraph, sup_obs_space, sup_act_space, sup_conf),
           "worker_p1": (
               (PPOPolicyGraph, work_obs_s, work_act_s, work_p1_conf),
           "worker_p2":

                (PPOPolicyGraph, work_obs_s, work_act_s, work_p2_conf),
       },
       "policies_to_train": [

             "supervisor_policy", "worker_p1", "worker_p2"],
   },
})
while True:
   print(trainer.train())  # distributed training step

這將生成一個如圖5所示的配置。你可以爲每個策略定製個性化的策略圖類,以及不同的策略配置字典。任何RLib的支持的定製(例如,自定義模型和預處理)都可以用於每個策略,以及新的策略類的批量定義。

其他示例:Sharing layers across policiesImplementing 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={

            "supervisor_policy": (SupervisorPolicy, ...),

            "worker_p1": ..., ...},
       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))
   # >>> print(batch)
   # MultiAgentBatch({
   #     "supervisor_policy": SampleBatch({
   #          "obs": [[...], ...], "rewards": [0, ...], ...
   #      }),
   #     "worker_p1": SampleBatch(...),

    #     "worker_p2": SampleBatch(...),
   # })
   your_optimize_func(sup, w1, w2, batch)  # Custom policy optimization
   # Broadcast new weights and repeat
   for ev in evaluators:
       ev.set_weights.remote({
           "supervisor_policy": sup.get_weights(),
           "worker_p1": w1.get_weights(),
           "worker_p2": w2.get_weights(),
        })

總之,RLib提供了多個層級的API,旨在提高其可定製性。在最高層級,這裏提供了幾個簡單的“開箱即用”的訓練過程,但用戶也可以從核心的多智能體抽象對象中選擇使用自定義的算法和訓練策略。這裏有一些可以直接運行的腳本供使用: multiagent_cartpole.pymultiagent_two_trainers.py.

性能表現

RLlib旨在擴展到大型集羣以及多智能體模式,同時也提供類似向量化這種針對單核心效率的優化。這允許在小型機器上高效地使用多智能體API。

爲了說明這些優化方法的重要性,下圖分析了單核心策略評估與環境中智能體數量的關係。在這個基準測試中,觀測值是小浮點向量,策略是小型16*16的全連接網絡。每個智能體被隨機分配給10個這樣的策略網絡。RLib在每個環境中的10000個智能體上管理超過70k actions/s/core(此時Python的計算開銷就變成了瓶頸)。當向量化功能關閉的時候,經驗累積的速度降低了40倍:

image

RISELab還評估了在環境中使用多個不同策略網絡的更具挑戰性的情況。在這裏,仍然可以利用向量化將多個TensorFlow調用融合爲一個,從而獲得更穩定的單核性能,下圖是不同策略的數量從1擴展到50的評估結果:

image

結論

這篇博文介紹了一個快速,通用的多智能體強化學習框架。

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

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章