注意
此示例与 Gymnasium 1.2.0 版兼容。
处理时间限制¶
本教程解释了如何正确处理带有终止和截断信号的时间限制。
从 env.step
接收到的 done
信号(在 OpenAI Gym 之前的版本 < 0.26 中)表示一个回合是否结束。然而,此信号并未区分回合是由于终止
还是截断
而结束的。
终止¶
终止是指回合在达到作为环境定义一部分的终止状态后结束。例如:任务成功、任务失败、机器人跌倒等。值得注意的是,这也包括在有限时域环境中因环境固有的时间限制而结束的回合。请注意,为了保持马尔可夫性质,在有限时域环境中,智能体的观测中必须包含剩余时间的表示。(参考文献)
截断¶
截断是指回合在外部定义条件(超出马尔可夫决策过程范围)后结束。这可能是一个时间限制,机器人超出边界等。
无限时域环境是需要此功能的一个明显例子。我们不能永远等待回合完成,因此我们设置一个实际的时间限制,在此之后我们强制中止回合。在这种情况下,最后一个状态不是终止状态,因为它根据定义RL问题的马尔可夫决策过程,具有非零的转移到另一个状态的概率。这与有限时域环境中的时间限制也不同,因为在这种情况下,智能体不知道这个时间限制。
在学习代码中的重要性¶
自举(使用一个或多个变量的估计值来更新同一变量的估计)是强化学习的一个关键方面。价值函数将告诉你,如果你遵循给定策略,从特定状态将获得多少折扣奖励。当一个回合在任何给定点停止时,通过查看最终状态的价值,智能体能够估计如果回合继续下去,可以获得多少折扣奖励。这是处理截断的一个例子。
更正式地说,强化学习中自举的一个常见例子是更新 Q-价值函数的估计,
在经典强化学习中,新的 Q
估计是之前的 Q
估计和 Q_target
的加权平均值,而在深度 Q-学习中,Q_target
和之前的 Q
估计之间的误差被最小化。
然而,在终止状态下,不进行自举,
这就是终止和截断之间区别变得重要的地方。当一个回合因终止而结束时,我们不进行自举;当它因截断而结束时,我们进行自举。
在使用 Gymnasium 环境时,done
信号(v0.26 之前的默认值)经常用于决定是否进行自举。然而,这是不正确的,因为它没有区分终止和截断。
下面展示了一个简单的价值函数示例。这是一个说明性示例,不属于任何特定算法的一部分。
# INCORRECT
vf_target = rew + gamma * (1 - done) * vf_next_state
这在因截断导致回合结束的情况下是不正确的,此时需要进行自举,但实际上并未发生。
解决方案¶
从 v0.26 版本开始,Gymnasium 的 env.step
API 明确返回终止和截断信息。在之前的版本中,截断信息通过 info 键 TimeLimit.truncated
提供。现在处理终止和截断的正确方法是,
# terminated = done and 'TimeLimit.truncated' not in info
# This was needed in previous versions.
vf_target = rew + gamma * (1 - terminated) * vf_next_state