openai gym - 我可以在多离散动作空间中使用什么代理?

数据挖掘 机器学习 Python 深度学习 开放式健身房
2022-02-19 16:54:05

我有一个具有多离散操作空间的自定义环境。

动作和观察空间如下:

行动:

MultiDiscrete([  3 121 121 121   3 121 121 121   3 121 121 121   3 121 121 121   3 121
 121 121   3 121 121 121   3 121 121 121   3 121 121 121   3 121 121 121
   3 121 121 121   3 121 121 121   3 121 121 121   3 121 121 121   3 121
 121 121   3 121 121 121   3 121 121 121   3 121 121 121])

观察:

MultiDiscrete([100   3   2 121   2 121   2 121   2 121   2 121   2 121   2 121   2 121
   2 121   2 121   2 121   2 121   2 121   2 121   2 121   2 121   2 121
   2 121   2 121   2 121   2 121   2 121   2 121   2 121   2 121   2 121
   2 121   2 121   2 121   2 121   2 121   2 121   2 121   2 121   2 121
 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121
 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121])

我很难找到能够处理这些空间的代理(例如在 keras-rl 中)。

这个问题:https ://github.com/keras-rl/keras-rl/issues/224表明 keras-rl DDPG 代理能够处理多离散动作空间,但模型有一个浮点输出,我不能用作step()函数的动作,它需要一个整数输出!

大多数其他代理似乎使用tanh激活层,或产生二进制输出的某些层。我需要一个与我的动作空间形状相同的输出。

如何处理?

2个回答

OpenAI 基线——或者对我来说更好的是稳定基线——有许多模型选项可以处理多离散动作和/或观察空间。建立一个定制的健身房环境也很简单。

假设现在你的空间定义如下

n_actions = (10, 20, 30)
action_space = MultiDiscrete(n_actions)

环境方面的一个简单解决方案是将空间定义为

action_space = Discrete(np.prod(n_actions))

然后借助np.ndindex将离散动作转换为相应的多离散动作

mapping = tuple(np.ndindex(n_actions))
multidiscrete_action = mapping[discrete_action]