深度強化學習已經在許多領域取得了矚目的成就,并且仍是各大領域受熱捧的方向之一。本文深入淺出的介紹了如何利用TensorForce框架快速搭建深度強化學習模型。
深度強化學習(Deep Reinforcement Learning, DRL)是目前最熱門的方向之一,從視頻游戲、圍棋、蛋白質結構預測到機器人、計算機視覺、推薦系統等領域已經取得了很多令人矚目的成就且仍在蓬勃發展中。
AlphaGo第一作者Davild Silver就認為通用人工智能需要強化學習結合深度學習來實現,即AGI=DL+RL。
框架
為了便于研究人員快速搭建出強化學習模型,很多機構發布了強化學習基準算法或框架,其中較早的有OpenAI Baselines [1]、伯克利的rllab [2],最新的有18年谷歌發布的Dopamine [3]、Facebook發布的Horizon [4]。具體見下表:
本文介紹的是TensorForce并非由這些大機構發布,而是由幾個劍橋大學的博士生開發、維護的。
當時選擇TensorForcce是因為需要在ROS框架下開發,而如上表列出的,它完全支持Python2,且包含很多主流的強化學習算法、支持OpenAI Gym、DeepMind Lab等常用于強化學習算法測試的基準環境。
TensorForce是架構在TensorFlow上的強化學習API,最早在17年就開源了,并發布了博客[5]介紹其背后的設計思想及基本應用。
這里簡單介紹一下TensorForce的設計思想。
框架設計的難點在于如何解耦出其它層面的內容,盡可能將共用的部分抽象出來。拿強化學習來說,智能體與環境不斷通過交互試錯來學習,如果由我們從頭自己編程實現某個RL任務,為了方便智能體與環境很自然地會寫在一起。但作為框架卻不行,需要將智能體從環境中解耦出來。
TensorForce包括了下面四個層面的概念:
Environment <-> Runner <-> Agent <-> Model
Agent在訓練前可以加載model,訓練后保存model,運行時接收state,(預處理后)作為model的輸入,返回action。模型會根據算法及配置自動更新。Runner將Agent和Environment之間的交互抽象出來作為函數。Environment根據應用場景的不同需要自己寫接口,后文會提供一個機器人導航環境的接口案例。如果是學習或者算法測試,可以使用現成的基準環境,TensorForce提供了OpenAI Gym、OpenAI Universe和DeepMind Lab的接口。
第一行代碼
下面通過使用近端策略優化(Proximal Policy Optimization, PPO)算法訓練OpenAI Gym中倒立擺來初識TensorForce的簡潔和強大。
from tensorforce.agents import PPOAgentfrom tensorforce.execution import Runnerfrom tensorforce.contrib.openai_gym import OpenAIGym# Create an OpenAIgym environment.environment=OpenAIGym('CartPole-v0',visualize=True)network_spec=[dict(type='dense',size=32,activation='relu'),dict(type='dense',size=32,activation='relu')]agent = PPOAgent(states=environment.states,actions=environment.actions,network=network_spec,step_optimizer=dict(type='adam',learning_rate=1e-3),saver=dict(directory='./saver/',basename='PPO_model.ckpt',load=False,seconds=600),summarizer=dict(directory='./record/',labels=["losses","entropy"],seconds=600),)# Create the runnerrunner=Runner(agent=agent,environment=environment)# Start learningrunner.run(episodes=600, max_episode_timesteps=200)runner.close()
很快,倒立擺能夠平衡:
使用TensorBoard查看訓練過程(左圖是loss,右圖是entropy):
上面我們只用了30行代碼實現了PPO算法訓練倒立擺,代碼首先定義了環境和網絡(兩層32個節點的全連接網絡,激活函數為relu),然后定義了agent,agent的參數中states, actions, network三個參數是必填的,step_optimizer定義了優化器,saver和summarizer分別保存模型和訓練過程。最后通過runner來實現agent和environment的交互,總共跑了600個episodes,每個episode的最大步長是200。
runner解耦出了交互過程,實際上是是下面過程的循環:
# Query the agent for its action decisionaction = agent.act(state)# Execute the decision and retrieve the current informationobservation, terminal, reward = GazeboMaze.execute(action)# Pass feedback about performance (and termination) to the agentagent.observe(terminal=terminal, reward=reward)
在上述過程中,agent會儲存相關信息來更新模型,比如DQNAgent會存儲(state, action, reward, next_state)。
視頻游戲
TensorForce提供了豐富的observation預處理功能,視頻游戲是DRL最先取得突破的方向,以Flappy Bird為例,需要進行四個步驟的預處理:
轉化為灰度圖,去除不必要的顏色信息;
縮小輸入的游戲截屏,resize為80*80;
堆疊連續的四幀,推導出運行信息;
歸一化處理,以便于訓練。
使用TensorForce可以很方便地進行預處理:
states = dict(shape=(3264, 18723, 3), type='float')states_preprocessing_spec = [dict( type='image_resize', width=80, height=80), dict( type='grayscale'),dict( type='normalize')dict( type='sequence', length=4)]agent = DQNAgent( states=states, actions=actions, network=network_spec, states_preprocessing=states_preprocessing_spec)
環境搭建
如果要在具體的應用場景中使用TensorForce就需要根據應用場景手動搭建環境,環境的模板為environment.py [7],其中最重要的函數是execute,該函數接收agent產生的action,并在環境中執行該action,然后返回next_state,reward,terminal。這里我以搭建的Gazebo中的機器人導航環境為例,進行介紹。
首先搭建仿真環境如下圖:
設計環境的接口及其與agent交互的過程:
仿真開始,init函數打開Gazebo并加載對應的導航環境,reset函數初始化機器人,execute函數接收到action后通過ROS發送對應的速度命令,Gazebo中的機器人接收到速度命令后執行對應的速度,機器人傳感器返回相應的信息,計算對應的reward,讀取視覺傳感器的RGB圖像作為next_state,判斷是否到達目標點或者碰撞,如果是Terminal為True,該episode結束。完整的代碼見 [8]。
復雜網絡
DRL網絡和算法是智能體最重要的兩部分,一個確定模型結構、一個決定模型更新。上面只介紹了簡單的模型,對于有些復雜網絡需要層疊的方式來定義,如下如:
該網絡的輸入為64*48*3的RGB圖像,由卷積層提取特征后與2維的速度信息和運動信息共同輸入全連接層進行決策。首先定義state:
states=dict(image=dict(shape=(48,64,3),type='float'),#Observationprevious_act=dict(shape=(2,),type='float'),#velocityrelative_pos=dict(shape=(2,),type='float')#target)
然后定義action即velocity,這里為機器人的線速度(限制在[0,1])和角速度(限制在[-1,1]):
dict(linear_vel=dict(shape=(),type='float',min_value=0.0,max_value=1.0),angular_vel=dict(shape=(),type='float',min_value=-1.0,max_value=1.0))
然后通過層疊的方式來定義網絡結構:
network_spec=[[dict(type='input',names=['image']),dict(type='conv2d',size=32,window=(8,6),stride=4,activation='relu',padding='SAME'),dict(type='conv2d',size=64,window=(4,3),stride=2,activation='relu',padding='SAME'),dict(type='pool2d',pooling_type='max',window=2,stride=2,padding='SAME'),dict(type='conv2d',size=64,window=2,stride=2,activation='relu',padding='SAME'),dict(type='flatten'),dict(type='output',name='image_output')],[dict(type='input',names=['image_output','previous_act','relative_pos'],aggregation_type='concat'),dict(type='dense',size=512,activation='relu'),dict(type='dense',size=512,activation='relu'),]]
完整代碼見[8]
其它
1. agent會有actions_exploration參數來定義exploration,默認值為'none',但這并不代表不探索,以PPO為例,模型在輸出的時候不輸出直接的確定性動作(只有DPG才會輸出確定性動作),而是分布,輸出在分布上采樣輸出,這可以看作是一種exploration。
2. 網絡的輸出層是根據action自動添加的,在network中定義輸入層和隱藏層即可
3. 如果不再需要exploration而只是exploitation,則運行:
agent.act(action,deterministic=True)
此時agent執行greedy策略。而如果模型訓練完成,不再訓練則:
agent.act(action,independent=True)
此時函數只執行act不執行observe來更新模型
4. PPO算法相比于DQN,不僅性能好,并且對超參數更魯棒,建議優先選擇PPO
-
人工智能
+關注
關注
1792文章
47432瀏覽量
238976 -
計算機視覺
+關注
關注
8文章
1698瀏覽量
46032 -
強化學習
+關注
關注
4文章
268瀏覽量
11270
原文標題:快速上手深度強化學習?學會TensorForce就夠了
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論