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我已经解决了这个问题。
您需要有一个稍微时髦的设置,其中一个函数输出另一个函数。在此链接中,他们给出了以下示例:
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 本身传递给该函数。所以,我认为事件的“幕后”顺序是这样的:
就我而言,我写了这样的内容:
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)