劍橋大學等開源RLgraph框架,讓強化學習測試視覺化

weixin_33843409發表於2019-04-11

劍橋大學研究人員推出了強化學習框架RLgraph(GitHub repo),該框架將邏輯元件組合從深度學習後端和分散式執行中分離開來,為強化學習帶來了對內部和外部狀態、輸入、裝置及資料流的嚴格管理。

\"\"
左側:在Pendulum-v0(10個種子)上的Soft Actor Critic。右側:在Pong-v0(10個種子)上的多GPU Ape-X。

開發人員使用RLgraph把高階元件以與空間無關的方式組合並定義輸入空間。然後,RLgraph構建與後端無關的元件圖,該圖可以轉化為TensorFlow計算圖,或通過PyTorch(1.0以上版本)以執行模式定義的方式執行。

以這種方式生成的智慧體可以嵌入到其他應用程式(如第三方庫numpy等)進行本地訓練,或使用分散式TensorFlow、Ray和Horovod等框架作為後端。RLgraph實現了目前許多流行演算法的變體,如SAC(感謝貢獻者)、IMPALA、APE-X、PPO等等。

\"\"

以上演算法現有的實現難以解決原型、跨後端的重用性及可擴充套件執行之間的緊張關係。與之相比,RLgraph實現的版本具有很多優勢:

  • 每個元件可以作為獨立的圖進行構建和測試,能夠系統地測試複雜演算法的子圖,大大加快了除錯和原型設計。元件可以被視為Sonnet風格物件,但包含API和裝置管理、構建系統、變數建立和計算邏輯的分離。
  • 後端和與空間無關的高階邏輯有助於更快地探索新設計。
  • 可擴充套件性:RLgraph代理可以任意執行,如:在Ray上使用我們的Ray執行包 、使用分散式TensorFlow來探索端到端圖、或使用任意選擇的分佈機制。
  • 維護:擴充套件現有框架常常意味著,不是複製大量程式碼就是把新的學習啟發式內容不透明地堆到單個實現中。這兩者都不可取。在RLgraph中,啟發式演算法是第一類公民,它們是分開構建和測試的。

總體而言,RLgraph的目標是,在強制嚴格介面和嚴格構建系統及探索新設計之間進行必要的平衡。具體而言,RLgraph框架適用於需要在各種各樣的上下文部署中執行其研究的使用者。該框架還具有簡單的即插即用的高階API(見下文)。

架構

使用者通過非常類似於TensorForce的前端代理API(該API我們中有些人也在建立或使用)與RLgraph代理進行互動。在內部,代理依賴圖執行器,這些執行器服務於針對元件圖的請求並管理特定於後端的執行語義。例如,TensorFlowExecutor處理會話、裝置、摘要、佔位符、分析、分散式TF伺服器和時間線。PyTorch執行器反過來處理預設張量型別、裝置或外部外掛(如Horovod)。

\"\"
可以在外部引擎上(如,使用RLgraph的RayExectuors)執行代理,或像任何其他應用程式中的物件一樣使用代理。

API示例

大多數應用使用者都可以依賴複雜的高階別API。下面我們將展示如何在本地或分散式上下文中無縫配置和執行代理。

from rlgraph.agents import agentsfrom rlgraph.spaces import *# Describe inputs via powerful space objects which manage batch and time ranks.states = IntBox(\tlow=0,\thigh=1024,\tadd_time_rank=True)# Nested container spaces are used throughout RLgraph# to describe state and perform shape inference.actions = Dict(\tint_action=IntBox(low=0, high=5),\tbool_action=BoolBox(),\tfloat_action=FloatBox(shape=(3,))# Create PPO agentagent = Agent.from_spec(    agent_config,    state_space=env.state_space,    action_space=env.action_space)# Use agent locally, control behaviour with flags.actions = agent.get_actions(states, use_exploration=use_exploration, apply_preprocessing=True)# Batch observe multi-environment settings.agent.observe(states, actions, rewards, terminals, batched=True , env_id=\u0026quot;env_3\u0026quot;)# Updates by sampling from buffer after observing.loss = agent.update()# Update from an external batch which may contain # arbitrary (non-terminal) sub-episode fragments from multiple environments,# identified via sequence indices:agent.update(batch=dict(states=states, actions=actions, rewards=rewards, terminals=terminals, sequence_indices=sequence_indices)# Single-threaded, vectorized execution. env_spec = {\u0026quot;type\u0026quot;: \u0026quot;openai\u0026quot;, \u0026quot;env_id\u0026quot;: \u0026quot;CartPole-v0\u0026quot;}worker = SingleThreadedWorker(env_spec=env_spec, agent=agent, num_envs=8)stats = worker.execute_timesteps(100000)# Go large scale with Ray in 2 lines.ray_executor = SyncBatchExecutor(agent_config, env_spec)ray_stats = ray_executor.execute(steps=100000)# Use agent trained on Ray just as before.agent = ray_executor.local_agent

