深度学习16-连续动作空间

本文探讨了连续动作空间在强化学习(RL)中的重要性,对比了连续与离散动作空间的区别。通过GymAPI,作者展示了如何实现连续控制。文章详细介绍了D4PG算法,包括critic的forward()函数、探索策略(如OU过程和随机噪声)以及使用交叉熵损失进行训练。此外,还提出了使用优先级回放缓冲区、尝试不同环境(如PyBullet和DeepMindControlSuite)以及比较MuJoCo与PyBullet的实验建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### 连续动作空间 

▪  涵盖连续动作空间为何重要、它与离散动作空间有何不同,以及在Gym API中的实现方式。
▪  讨论将RL方法应用到连续控制的领域。
▪  查看解决四足机器人问题的三种不同算法。

critic的forward()函数首先用其较小的网络对观察进行转换,然后将输出和给定的动作进行组合,以将其转换为单个Q值。若要将actor神经网络与PTAN经验源一起使用,我们需要定义一个将观察结果转化为动作的智能体类。此类是放置OU探索过程最方便的地方,但是要更方便地执行此操作,我们还应该使用PTAN智能体的一个功能:可选状态。

最显著的变化是critic的输出。现在,它不返回给定状态和动作的单个Q值,而是返回N_ATOMS个值,该值对应于预定义范围中的值的概率。在我的代码中,我使用了N_ATOMS=51且分布范围为Vmin=-10和Vmax=10,因此critic返回51个数字,表示带折扣的奖励会落入[–10, –9.6, –9.2, …, 9.6, 10]中。
D4PG和DDPG之间的另一个区别是探索。DDPG使用OU过程进行探索,但据D4PG的作者称,他们同时尝试了在动作中添加OU以及简单的随机噪声,结果是相同的。因此,他们在本文中使用了一种更简单的方法进行探索。
代码中的最后一个显著差异与训练有关,因为D4PG使用交叉熵损失来计算两个概率分布之间的差异(由critic返回并由Bellman运算符得出)。为了使两个分布的原子对齐,与Bellemare在原始论文中的使用方式相同,他们使用了分布投影。

**可以尝试的事情**

1)在D4PG代码中,我使用了一个简单的回放缓冲区,它足以对DDPG进行良好的改进。你可以尝试按照与第8章中相同的方式将示例切换到带优先级的回放缓冲区,然后检查效果。
2)还有许多有趣且充满挑战的环境。例如,你可以从其他PyBullet环境开始,但也可以使用DeepMind Control Suite(见Tassa、Yuval等人发表的“DeepMind Control Suite”,arXiv abs/1801.00690(2018))、Gym中基于MuJoCo的环境以及许多其他环境。
3)你可以申请MuJoCo的试用许可证,并将其稳定性、性能和产生的策略与PyBullet进行比较。
4)你可以参加NIPS-2017极富挑战性的Learning to Run竞赛(该竞赛也在2018年和2019年进行,并存在更多具有挑战性的问题),你将获得一个人体模拟器,并且你的智能体需要弄清楚如何移动它。

### 深度强化学习中处理连续动作空间代码实现 #### 使用Actor-Critic架构解决连续动作空间问题 对于连续动作空间的任务,通常采用Actor-Critic结构来进行建模。该模型由两个主要部分组成: - **Actor**: 负责根据当前环境状态输出行动的概率分布。 - **Critic**: 对采取特定行为后的预期回报做出评估。 为了更好地理解这一过程,在下面给出一个简单的PyTorch版本DDPG(Deep Deterministic Policy Gradient)算法实现案例[^3]。 ```python import torch import torch.nn as nn import numpy as np class Actor(nn.Module): def __init__(self, state_dim, action_dim, max_action): super(Actor, self).__init__() self.fc1 = nn.Linear(state_dim, 400) self.fc2 = nn.Linear(400, 300) self.fc3 = nn.Linear(300, action_dim) self.max_action = max_action def forward(self, state): a = torch.relu(self.fc1(state)) a = torch.relu(self.fc2(a)) a = torch.tanh(self.fc3(a)) * self.max_action return a class Critic(nn.Module): def __init__(self, state_dim, action_dim): super(Critic, self).__init__() self.fc1 = nn.Linear(state_dim + action_dim, 400) self.fc2 = nn.Linear(400, 300) self.fc3 = nn.Linear(300, 1) def forward(self, state, action): q = torch.relu(self.fc1(torch.cat([state, action], dim=1))) q = torch.relu(self.fc2(q)) q = self.fc3(q) return q ``` 此段代码定义了一个基本的actor-critic网络体系结构,其中`max_action`参数用来缩放tanh层产生的[-1, 1]范围内的输出至实际的动作区间内。通过这种方式可以有效地处理各种不同的连续动作空间任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值