Supersuit 封装器

配套软件包 SuperSuit (pip install supersuit) 包含了一系列预处理函数,可应用于 AECParallel 环境。

太空侵略者 转换为灰度观察空间并堆叠最近 4 帧

from pettingzoo.atari import space_invaders_v2
from supersuit import color_reduction_v0, frame_stack_v1

env = space_invaders_v2.env()

env = frame_stack_v1(color_reduction_v0(env, 'full'), 4)

包含的函数

Supersuit 包含以下封装器

clip_reward_v0(env, lower_bound=-1, upper_bound=1)

将奖励剪辑到 lower_bound 和 upper_bound 之间。这是一种处理奖励幅度差异较大问题(尤其是在 Atari 环境中)的常用方法。

clip_actions_v0(env)

将 Box 动作剪辑到动作空间的上限和下限之间。这是应用于连续动作空间环境的标准转换,用于将传递给环境的动作保持在指定的界限内。

color_reduction_v0(env, mode='full')

简化图形 ((x,y,3) 形状) 环境中的颜色信息。mode=’full’ 会将观察完全灰度化。这可能会计算密集。参数 ‘R’、‘G’ 或 ‘B’ 只会从观察中取出相应的 R、G 或 B 颜色通道。这快得多,通常也足够了。

dtype_v0(env, dtype)

将您的观察重新转换为特定的 dtype。许多图形游戏返回 uint8 观察,而神经网络通常需要 float16float32dtype 可以是 NumPy 作为 dtype 参数接受的任何类型(例如 np.dtype 类或字符串)。

flatten_v0(env)

将观察展平为一维数组。

frame_skip_v0(env, num_frames)

通过反复应用旧动作来跳过 num_frames 数量的帧。跳过的观察将被忽略。跳过的奖励将被累积。与 Gymnasium Atari 的 frameskip 参数类似,num_frames 也可以是一个元组 (min_skip, max_skip),表示一个可能跳过长度的范围,从中随机选择(仅限单智能体环境)。

delay_observations_v0(env, delay)

将观察延迟 delay 帧。在执行 delay 帧之前,观察全为零。与 frame_skip 一起,这是实现高 FPS 游戏反应时间的推荐方法。

sticky_actions_v0(env, repeat_action_probability)

为旧动作“粘滞”到环境并按请求不更新分配一个概率。这是为了防止智能体在像 Atari 这样高度确定性的游戏中学习预定义的动作模式。注意,粘滞性是累积的,因此一个动作连续两回合粘滞的概率是 repeat_action_probability^2 等。这是通过 “Machado 等人 (2018),《重访街机学习环境:通用智能体的评估协议和开放问题》” 向 Atari 添加随机性的推荐方法。

frame_stack_v1(env, num_frames=4)

堆叠最近的帧。对于通过普通向量(一维数组)观察到的向量游戏,输出只是连接到一个更长的一维数组。二维或三维数组被堆叠成更高的三维数组。游戏开始时,尚不存在的帧会用 0 填充。num_frames=1 类似于不使用此函数。

max_observation_v0(env, memory)

结果观察将是 memory 数量的先前帧的最大值。这对于 Atari 环境很重要,因为许多游戏由于游戏机和 CRT 电视的特殊性,元素是间歇性闪烁而不是常驻的。OpenAI baselines 的 MaxAndSkip Atari 封装器等同于执行 memory=2 然后进行 frame_skip 4。

normalize_obs_v0(env, env_min=0, env_max=1)

在给定观察空间中定义的已知最小和最大观察值的情况下,将观察线性缩放到 env_min(默认 0)到 env_max(默认 1)的范围。仅适用于具有 float32 或 float64 dtype 和有限边界的 Box 观察。如果您希望归一化其他类型,可以先应用 dtype 封装器将您的类型转换为 float32 或 float64。

reshape_v0(env, shape)

将观察重塑为给定形状。

resize_v1(env, x_size, y_size, linear_interp=False)

默认使用区域插值对观察图像进行放大或缩小插值。通过设置 linear_interp=True 也可以使用线性插值(它更快,更适合放大)。此封装器仅适用于 2D 或 3D 观察,并且只有当观察是图像时才有意义。

nan_noop_v0(env)

如果在某一步动作是 NaN 值,以下封装器将触发警告并在其位置执行无操作动作。无操作动作在 step(action, no_op_action) 函数中作为参数接受。

nan_zeros_v0(env)

如果在某一步动作是 NaN 值,以下封装器将触发警告并在其位置执行零动作。

nan_random_v0(env)

如果在某一步动作是 NaN 值,以下封装器将触发警告并在其位置执行随机动作。随机动作将从动作掩码中获取。

scale_actions_v0(env, scale)

通过 __init__() 中的 scale 参数缩放动作空间的上限和下限。此外,在调用 step() 时,以相同的值缩放任何动作。

包含的仅多智能体函数

agent_indicator_v0(env, type_only=False)

向观察中添加智能体 ID 的指示器,仅支持离散和一维、二维、三维 box 空间。对于一维空间,智能体 ID 被转换为 one-hot 向量并附加到观察中(如有必要,增加观察空间的大小)。二维和三维空间被视为图像(通道在最后),ID 被转换为 n 个附加通道,其中代表 ID 的通道全为 1,其他通道全为 0(一种 one-hot 编码)。这使得参数共享等 MADRL 方法可以学习异构智能体的策略,因为策略可以知道它正在作用于哪个智能体。将 type_only 参数设置为解析智能体名称为 <type>_<n>,并让附加的 one-hot 向量仅标识类型,而不是特定的智能体名称。这对于环境中智能体数量多但智能体类型少的游戏很有用。MADRL 中的智能体指示首次在 使用深度强化学习进行合作多智能体控制 中引入。

black_death_v2(env)

死亡智能体的动作不会被移除,而是观察和奖励变为 0,动作被忽略。这可以简化处理智能体死亡机制。名称“黑死病”并非源自瘟疫,而是源于死亡时看到黑色图像(一个充满零的图像)的事实。

pad_action_space_v0(env)

根据 参数共享对于深度强化学习出奇地有用 中提出的算法,将所有智能体的动作空间填充到与最大动作空间相同的大小。这使得需要所有智能体具有同质动作空间的 MARL 方法能够处理具有异构动作空间的环境。填充区域内的离散动作将被设置为零,Box 动作将被裁剪回原始空间。

pad_observations_v0(env)

根据 参数共享对于深度强化学习出奇地有用 中提出的算法,用 0 填充观察,使其形状与任何智能体的最大观察形状相同。这使得需要所有智能体具有同质观察的 MARL 方法能够处理具有异构观察的环境。目前支持 Discrete 和 Box 观察空间。

引用

如果您在研究中使用此内容,请引用

@article{SuperSuit,
  Title = {SuperSuit: Simple Microwrappers for Reinforcement Learning Environments},
  Author = {Terry, J K and Black, Benjamin and Hari, Ananth},
  journal={arXiv preprint arXiv:2008.08932},
  year={2020}
}