了解稳定基线模型中的 total_timesteps 参数

PyR*_*red 10 python reinforcement-learning

我正在阅读原始 PPO 论文并尝试将其与稳定基线 PPO2模型的输入参数相匹配。

我不明白的一件事是方法中的total_timesteps参数learn

论文中提到

一种策略梯度实现方式……运行 T 个时间步长的策略(其中 T 远小于剧集长度)

虽然稳定基线文档将total_timesteps参数描述为

(int) 要训练的样本总数

因此,我认为T在论文和total_timesteps文档中是相同的参数。

我不明白的是:

  • 是否total_timesteps总是需要小于或环境中的(说如果我有帧的数量有限喜欢1,000,000)等于可用“帧”(样本)的总数。如果是这样,为什么?

  • 通过设置total_timesteps一个小于可用帧数的数字,代理会看到训练数据的哪一部分?例如,如果total_timesteps=1000,代理是否只看到前 1000 帧?

  • 一集是定义为可用帧的总数,还是定义为代理第一次“松动”/“死亡”的时间?如果是后者,那么你怎么能提前知道代理什么时候会死才能设置total_timesteps一个较小的值呢?

我仍在学习 RL 背后的术语,所以我希望我能够在上面清楚地解释我的问题。非常欢迎任何帮助/提示。

小智 10

根据稳定基线源代码

  • total_timesteps 是代理将为任何环境执行的步数。total_timesteps 可以跨越多个情节,这意味着该值不受某个最大值的限制。
  • 假设您有一个时间步长超过 1000 的环境。如果您调用一次学习函数,您只会体验前 1000 帧,而剧集的其余部分是未知的。在许多实验中,您知道环境应该持续多少时间步长(即 CartPole),但是对于长度未知的环境,这变得不太有用。但。如果您两次调用学习函数并说环境剧集有 1500 帧,您将看到完整的剧集 + 50% 的第二集。
  • 一个情节被定义为终端标志设置为真时的程度(在体育馆中,这通常也设置在最大时间步之后)许多其他强化学习实现使用 total_episodes 代替,因此您不必关心时间步长,但同样,缺点是如果你进入吸收状态,你最终可能只运行 1 集。

总时间步长参数也使用 n_steps,其中更新次数的计算如下:

n_updates = total_timesteps // self.n_batch
Run Code Online (Sandbox Code Playgroud)

其中 n_batch 是 n_steps 乘以矢量化环境的数量。

这意味着,如果您有 1 个环境在 n_step 设置为 32 且 total_timesteps = 25000 的情况下运行,则您将在学习调用期间对您的策略进行 781 次更新(不包括 epoch,因为 PPO 可以对单个批次进行多次更新)

教训是:

  • 对于未知大小的环境,您必须使用此值。也许创建一个运行平均剧集长度并使用这个值
  • 在剧集长度已知的情况下,将其设置为您想要训练的所需剧集数。但是,它可能会更少,因为代理可能不会(可能不会)每次都达到最大步数。
  • TLDR 使用该值(将其视为超参数)

希望这可以帮助!