基於模塊化和快速原型設計的Huskarl深度強化學習框架

  • 2019 年 11 月 21 日
  • 筆記

深度強化學習報道

來源:Huskarl(Medium)

編輯:DeepRL

前言:Huskarl是一種基於TensorFlow 2.0構建的深度強化學習的框架,其專註於模塊化和快速原型設計。設計中儘可能使用了tf.keras API以實現簡潔性和可讀性。Huskarl可以輕鬆地跨多個CPU核心並行計算環境動態。這對於加速從多個並發經驗源(如A2C或PPO)中受益的策略性學習算法非常有用。並且對於計算密集型環境尤其有用,例如基於物理的環境。其與OpenAI Gym環境無縫協作,並支持多智能體環境和Unity3D環境。

一、簡介

深度學習革命一直是從計算機視覺到自然語言處理等領域的許多最新進展和突破的原因。已經看到非凡增長的一個特殊領域是深度強化學習。2013年,DeepMind發佈了「使用深度強化學習玩Atari」,他們的模型只是通過觀看屏幕上的像素來學習玩Atari遊戲。三年後,AlphaGo擊敗了Go世界冠軍,吸引了全球觀眾。最近,AlphaZero打破了從人類比賽中學習的需要,通過自我發揮將學習推廣到任何完美的信息遊戲,並有效地成為Go,Chess和Shogi的世界冠軍。

1.1

Huskarl在Atari遊戲中的應用

Huskarl在#PoweredByTF 2.0挑戰賽中獲得第一名。其目標是讓研究人員輕鬆實現,測試,調整和比較深度RL算法。類似於TensorFlow如何抽象出計算圖的管理,以及Keras創建高級模型,Huskarl抽象出代理 – 環境交互。這使用戶可以專註於開發和理解算法,同時還可以防止數據泄漏。目前項目仍處於早期階段,但它已經包括深度Q學習網絡(DQN),Double DQN,AC,DDPG等算法的實現,同時提供了解決離散和連續狀態下的方法。並且,Huskarl使用OpenAI Gym工具包開發和比較RL算法,因此與其他開源框架等具有可比性。

下文是創建和可視化DQN代理所需的完整代碼,該智能體學習平衡一個cartpole,可以看出整個的代碼非常的簡潔,後文將會詳細講述過程。

from tensorflow.keras.models import Sequential  from tensorflow.keras.layers import Dense  import huskarl as hk  import gym    # Setup gym environment  create_env = lambda: gym.make('CartPole-v0').unwrapped  dummy_env = create_env()    # Build a simple neural network with 3 fully connected layers as our model  model = Sequential([    Dense(16, activation='relu', input_shape=dummy_env.observation_space.shape),    Dense(16, activation='relu'),    Dense(16, activation='relu'),  ])    # Create Deep Q-Learning Network agent  agent = hk.agent.DQN(model, actions=dummy_env.action_space.n, nsteps=2)    # Create simulation, train and then test  sim = hk.Simulation(create_env, agent)  sim.train(max_steps=3000, visualize=True)  sim.test(max_steps=1000)  

目前,Huskarl實現了包括三個可調智能體的若干算法。DQN智能體實現了深度Q-Learning以及多種增強功能,例如可變步長跟蹤,雙DQN和可調整的決鬥架構。DQN是一種非策略算法,過程實現默認使用優先級經驗重放。A2C代理實現Advantage Actor-Critic的同步,多步版本,這是一種on-policy算法。Huskarl允許像A2C這樣的on-policy算法輕鬆地同時從多個環境實例中獲取經驗。這有助於將數據解相關成一個更加固定的過程,最後,DDPG代理使用變步長跟蹤實現深度確定性策略梯度,默認情況下也使用優先級經驗重放。DDPG代理處理連續動作空間的問題。

Huskarl可以輕鬆地跨多個CPU核心並行計算環境動態。這對於加速從多個並發經驗源(例如A2C或PPO)中受益的策略性學習算法非常有用。首先,要同時使用多個環境實例,只需為策略上的代理和模擬提供所需數量的實例。然後,將環境實例分佈在多個進程上,這些進程在可用的CPU內核上自動並行化,只需在調用sim.train()時為max_subprocesses參數提供所需的值,如下面的代碼段所示。另外,請注意為每個環境實例使用不同的策略是多麼簡單 – 只需提供策略列表而不是單個策略對象:

# We will be running multiple concurrent environment instances  instances = 16    # Create a policy for each instance with a different distribution for epsilon  policy = [hk.policy.Greedy()] + [hk.policy.GaussianEpsGreedy(eps, 0.1) for eps in np.arange(0, 1, 1/(instances-1))]    # Create Advantage Actor-Critic agent  agent = hk.agent.A2C(model, actions=dummy_env.action_space.n, nsteps=2, instances=instances, policy=policy)    # Create simulation, train and then test  sim = hk.Simulation(create_env, agent)  sim.train(max_steps=5000, instances=instances, max_subprocesses=8)  sim.test(max_steps=1000)  

