首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稳定的Baselines3 PPO() -如何在训练期间改变clip_range参数?

稳定的Baselines3 PPO() -如何在训练期间改变clip_range参数?
EN

Stack Overflow用户
提问于 2022-06-03 01:12:54
回答 1查看 461关注 0票数 0

在我的PPO模型中,我希望在整个训练过程中逐渐减少clip_range (探索与开发参数)。

我尝试过简单地运行"model.clip_range = new_value",但这是行不通的。

在docs 这里中,它表示"clip_range (clip_range[clip_range,可调用的[float,float])-裁剪参数,它可以是当前剩余进度的函数(从1到0)“。

是否有人知道如何在培训期间实际更改此参数,或者如何输入“当前进度的函数”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-29 17:09:50

我已经解决了这个问题。

您需要有一个稍微时髦的设置,其中一个函数输出另一个函数。在此链接,他们给出了以下示例:

代码语言:javascript
复制
def linear_schedule(initial_value):
    """
    Linear learning rate schedule.
    :param initial_value: (float or str)
    :return: (function)
    """
    if isinstance(initial_value, str):
        initial_value = float(initial_value)

    def func(progress):
        """
        Progress will decrease from 1 (beginning) to 0
        :param progress: (float)
        :return: (float)
        """
        return progress * initial_value

    return func

因此,从本质上讲,您必须编写一个函数myscheduler(),它不一定需要输入,并且需要将该函数的输出作为另一个函数,它具有“进度”(随着培训的进行从1到0)为唯一的输入。这个“进度”值将由PPO本身传递给函数。所以,我认为“幕后”的顺序是这样的:

  1. 您的learning_rate调度函数被调用
  2. 您的learning_rate调度函数输出一个以进度为输入的函数
  3. SB3的PPO (或其他算法)将其当前的进度输入到该函数中。
  4. 函数输出所需的learning_rate,模型获取它并与该输出一起执行。

在我的例子中,我写了这样的东西:

代码语言:javascript
复制
def lrsched():
  def reallr(progress):
    lr = 0.003
    if progress < 0.85:
      lr = 0.0005
    if progress < 0.66:
      lr = 0.00025
    if progress < 0.33:
      lr = 0.0001
    return lr
  return reallr

然后,以下列方式使用该函数:

代码语言:javascript
复制
model = PPO(...learning_rate=lrsched())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72483775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档