1

rllib 示例中提供了参数/可变长度动作模型。该示例假设输出是单个分类操作 dist 的 logits。如何使用更复杂的输出来完成这项工作?

例如,一个盒子里有 200 个不同的球。每步 2 球被捡起并放回。动作空间可以定义为 Multidiscrete([200, 200]) 或 Tuple((spaces.Discrete(200), spaces.Discrete(200)))。

有 3 个限制使某些操作无效。

  1. 每次2个球都不一样。所以像 (1,1) 或 (2,2) 这样的动作是无效的。
  2. 相同颜色的球不允许一起捡。比如2号球和3号球都是黄色的,所以在某些状态下不能一起捡。所以 action(1,2) 在那个状态下是无效的。
  3. 有些球在特定状态下是不允许捡的。例如,当 2 号球被标记为不允许捡球时,所有与 2 号球类似的动作 (1, n) 或 (n,1) 的动作都无效。

如何通过 rllib 中的动作屏蔽来强制执行这 3 个约束。

假设我们的 obs 空间有 2 个部分。第一个约束是隐含的。可以在没有观察空间的情况下确定无效动作。对于第二个约束,A real_obs用一个表示颜色的数字标记每个球。相同号码的球不允许一起捡。对于第三个约束,一个指示是否允许捡球的action_mask 。

具体来说,如何在自定义模型中实现动作/观察空间和前向功能?

如果我对 obs 空间的假设是不可行的。您可以定义您的 obs 空间和相应的自定义模型。

rllib 中的 ParametricActionsModel 示例

4

1 回答 1

1

我有同样的问题。最大的问题是你的两个动作之间的依赖关系(例如不能两次拿同一个球)。所以你可以做的一件事就是将它们相乘,这样你就有了一个 200x200=40000 的大动作空间。然后,您可以在 env 中创建完整的掩码并将其传递给前向函数进行掩码。否则,您需要使用依赖动作采样和分布。

对我来说,乘法不是一个选择,因为它会很大。所以我按照以下方式制作:

  1. Env 为动作 1 创建掩码,并为依赖的动作 2 创建 XXX 掩码。
  2. 在模型中,您将使用您的操作 1 掩码对操作 1(使用 tf.random.categorical)进行采样
  3. 根据操作 1,您为操作 2 (tf.where) 和示例操作 2 选择掩码。
  4. 模型的输出应该是 logits 和采样的动作。
  5. 您需要实现自己的 MultiCategorical 操作分布以使用您已经采样的操作。
于 2021-05-05T10:41:42.210 回答