自定义 RL 环境的意外动作分布

Posted

技术标签:

【中文标题】自定义 RL 环境的意外动作分布【英文标题】:Unexpected action distribution for custom RL environment 【发布时间】:2020-09-22 07:24:38 【问题描述】:

我正在创建一个自定义环境并在上面训练一个 RL 代理。

我使用的是 stable-baselines,因为它似乎实现了所有最新的 RL 算法,并且似乎尽可能接近“即插即用”(我想专注于创建环境和奖励函数,而不是模型本身的实现细节)

我的环境有一个大小为 127 的动作空间,并将其解释为 one-hot 向量:将向量中最高值的索引作为输入值。 为了调试,我创建了一个条形图,显示每个值被“调用”了多少次

在训练之前,我希望图表显示“事件”的大致均匀分布:

但行动规范下端的“事件”比其他事件更有可能:

我创建了一个colab 来解释和重现该问题

我在github issue 中提出了这个问题,但他们建议我在这里发布问题

【问题讨论】:

【参考方案1】:

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)

我相应地更改了您的环境 here。

【讨论】:

以上是关于自定义 RL 环境的意外动作分布的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 异常自定义处理 - 意外的 HTTP 状态

我的自定义插槽类型出现意外值

自定义 UIFieldBehavior 中的意外加速

拖入自定义分段控件时意外调用cancelTracking

自定义 UITableViewCell 中的 UITextField 意外发现 nil

自定义 VBA 函数引发意外输出 [重复]