值得注意的是,某些環境(如cartpole環境)非常簡單,因此使用多個進程實際上會因進程間通信開銷而減慢培訓速度。只有計算上昂貴的環境才能從跨進程傳播中受益。在所有實現的智能體中,使用的神經網絡由用戶提供,因為它們依賴於每個問題規範。它們可以如所希望的那樣簡單或者複雜。此外,所有算法都充分利用自定義Keras損耗儘可能快速和簡潔

下一步是什麼

1.2

Huskarl目前支持的算法

二、Huskarl環境安裝與使用

源方式

2.1

源代碼安裝

git clone https://github.com/danaugrs/huskarl.git  cd huskarl  pip install -e .

2.2

PiP安裝

pip install huskarl  

2.3

使用方法

相對於其他框架和方法的實現上,Huskarl在代碼的簡潔性上可以說美妙絕倫。本部以huskarl利用DDPG算法實現Pendulum為例子進行分析。

1、首先引入相關的包(包括tensorflow kera、Gym環境和huskarl)

from tensorflow.keras.models import Sequential, Model  from tensorflow.keras.layers import Dense, Input, Concatenate  import matplotlib.pyplot as plt  import gym  import huskarl as hk  

2、Build環境(同往常一樣)

   create_env = lambda: gym.make('Pendulum-v0')     dummy_env = create_env()     action_size = dummy_env.action_space.shape[0]     state_shape = dummy_env.observation_space.shape  

3、建立Actor模型

由於DDPG算法使用了AC框架,因此需要創建對應的網絡

   actor = Sequential([          Dense(16, activation='relu', input_shape=state_shape),          Dense(16, activation='relu'),          Dense(16, activation='relu'),          Dense(action_size, activation='linear')      ])  

4、建立Critic環境

   action_input = Input(shape=(action_size,), name='action_input')      state_input = Input(shape=state_shape, name='state_input')      x = Concatenate()([action_input, state_input])      x = Dense(32, activation='relu')(x)      x = Dense(32, activation='relu')(x)      x = Dense(32, activation='relu')(x)      x = Dense(1, activation='linear')(x)      critic = Model(inputs=[action_input, state_input], outputs=x)  

5、創建深層確定性策略梯度智能體

非常關鍵,也是使用huskarl核心的一步。

  agent = hk.agent.DDPG(actor=actor, critic=critic, nsteps=2)

6、畫過程和曲線圖

 def plot_rewards(episode_rewards, episode_steps, done=False):          plt.clf()          plt.xlabel('Step')          plt.ylabel('Reward')          for ed, steps in zip(episode_rewards, episode_steps):              plt.plot(steps, ed)          plt.show() if done else plt.pause(0.001) # Pause a bit so that the graph is updated  

7、創建模擬訓練和測試的過程

  sim = hk.Simulation(create_env, agent)    sim.train(max_steps=30_000, visualize=True, plot=plot_rewards)    sim.test(max_steps=5_000)  

2.4

完整DDPG代碼實現Pendulum

from tensorflow.keras.models import Sequential, Model  from tensorflow.keras.layers import Dense, Input, Concatenate    import matplotlib.pyplot as plt  import gym    import huskarl as hk    if __name__ == "__main__":        # Setup gym environment      create_env = lambda: gym.make('Pendulum-v0')      dummy_env = create_env()      action_size = dummy_env.action_space.shape[0]      state_shape = dummy_env.observation_space.shape        # Build a simple actor model      actor = Sequential([          Dense(16, activation='relu', input_shape=state_shape),          Dense(16, activation='relu'),          Dense(16, activation='relu'),          Dense(action_size, activation='linear')      ])        # Build a simple critic model      action_input = Input(shape=(action_size,), name='action_input')      state_input = Input(shape=state_shape, name='state_input')      x = Concatenate()([action_input, state_input])      x = Dense(32, activation='relu')(x)      x = Dense(32, activation='relu')(x)      x = Dense(32, activation='relu')(x)      x = Dense(1, activation='linear')(x)      critic = Model(inputs=[action_input, state_input], outputs=x)        # Create Deep Deterministic Policy Gradient agent      agent = hk.agent.DDPG(actor=actor, critic=critic, nsteps=2)        def plot_rewards(episode_rewards, episode_steps, done=False):          plt.clf()          plt.xlabel('Step')          plt.ylabel('Reward')          for ed, steps in zip(episode_rewards, episode_steps):              plt.plot(steps, ed)          plt.show() if done else plt.pause(0.001) # Pause a bit so that the graph is updated        # Create simulation, train and then test      sim = hk.Simulation(create_env, agent)      sim.train(max_steps=30_000, visualize=True, plot=plot_rewards)      sim.test(max_steps=5_000)  

參考資料:

1. https://tensorflow.devpost.com/

2. https://github.com/danaugrs/huskarl