Cartpole:调整选项





5.00/5 (3投票s)
在本文中,我们将了解幕后发生了什么,以及有哪些选项可用于更改强化学习。
在前一篇也是第一篇文章中,我们回顾了强化学习的背景,并设置了一些辅助函数。最后,我们解决了一个简单的 Cartpole 环境。
这一次,我们将深入了解幕后情况,看看有哪些选项可以调整学习。最后,我们将看看另一个经典的强化学习环境:登山车。
理解 Cartpole 环境
我们可以查询 Gym 环境,以了解它期望我们如何与之交互
import gym
env = gym.make("Cartpole-v0")
print(env.observation_space)
>>> Box(4,)
这告诉我们,我们应该期望在每个观察结果中获得四个值。
print(env.action_space)
>>> Discrete(2)
这被称为离散动作空间;在这种情况下,向左移动或向右移动。保持静止不是一种选择:小车将处于持续的运动状态。一些其他环境具有连续动作空间,例如,代理必须准确地决定施加多少电压到伺服系统以移动机器人手臂。
让我们逐步完成与 Cartpole 环境交互的一个回合。我们正在重置环境,然后一遍又一遍地采取相同的动作(0 或 LEFT),直到杆倾倒得太远或小车超出范围。
env.reset()
while True:
update = env.step(action=0)
print(update)
observation, reward, done, info = update
if done:
break
每次交互时,我们会得到一个新的观察结果,有关奖励的详细信息(对于我们设法生存的每个时间步长 +1),剧集是否完成的通知,以及一些(空)信息。
OpenAI 的 wiki 页面对该环境进行了更详细的介绍,包括对观察结果中四个浮点数的解释:小车的位置、其速度、杆的角度和杆尖的速度。
更改学习配置
在前一篇文章中,我们使用了 DQNTrainer。由于我们在配置中没有指定太多内容,因此 RLlib 使用了默认值。我们可以使用 Python 库的漂亮打印模块来显示这些内容
import pprint
pprint.pprint(ray.rllib.agents.dqn.DEFAULT_CONFIG)
此处的输出应使您了解该库的可定制程度。 例如
double_q
、dueling
和prioritied_replay
都默认为 True:这些选项可用于帮助代理更快地学习lr
是学习率;这可能是您想要调整的东西,但它可能会对代理的学习方式产生巨大的影响
在本系列的剩余部分中,我们将介绍更多选项。 我希望这会激发您调查其他选项的兴趣!
将以下行添加到您上次用于在 Cartpole 环境中训练的配置字典中
"lr": 0.001,
"explore": False,
这将将学习率从默认的 0.0005 提高到 0.001,并将关闭探索计划。 如果探索已开启,代理可能会随机选择一个动作,该概率会随着时间的推移而衰减,而不是仅仅采取它认为最好的动作。 这可以避免过度拟合。 Cartpole 环境非常简单,因此我们无需担心这一点。
再次运行训练,看看效果如何。 您可能需要多次运行每个配置才能获得清晰的图像。 调整其他一些参数,看看是否可以缩短训练时间。 这是一个很好的实验环境,因为您可以在几分钟内知道您的更改是否成功。
登山车环境
登山车是另一个经典的强化学习环境。 您的代理必须学会通过左右推动一辆小车到山顶,并尽可能少地消耗能量。
注意奖励结构:对于从开始到登山车到达山顶之间经过的每个时间步长,您都会从得分中失去一分。 所以目标分数也是一个负数,只是比训练早期获得的分数更不负。 剧集将在 200 个时间步长后自动终止,因此最差的分数为 -200。
这是我使用的代码
ENV = 'MountainCar-v0'
TARGET_REWARD = -110 # note the negative target
TRAINER = DQNTrainer
tune.run(
TRAINER,
stop={"episode_reward_mean": TARGET_REWARD},
config={
"env": ENV,
"num_workers": 0, # run in a single process
"num_gpus": 0,
"monitor": True,
"evaluation_num_episodes": 25,
"lr": 0.001,
"explore": False,
}
)
对我来说,这在不到 10 分钟的时间内解决了环境问题。 和以前一样,尝试配置以查看是否可以提高性能。
从下一篇文章开始,我们将学习更多基于 Atari Breakout 游戏的复杂环境。