在强化学习领域,理解环境的运作机制以及如何与环境交互是至关重要的。本文将深入探讨如何通过调整学习配置来优化算法在Cartpole和Mountain Car这两个经典环境中的表现。
Cartpole环境是一个经典的强化学习问题,目标是通过移动小车来保持杆子竖直。可以通过查询Gym环境来了解它期望如何与之交互。
import gym
env = gym.make("Cartpole-v0")
print(env.observation_space)
# 输出:Box(4,)
print(env.action_space)
# 输出:Discrete(2)
观察空间告诉每次观察应该包含四个值,而动作空间是离散的,即向左或向右移动。通过与环境的交互,可以得到新的观察值、奖励详情、是否结束的通知以及一些信息。
env.reset()
while True:
update = env.step(action=0)
print(update)
observation, reward, done, info = update
if done:
break
每次交互都会得到新的观察值、奖励详情、是否结束的通知以及一些信息。OpenAI的Wiki页面提供了更多细节,包括观察值中的四个浮点数:小车的位置、速度、杆子的角度和杆子尖端的速度。
在之前的文章中,使用了DQNTrainer,并且没有指定太多配置,RLlib使用了默认值。可以使用Python库的pretty-printing模块来显示这些默认值。
import pprint
pprint.pprint(ray.rllib.agents.dqn.DEFAULT_CONFIG)
输出应该让对库的可定制性有所了解。例如,double_q、dueling和prioritised_replay默认都是True,这些选项可以帮助代理更快地学习。学习率(lr)是一个可能想要调整的参数,但它对代理的学习方式有显著影响。
在训练Cartpole环境时,可以在配置字典中添加以下几行代码来调整学习率和关闭探索计划:
"lr": 0.001,
"explore": False,
这将把学习率从默认的0.0005提高到0.001,并关闭探索计划。如果探索开启,代理可能会以随时间衰减的概率随机选择动作,而不是只选择它认为最好的动作。这可以避免过拟合。Cartpole环境足够简单,所以不需要担心这个问题。
再次运行训练,看看效果如何。可能需要多次运行每个配置以获得清晰的结果。调整一些其他参数,看看是否能够缩短训练时间。这是一个很好的环境来实验,因为可以在几分钟内知道是否做出了成功的改变。
Mountain Car是另一个经典的强化学习环境。代理需要学会通过左右推动小车,以尽可能少的能量将其推到山顶。
注意奖励结构:每经过一个时间步,得分就会减少一分,直到Mountain Car到达山顶。所以目标得分也是一个负数,只是比在训练早期阶段得到的得分不那么负。一集会自动在200个时间步后终止,所以最坏的得分是-200。
ENV = 'MountainCar-v0'
TARGET_REWARD = -110 # 注意负目标
TRAINER = DQNTrainer
tune.run(
TRAINER,
stop={
"episode_reward_mean": TARGET_REWARD},
config={
"env": ENV,
"num_workers": 0, # 在单个进程中运行
"num_gpus": 0,
"monitor": True,
"evaluation_num_episodes": 25,
"lr": 0.001,
"explore": False,
}
)