劍橋大學等開源RLgraph框架,讓強化學習測試視覺化
劍橋大學研究人員推出了強化學習框架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
相關文章
- Google開源TensorFlow強化學習框架!Go強化學習框架
- DeepMind開源強化學習庫TRFL強化學習
- Django 視覺化Web展示 學習Django視覺化Web
- 學習python視覺化,matplotlib庫學習,基本操作Python視覺化
- 從零開始學機器學習——聚類視覺化機器學習聚類視覺化
- 強化學習(十七) 基於模型的強化學習與Dyna演算法框架強化學習模型演算法框架
- 深度學習(視覺化卷積核)深度學習視覺化卷積
- 強化學習強化學習
- 強化學習-學習筆記13 | 多智慧體強化學習強化學習筆記智慧體
- 浙江大學陳為“大資料視覺化”大資料視覺化
- 【強化學習篇】--強化學習案例詳解一強化學習
- 【強化學習】強化學習術語表(A-Z)強化學習
- 深度強化學習day01初探強化學習強化學習
- 視覺化學習:WebGL的基礎使用視覺化Web
- 「深度學習系列」CNN模型的視覺化深度學習CNN模型視覺化
- Matlab學習-視覺化和程式設計Matlab視覺化程式設計
- 【Tensorflow_DL_Note15】TensorFlow視覺化學習2-用Matplotlib視覺化視覺化
- 資料視覺化Seaborn從零開始學習教程(三) 資料分佈視覺化篇視覺化
- 新手如何開始學習自動化測試?
- 強化學習10——迭代學習強化學習
- 《深度強化學習》手稿開放了!強化學習
- 強化學習的框架化,會引爆AI開發的新腦洞嗎?強化學習框架AI
- 視覺化學習:如何使用後期處理通道增強影像效果視覺化
- matplotlib 強化學習強化學習
- 從零開始學習時空資料視覺化(序)視覺化
- 從零開始學機器學習——準備和視覺化資料機器學習視覺化
- 【強化學習篇】--強化學習從初識到應用強化學習
- 視覺化學習:WebGL實現縮放平移視覺化Web
- 視覺化學習:如何生成簡單動畫讓圖形動起來視覺化動畫
- 視覺化醫學影像CT視覺化
- 機器學習、深度學習、強化學習課程超級大列表!機器學習深度學習強化學習
- Echarts檢視視覺化-學習筆記(努力更新中)Echarts視覺化筆記
- 曠視宣佈開源深度學習框架“天元”深度學習框架
- DeepMind開源強化學習遊戲框架,25款線上遊戲等你來挑戰強化學習遊戲框架
- 突破!自然語言強化學習(NLRL):一個可處理語言反饋的強化學習框架強化學習框架
- 強化學習-學習筆記3 | 策略學習強化學習筆記
- Windows UIA自動化測試框架學習--獲取qq好友列表WindowsUI框架
- 再探強化學習強化學習