伯克利開源工具庫 RLib 現已支持大規模多智能體強化學習
近日,UC 伯克利的研究團隊 RISELab 在其 Github 的項目 Ray Rlib 0.6.0 中添加了面向多智能體強化學習(multi-agent Reinforcement Learning)的支持。本文由團隊成員 Eric Liang 首發于 RISELab 團隊主頁,AI 前線翻譯整理。本文主要是關于多智能體強化學習的簡明教程,以及在 RLib 中的設計思路。
為什么要使用多智能體強化學習?
研究人員發現,在實際的強化學習設置中,很多問題都討論到使用多智能體學習是否有意義。在特定的環境中,與訓練單一策略的方案相比,多智能體方案能提供以下優點:
- 對問題的分解更具有可解釋性 。舉個例子,假設現在需要在城市環境中訓練 蜂窩天線仰角控制 的策略。一種方案是訓練一個“超級智能體”在城市中控制所有的蜂窩天線,另一種方案是將每個天線建模成分離的智能體,后者顯然更加合理。因為只有相鄰的天線和用戶觀測到的天線需要彼此互聯,而其他個體之間則不需要復雜的響應機制。
- 對于可擴展性的潛力: 首先,將一個龐大的、復雜的單一智能體分解為多個簡單的智能體不僅可以減少輸入和輸出的維度,同時也可以有效的增加每次迭代過程中訓練數據的輸入數量。其次,對每個智能體的操作和觀測空間進行分區,可以起到與 時域抽象方法 類似的作用,該方法成功地在單智能體策略中 提高 了學習效率。相對地,類似的分級方法可以顯式地實現為多智能體系統。最后,好的分解策略可以對環境變化具有更好的魯棒性,例如,單一的超智能體很容易對某個特定環境產生過擬合。
圖 1:單智能體方法(a)和(b)與多智能體強化學習(c)。
一些多智能體應用的例子:
減少交通擁堵 :事實證明, 智能化控制 少數自動駕駛車輛的速度,我們可以大幅增加交通流量。多智能體是這種自動化策略的基礎,因為在 混合自動化 系統中,將交通信號燈和車輛建模為單個智能體是不現實的,因為這需要在一個廣泛區域內的所有智能體之間同步所有的觀測值和行為。
圖 2: 交通流量模擬 ,上圖為沒有自動駕駛車輛的情況,下圖為有自動駕駛車輛的情況。
天線仰角控制 :可以根據本地環境的用戶分布和拓撲結構來優化蜂窩基站的聯合配置。每個基站可以被建模為覆蓋城市的多個智能體之一。
圖 3:天線仰角控制系統
OpenAI Five :Dota 2 AI 智能體經過訓練,可以相互協調并與人類對抗。五個 AI 玩家中的每一個都作為單獨的神經網絡策略實施,并與大規模 PPO 一起訓練。
圖 4:電腦玩家進行 Dota 2 游戲
介紹 RLib 中的多智能體支持
本文主要針對 RLib 中的通用多智能體支持進行介紹,包括與 Rlib 中的大多數 分布式算法 (A2C/A3C、PPO、IMPALA、DQN、DDPG 和 Ape-X)的兼容性介紹。本文還討論了多智能體強化學習面臨的挑戰,并展示了如何使用現有算法訓練多智能體策略,同時還提供了針對非平穩環境和環境變化較多情況下的 特定算法 的實現。
由于當前可供使用的多智能體強化學習庫幾乎沒有,這就增加了基于多智能體方法的實驗成本。在科研和應用兩個領域中,RLib 希望減少從單智能體模式轉為多智能體模式的矛盾并簡化轉變過程。
為什么支持多智能體很困難
為類似強化學習這種快速發展的領域開發軟件是極具挑戰性的,多智能體強化學習更甚之。這一工作的難點主要是針對處理多智能體學習中出現的核心問題的技術。
舉個例子:非平穩環境。在下圖中,紅色智能體的目標是學習如何調節整個交通流的速度。藍色智能體則只學習如何最小化它自己的行進時間。紅色智能體可以通過簡單地以所需速度駕駛來實現其目標。然而,在多智能體環境中,其他智能體將會學習如何達到其目標——例如藍色智能體通過繞行以縮短其時間。這是有問題的,因為從單智能體的視角來看(例如圖中紅色智能體),藍色智能體也是“環境的一部分”。事實上,從單智能體視角來看,環境的動態變化違反了馬爾可夫假設,而在 Q-learning 算法例如 DQN 中,這是整個算法設計的前提。
圖 5:環境中的非平穩過程:最開始在(a)中,紅色智能體通過減速來控制整個交通流的速度。然而,緊接著藍色智能體會學習繞過紅色智能體(b),這時,紅色智能體的處理機制將無法有效的應對當前環境。
針對上述情況,很多算法被提出,例如 LOLA、RIAL 和 Q-MIX。 從高層面講,強化學習模型的訓練過程中,這些算法會考慮其他智能體的行為。通常是在訓練階段部分集中化,在執行階段分散化處理。在實現方面,這意味著策略網絡之間是彼此依賴的,例如,Q-MIX 算法中的網絡混合:
圖 6:Q-MIX 混合網絡結構,具體可參考: QMIX: Monotonic Value Function Factorisation for Deep Multi-Agent Reinforcement Learning 。獨立的 Q- 估測通過單調的混合網絡進行累積,從而高效地進行最終行為的計算。
類似地,基于梯度策略的算法例如 A3C 和 PPO 等,可能無法兼容多智能體配置。因為隨著智能體數量的增加,置信度評價將變得越來越困難。考慮下圖中這種多智能體的所處的情況。可以看出,隨著智能體數量的增加,對智能體的激勵與其行為的相關性將會越來越小。此時,交通速度已經降為了 0,但是智能體并不能作出正確的響應以打破僵局。
圖 7:復雜情況下的優勢估測:在上圖的交通阻塞情況中,難以判斷哪個智能體是主要原因,在阻塞情況被解決后,同樣無法確定應當給哪個智能體分配更高的置信度。
一類方法通過中心化值函數(如圖 8 中的“Q”框)來模擬其他智能體對環境中的影響,MA-DDPG 則使用了這種方法。直觀地講,通過統計其他智能體的行為,可以有效減少對每個智能體進行優勢估計時的變化性。
圖 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 所示的是一種交通控制場景,其中多個可控實體(例如,交通燈、自動駕駛車輛)一起工作以減少高速公路擁堵。
在該場景中:
- 每個智能體都可以在不同的時間尺度上作出響應(即,異步工作)。
- 智能體會隨時間進出該環境。
圖 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 所示)。用戶可以在不同程度上使用這一抽象的對象,從僅使用一個單智能體共享策略到多策略,再到完全自定義的策略優化:
圖 10:RLib 中的多智能體執行與單智能體執行模型對比
級別 1:多智能體,共享策略
如果環境中的所有智能體都是同質的(例如,在交通模擬中的多個獨立的車輛),則可以使用現有的單智能體算法進行訓練。由于只有一個策略被訓練,因此 RLib 只需要在策略優化之前在內部累積不同智能體的經驗,用戶方面的變化則很小。
單智能體的情況:
復制代碼
register_env("your_env", lambda c: YourEnv(...))
trainer = PPOAgent(env="your_env")
while True:
print(trainer.train()) # distributed trainingstep
多智能體的情況:
復制代碼
register_env("your_multi_env", lambda c: YourMultiEnv(...))
trainer = PPOAgent(env="your_multi_env")
while True:
print(trainer.train()) # distributed trainingstep
注意,此處的 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 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={
"supervisor_policy": (SupervisorPolicy,...),
"worker_p1":...,...},
policy_mapping_fn=policy_mapper,
sample_batch_size=500)
evaluators.append(ev)
while True:
# Collect experiencesinparallel using thepolicyevaluators
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) # Custompolicyoptimization
# Broadcast new weightsandrepeat
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.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