自arXiv
作者:Aravind Srinivas等
機器之心編譯
參與:Racoon、Jamin
pixel-based RL 算法逆襲,BAIR 提出將對比學習與 RL 相結合的算法,其 sample-efficiency 匹敵 state-based RL。
此次研究的本質在于回答一個問題—使用圖像作為觀測值(pixel-based)的 RL 是否能夠和以坐標狀態作為觀測值的 RL 一樣有效?傳統意義上,大家普遍認為以圖像為觀測值的 RL 數據效率較低,通常需要一億個交互的 step 來解決 Atari 游戲那樣的基準測試任務。
研究人員介紹了 CURL:一種用于強化學習的無監督對比表征。CURL 使用對比學習的方式從原始像素中提取高階特征,并在提取的特征之上執行異策略控制。在 DeepMind Control Suite 和 Atari Games 中的復雜任務上,CURL 優于以前的 pixel-based 的方法(包括 model-based 和 model-free),在 100K 交互步驟基準測試中,其性能分別提高了 2.8 倍以及 1.6 倍。在 DeepMind Control Suite 上,CURL 是第一個幾乎與基于狀態特征方法的 sample-efficiency 和性能所匹配的基于圖像的算法。
論文鏈接:https://arxiv.org/abs/2004.04136
網站:https://mishalaskin.github.io/curl/
GitHub 鏈接:https://github.com/MishaLaskin/curl
背景介紹
CURL 是將對比學習與 RL 相結合的通用框架。理論上,可以在 CURL pipeline 中使用任一 RL 算法,無論是同策略還是異策略。對于連續控制基準而言(DM Control),研究團隊使用了較為熟知的 Soft Actor-Critic(SAC)(Haarnoja et al., 2018) ;而對于離散控制基準(Atari),研究團隊使用了 Rainbow DQN(Hessel et al., 2017))。下面,我們簡要回顧一下 SAC,Rainbow DQN 以及對比學習。
Soft Actor Critic
SAC 是一種異策略 RL 算法,它優化了隨機策略,以最大化預期的軌跡回報。像其他 SOTA 端到端的 RL 算法一樣,SAC 在從狀態觀察中解決任務時非常有效,但卻無法從像素中學習有效的策略。
Rainbow
最好將 Rainbow DQN(Hessel et al., 2017)總結為在原來應用 Nature DQN 之上的多項改進(Mnih et al., 2015)。具體來說,深度 Q 網絡(DQN)(Mnih et al., 2015)將異策略算法 Q-Learning 與卷積神經網絡作為函數逼近器相結合,將原始像素映射到動作價值函數里。
除此之外,價值分布強化學習(Bellemare et al., 2017)提出了一種通過 C51 算法預測可能值函數 bin 上的分布技術。Rainbow DQN 將上述所有技術組合在單一的異策略算法中,用以實現 Atari 基準的最新 sample efficiency。此外,Rainbow 還使用了多步回報(Sutton et al.,1998)。
對比學習
CURL 的關鍵部分是使用對比無監督學習來學習高維數據的豐富表示的能力。對比學習可以理解為可區分的字典查找任務。給定一個查詢 q、鍵 K= {k_0, k_1, . . . } 以及一個明確的 K(關于 q)P(K) = ({k+}, K \ {k+}) 分區,對比學習的目標是確保 q 與 k +的匹配程度比 K \ {k +} 中的任何的鍵都更大。在對比學習中,q,K,k +和 K \ {k +} 也分別稱為錨點(anchor),目標(targets),正樣本(positive), 負樣本(negatives)。
CURL 具體實現
CURL 通過將訓練對比目標作為批更新時的輔助損失函數,在最小程度上改變基礎 RL 算法。在實驗中,研究者將 CURL 與兩個無模型 RL 算法一同訓練——SAC 用于 DMControl 實驗,Rainbow DQN 用于 Atari 實驗。
總體框架概述
CURL 使用的實例判別方法(instance discrimination)類似于 SimCLR、MoC 和 CPC。大多數深度強化學習框架采用一系列堆疊在一起的圖像作為輸入。因此,算法在多個堆疊的幀中進行實例判別,而不是單一的圖像實例。
研究者發現,使用類似于 MoCo 的動量編碼流程(momentum encoding)來處理目標,在 RL 中性能較好。最后,研究者使用一個類似于 CPC 中的雙線性內積來處理 InfoNCE score 方程,研究者發現效果比 MoCo 和 SimCLR 中的單位范數向量積(unit norm vector products)要好。對比表征和 RL 算法一同進行訓練,同時從對比目標和 Q 函數中獲得梯度。總體框架如下圖所示。
圖 2:CURL 總體框架示意圖
判別目標
選擇關于一個錨點的正、負樣本是對比表征學習的其中一個關鍵組成部分。
不同于在同一張圖像上的 image-patches,判別變換后的圖像實例優化帶有 InfoNCE 損失項的簡化實例判別目標函數,并需要最小化對結構的調整。在 RL 設定下,選擇更簡化判別目標的理由主要有如下兩點:
鑒于 RL 算法十分脆弱,復雜的判別目標可能導致 RL 目標不穩定。
RL 算法在動態生成的數據集上進行訓練,復雜的判別目標可能會顯著增加訓練所需時間。
因此,CURL 使用實例判別而不是 patch 判別。我們可將類似于 SimCLR 和 MoCo 這樣的對比實例判別設置,看做最大化一張圖像與其對應增廣版本之間的共同信息。
查詢-鍵值對的生成
類似于在圖像設定下的實例判別,錨點和正觀測值是來自同一幅圖像的兩個不同增廣值,而負觀測值則來源于其他圖像。CURL 主要依靠隨機裁切數據增廣方法,從原始渲染圖像中隨機裁切一個正方形的 patch。
研究者在批數據上使用隨機數據增廣,但在同一堆幀之間保持一致,以保留觀測值時間結構的信息。數據增廣流程如圖 3 所示。
圖 3: 使用隨機裁剪產生錨點與其正樣本過程的直觀展示。
相似度量
區分目標中的另一個決定因素是用于測量查詢鍵對之間的內部乘積。CURL 采用雙線性內積 sim(q,k)= q^TW_k,其中 W 是學習的參數矩陣。研究團隊發現這種相似性度量的性能優于最近在計算機視覺(如 MoCo 和 SimCLR)中最新的對比學習方法中使用的標準化點積。
動量目標編碼
在 CURL 中使用對比學習的目標是訓練從高維像素中能映射到更多語義隱狀態的編碼器。InfoNCE 是一種無監督的損失,它通過學習編碼器 f_q 和 f_k 將原始錨點(查詢)x_q 和目標(關鍵字)x_k 映射到潛在值 q = f_q(x_q) 和 k = f_k(x_k) 上,在此團隊應用相似點積。通常在錨點和目標映射之間共享相同的編碼器,即 f_q = f_k。
CURL 將幀-堆棧實例的識別與目標的動量編碼結合在一起,同時 RL 是在編碼器特征之上執行的。
CURL 對比學習偽代碼(PyTorch 風格)
實驗
研究者評估(i)sample-efficiency,方法具體為測量表現最佳的基線需要多少個交互步驟才能與 100k 交互步驟的 CURL 性能相匹配,以及(ii)通過測量 CURL 取得的周期回報值與最佳表現基線的比例來對性能層面的 100k 步驟進行衡量。換句話說,當談到數據或 sample-efficiency 時,其實指的是(i),而當談起性能時則指的是(ii)。
DMControl
在 DMControl 實驗中的主要發現:
CURL 是我們在每個 DMControl 環境上進行基準測試的 SOTA ImageBased RL 算法,用于根據現有的 Image-based 的基準進行采樣效率測試。在 DMControl100k 上,CURL 的性能比 Dreamer(Hafner 等人,2019)高 2.8 倍,這是一種領先的 model-based 的方法,并且數據效率高 9.9 倍。
從圖 7 所示的大多數 16 種 DMControl 環境中的狀態開始,僅靠像素操作的 CURL 幾乎可以進行匹配(有時甚至超過)SAC 的采樣效率。它是基于 model-based,model-free,有輔助任務或者是沒有輔助任務。
在 50 萬步之內,CURL 解決了 16 個 DMControl 實驗中的大多數(收斂到接近 1000 的最佳分數)。它在短短 10 萬步的時間內就具有與 SOTA 相似性能的競爭力,并且大大優于該方案中的其他方法。
表 1. 在 500k(DMControl500k)和 100k(DMControl100k)環境步長基準下,CURL 和 DMControl 基準上獲得的基線得分。
圖 4. 相對于 SLAC、PlaNet、Pixel SAC 和 State SAC 基線,平均 10 個 seeds 的 CURL 耦合 SAC 性能。
圖 6. 要獲得與 CURL 在 100k 訓練步驟中所得分相同的分數,需要先行采用領先的 pixel-based 方法 Dreamer 的步驟數。
圖 7. 將 CURL 與 state-based 的 SAC 進行比較,在 16 個所選 DMControl 環境中的每個環境上運行 2 個 seeds。
Atari
在 Atari 實驗中的主要發現:
就大多數 26 項 Atari100k 實驗的數據效率而言,CURL 是 SOTA PixelBased RL 算法。平均而言,在 Atari100k 上,CURL 的性能比 SimPLe 高 1.6 倍,而 Efficient Rainbow DQN 則高 2.5 倍。
CURL 達到 24%的人類標準化分數(HNS),而 SimPLe 和 Efficient Rainbow DQN 分別達到 13.5%和 14.7%。CURL,SimPLe 和 Efficient Rainbow DQN 的平均 HNS 分別為 37.3%,39%和 23.8%。
CURL 在三款游戲 JamesBond(98.4%HNS),Freeway(94.2%HNS)和 Road Runner(86.5%HNS)上幾乎可以與人類的效率相提并論,這在所有 pixel-based 的 RL 算法中均屬首例。
表 2. 通過 CURL 和以 10 萬個時間步長(Atari100k)為標準所獲得的分數。CURL 在 26 個環境中的 14 個環境中實現了 SOTA。
項目介紹
安裝
所有相關項都在 conda_env.yml 文件中。它們可以手動安裝,也可以使用以下命令安裝:
conda env create -f conda_env.yml
使用說明
要從基于圖像的觀察中訓練 CURL agent 完成 cartpole swingup 任務,請從該目錄的根目錄運行 bash script/run.sh。run.sh 文件包含以下命令,也可以對其進行修改以嘗試不同的環境/超參數。
CUDA_VISIBLE_DEVICES=0 python train.py \
--domain_name cartpole \
--task_name swingup \
--encoder_type pixel \
--action_repeat 8 \
--save_tb --pre_transform_image_size 100 --image_size 84 \
--work_dir ./tmp \
--agent curl_sac --frame_stack 3 \
--seed -1 --critic_lr 1e-3 --actor_lr 1e-3 --eval_freq 10000 --batch_size 128 --num_train_steps 1000000
在控制臺中,應該看到如下所示的輸出:
| train | E: 221 | S: 28000 | D: 18.1 s | R: 785.2634 | BR: 3.8815 | A_LOSS: -305.7328 | CR_LOSS: 190.9854 | CU_LOSS: 0.0000
| train | E: 225 | S: 28500 | D: 18.6 s | R: 832.4937 | BR: 3.9644 | A_LOSS: -308.7789 | CR_LOSS: 126.0638 | CU_LOSS: 0.0000
| train | E: 229 | S: 29000 | D: 18.8 s | R: 683.6702 | BR: 3.7384 | A_LOSS: -311.3941 | CR_LOSS: 140.2573 | CU_LOSS: 0.0000
| train | E: 233 | S: 29500 | D: 19.6 s | R: 838.0947 | BR: 3.7254 | A_LOSS: -316.9415 | CR_LOSS: 136.5304 | CU_LOSS: 0.0000
cartpole swing up 的最高分數約為 845 分。而且,CURL 如何以小于 50k 的步長解決 visual cartpole。根據使用者的 GPU 不同而定,大約需要一個小時的訓練。同時作為參考,最新的端到端方法 D4PG 需要 50M 的 timesteps 來解決相同的問題。
Log abbreviation mapping:
train - training episode
E - total number of episodes
S - total number of environment steps
D - duration in seconds to train 1 episode
R - mean episode reward
BR - average reward of sampled batch
A_LOSS - average loss of actor
CR_LOSS - average loss of critic
CU_LOSS - average loss of the CURL encoder
與運行相關的所有數據都存儲在指定的 working_dir 中。若要啟用模型或視頻保存,請使用--save_model 或--save_video。而對于所有可用的標志,需要檢查 train.py。使用 tensorboard 運行來進行可視化:
tensorboard --logdir log --port 6006
同時在瀏覽器中轉到 localhost:6006。如果運行異常,可以嘗試使用 ssh 進行端口轉發。
對于使用 GPU 加速渲染,確保在計算機上安裝了 EGL 并設置了 export MUJOCO_GL = egl。
本內容來源于@什么值得買APP,觀點僅代表作者本人 |作者:那夜師太太溫柔
大家好,我是師太!
最近EPIC圣誕周天天送游戲+大促,相信各位白嫖怪們又收獲了許多喜加一的快樂!
我知道有很多人,游戲領了幾十上白個,但是客戶端卻都從來沒下載過!
話說回來,EPIC哪都好,唯一的槽點就客戶端真的太LJ了!
明明上午才登錄過,下午再打開客戶端,又提示讓我登錄!
登錄過程也是非常艱辛,動不動登錄失敗。
客戶端做的還不如網頁。
下載速度也是不太穩定,不知道是網絡問題還是客戶端的鍋。
玩歸玩,鬧歸鬧,真要打游戲,還是等靠steam!
因此,我就在想能不能通過steam來管理EPIC游戲的下載、更新呢?
一頓折騰,果然有路子!
使用一段時間,發現有如下優點:
1. 告別epic客戶端的卡、慢、亂煩惱,開局一個號,不用客戶端也能玩!
2. 通過steam啟動epic正版游戲,統一管理所有游戲
3. 可以共享steam的各種設置(手柄、截圖)
本文將手把手教你,不用下載epic客戶端,通過steam來下載、啟動epic白嫖的游戲!
廢話不多說,咱開整!
下載Legendary開源游戲啟動器
是的,Legendary是一款網友開發的開源游戲啟動器,可以從Linux,macOS和Windows上的Epic Games平臺下載和安裝游戲。
它可以:
說白了就是官方啟動器替代產品,不過是通過命令行來交互,所以軟件體積大小只有幾M。
下載到任意目錄后,在該目錄位置,鼠標右鍵單擊空白處,選擇“在此處打開power shell窗口”
在彈出的powershell窗口,輸入“.legendary.exe auth”,按下回車
此時,會彈出epic的網頁版登陸頁面,和平常白嫖時候一樣,正常輸入賬號密碼。
登錄成功后,原有的網頁登錄頁面會消失,而命令行窗口將會看到成功提示;
至此,我們算是完成了epic賬號在本臺電腦的身份驗證了。
下載游戲的命令行語句是:“./legendary install Anemone”。
Anemone可以理解為游戲的包名,每個游戲的包名都是唯一的,所以需要繼續找到對應游戲的包名,才能正確下載安裝。
還是原來的命令行窗口,輸入“.legendary.exe list-name“,列出自己游戲庫的所有游戲
其中app name 就代表游戲的包名。
因此,將app name 后面的那串字符,填入Anemone所在位置,再按下回車;這個時候,會看到相關的安裝信息(游戲名稱、大小、安裝位置);
當你核對好信息后,軟件會詢問你是否確認安裝,繼續按下“Y“鍵即可。
可以看到軟件開始下載安裝游戲了,等待下載完成即可,下載速度還是非常快的!
至此,我們的游戲下載安裝已經完成。
如果忽略通過steam,只用legendary來玩游戲,那么需要每次都往命令行輸入“.legendary lunch Anemone“來完成游戲啟動。
沒辦法,軟件沒有圖形界面,只能這么原始。
所以,建議用steam添加第三方應用的方式來完成開游戲。
進入steam客戶端游戲庫頁面,點擊下方的”添加游戲“,選擇”非steam游戲“;
注意,此時我們需要勾選第一步中下載好的的“legendary”軟件,而非安裝好的游戲!因為epic游戲的身份認證必須要靠legendary完成!
勾選完成后,點擊“添加所選程序”。
添加完成后,在左側的游戲列表,就能看到legendary程序了。
繼續操作!
鼠標右鍵單擊legendary圖標,選擇“屬性”;
在彈出的屬性窗口中,在啟動選項一欄,輸入“lunch 包名“;順帶可以對游戲圖標、名稱進行個性化設置;
關閉屬性窗口,繼續替換下游戲背景(可選操作),完成美化。
至此,整個steam庫添加epic游戲的流程結束。
點擊開始游戲,可以看到steam會先啟動legendary程序,legendary會檢查下賬號是否登錄,再檢查該游戲是否需要更新,然后再正式啟動游戲!
搞定!收工~
最后,補充下legendary工具的其他實用用法!
上文演示的游戲是通過legendary下載安裝的,路徑默認是在“C:Users用戶名legendary“文件夾下。
顯然很少會把游戲安裝在C盤。安裝目錄更改方法如下:
進入如下圖所示地址,用記事本工具打開“config.ini”文件,在最下方新增一行“install_dir = 目標路徑“,目標路徑可以定義;我這里是在d盤新建了個legendary的文件夾,所以填了如下內容。
更改后,測試下是否修改成功。
命令行,繼續執行游戲的安裝命令,可以看到安裝目錄已經發生了變更。
修改成功!
我電腦有一個已安裝的大表哥2游戲,那如何把這類之前從epic客戶端下載的游戲和legendary關聯起來,并加入steam游戲庫呢?
首先,需要找到原游戲的文件路徑,我的是在“D:GTA5RedDeadRedemption2“;
接下來,命令行輸入如下指令”.legendary import-game 游戲包名 游戲路徑“。同樣的,這次大表哥2的包名變成了另外的字符串。輸入完成,按下回車,可以看到導入成功。
之后添加到steam游戲庫的步驟,和本文上述第三步一致。這里不再闡述!
從我的體驗來看,以這種方式啟動游戲,明顯比epic客戶端啟動要快的多。
盡情享受荒野的西部世界吧!
本文主要分享了使用legendary第三方啟動器將epic游戲添加到steam的經驗。
關于legendary的更多用法,可以去官方文檔查看。
當然還有個gog galaxy工具,專門做游戲管理的,有這方面的需求的朋友可以關注下。
以上是本文的全部內容,希望能對大家有所幫助!
我是師太,下篇文章見!
作者聲明本文無利益相關,歡迎值友理性交流,和諧討論~