天天看點

精彩回顧|阿裡算法專家詳解,最易用強化學習開源庫EasyRL從入門到實踐

昨天,“EasyRL強化學習入門與實踐”第一課的直播已圓滿結束!阿裡巴巴算法專家王桢為大家帶來了強化學習開源庫EasyRL的介紹。

内容包括強化學習的入門與實踐,從基本的概念到具體的例子,如何利用EasyRL快速運作強化學習算法解決一些實際的問題。

今天會進行第二課的直播哦,具體直播安排如下:

直播時間:今晚19:00-20:00

課程内容:

1. 馬爾可夫決策過程(值函數與貝爾曼方程)

2. 強化學習算法(基于值的方法,政策梯度方法,算法歸類)

直播傳送門:阿裡雲開發者社群

https://developer.aliyun.com/live/2287

接下來讓我們回顧一下昨日的精彩内容!沒能觀看直播的同學可以通過以下連結觀看回放,再配上下面的内容回顧,妙哉啊!

第一課回放:

https://study.163.com/course/courselive/1280452094.htm?share=2&shareId=10146755

關鍵詞:人工智能,大資料,分布式強化學習算法,開源EasyRL,馬爾可夫決策過程

EasyRL簡介

概述

在實踐中,強化學習相較于監督學習對工程師往往提出了更高的要求,包括但不限于:

  • 監督學習往往隻需要在計算圖中描述目标函數并選擇優化器,強化學習需要描述政策,值函數,目标的估計等等多個子產品。   
  • 在分布式訓練的設定下,監督學習僅需要在程序間交換同質的梯度和參數,而強化學習還需要傳遞格式更複雜的樣本(即(state, action, reward, next state)元組組成的序列)。   
  • 不同流派的強化學習算法在不同場景中往往各有優劣。工程師往往需要一套較為齊全的算法庫來嘗試和驗證不同算法。   

EasyRL針對上述困難與挑戰而設計,在易用性上滿足使用者能一鍵運作各種算法(包括單機和分布式設定),同時提供清晰的接口和扁平的類層次關系友善開發者複用已有子產品來定制新算法。

設計理念

1. 輕量易用

絕大多數已有的強化學習算法庫依賴MPI,NCCL,或者Ray來實作分布式強化學習算法,給使用者在搭建環境,二次開發,或移植部署等環節造成了一定困難。

EasyRL完全基于TensorFlow開發實作,包括表達算法本身的計算圖描述以及分布式模式下不同程序間的通信。   

使用者可以友善地跑通我們提供的任意算法,安裝、移植、以及嵌入業務代碼中都是非常友善的。

2. 可擴充性

如下圖所示,EasyRL将不同程序在概念上劃分為四種角色,統一地表達了不同Actor-Learner架構:

  • Actor:負責和環境互動産生樣本。   
  • Replay Memory:存儲互動産生的樣本,提供重複采樣。   
  • Learner:利用收集的資料計算梯度,更新模型。   
  • Parameter Server (PS):參數伺服器。  

Actor利用CPU資源,和環境互動産生樣本并存入Replay Memory中;Learner從Replay Memory取出資料,利用GPU計算梯度并将梯度更新到PS上。   

具體地,每個actor上維護一份本地的模型副本,間隔地從PS上同步最新的模型參數,在與環境進行互動的過程中不需要額外的通信開銷。   

為了進一步提高系統的樣本吞吐,EasyRL為actor提供了wrapper将環境包裝在獨立程序中執行,獨立于主程序中actor的推理步驟,使得actor可以與多個程序的環境同時互動,充分利用單個actor上的cpu資源。   

除了PS之外,每個actor,memory 或者learner與其他角色的通信均由獨立的線程負責,與主線程用隊列通信,主線程僅負責計算,一定程度将計算和通信的開銷重疊,進而提高效率。   

我們提供了多種replay memory:均勻采樣的replay buffer,按priority進行采樣的priority replay buffer,用于on-policy算法的僅儲存單個trajectory的TrajectoryBuffer,以及适用于Evolutional strategy (ES)/PPO,累積存儲多個actor采樣資料,一次性讀取的AggregateBuffer。   

由于設計上将replay memory作為一種角色,針對memory采樣政策的二次開發變得非常友善。   

Learner和PS則類似監督學習中的PS-worker架構,進行純粹的分布式訓練,避免了其他資料流的處理,learner可以更好地利用GPU的算力。   

