了解稳定基线模型中的 total_timesteps 参数
Understanding the total_timesteps parameter in stable-baselines' models
我正在通读 original PPO paper and trying to match this up to the input parameters of the stable-baselines PPO2 模型。
我不明白的一件事是 learn
方法中的 total_timesteps
参数。
论文提到
One style of policy gradient implementation... runs the policy for T timesteps (where T is much less than the
episode length)
虽然稳定基线文档将 total_timesteps
参数描述为
(int) The total number of samples to train on
因此我认为论文中的T
和文档中的total_timesteps
是同一个参数。
我不明白的是:
total_timesteps
是否总是需要小于或等于环境中可用 "frames"(样本)的总数(假设我有有限数量的样本)像 1,000,000 这样的帧)。如果是,为什么?
通过将 total_timesteps
设置为小于可用帧数的数字,代理会看到训练数据的哪一部分?例如,如果 total_timesteps=1000
,代理是否只看到前 1000 帧?
一个episode是定义为可用帧总数,还是定义为agent第一次"looses" / "dies"?如果是后者,那么你怎么能提前知道代理什么时候会死才能将 total_timesteps
设置为一个较小的值?
我仍在学习 RL 背后的术语,所以我希望我已经能够在上面清楚地解释我的问题。非常欢迎任何帮助/提示。
根据stable-baselines源代码
- total_timesteps 是代理将为任何环境执行的 总计 步数。 total_timesteps 可以跨越多个剧集,这意味着该值不受某个最大值的限制。
- 假设您有一个时间步长超过 1000 的环境。如果调用一次 learn 函数,你只会体验前 1000 帧,其余部分是未知的。在许多实验中,您知道环境应该持续多少个时间步长(即 CartPole),但对于长度未知的环境,这就变得没那么有用了。但。如果你两次调用学习函数并说环境剧集有 1500 帧,你会看到完整的剧集 + 第二集的 50%。
- 一集定义为终端标志设置为真(在健身房中,这通常也设置在最大时间步长之后)许多其他 RL 实现使用 total_episodes 代替,以便您不必关心时间步长的考虑,但同样,缺点是如果你达到吸收状态,你可能最终只有 运行 1 集。
总时间步长参数也使用 n_steps,其中更新次数计算如下:
n_updates = total_timesteps // self.n_batch
其中 n_batch 是矢量化环境数量的 n_steps 倍。
这意味着如果您要将 1 个环境 运行 n_step 设置为 32 且 total_timesteps = 25000,您将在学习通话期间对策略进行 781 次更新(不包括时期,因为 PPO 可以在一个批次上进行多次更新)
课文是:
- 对于未知大小的环境,您将不得不使用这个值。也许创建 运行 平均剧集长度并使用此值
- 在剧集长度已知的情况下,将其设置为您想要训练的所需剧集数。但是,它可能会更少,因为代理可能不会(可能不会)每次都达到最大步数。
- TLDR 使用值(将其视为超参数)
希望对您有所帮助!
我正在通读 original PPO paper and trying to match this up to the input parameters of the stable-baselines PPO2 模型。
我不明白的一件事是 learn
方法中的 total_timesteps
参数。
论文提到
One style of policy gradient implementation... runs the policy for T timesteps (where T is much less than the episode length)
虽然稳定基线文档将 total_timesteps
参数描述为
(int) The total number of samples to train on
因此我认为论文中的T
和文档中的total_timesteps
是同一个参数。
我不明白的是:
total_timesteps
是否总是需要小于或等于环境中可用 "frames"(样本)的总数(假设我有有限数量的样本)像 1,000,000 这样的帧)。如果是,为什么?通过将
total_timesteps
设置为小于可用帧数的数字,代理会看到训练数据的哪一部分?例如,如果total_timesteps=1000
,代理是否只看到前 1000 帧?一个episode是定义为可用帧总数,还是定义为agent第一次"looses" / "dies"?如果是后者,那么你怎么能提前知道代理什么时候会死才能将
total_timesteps
设置为一个较小的值?
我仍在学习 RL 背后的术语,所以我希望我已经能够在上面清楚地解释我的问题。非常欢迎任何帮助/提示。
根据stable-baselines源代码
- total_timesteps 是代理将为任何环境执行的 总计 步数。 total_timesteps 可以跨越多个剧集,这意味着该值不受某个最大值的限制。
- 假设您有一个时间步长超过 1000 的环境。如果调用一次 learn 函数,你只会体验前 1000 帧,其余部分是未知的。在许多实验中,您知道环境应该持续多少个时间步长(即 CartPole),但对于长度未知的环境,这就变得没那么有用了。但。如果你两次调用学习函数并说环境剧集有 1500 帧,你会看到完整的剧集 + 第二集的 50%。
- 一集定义为终端标志设置为真(在健身房中,这通常也设置在最大时间步长之后)许多其他 RL 实现使用 total_episodes 代替,以便您不必关心时间步长的考虑,但同样,缺点是如果你达到吸收状态,你可能最终只有 运行 1 集。
总时间步长参数也使用 n_steps,其中更新次数计算如下:
n_updates = total_timesteps // self.n_batch
其中 n_batch 是矢量化环境数量的 n_steps 倍。
这意味着如果您要将 1 个环境 运行 n_step 设置为 32 且 total_timesteps = 25000,您将在学习通话期间对策略进行 781 次更新(不包括时期,因为 PPO 可以在一个批次上进行多次更新)
课文是:
- 对于未知大小的环境,您将不得不使用这个值。也许创建 运行 平均剧集长度并使用此值
- 在剧集长度已知的情况下,将其设置为您想要训练的所需剧集数。但是,它可能会更少,因为代理可能不会(可能不会)每次都达到最大步数。
- TLDR 使用值(将其视为超参数)
希望对您有所帮助!