使用 Python TorchRL 進行多代理強化學習
隨著多代理系統的出現,強化學習的復雜性不斷增加。為了管理這種復雜性,像 TorchRL 這樣的專門工具提供了一個強大的框架,可以開發和實驗多代理強化學習(MARL)算法。本文將深入探討如何使用 TorchRL 解決 MARL 問題,重點關注多代理環境中的近端策略優化(PPO)。
我們將使用 VMAS 模擬器,這是一個多機器人模擬器并且可以在 GPU 上進行并行訓練。他的主要目標多個機器人必須導航到各自的目標,同時避免碰撞。
依賴
在開始之前,請確保安裝以下依賴項:
!pip3 install torchrl
!pip3 install vmas
!pip3 install tqdm
理解近端策略優化 (PPO)
PPO 是一種策略梯度算法,它迭代地從環境中采樣數據,并直接使用這些數據來優化策略。這個過程包括采樣和訓練兩個階段,數據在收集后立即進行訓練更新。這種在線方法確保策略根據與環境最近的交互持續改進。
在線學習
在 PPO 中,學習過程依賴于一個評論家(critic),它評估策略所采取行動的質量。評論家估計給定狀態的價值,通過比較預期回報與實際結果來指導策略優化。
在多代理設置中,我們部署多個策略,每個代理一個,通常以分散的方式運作。每個代理的策略僅根據其局部觀察來決定其行動。但是評論家可以是集中的或分散的:
- MAPPO : 評論家是集中的,以全局觀察或連接的代理觀察作為輸入。這種方法在可獲得全局狀態信息的集中式訓練場景中有益。
- IPPO : 評論家是分散的,僅依賴于局部觀察。這種設置支持分散式訓練,代理只需要局部信息。
集中式評論家有助于緩解多個代理同時學習時出現的非平穩性問題,但可能因輸入的高維度性而面臨挑戰。
TorchRL
TorchRL是一個基于PyTorch的強化學習(Reinforcement Learning, RL)庫,專為研究人員和開發者設計,旨在提供一個靈活、高效的框架來實現和實驗各種RL算法。
- 與PyTorch深度集成:TorchRL充分利用了PyTorch的生態系統,使用戶能夠無縫地將RL算法與深度學習模型結合。
- 模塊化設計:庫提供了可組合的組件,允許用戶輕松構建和定制RL算法。
- 高性能:TorchRL注重效率,支持GPU加速和并行化,以加快訓練和推理速度。
- 多環境支持:兼容多種RL環境,包括OpenAI Gym、DeepMind Control Suite等。
- 豐富的算法實現:內置多種流行的RL算法,如DQN、PPO、SAC等。
- 擴展性:易于擴展和添加新的算法、環境和功能。
下面代碼我們將使用TorchRL來完成我們的目標
1、設置超參數
我們從定義 MARL 設置的超參數開始。這些參數控制模擬和訓練過程的各個方面,如設備類型、批量大小、學習率和 PPO 特定設置。
import torch
from torch import multiprocessing
# 設置設備
is_fork = multiprocessing.get_start_method() == "fork"
device = torch.device(0) if torch.cuda.is_available() and not is_fork else torch.device("cpu")
vmas_device = device # 運行 VMAS 模擬器的設備
# 采樣和訓練參數
frames_per_batch = 6000
n_iters = 10
total_frames = frames_per_batch * n_iters
# 訓練細節
num_epochs = 30
minibatch_size = 400
lr = 3e-4
max_grad_norm = 1.0
# PPO 參數
clip_epsilon = 0.2
gamma = 0.99
lmbda = 0.9
entropy_eps = 1e-4
2、創建環境
TorchRL 與 VMAS 的集成允許我們高效地創建和管理多代理環境。在我們環境中多個代理必須在 LIDAR 傳感器的引導下導航到各自的目標,同時避免碰撞。
from torchrl.envs.libs.vmas import VmasEnv
max_steps = 100
num_vmas_envs = frames_per_batch // max_steps
scenario_name = "navigation"
n_agents = 3
env = VmasEnv(
scenario=scenario_name,
num_envs=num_vmas_envs,
continuous_actions=True,
max_steps=max_steps,
device=vmas_device,
n_agents=n_agents,
)
3、策略設計
策略網絡在 PPO 中至關重要,它負責根據代理觀察生成動作。鑒于環境中的連續動作空間,我們將使用 Tanh-Normal 分布來模擬動作,這樣還可以決定是否在代理之間共享參數,在計算效率和行為多樣性之間權衡。
from torch.nn import Sequential, Tanh
from tensordict.nn import TensorDictModule
from torchrl.modules import MultiAgentMLP, ProbabilisticActor, TanhNormal
from tensordict.nn.distributions import NormalParamExtractor
share_parameters_policy = True
# 定義策略網絡
policy_net = Sequential(
MultiAgentMLP(
n_agent_inputs=env.observation_spec["agents", "observation"].shape[-1],
n_agent_outputs=2 * env.action_spec.shape[-1],
n_agents=env.n_agents,
centralised=False,
share_params=share_parameters_policy,
device=device,
depth=2,
num_cells=256,
activation_class=Tanh,
),
NormalParamExtractor(),
)
# 將網絡包裝在 TensorDictModule 中
policy_module = TensorDictModule(
policy_net,
in_keys=[("agents", "observation")],
out_keys=[("agents", "loc"), ("agents", "scale")],
)
# 創建概率性行動者
policy = ProbabilisticActor(
module=policy_module,
spec=env.unbatched_action_spec,
in_keys=[("agents", "loc"), ("agents", "scale")],
out_keys=[env.action_key],
distribution_class=TanhNormal,
distribution_kwargs={
"low": env.unbatched_action_spec[env.action_key].space.low,
"high": env.unbatched_action_spec[env.action_key].space.high,
},
return_log_prob=True,
log_prob_key=("agents", "sample_log_prob"),
)
4、評論家網絡設計
評論家網絡評估狀態值,指導策略更新??梢愿鶕褂?MAPPO 還是 IPPO 來選擇集中式或分散式評論家。在代理之間共享參數可以加速訓練,但是可能導致同質化策略。
share_parameters_critic = True
mappo = True # 設置為 False 以使用 IPPO
critic_net = MultiAgentMLP(
n_agent_inputs=env.observation_spec["agents", "observation"].shape[-1],
n_agent_outputs=1,
n_agents=env.n_agents,
centralised=mappo,
share_params=share_parameters_critic,
device=device,
depth=2,
num_cells=256,
activation_class=Tanh,
)
critic = TensorDictModule(
module=critic_net,
in_keys=[("agents", "observation")],
out_keys=[("agents", "state_value")],
)
5、數據收集
TorchRL 中的數據收集通過設計用于自動處理環境重置、動作計算和環境步進的類得到簡化。所以我們可以直接使用 SyncDataCollector 來收集訓練數據。
from torchrl.collectors import SyncDataCollector
collector = SyncDataCollector(
env,
policy,
device=vmas_device,
storing_device=device,
frames_per_batch=frames_per_batch,
total_frames=total_frames,
)
6、訓練循環
訓練循環將環境、策略、評論家和數據收集器結合在一起,通過采樣和訓練階段的迭代來優化代理的性能。
from torchrl.data.replay_buffers import ReplayBuffer
from torchrl.data.replay_buffers.samplers import SamplerWithoutReplacement
from torchrl.data.replay_buffers.storages import LazyTensorStorage
from torchrl.objectives import ClipPPOLoss, ValueEstimators
from tqdm import tqdm
# 重放緩沖區設置
replay_buffer = ReplayBuffer(
storage=LazyTensorStorage(
size=frames_per_batch,
device=device,
),
sampler=SamplerWithoutReplacement(),
)
# PPO 損失設置
ppo_loss = ClipPPOLoss(
actor=policy,
critic=critic,
clip_epsilon=clip_epsilon,
entropy_bonus=entropy_eps,
value_loss_coef=0.5,
gamma=gamma,
lam=lmbda,
advantage_normalization=True,
)
# 訓練循環
for i in tqdm(range(n_iters)):
batch = collector.next()
replay_buffer.extend(batch)
for _ in range(num_epochs):
for minibatch in replay_buffer.sample(minibatch_size):
loss = ppo_loss(minibatch)
loss.backward()
torch.nn.utils.clip_grad_norm_(ppo_loss.parameters(), max_grad_norm)
optimizer.step()
optimizer.zero_grad()
這樣我們完整的代碼就完成了,可以看到通過TorchRL,可以減少我們很多的代碼開發工作。
總結
本文提供了使用 TorchRL 和 PPO 實現 MARL 解決方案的全面指南。通過這些步驟,可以在多代理環境中訓練代理以導航復雜任務,同時利用 GPU 加速模擬和并行計算的力量。無論選擇集中式還是分散式評論家,TorchRL 都提供了設計和實驗不同 MARL 架構,可以幫助你解決多代理強化學習的復雜性。