做者|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-projec...。網絡
這些都是使用算法的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...,或者獨立的值和策略網絡。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,它使你可以調整模型的超參數,併爲你管理全部重要的數據收集和後端工做。
原文連接:https://towardsdatascience.co...
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/