2

我正在使用 ray RLlib 库在 5-in-a-row 游戏中训练多智能体 Trainer。这是零和环境,所以我有代理行为退化的问题(总是赢得第一个代理,5 步获胜)。我有一个想法以这种方式改变代理的学习率:首先训练第一个代理,第二个随机训练,学习率为零。在第一个代理学会如何赢得超过 90% 的游戏后切换。然后重复但是在构造函数中初始化后我无法更改学习率。这可能吗?

def gen_policy(GENV, lr=0.001):
    config = {
        "model": {
            "custom_model": 'GomokuModel',
            "custom_options": {"use_symmetry": True, "reg_loss": 0},
        },
        "custom_action_dist": Categorical,
        "lr": lr
    }
    return (None, GENV.observation_space, GENV.action_space, config)

def map_fn(agent_id):
    if agent_id=='agent_0':
        return "policy_0"
    else:
        return "policy_1"

trainer = ray.rllib.agents.a3c.A3CTrainer(env="GomokuEnv", config={
        "multiagent": {
            "policies": {"policy_0": gen_policy(GENV, lr = 0.001), "policy_1": gen_policy(GENV,lr=0)},
            "policy_mapping_fn": map_fn,
            },
        "callbacks":
            {"on_episode_end": clb_episode_end},


while True:
    rest = trainer.train()
    #here I want to change learning rate of my policies based on environment statistics

我试图在 while True 循环中添加这些行

new_config = trainer.get_config()
new_config["multiagent"]["policies"]["policy_0"]=gm.gen_policy(GENV, lr = 0.00321)
new_config["multiagent"]["policies"]["policy_1"]=gm.gen_policy(GENV, lr = 0.00175)

trainer["raw_user_config"]=new_config
trainer.config = new_config

它没有帮助

4

2 回答 2

0

我发现这里的简单示例有点令人困惑。所以我想添加一个明确的答案。为了确保其他用户不必查看代码,我添加了一个问题并想在此处添加我的答案: https ://github.com/ray-project/ray/issues/15647

这是一个线性下降学习率的测试示例,直到某个点。

lr_start = 2.5e-4
lr_end = 2.5e-5
lr_time = 50 * 1000000
config = {
    "lr": lr_start,
    "lr_schedule": [
        [0, lr_start],
        [lr_time, lr_end],
    ],
}

LR

于 2021-05-05T10:11:31.537 回答
0

我偶然发现了同样的问题,并对 RLlib 实现做了一些研究。

从测试脚本看起来 lr_schedule 是由一个间隔给出的

lr_schedule: [
            [0, 0.0005],
            [20000000, 0.000000000001],
        ]

之后,我检查了实施细节。
ray/rllib/policy/torch_policy.py中,函数LearningRateSchedule实现了入口点。
当定义 lr_schedule 时,将使用PiecewiseSchedule

ray/rllib/utils/schedules/piecewise_schedule.py中PiecewiseSchedule的实现如下:

endpoints (List[Tuple[int,float]]): A list of tuples
                `(t, value)` such that the output
                is an interpolation (given by the `interpolation` callable)
                between two values.
                E.g.
                t=400 and endpoints=[(0, 20.0),(500, 30.0)]
                output=20.0 + 0.8 * (30.0 - 20.0) = 28.0
                NOTE: All the values for time must be sorted in an increasing
                order.

这意味着学习率计划由两个参数组成:
时间步长 t (int) 和假设学习率 (float)

对于这些值之间的每个时间步,使用插值。
插值可以在函数PiecewiseSchedule中通过参数interpolation指定,默认为_linear_interpolation

interpolation (callable): A function that takes the left-value,
                the right-value and an alpha interpolation parameter
                (0.0=only left value, 1.0=only right value), which is the
                fraction of distance from left endpoint to right endpoint.

TL;博士;

因此 lr_schedule 描述了线性插值的支持点(使用默认插值)。

此外,要在此Github 问题的训练期间更改参数,最好的选择似乎是重新初始化训练器:

state = trainer.save()
trainer.stop()
#re_initialise trainer
trainer.restore(state)
于 2020-08-29T10:27:21.207 回答