强化学习,作为人工智能领域中的一个重要分支,致力于研究如何使智能体在与环境的互动中学习最优行为策略。在本教程中,我们将探讨如何使用 PyTorch 和其强化学习库 TorchRL 来实现近端策略优化(PPO)算法。我们将按照以下步骤进行:
环境与转换配置首先,我们需要安装必要的库:
!pip3 install torch
!pip3 install torchrl
!pip3 install gym[mujoco]
!pip3 install tqdm
设置关键超参数,包括设备选择、帧数设置和训练循环参数:
import torch
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
frames_per_batch = 1000
total_frames = 50_000
sub_batch_size = 64
num_epochs = 10
clip_epsilon = 0.2
gamma = 0.99
lmbda = 0.95
entropy_eps = 1e-4
使用GymEnv
创建环境,并应用转换器:
from torchrl.envs.libs.gym import GymEnv
from torchrl.envs.transforms import (
DoubleToFloat,
ObservationNorm,
StepCounter,
TransformedEnv,
)
# 创建 Gym 环境
env = GymEnv("CartPole-v1", device=device)
# 应用转换器
env = TransformedEnv(
env,
transforms=[
DoubleToFloat(),
ObservationNorm(),
StepCounter(),
]
)
构建策略与价值网络
设计策略和价值函数网络:
from torch import nn
from torchrl.modules import TensorDictModule, ProbabilisticActor
def build_actor_net(num_cells, env):
net = nn.Sequential(
nn.Linear(num_cells, num_cells),
nn.Tanh(),
nn.Linear(num_cells, num_cells),
nn.Tanh(),
nn.Linear(num_cells, num_cells),
nn.Tanh(),
nn.Linear(num_cells, 2 * env.action_spec.shape[-1]),
)
return net
def build_value_net(num_cells, env):
net = nn.Sequential(
nn.Linear(num_cells, num_cells),
nn.Tanh(),
nn.Linear(num_cells, num_cells),
nn.Tanh(),
nn.Linear(num_cells, 1),
)
return net
actor_net = build_actor_net(num_cells=64, env=env)
value_net = build_value_net(num_cells=64, env=env)
actor_module = TensorDictModule(
actor_net,
in_keys=["observation"],
out_keys=["loc", "scale"],
)
value_module = TensorDictModule(
value_net,
in_keys=["observation"],
out_keys=["state_value"],
)
实现 PPO 损失函数和相关组件
实现 PPO 损失函数和相关组件:
from torchrl.objectives import ClipPPOLoss
from torchrl.objectives.value import GAE
advantage_module = GAE(gamma=gamma, lmbda=lmbda, value_network=value_module, average_gae=True)
loss_module = ClipPPOLoss(
actor_network=actor_module,
critic_network=value_module,
clip_epsilon=clip_epsilon,
entropy_bonus=bool(entropy_eps),
entropy_coef=entropy_eps,
)
配置数据收集器和重放缓冲区
配置数据收集器和重放缓冲区:
from torchrl.collectors import SyncDataCollector
from torchrl.data.replay_buffers import ReplayBuffer
from torchrl.data.replay_buffers.samplers import SamplerWithoutReplacement
replay_buffer = ReplayBuffer(storage=ReplayBuffer.LazyTensorStorage(max_size=frames_per_batch), sampler=SamplerWithoutReplacement())
collector = SyncDataCollector(
env,
policy_module=actor_module,
frames_per_batch=frames_per_batch,
total_frames=total_frames,
split_trajs=False,
device=device,
)
执行训练循环
执行训练循环:
from tqdm import tqdm
logs = defaultdict(list)
pbar = tqdm(total=total_frames)
for i, tensordict_data in enumerate(collector):
for _ in range(num_epochs):
advantage_module(tensordict_data)
replay_buffer.extend(tensordict_data.to(device))
for _ in range(frames_per_batch // sub_batch_size):
subdata = replay_buffer.sample(sub_batch_size)
loss_vals = loss_module(subdata)
loss_value = sum(loss_vals.values())
loss_value.backward()
torch.nn.utils.clip_grad_norm_(loss_module.parameters(), max_grad_norm)
optimizer.step()
optimizer.zero_grad()
# 记录日志
logs["reward"].append(tensordict_data["next", "reward"].mean().item())
logs["step_count"].append(tensordict_data["step_count"].max().item())
logs["lr"].append(optimizer.param_groups[0]["lr"])
# 评估策略
if i % 10 == 0:
# 执行评估
eval_rollout = env.rollout(1000, policy_module)
logs["eval reward"].append(eval_rollout["next", "reward"].mean().item())
logs["eval step_count"].append(eval_rollout["step_count"].max().item())
del eval_rollout
pbar.update(tensordict_data.numel())
性能评估与结果分析
分析最终性能,并可视化训练过程中的关键指标:
import matplotlib.pyplot as plt
# 绘制奖励随时间的变化
plt.figure(figsize=(14, 7))
plt.plot(logs["reward"], label="Training Reward")
plt.plot(logs["eval reward"], label="Evaluation Reward")
plt.xlabel("Training Steps")
plt.ylabel("Reward")
plt.legend()
plt.show()
# 绘制学习率变化
plt.figure(figsize=(14, 7))
plt.plot(logs["lr"], label="Learning Rate")
plt.xlabel("Training Steps")
plt.ylabel("Learning Rate")
plt.legend()
plt.show()
通过上述步骤,您可以实现一个基于 TorchRL 的 PPO 算法,用于解决特定的强化学习问题。本教程提供了从环境构建、转换配置到策略与价值函数设计、损失函数实现、数据收集与重放缓冲区设计,以及训练循环实现的完整流程,旨在帮助您深入理解 PPO 算法在实践中的应用。
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