完整的示例指令碼和配置檔案可以在儲存庫中找到。

元件

在RLgraph中,一切都是一個個的元件。代理通過根元件實現演算法,而根元件包含各種子元件,如記憶體、神經網路、損失函式或優化器。元件通過API函式彼此互動,這些API函式在元件之間隱含地建立資料流。也就是說,使用TensorFlow後端,RLgraph通過把API呼叫拼接在一起並在構建過程中跟蹤它們,以建立端到端的靜態圖。例如,下圖是一個用來更新策略網路的簡單API方法:

\"\"

API方法裝飾器將API函式包裝起來,以建立端到端的資料流。RLgraph會管理每個元件的會話、變數/內部狀態、裝置、範圍、佔位符、巢狀、時間和批處理以及其傳入傳出的資料流。

我們可以從空間構建元件並與其互動,而無需手動建立張量、輸入佔位符等等:

record_space = Dict(    states=dict(state1=float, state2=float),    actions=dict(action1=float, action2=IntBox(10)),    # For scalar spaces, use Python primitives    reward=float,    terminals=BoolBox(),    next_states=dict(state1=float, state2=float),    add_batch_rank=True)# Memory exposes insert, sample..methodsmemory = ReplayMemory(capacity=1000) # Input spaces contain spaces for all arguments.input_spaces = dict(records=record_space, num_records=int)# Builds the memory with variables, placeholders for these spaces.graph = ComponentTest(component=memory, input_spaces=input_spaces)# Generate a sample batch from the nested space.observation = record_space.sample(size=32)# Calls session, fetches ops, prepares inputs, executes API method.graph.test(memory.insert_records, observation))# Get some samples providing the \u0026quot;num_records\u0026quot; int-arg.samples = graph.test((memory.insert_records, 10))

RLgraph將張量空間和邏輯元件分開,使我們能夠重用元件,而無需再次手動處理不相容的形狀。請注意,上述程式碼如何沒有包含任何特定於框架的概念,只定義了來自一組空間的輸入資料流。在RLgraph中,啟發式演算法(通常對RL的效能有很大的影響)不是事後才想到的,而是第一類公民,是單獨或用其它元件整合測試過的。例如,策略(Policy)元件包含神經網路、動作介面卡(以及相應的層次和分佈)子元件,所有這些都是單獨測試的。

使用RLgraph和標準實施工作流的核心區別在於,每個元件都是完全明確指定的:它的裝置和計算範圍及內部狀態(如變數共享)是明確分配的,這免除了令開發人員頭痛的巢狀上下文管理的問題。因此,RLgraph可以建立優雅的TensorBoard視覺化,比如下圖中我們實現的IMPALA:

\"\"

資源和貢獻者徵集

RLgraph目前處於alpha階段,正用於一些研究試點。我們歡迎貢獻者和反饋。由於RLgraph雄心勃勃地覆蓋了多個框架和後端,因此,在所有方面都有很多工作要做(我們特別歡迎更多PyTorch專家的加入)。

在接下來的幾個月,我們將繼續構建實用程式(TF 2.0 注意事項;後端程式碼分離,尤其是檢視固定問題;其他Ray執行程式等等)和實現更多演算法。請自由建立討論改進的問題。

程式碼:用RLgraph構建應用程式入門:https://github.com/rlgraph/rlgraph

文件:請從readthedocs下載相應的文件

論文:請閱讀我們的論文以瞭解更多關於RLgraph的設計。

閱讀英文原文:RLgraph: Robust, incrementally testable reinforcement learning

相關文章