最直接的解决方案是简单地使每个行为“合法”,但实施从潜在非法行为到不同合法行为的一致、确定性映射。每当您使用的 PPO 实现选择了非法操作时,您只需将其替换为它所映射到的合法操作即可。然后,您的 PPO 算法仍然可以自我更新,就好像选择了非法操作一样(非法操作简单地变成......代替合法操作的“昵称”)。
例如,在您描述的情况下:
- 2 个动作(0 和 1)始终可用
- 2 个动作(2 和 3)仅在 internal_state == 0 时可用
- 1 个动作 (4) 仅在 internal_state == 1 时可用
在这种情况下internal_state == 0
,如果4
选择了动作(非法动作),您始终可以将其换成其他动作之一,并改为使用该动作。选择哪一个并不重要(理论上),只要您对此保持一致即可。该算法不必知道它选择了非法行为,只要它在未来再次在相似状态下选择相同的非法行为,它将始终映射到相同的合法行为,因此您只需根据该行为进行强化。
上面描述的解决方案非常简单,可能是最简单的实现,但当然它......“闻起来”有点“hacky”。更清洁的解决方案将涉及网络中的一个步骤,该步骤将非法行为的概率输出设置为0, 并将其余部分重新归一化以求和1再次。这需要更加小心,以确保您的学习更新仍然正确执行,并且在诸如 Tensorforce 之类的现有框架之上实现可能要复杂得多(如果还没有以某种方式支持开箱即用)。
对于第一个“解决方案”,我在上面写道,“理论上”你如何选择映射并不重要。不过,我绝对希望您在这里的选择会对实践中的学习速度产生影响。这是因为,在学习过程的初始阶段,您可能会选择接近随机的动作。如果某些动作在输出中“多次出现”,则它们将更有可能被初始 close-tor-andom 动作选择选中。因此,这将对您的初始行为产生影响,这会影响您收集的经验,而这反过来也会影响您学到的东西。
internal_state
如果您可以包含变量的输入特征,我当然希望它对性能有益。
如果可以识别出某些法律行为在某种程度上与某些非法行为“语义上接近”,那么如果您选择将“映射”中的那些“类似”行为从非法行为与合法行为联系起来,这也可能对性能有益。该解决方案。例如,如果您的“向前跳跃”动作在上限非常低的州(因为您会撞到头)变得非法,则最好将该动作映射到“向前移动”动作(即仍然有点相似,它们都在前进),而不是将其映射到“向后移动”动作。这种“相似”动作的想法将仅适用于某些领域,但在某些领域中,动作之间可能没有这种相似性。