做者|Christian Hubbs
编译|VK
来源|Towards Data Sciencepython
Ray不单单是一个用于多处理的库,Ray的真正力量来自于RLlib和Tune库,它们利用了强化学习的这种能力。它使你可以将训练扩展到大型分布式服务器,或者利用并行化特性来更有效地使用你本身的笔记本电脑进行训练。git
咱们展现了如何使用Ray和RLlib在OpenAI Gym上构建一个自定义的强化学习环境。github
一旦你用pip install ray[rllib]
安装了Ray和RLlib,你就能够用命令行中的一个命令来训练你的第一个RL代理:算法
rllib train --run=A2C --env=CartPole-v0
这将告诉你的计算机在CartPole环境使用Advantage Actor Critic Algorithm (A2C) 算法训练。A2C和许多其余算法已经内置在库中,这意味着你没必要担忧本身实现这些算法的细节。后端
这是很是棒的,特别是若是你想使用标准的环境和算法来训练。然而,若是你想作得更多,你就得挖得更深一些。服务器
能够经过ray.rllib.agents
访问的各类算法。在这里,你能够找到在PyTorch和Tensorflow中的不一样实现:https://github.com/ray-project/ray/tree/master/rllib/agents。网络
这些都是使用算法的trainer方法访问的。例如,若是你想使用如上所示的A2C,你能够运行:机器学习
import ray from ray.rllib import agents ray.init() trainer = agents.a3c.A2CTrainer(env='CartPole-v0')
若是你想尝试DQN,你能够调用:分布式
trainer = agents.dqn.DQNTrainer(env='CartPole-v0') #深度Q网络
全部算法都遵循相同的基本结构,从小写字母algo缩写到大写字母algo缩写,而后是"Trainer"。函数
更改超参数就将配置信息的dict传递给config参数。一个快速了解你有什么可用的调用trainer.config以打印出可用于所选算法的选项。一些例子包括:
fcnet_hiddens
控制隐藏单元和隐藏层的数量(用一个叫model
的字典传递到config
,而后是一个列表,我将在下面展现一个例子)。vf_share_layers
肯定你是否拥有一个具备多个输出头的神经网络(https://www.datahubbs.com/two-headed-a2c-network-in-pytorch/),或者独立的值和策略网络。num_workers
设置并行化的处理器数量。num_gpus
来设置你将使用的GPU数量。从网络有各类回调和多代理的设置(一般位于model的字典中)
我想展现一个快速的例子来让你开始,并向你展现如何在一个标准的,OpenAI Gym环境下工做。
选择你的IDE
import ray from ray.rllib import agents ray.init() # 若是已经调用,跳过或设置为忽略 config = {'gamma': 0.9, 'lr': 1e-2, 'num_workers': 4, 'train_batch_size': 1000, 'model': { 'fcnet_hiddens': [128, 128] }} trainer = agents.ppo.PPOTrainer(env='CartPole-v0', config=config) results = trainer.train()
config
字典更改了上述值的默认值。你能够看到咱们如何经过在config
字典中嵌套一个名为model
的字典来影响网络中的层数和节点数。一旦咱们指定了配置,在trainer对象上调用train()方法将把环境发送给worker并开始收集数据。一旦收集了足够的数据(根据上面的设置收集了1,000个样本),模型就会更新并将输出发送到一个名为results的新字典中。
若是你想要运行多个更新,你能够设置一个训练循环来连续调用给定次数的迭代的train()方法,或者直到达到某个其余阈值。
OpenAI Gym及其全部扩展都很棒,但若是你正在寻找RL的新应用程序或在你的公司中使用它,则须要使用自定义环境。
不幸的是,Ray(0.9)的当前版本明确声明它与gym不兼容。值得庆幸的是,使用helper函数可使自定义gym环境与Ray一块儿工做。
让咱们假设你有一个名为MyEnv-v0
的环境,所以你能够像在任何其余gym环境中调用,咱们使用gym.make('MyEnv-v0')
调用。
要从Ray调用自定义环境,你须要将其封装到一个函数中,该函数将返回environment类,而不是实例化的对象。
def env_creator(env_name): if env_name == 'MyEnv-v0': from custom_gym.envs.custom_env import CustomEnv0 as env elif env_name == 'MyEnv-v1': from custom_gym.envs.custom_env import CustomEnv1 as env else: raise NotImplementedError return env
从这里,你能够设置代理并在这个新环境中对其进行训练,只需对训练器进行轻微的修改。
env_name = 'MyEnv-v0' config = { # 无论你想要什么样的配置设置…. } trainer = agents.ppo.PPOTrainer( env=env_creator(env_name), config=config) max_training_episodes = 10000 while True: results = trainer.train() # 输入你喜欢的任何中止条件 if results['episodes_total'] >= max_training_episodes: break print('Mean Rewards:\t{:.1f}'.format(results['episode_reward_mean']))
注意,在上面,咱们使用env_creator调用环境,其余一切保持不变。
若是你习惯于从环境构建本身的模型到网络和算法,那么在使用Ray时须要了解一些特性。
首先,Ray遵循OpenAI Gym API,这意味着你的环境须要有step()和reset()方法,以及指定的observation_space和action_space属性。关于后两个方面,我一直有点懒,由于我能够简单地定义网络输入和输出维度,而没必要考虑输入值的范围,例如,gym.spaces方法须要的范围。Ray检查了全部输入,以确保它们都在指定的范围内
在创建你的行动和观察空间时,使用Box
、Discrete
和Tuple
。MultiDiscrete
和MultiBinary
不能工做(目前),并将致使运行崩溃。相反,在Tuple函数中包装Box
和Discrete
能够的话,利用自定义预处理。Ray对你的状态输入作了一些假设,这些假设一般工做得很好,可是它也使你可以自定义预处理步骤,这可能有助于你的训练。
Ray能够极大地加快训练速度,使深度强化学习更容易开始。RLlib不是结束(咱们只是在这里触及了它的基本功能)。还有一个库,称为Tune,它使你可以调整模型的超参数,并为你管理全部重要的数据收集和后端工做。
欢迎关注磐创AI博客站:
http://panchuang.net/
sklearn机器学习中文官方文档:
http://sklearn123.com/
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/