Stable Baselines3 PPO() - 如何在训练期间更改 Clip_range 参数?

Vla*_*lik 3 reinforcement-learning stable-baselines

我想在 PPO 模型的整个训练过程中逐渐减小 Clip_range(epsilon、探索与利用参数)。

\n

我尝试简单地运行“model.clip_range = new_value”,但这不起作用。

\n

在此处的文档中,它说“clip_range (Union[float, Callable[[float], float]]) \xe2\x80\x93 剪辑参数,它可以是当前剩余进度的函数(从1到0)。 ”

\n

有谁知道如何在训练期间实际更改此参数,或者如何输入“当前剩余进度的函数”?

\n

Vla*_*lik 6

我已经解决了这个问题。

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

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
Run Code Online (Sandbox Code Playgroud)

所以本质上,你要做的就是编写一个函数 myscheduler(),它不一定需要输入,并且你需要该函数的输出是另一个具有“进度”的函数(作为训练从 1 到 0 进行测量)继续)成为唯一的输入。该“进度”值将由 PPO 本身传递给该函数。所以,我认为事件的“幕后”顺序是这样的:

  1. 您的learning_rate调度函数被称为
  2. 您的learning_rate调度函数输出一个以进度作为输入的函数
  3. SB3 的 PPO(或其他算法)将其当前进度输入到该函数中
  4. 函数输出必要的learning_rate,模型抓取它并使用该输出。

就我而言,我写了这样的内容:

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式使用该函数:

model = PPO(...learning_rate=lrsched())
Run Code Online (Sandbox Code Playgroud)