我正在创建一个自定义环境并在上面训练一个 RL 代理。
我正在使用稳定基线,因为它似乎实现了所有最新的 RL 算法,并且似乎尽可能接近“即插即用”(我想专注于创建环境和奖励函数而不是实现细节模型本身)
我的环境有一个大小为 127 的动作空间,并将其解释为 one-hot 向量:将向量中最大值的索引作为输入值。为了调试,我创建了一个条形图,显示每个值被“调用”了多少次
我创建了一个colab来解释和重现该问题
我在github 问题中问了这个问题,但他们建议我在这里发布问题
我正在创建一个自定义环境并在上面训练一个 RL 代理。
我正在使用稳定基线,因为它似乎实现了所有最新的 RL 算法,并且似乎尽可能接近“即插即用”(我想专注于创建环境和奖励函数而不是实现细节模型本身)
我的环境有一个大小为 127 的动作空间,并将其解释为 one-hot 向量:将向量中最大值的索引作为输入值。为了调试,我创建了一个条形图,显示每个值被“调用”了多少次
我创建了一个colab来解释和重现该问题
我在github 问题中问了这个问题,但他们建议我在这里发布问题
将model.predict(obs)
每个动作剪辑到范围内[-1, 1]
(因为这是您定义动作空间的方式)。因此,您的动作值数组看起来像
print(action)
# [-0.2476, 0.7068, 1., -1., 1., 1.,
# 0.1005, -0.937, -1. , ...]
也就是说,所有大于 1 的动作都被截断/剪裁为 1,因此存在多个最大动作。在您的环境中,您计算 numpy argmax pitch = np.argmax(action)
,它返回第一个最大值的索引,而不是随机选择的索引(如果有多个最大值)。
您可以如下选择“随机 argmax”。
max_indeces = np.where(action == action.max())[0]
any_argmax = np.random.choice(max_indeces)
我在这里相应地更改了您的环境。