作者|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,它使你能夠調整模型的超參數,並為你管理所有重要的數據收集和后端工作。
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/