处理时间限制¶
在使用 Gymnasium 环境进行强化学习代码编写时,一个常见的观察到的问题是如何不正确地处理时间限制。从 env.step
收到的 done
信号(在以前版本的 OpenAI Gym < 0.26 中)指示了一个 episode 是否已结束。但是,此信号未区分 episode 是由于 termination
还是 truncation
而结束。
终止¶
终止指的是 episode 在达到终端状态后结束,该终端状态被定义为环境定义的一部分。示例包括 - 任务成功、任务失败、机器人摔倒等。值得注意的是,这也包括由于环境固有的时间限制而在有限视界环境中结束的 episode。请注意,为了保持马尔可夫性质,在有限视界环境中,剩余时间的表示必须存在于智能体的观测中。 (参考文献)
截断¶
截断指的是 episode 在外部定义的条件(即在马尔可夫决策过程范围之外)之后结束。这可能是时间限制、机器人超出边界等。
无限视界环境是需要截断的一个明显例子。我们不能永远等待 episode 完成,因此我们设置了一个实际的时间限制,在此之后我们强制停止 episode。在这种情况下,最后一个状态不是终端状态,因为它具有非零的转移概率,可以根据定义 RL 问题的马尔可夫决策过程移动到另一个状态。这也不同于有限视界环境中的时间限制,因为在这种情况下,智能体不知道这个时间限制。
在学习代码中的重要性¶
自举(使用一个或多个变量的估计值来更新同一变量的估计值)是强化学习的关键方面。值函数会告诉你,如果你遵循给定的策略,你将从特定状态获得多少折扣奖励。当 episode 在任何给定点停止时,通过查看最终状态的值,智能体能够估计如果 episode 继续,可能会获得多少折扣奖励。这是处理截断的一个例子。
更正式地说,RL 中自举的一个常见例子是更新 Q 值函数的估计值,
在经典 RL 中,新的 Q
估计是先前 Q
估计和 Q_target
的加权平均值,而在深度 Q-Learning 中,Q_target
和先前 Q
估计之间的误差被最小化。
但是,在终端状态下,不进行自举,
这就是终止和截断之间的区别变得重要的地方。当 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