DI-engine强化学习入门(九)环境包裹器(Env Wrapper)

在强化学习中,环境(Environment)是智能体(Agent)进行学习和互动的场所,它定义了状态空间、动作空间以及奖励机制。Env Wrapper(环境包装器)提供了一种方便的机制来增强或修改原始环境的功能,而不需要改变环境本身的代码。

Env Wrapper主要有以下的几个特性
1.预处理和归一化:

  • 为了提高学习效率和稳定性,很多时候需要对环境的状态进行预处理,例如归一化处理,使得所有的输入特征都处在同一量级上,以便于智能体更好地学习。
  • Env Wrapper可以在不修改原始环境代码的情况下,添加这些预处理步骤。

2.奖励形状改变(Reward Shaping):

  • 有时原始环境的奖励信号太稀疏或不利于学习,Env Wrapper可以用来修改奖励信号,使之更加符合特定学习任务的需求。

3.动作和状态空间修改:

  • 如果需要对动作空间进行离散化或者对状态空间进行降维,Env Wrapper允许用户实现这样的变换。
  • 这对于将复杂环境简化以适应低容量智能体或算法尤其有用。

4.实验一致性和复现性:

  • 当研究者想要分享他们的实验设置或与其他研究者进行比较时,使用Env Wrapper可以确保所有人都在相同的环境变种上进行实验。

5.代码的模块化和复用:

  • 通过Env Wrappers,可以创建可复用的模块,对不同的环境应用相同的处理逻辑。
  • 这样可以避免代码冗余,提高开发效率。

6.易于维护和扩展:

  • 当需要更新环境处理逻辑时,只需修改对应的Env Wrapper,而不需要重新触碰环境本身的实现。

       例如,若要为一个环境添加噪声处理或者状态的标准化处理,可以创建一个Env Wrapper来实         现这些功能。这样,当需要在不同的环境中实施同样的噪声或标准化处理时,只需要将环境

       通 过这个Env Wrapper传递即可,而不需要为每个环境单独编写处理代码。

DI-engine 提供了大量已经定义好的、通用的 Env Wrapper
DI-engine 继承和扩展了 OpenAI Gym 的设计,提供了一系列通用的 Env Wrapper,以便用户可以轻松地根据自己的需求来修改环境。以下是这些 Env Wrapper 的简介:

 1.NoopResetEnv:

  • 在环境启动时随机执行一定数量的无操作(no-op)步骤,然后再重置环境。这有助于提供更多样化的初始状态。

2.MaxAndSkipEnv:

  • 在连续的几个帧中执行相同的动作,并从中选取两个连续帧的最大值作为代表,这样做可以减少环境内的非必要变化,有助于稳定训练。

3.WarpFrame:

  • 将输入的图像帧缩放到固定的大小(例如 84x84)并转换为灰度图像,这是许多深度强化学习工作中的常见做法。

4.ScaledFloatFrame:

  • 将图像帧的像素值从整数转换为浮点数,并将其标准化到 0 到 1 的范围内。

5.ClipRewardEnv:

  • 将奖励剪裁为 -1, 0, 或 +1,根据奖励的正负性。这样做有利于限制梯度更新的规模,有时能够增加训练的稳定性。

6.FrameStack:

  • 将连续的几个帧堆叠在一起作为网络的输入,以提供给智能体关于动作的时间连续性信息。

7.ObsTransposeWrapper:

  • 重新排列观测数组的维度,这在处理图像输入时特别有用,如将图像数据从 HxWxC 调整为 CxHxW。

8.RunningMeanStd:

  • 计算和更新环境观测值的均值和标准差,通常用于环境状态的归一化处理。

9.ObsNormEnv:

  • 使用实时更新的均值和标准差归一化观测值,以保持输入值的分布稳定。

10.RewardNormEnv:

  • 使用实时更新的均值和标准差归一化奖励值,帮助稳定训练过程。

11.RamWrapper:

  • 将环境的 RAM 状态转换为类似图像的格式,这对于处理非图像的原始状态表示特别有用。

12.EpisodicLifeEnv:

  • 当智能体“死亡”时,即使游戏没有真正结束,也会结束当前的 episode。这可以让智能体更快地学习有关失败的信息。

13.FireResetEnv:

  • 在某些游戏中,环境重置后需要执行一个 “fire” 动作来开始游戏。这个 Wrapper 自动处理这个动作。

二、如何使用 Env Wrapper
下一个问题是我们如何给环境包裹上 Env Wrapper。最简单的一种方法就是手动地显式对环境进行包裹:

from ding.envs.env_wrappers.env_wrappers import NoopResetWrapperenv = gym.make(env_id)  # 'PongNoFrameskip-v4'env = NoopResetWrapper(env, noop_max = 30)env = MaxAndSkipWrapper(env, skip = 4)

我们也可以尝试在gym中使用FrameStack环境包裹器

import gymfrom gym.wrappers import FrameStack# 创建并包裹环境env_id = 'CartPole-v1'env = gym.make(env_id)env = FrameStack(env, num_stack=4)# 使用包裹后的环境运行一些episodefor episode in range(2):    obs = env.reset()    done = False    step = 0    while not done:        action = env.action_space.sample()  # 随机选择动作        obs, reward, done, info = env.step(action)        print(f"Episode: {episode}, Step: {step}, Observation Shape: {obs.shape}, Reward: {reward}, Done: {done}")        step += 1    print(f"Episode {episode} finished after {step} steps.")# 关闭环境env.close()

以下是在 Python 中非显式的使用 Env Wrapper 的具体示例: 

点击DI-engine强化学习入门(九)环境包裹器(Env Wrapper) - 古月居可查看全文

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值