亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

強化學習入門教程:使用 TorchRL 實現 PPO(近端策略優化)

標簽:
雜七雜八

强化学习,作为人工智能领域中的一个重要分支,致力于研究如何使智能体在与环境的互动中学习最优行为策略。在本教程中,我们将探讨如何使用 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 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消