作者|Christian Hubbs
編譯|VK
來源|Towards Data Science
Ray不僅僅是一個用于多處理的庫,Ray的真正力量來自于RLlib和Tune庫,它們利用了強化學習的這種能力,它使你能夠將訓練擴展到大型分布式服務器,或者利用并行化特性來更有效地使用你自己的筆記本電腦進行訓練,
我們展示了如何使用Ray和RLlib在OpenAI Gym上構建一個自定義的強化學習環境,
一個RLlib教程
一旦你用pip install ray[rllib]安裝了Ray和RLlib,你就可以用命令列中的一個命令來訓練你的第一個RL代理:
rllib train --run=A2C --env=CartPole-v0
這將告訴你的計算機在CartPole環境使用Advantage Actor Critic Algorithm (A2C) 演算法訓練,A2C和許多其他演算法已經內置在庫中,這意味著你不必擔心自己實作這些演算法的細節,
這是非常棒的,特別是如果你想使用標準的環境和演算法來訓練,然而,如果你想做得更多,你就得挖得更深一些,
RLlib代理
可以通過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的字典中)
例如:為CartPole訓練PPO
我想展示一個快速的例子來讓你開始,并向你展示如何在一個標準的,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()方法,或者直到達到某個其他閾值,
定制你的RL環境
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對你的狀態輸入做了一些假設,這些假設通常作業得很好,但是它也使你能夠自定義預處理步驟,這可能有助于你的訓練,
超越RLlib
Ray可以極大地加快訓練速度,使深度強化學習更容易開始,RLlib不是結束(我們只是在這里觸及了它的基本功能),還有一個庫,稱為Tune,它使你能夠調整模型的超引數,并為你管理所有重要的資料收集和后端作業,
原文鏈接:https://towardsdatascience.com/ray-and-rllib-for-fast-and-parallel-reinforcement-learning-6d31ee21c96c
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/5349.html
標籤:其他
上一篇:yolov5 簡單教程
下一篇:自然語言處理十大應用
