处理时间限制

在使用 Gymnasium 环境进行强化学习代码编写时,一个常见的观察到的问题是如何不正确地处理时间限制。从 env.step 收到的 done 信号(在以前版本的 OpenAI Gym < 0.26 中)指示了一个 episode 是否已结束。但是,此信号未区分 episode 是由于 termination 还是 truncation 而结束。

终止

终止指的是 episode 在达到终端状态后结束,该终端状态被定义为环境定义的一部分。示例包括 - 任务成功、任务失败、机器人摔倒等。值得注意的是,这也包括由于环境固有的时间限制而在有限视界环境中结束的 episode。请注意,为了保持马尔可夫性质,在有限视界环境中,剩余时间的表示必须存在于智能体的观测中。 (参考文献)

截断

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

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

在学习代码中的重要性

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

更正式地说,RL 中自举的一个常见例子是更新 Q 值函数的估计值,

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

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

但是,在终端状态下,不进行自举,

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

这就是终止和截断之间的区别变得重要的地方。当 episode 由于终止而结束时,我们不进行自举;当 episode 由于截断而结束时,我们进行自举。

在使用 gymnasium 环境时,done 信号(< v0.26 的默认值)经常用于确定是否进行自举。但是,这是不正确的,因为它没有区分终止和截断。

下面显示了一个值函数的简单示例。这是一个说明性示例,并非任何特定算法的一部分。

# INCORRECT
vf_target = rew + gamma * (1 - done) * vf_next_state

在 episode 由于截断而结束的情况下,这是不正确的,在这种情况下需要进行自举,但实际上并没有进行。

解决方案

从 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