Ape-X架構下支援異步訓練的随機梯度下降,可以根據整個系統吞吐增加learner的數量進行擴充。    

在ES/PPO等每一輪疊代都需要同步的算法,目前的設計是1個learner+多個actors的模式,重點是提高互動的效率(例如ES算法需要大量的實驗來收集資料),通過單機多卡并行的方式,提高模型訓練的效率。   

這其中不同角色的程序的數量均可以任意調節,進而避免某一個角色的程序成為系統的瓶頸。

3. 子產品化

models子產品采用了扁平的設計,僅通過基類描述了一些必要實作的接口,提供了常用算法的實作,不同model之間沒有耦合,友善算法同學對模型進行定制。    

model類建構計算圖的邏輯分解成相對獨立的類方法,主要包括:建構網絡結構、建構政策輸出的動作分布、計算目标/損失函數、使用的優化器(包括對梯度的處理)四個部分。

開發者可以根據自己的需求,繼承Model類并單獨重載需要定制的類方法,例如修改網絡結構、實作新的損失函數、或者是采用更加複雜的優化器。

同時,EasyRL也提供了一種通過配置檔案來自動建構網絡結構的途徑。   

4. 算法種類齊全

EasyRL提供的算法種類全面,且覆寫單機和分布式的實作,下面通過一個表格顯示與其它開源庫的對比。  

o:表示支援該功能;x:表示不支援該功能(表中調研的各開源庫的功能覆寫情況截止2019年3月)

對上述開源強化學習庫調研發現,部分項目缺乏持續更新,例如RLLab、Tensorflow Agents;部分項目算法種類過于單一,例如Dopamine 僅提供了 DQN(Rainbow)算法,而PARL、TensorForce沒有提供Rainbow的實作,RLGraph則是一個meta graph的實作,開發複雜并且缺少DDPG、模仿學習等。   

另一些項目則缺少良好分布式的實作,例如OpenAI的Baselines沒有actor-learner的架構;包括coach,PARL沒有對Ape-X的支援。   

部分項目僅是op層面的優化工作,例如Uber-research/ape-x和Trfl。   

Ray RLlib是功能全面且分布式性能優異的項目,但是不支援任意擴充leanrer程序的數量,在樣本産出速度非常快的場景會導緻learner成為瓶頸。

性能比較

本節比較EasyRL與Ray RLLib在Actor-Learner架構下的吞吐和收斂速度。

使用的環境Atari-Pong是一個視訊遊戲,其狀态經過預處理後是一個形狀為(42, 42, 4)的numpy數組,可以比較典型的反映系統對互動産出的樣本進行通信和消費的效率。

1. IMPALA架構

針對actor-leaner資源靈活配置的特性,我們動态調節actor和learner的數量,同時保持memory和learner數量一緻,觀察整個系統的吞吐變化。  

可以看到當learner與actor數量保持1:8時,sample産生的速率和消耗的大緻速率達到一個平衡。

此時,隻有繼續增加learner之後,再次增加actor的數量才能使整體的吞吐提升。   

在16個learner和128個actor的配置下,系統平均每秒可以産生和訓練12萬條樣本,并且在這個配置下,繼續增加資源還能提升整體吞吐。    

再看模型的收斂效果:   

如上圖所示,a代表actor,m代表memory,l代表learner,我們分别在5組配置下進行了收斂性的實驗。   

其中actor和memory使用CPU機器,learner使用GPU機器。可以看到随着系統的吞吐提升,平均累積獎勵達到17+的時間也越來越短。   

這裡記錄了不同配置下,第一個episode累積獎勵達到17+所用的時間: 

相較于Ray RLLib IMPALA算法在Atari-Pong環境下所得到的實驗結果。

  • Ray RLLib使用2個V100 GPU+32個actors在6~7分鐘左右episode累積獎勵達到17+,其吞吐為10k samples/sec左右;
  • EasyRL使用同樣的GPU+16個actors在400~500s左右episode累積獎勵達到17+,吞吐在16k samples/sec左右。   

其中吞吐更大而收斂偏慢,在于我們的learner是處在不同機器上,進行的異步訓練,而Ray RLLib是單機多卡的實作。   

單機多卡使得梯度更新同步做的更好,但是同時限制了其擴充性,超出單機卡數的更多learner的并行成為其瓶頸。 

