|
新智元推薦 來源:強(qiáng)化學(xué)習(xí)與自動(dòng)駕駛 (ID:rl_and_ad) 作者:卓求 整理編輯:三石 【新智元導(dǎo)讀】深度強(qiáng)化學(xué)習(xí)已經(jīng)在許多領(lǐng)域取得了矚目的成就,并且仍是各大領(lǐng)域受熱捧的方向之一。本文深入淺出的介紹了如何利用TensorForce框架快速搭建深度強(qiáng)化學(xué)習(xí)模型。深度強(qiáng)化學(xué)習(xí)(Deep Reinforcement Learning, DRL)是目前最熱門的方向之一,從視頻游戲、圍棋、蛋白質(zhì)結(jié)構(gòu)預(yù)測(cè)到機(jī)器人、計(jì)算機(jī)視覺、推薦系統(tǒng)等領(lǐng)域已經(jīng)取得了很多令人矚目的成就且仍在蓬勃發(fā)展中。 AlphaGo第一作者Davild Silver就認(rèn)為通用人工智能需要強(qiáng)化學(xué)習(xí)結(jié)合深度學(xué)習(xí)來實(shí)現(xiàn),即AGI=DL+RL。 為了便于研究人員快速搭建出強(qiáng)化學(xué)習(xí)模型,很多機(jī)構(gòu)發(fā)布了強(qiáng)化學(xué)習(xí)基準(zhǔn)算法或框架,其中較早的有OpenAI Baselines [1]、伯克利的rllab [2],最新的有18年谷歌發(fā)布的Dopamine [3]、Facebook發(fā)布的Horizon [4]。具體見下表: 本文介紹的是TensorForce并非由這些大機(jī)構(gòu)發(fā)布,而是由幾個(gè)劍橋大學(xué)的博士生開發(fā)、維護(hù)的。 當(dāng)時(shí)選擇TensorForcce是因?yàn)樾枰赗OS框架下開發(fā),而如上表列出的,它完全支持Python2,且包含很多主流的強(qiáng)化學(xué)習(xí)算法、支持OpenAI Gym、DeepMind Lab等常用于強(qiáng)化學(xué)習(xí)算法測(cè)試的基準(zhǔn)環(huán)境。 TensorForce是架構(gòu)在TensorFlow上的強(qiáng)化學(xué)習(xí)API,最早在17年就開源了,并發(fā)布了博客[5]介紹其背后的設(shè)計(jì)思想及基本應(yīng)用。 這里簡單介紹一下TensorForce的設(shè)計(jì)思想。 框架設(shè)計(jì)的難點(diǎn)在于如何解耦出其它層面的內(nèi)容,盡可能將共用的部分抽象出來。拿強(qiáng)化學(xué)習(xí)來說,智能體與環(huán)境不斷通過交互試錯(cuò)來學(xué)習(xí),如果由我們從頭自己編程實(shí)現(xiàn)某個(gè)RL任務(wù),為了方便智能體與環(huán)境很自然地會(huì)寫在一起。但作為框架卻不行,需要將智能體從環(huán)境中解耦出來。 TensorForce包括了下面四個(gè)層面的概念: Environment <-> Runner <-> Agent <-> Model Agent在訓(xùn)練前可以加載model,訓(xùn)練后保存model,運(yùn)行時(shí)接收state,(預(yù)處理后)作為model的輸入,返回action。模型會(huì)根據(jù)算法及配置自動(dòng)更新。Runner將Agent和Environment之間的交互抽象出來作為函數(shù)。Environment根據(jù)應(yīng)用場景的不同需要自己寫接口,后文會(huì)提供一個(gè)機(jī)器人導(dǎo)航環(huán)境的接口案例。如果是學(xué)習(xí)或者算法測(cè)試,可以使用現(xiàn)成的基準(zhǔn)環(huán)境,TensorForce提供了OpenAI Gym、OpenAI Universe和DeepMind Lab的接口。 下面通過使用近端策略優(yōu)化(Proximal Policy Optimization, PPO)算法訓(xùn)練OpenAI Gym中倒立擺來初識(shí)TensorForce的簡潔和強(qiáng)大。
很快,倒立擺能夠平衡: 使用TensorBoard查看訓(xùn)練過程(左圖是loss,右圖是entropy): 上面我們只用了30行代碼實(shí)現(xiàn)了PPO算法訓(xùn)練倒立擺,代碼首先定義了環(huán)境和網(wǎng)絡(luò)(兩層32個(gè)節(jié)點(diǎn)的全連接網(wǎng)絡(luò),激活函數(shù)為relu),然后定義了agent,agent的參數(shù)中states, actions, network三個(gè)參數(shù)是必填的,step_optimizer定義了優(yōu)化器,saver和summarizer分別保存模型和訓(xùn)練過程。最后通過runner來實(shí)現(xiàn)agent和environment的交互,總共跑了600個(gè)episodes,每個(gè)episode的最大步長是200。 runner解耦出了交互過程,實(shí)際上是是下面過程的循環(huán):
在上述過程中,agent會(huì)儲(chǔ)存相關(guān)信息來更新模型,比如DQNAgent會(huì)存儲(chǔ)(state, action, reward, next_state)。 TensorForce提供了豐富的observation預(yù)處理功能,視頻游戲是DRL最先取得突破的方向,以Flappy Bird為例,需要進(jìn)行四個(gè)步驟的預(yù)處理:
使用TensorForce可以很方便地進(jìn)行預(yù)處理:
如果要在具體的應(yīng)用場景中使用TensorForce就需要根據(jù)應(yīng)用場景手動(dòng)搭建環(huán)境,環(huán)境的模板為environment.py [7],其中最重要的函數(shù)是execute,該函數(shù)接收agent產(chǎn)生的action,并在環(huán)境中執(zhí)行該action,然后返回next_state,reward,terminal。這里我以搭建的Gazebo中的機(jī)器人導(dǎo)航環(huán)境為例,進(jìn)行介紹。 首先搭建仿真環(huán)境如下圖: 設(shè)計(jì)環(huán)境的接口及其與agent交互的過程: 仿真開始,init函數(shù)打開Gazebo并加載對(duì)應(yīng)的導(dǎo)航環(huán)境,reset函數(shù)初始化機(jī)器人,execute函數(shù)接收到action后通過ROS發(fā)送對(duì)應(yīng)的速度命令,Gazebo中的機(jī)器人接收到速度命令后執(zhí)行對(duì)應(yīng)的速度,機(jī)器人傳感器返回相應(yīng)的信息,計(jì)算對(duì)應(yīng)的reward,讀取視覺傳感器的RGB圖像作為next_state,判斷是否到達(dá)目標(biāo)點(diǎn)或者碰撞,如果是Terminal為True,該episode結(jié)束。完整的代碼見 [8]。 DRL網(wǎng)絡(luò)和算法是智能體最重要的兩部分,一個(gè)確定模型結(jié)構(gòu)、一個(gè)決定模型更新。上面只介紹了簡單的模型,對(duì)于有些復(fù)雜網(wǎng)絡(luò)需要層疊的方式來定義,如下如: 該網(wǎng)絡(luò)的輸入為64*48*3的RGB圖像,由卷積層提取特征后與2維的速度信息和運(yùn)動(dòng)信息共同輸入全連接層進(jìn)行決策。首先定義state: 然后定義action即velocity,這里為機(jī)器人的線速度(限制在[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))然后通過層疊的方式來定義網(wǎng)絡(luò)結(jié)構(gòu): 完整代碼見[8] 1. agent會(huì)有actions_exploration參數(shù)來定義exploration,默認(rèn)值為'none',但這并不代表不探索,以PPO為例,模型在輸出的時(shí)候不輸出直接的確定性動(dòng)作(只有DPG才會(huì)輸出確定性動(dòng)作),而是分布,輸出在分布上采樣輸出,這可以看作是一種exploration。 2. 網(wǎng)絡(luò)的輸出層是根據(jù)action自動(dòng)添加的,在network中定義輸入層和隱藏層即可 3. 如果不再需要exploration而只是exploitation,則運(yùn)行: agent.act(action, deterministic=True)此時(shí)agent執(zhí)行g(shù)reedy策略。而如果模型訓(xùn)練完成,不再訓(xùn)練則: 此時(shí)函數(shù)只執(zhí)行act不執(zhí)行observe來更新模型 4. PPO算法相比于DQN,不僅性能好,并且對(duì)超參數(shù)更魯棒,建議優(yōu)先選擇PPO 參考鏈接: [1] https://github.com/openai/baselines [2] https://rllab./en/latest/index.html [3] https://github.com/google/dopamine [4] https://github.com/facebookresearch/Horizon [5] https:///blog/ [6] https://tensorforce./en/latest/ [7] https://github.com/tensorforce/tensorforce/blob/master/ tensorforce/environments/environment.py [8] https://github.com/marooncn/navbot/blob/master/rl_nav |
|
|