注意

此示例与 Gymnasium 1.2.0 版兼容。

处理时间限制

本教程解释了如何正确处理带有终止截断信号的时间限制。

env.step 接收到的 done 信号(在 OpenAI Gym 之前的版本 < 0.26 中)表示一个回合是否结束。然而,此信号并未区分回合是由于终止还是截断而结束的。

终止

终止是指回合在达到作为环境定义一部分的终止状态后结束。例如:任务成功、任务失败、机器人跌倒等。值得注意的是,这也包括在有限时域环境中因环境固有的时间限制而结束的回合。请注意,为了保持马尔可夫性质,在有限时域环境中,智能体的观测中必须包含剩余时间的表示。(参考文献)

截断

截断是指回合在外部定义条件(超出马尔可夫决策过程范围)后结束。这可能是一个时间限制,机器人超出边界等。

无限时域环境是需要此功能的一个明显例子。我们不能永远等待回合完成,因此我们设置一个实际的时间限制,在此之后我们强制中止回合。在这种情况下,最后一个状态不是终止状态,因为它根据定义RL问题的马尔可夫决策过程,具有非零的转移到另一个状态的概率。这与有限时域环境中的时间限制也不同,因为在这种情况下,智能体不知道这个时间限制。

在学习代码中的重要性

自举(使用一个或多个变量的估计值来更新同一变量的估计)是强化学习的一个关键方面。价值函数将告诉你,如果你遵循给定策略,从特定状态将获得多少折扣奖励。当一个回合在任何给定点停止时,通过查看最终状态的价值,智能体能够估计如果回合继续下去,可以获得多少折扣奖励。这是处理截断的一个例子。

更正式地说,强化学习中自举的一个常见例子是更新 Q-价值函数的估计,

\[Q_{target}(o_t, a_t) = r_t + \gamma . \max_a(Q(o_{t+1}, a_{t+1}))\]

在经典强化学习中,新的 Q 估计是之前的 Q 估计和 Q_target 的加权平均值,而在深度 Q-学习中,Q_target 和之前的 Q 估计之间的误差被最小化。

然而,在终止状态下,不进行自举,

\[Q_{target}(o_t, a_t) = r_t\]

这就是终止和截断之间区别变得重要的地方。当一个回合因终止而结束时,我们不进行自举;当它因截断而结束时,我们进行自举。

在使用 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