2. Ape-X架構

在Ape-X下,由于replay buffer的存在,樣本會被重複使用,因而actor端樣本産生的速率變得不那麼關鍵。   

當使用priority replay buffer時,由于priority采樣和更新的開銷巨大,系統的瓶頸處在memory上。   

EasyRL可以通過增加memory的數量來消除priority replay造成的瓶頸。   

可以看到在1個learner設定下,通過增加priority buffer的數量,可以提高整體的吞吐。   

當priority buffer數量達到4個之後,繼續增加,則獲得的提升非常小,此時系統性能的瓶頸已經從memory轉移到learner上了。   

收斂性實驗:   

與IMPALA參數含義相同,在Ape-X上我們做了四組實驗,保持actor和learner的數量不變,增加priority replay memory的數量,通過提高整體throughput進而減少episode累積獎勵達到17+的時間。    

Ray RLLib Ape-X算法在Atari-Pong上的實驗結果:

https://ray.readthedocs.io/en/latest/rllib-algorithms.html#distributed-prioritized-experience-replay-ape-x

可以看到同樣1個GPU配置下,Ray RLlib Ape-X利用32個cpu需要接近1個小時才能達到17+,而EasyRL在1個learner+8個memory+4個actor設定下,需要1200s~1400s就可以讓episode累積獎勵達到17+,時間減少了一半以上。

馬爾可夫決策過程

定義與樣例

馬爾可夫決策過程(MDP)是一個四元組,由狀态空間,動作空間,狀态轉移機率,獎勵函數四個元素定義。如下圖所示,給出了一個簡單的MDP樣例,綠色節點代表狀态 ,紅色節點代表動作,從紅色節點指向綠色節點的邊上标出了狀态轉移機率和獎勵。

求解MDP

求解馬可夫決策過程,是去學習某種政策,最大化智能體接收到的标量信号(稱之為收益)累積和的機率期望值。

所謂政策就是從環境當中觀察到智能體所處的一個狀态,根據政策去選取某個動作,然後去執行并回報給這個環境。或者說我們作用于這個環境,這個環境會按照它本身MDP的這個狀态轉移以及獎勵函數相應的回報給智能體一個獎勵的信号,即一個實數。然後内在的環境會跳轉到下一個狀态,再根據政策去選取某個動作,以此類推。

強化學習有兩種,第一種是回合式任務,比如走迷宮,走到出口,智能體和環境互動的過程就結束了。第二種是持續性任務,智能體和環境的互動永遠沒有一個終止的狀态。為了使得總的獎勵在持續性任務中不趨于無窮大,且使其在上述兩種任務中有一個統一的表示法,引入一個衰減因子gamma,是一個小于1的正的實數。

更多樣例

如下圖所示,分别給出了4個不同任務的MDP四元組的描述。

從貪心政策到動态規劃

在算法和資料結構的課程中,有兩種常用的算法,貪心政策和動态規劃。如下圖所示,左圖中的MDP的求解,如果采用貪心政策,我們會在第一步選擇a1,而最優政策應該是選擇a0。右圖以經典的求解最長公共子序列為例,将其描述成MDP四元組,用動态規劃求出這張表,再從後往前根據表格中數值貪心地做決策,進而求解出最長公共子序列

值函數與貝爾曼方程

為了解釋下圖中的表格是什麼含義,需要引入值函數的概念。值函數是狀态(或狀态與動作二進制組)的函數,用來評估目前智能體在給定狀态(或給定狀态與動作)下總獎勵的期望值。當然,智能體期望未來能得到的收益取決于智能體所選擇的動作。是以,值函數是與特定的行為方式相關的,稱之為政策。嚴格地說,政策是從狀态到每個動作的選擇機率之間的映射。

值函數有一個基本特性,就是它們滿足某種遞歸關系,如下圖所示,在給出狀态值函數和動作值函數的表達式之後,以此為基礎,進一步定義了狀态(動作)值函數的最優貝爾曼方程。最優政策是最優貝爾曼方程的唯一解。

在強化學習中,動态規劃的核心思想是使用值函數來結構化地組織對最優政策的搜尋。下圖中的表格是最優狀态值函數的表,它是從前往後計算得到的。再根據最優貝爾曼方程的遞推式,從後往前推理決策,就得到圖中黃色的路徑,即最優政策。