多圖見證模擬機器人的逆天成長:論進化策略在強化學習中的應用

雷鋒網 AI 科技評論按:本文是 otoro.net 的系列技術博客之一,以通俗可視化的方法講解了進化策略(Evolution Strategies)中的諸多概念。本篇介紹瞭如何使用進化策略來尋找前饋神經網絡智能代理的策略,以執行由 gym 環境接口定義的各式各樣的連續控制強化學習任務。前一篇參見《進化策略入門:最優化問題的另一種視角》。雷鋒網 AI 科技評論編譯。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

代碼傳送門:GitHub

在上一篇文章中,我已經介紹過了一些可以用於優化函數參數而不用顯式地計算梯度的進化策略(Evolution strategies, ES)算法。這些算法可以用於解決強化學習(Reinforcement learning, RL)問題,從而幫助神經網絡智能體(Neural network agent)找到合適的模型參數。在本文中,我將探討如何將進化策略應用於某一些增強學習問題中,並重點介紹一些方法,以幫助我們找到更加穩定和健壯的策略。

強化學習之進化策略

雖然強化學習算法需要在每個時間步都給予智能代理一個獎勵信號,但是進化策略算法只關心智能體在特定環境中展示(rollout)階段結束之後所獲得的最終累積獎勵。在許多問題中,我們只知道任務結束時的結果,比如智能體是贏還是輸、機器人手臂是否拿起了物體、或者智能體是否存活了下來,而這些方面的問題都是進化策略可能優於傳統強化學習的點。下面是一段偽代碼,它將智能體的展示階段封裝在一個 OpenAI Gym環境中,在這個環境下我們只關心累積獎勵:

def rollout(agent, env):

obs = env.reset

done = False

total_reward = 0

while not done:

a = agent.get_action(obs)

obs, reward, done = env.step(a)

total_reward += reward

return total_reward

我們可以將 rollout定義成目標函數,因為目標函數可以將智能代理的模型參數映射到最合適的分數,然後正如上一篇文章所講解的,再使用一個進化策略求解器去找到一組合適的模型參數:

env = gym.make('worlddomination-v0')


# use our favourite ES

solver = EvolutionStrategy


while True:


# ask the ES to give set of params

solutions = solver.ask


# create array to hold the results

fitlist = np.zeros(solver.popsize)


# evaluate for each given solution

for i in range(solver.popsize):

# init the agent with a solution

agent = Agent(solutions[i])


# rollout env with this agent

fitlist[i] = rollout(agent, env)


# give scores results back to ES

solver.tell(fitness_list)


# get best param & fitness from ES

bestsol, bestfit = solver.result


# see if our task is solved

if bestfit > MY_REQUIREMENT:

break

確定性策略和隨機策略(Deterministic and Stochastic Policies)

我們的智能體將環境給予它的觀察結果作為輸入,然後在環境內部展示期間的每個時間步輸出一個動作。我們可以根據需要對代理進行建模,並使用硬編碼規則、決策樹、線性函數以及遞歸神經網絡中的方法。在這篇文章中,我使用一個帶有兩個隱含層的簡單前饋網絡,將智能體的觀測結果(向量 x)直接映射到相應的動作(向量 y):

其中的激活函數 fh、fout可以是 tanh、sigmoid、relu 或是其它你想要使用的函數。而對我而言,我喜歡使用 tanh。對於輸出層而言,有時我們可能希望 fout是一個不含非線性變換的傳遞函數。如果我們將所有的權重和偏置項連接成一個向量W,我們可以看到上述神經網絡是一個確定性函數 y=F(x, W),然後我們可以使用進化策略,結合之前介紹的搜索循環來找到一個解決方案W

但是如果我們不希望我們的智能體是確定性的呢?對於特定的某些任務,即使像石頭剪刀布一般簡單,最優策略也是一種隨機行為,所以我們希望智能代理能夠學習到一種隨機策略。將 y=F(x, W) 轉換為隨機策略的一種方法是使得 W 隨機。模型中的每個參數 wiW都是符合正態分佈的隨機變量 N(μi, σi)。

這種隨機網絡被稱為貝葉斯神經網絡。貝葉斯神經網絡是一個權重帶有先驗分佈的神經網絡。在這種情況下,我們想要求解的模型參數是 μ 和 σ 的向量集,而不是權重W。在網絡每一次前向傳播的過程中,生成一個全新的符合N(μ, σ I)分佈的W。文獻中有許多有趣的工作將貝葉斯網絡應用於許多問題中,並解決了許多訓練網絡的挑戰。通過設置解空間為 μ 和 σ,而不是W,進化策略也可以用於直接找到隨機策略的解。

隨機策略網絡在強化學習的研究中也非常流行。例如,在近端策略優化(PPO)算法中,最後一層是 μ 和 σ 的參數集合,並且動作是從N(μ, σ I)中進行採樣的。為參數增加噪音的操作也被稱為鼓勵智能代理探索環境並逃離局部最優。我發現對於需要智能代理進行探索的許多任務,我們並不需要整個W 都是隨機的,而僅僅只有偏置項滿足隨機性就足夠了。對於具有挑戰性的運動任務,例如roboschool環境中的運動任務,我通常使用進化策略來找到一個隨機策略,其中只有偏置項的參數才符合正態分佈。

雙足步行者的健壯演進策略

我發現健壯策略研究是另一個可以應用進化策略算法的領域。我想控制數據效率之間的平衡,以及該策略在多個隨機實驗中的健壯程度。為了證明這一點,我在一個叫做 BipedalWalkerHardcore-v2的環境中測試了進化策略,該環境是由Oleg Klimov使用Box2D 物理引擎創建的,該引擎曾被用於開發《憤怒的小鳥》。

我們的智能代理解決了 BipedalWalkerHardcore-v2

在這種情況下,我們的智能代理必須學習到一個策略,以實現在有限時間內能夠通過一個隨機生成的地形還不摔倒。這裡涉及 24 個輸入,其中包括有 10 個雷達激光傳感器、角度參數和接觸器參數。智能體不知道自己在地圖中的絕對座標。動作空間是 4 個連續值,控制著 4 臺電機的轉矩。總獎勵的計算則基於智能體走過的總路程。一般情況下,如果智能體順利走完整個地圖,它將得到 300多分。此外根據全程施加的電機扭矩情況,還要再減去少量的分數,因此這樣使得能量也成為了一個限制條件。

BipedalWalkerHardcore-v2將任務完成定義為在超過 100 次連續的隨機試驗中,智能代理的平均分達到 300 多。雖然使用強化學習算法訓練智能體成功穿越地圖一兩次相對容易,但是要保證智能代理能始終如一且高效完成卻是很困難的,這使得該任務成為一項很有趣的挑戰。據我所知,到 2017 年 10 月為止,我的智能體是唯一已知能解決此問題的方案。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

早期階段,學習如何行走
多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

學習如何糾正錯誤,不過還是很慢

由於地形圖是針對每個實驗隨機生成的,因此有時候地形也許會非常簡單,而有時候地形也可能非常複雜。我們並不希望我們的自然選擇過程允許那些弱策略的智能體(通過簡單的地形地圖)進入下一代。另外我們也希望給那些擁有好策略的智能代理一個救贖的機會。所以我最終所做的是定義一個智能體分組(episode),作為 16 次隨機展示的平均值,並使用 16 次展示的累積獎勵平均值作為其最適分數(Fitness score)。

另一種對待這種事件的方法是,即使我們正在對智能體進行超過 100 次試驗的測試,我們通常會在單次試驗中對其進行訓練,所以測試任務和我們正在優化的訓練任務並不一樣。通過在隨機環境中對所有智能代理進行多次平均,我們縮小了訓練集和測試集之間的差距。如果我們可以對訓練集進行過度訓練,那麼也可能會對測試集進行過度訓練,因為這在強化學習中是一件好事情。

當然,我們算法的數據效率比現在差 16 倍,但最終的策略卻要健壯得多。當我在超過 100 次連續隨機試驗中測試最終策略時,我順利通過了這個環境,並得到了一個超過 300 點的平均分數。如果沒有這種平均方法,最好的智能體在超過 100 次試驗中智能的平均分數大約只有 220 到 230。據我所知,截止 2017 年 10 月,這是解決該環境問題的第一個解決方案。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用
多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

獲勝的解決方案,使用 PEPG 演變,每個分組平均運行 16 次

我還使用了 PPO,這是一種針對強化學習的最先進的策略梯度算法,然後我試圖將其進行調整以最佳化應用到這項任務中。最後,我在 100 次隨機試驗中只能讓 PPO 取得大約 240 到 250 的平均成績。但是我確信將來其他人可以使用 PPO 或其它強化學習算法來解決這個環境挑戰。

後續更新(2018 年 1 月):

dgriff777能夠使用帶有 4 個堆棧幀的 A3C+LSTM 連續版本作為輸入來訓練 BipedalWalkerHardcore-v2,以在超過 100 次隨機試驗中取得 300 分的成績。他在GitHub上開源了這個模型,由 pytorch 進行編寫。

在現實世界中我們需要足夠安全的策略,所以控制數據效率和策略健壯性之間的權衡能力是非常有用和重要的。理論而言,如果有足夠的計算能力,我們甚至可以對所需的 100 次展示進行平均,並將我們的雙足步行者直接優化到滿足需求。專業工程師通常要求他們的設計滿足特定的質量保證並滿足某些安全因素。當我們訓練智能代理去學習那些可能影響到現實世界的策略時,我們需要考慮到這些安全因素。

以下是進化策略發現的一些其它解決方案:

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

CMA-ES 解決方案
多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

OpenAI-ES 解決方案

我還使用具有高初始噪音參數的隨機策略網絡對智能體進行訓練,因此智能體可以在任何地方看到噪音,以至於它的行為也有點混亂。它導致了智能體在沒有對其輸入和輸出信息的準確性進行確認的情況下也依然學習任務(這個智能體無法獲得 300 以上的分數):

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

採用隨機策略的雙足步行者

Kuka 機械抓臂

我還試圖在簡化的 Kuka 機器人手臂抓取任務中使用帶有該項平均技術的進化策略。這個環境在pybullet 環境中可以獲得。仿真中使用的 Kuka 模型被設計為類似於真正的Kuka機器人手臂。在這個簡化的任務中,智能體被告知了物體的座標。

更高級的強化學習環境可能需要智能體直接從像素輸入中推理出一個動作,但是在原則上,我們可以將此簡化版模型與預訓練好的卷積網絡組合在一起,通過卷積網絡給出座標的估計值。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

使用隨機策略訓練的機器人手臂抓取任務

如果智能體成功抓取物體,它將獲得 10000 分,否則為 0。然後再扣除一些能源消耗的分數。通過對 16 個隨機試驗的稀疏獎勵進行平均,我們可以讓進化策略對健壯性進行優化。然而最終,我得到確定性策略或者隨機策略只能在 70% 至 75% 的時間內抓取物體。這裡還有提升的空間。

讓 Minitaur 學習多項任務

學習同時執行多項複雜任務使得我們能更好地執行單一任務。例如,少林寺的僧侶站在樹樁上舉重可以使得他們在沒有舉重的情況下更好地維持平衡。學習如何在山上以 80 英里/小時的速度駕駛汽車,並且還要保證不把杯子裡的水灑出來,這會使得司機成為一個更好的非法街頭賽車手。我們還可以訓練智能代理去執行多項任務,以使得它們學習到更加穩定的策略。

多圖見證模擬機器人的逆天成長:論進化策略在強化學習中的應用

少林和尚
多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

學習漂移

最近關於自我控制(Self-playing)智能體的研究工作表明,學習諸如 Sumo 摔跤(需要許多技巧的運動)等艱鉅任務的智能代理也能用於執行更簡單的任務,例如迎著風行走,而不需要額外的訓練。Erwin Coumans最近嘗試讓 Minitaur 在上方放著一隻玩具鴨的情況下學會行走。如果鴨子掉下來,Minitaur 也就失敗了,其中所蘊含的想法是期望這些類型的任務增強能夠有助於將學習策略從模擬轉移到真正的 Minitaur。我取用了他的一個例子,並嘗試使用進化策略訓練 Minitaur 和玩具鴨子的組合。

多圖見證模擬機器人的逆天成長:論進化策略在強化學習中的應用

pybullet 中以 CMAES 策略運行的 Minitaur
多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

來自 Ghost Robotics 公司的真實 Minitaur 機器人

pybullet中的 Minitaur 模型旨在模仿真實的物理 Minitaur。然而,在完美的模擬環境下訓練出來的策略往往不適用於真實世界。它甚至無法泛化到模擬環境內部的小小任務增強。例如,在上圖中有一個 Minitaur 被訓練用於朝前走(使用 CMA-ES),但是我們看到,當把一隻鴨子放在它上面的時候,這個策略並不總是能夠保持鴨子不掉而走出房間。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

只訓練了簡單前進任務的策略上面放一隻鴨子

多圖見證模擬機器人的逆天成長:論進化策略在強化學習中的應用

以帶著鴨子前進為任務訓練的策略

額外把鴨子放到 Minitaur 上的時候,從單純的步行任務中學到的策略在某種程度上依然可以發揮作用,這也意味著添加玩具鴨子並沒有增加太多的難度。玩具鴨子有一個較為平穩的底部,所以 Minitaur 不會讓鴨子從背部脫落。我試圖用一個球去代替鴨子,從而讓任務變得更加困難。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

CMA-ES 學到了一種作弊策略

然而,用球代替鴨子並不會立即產生穩定的平衡策略。相反,CMA-ES 發現了一項策略,首先將球滑入其腿部形成的孔中,然後將球帶入該孔內,從而以取巧的方式把球帶出了房間。這裡學到的教訓是,一個目標驅動(Objective-driven)的搜索算法將學會利用環境中的任何設計缺陷,並利用它們以實現自己的目標。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

帶著小球訓練的 CMA-ES

在將球縮小之後,CMA-ES 能夠找到一個隨機策略,它能夠同時實現前行和保持平衡。這項策略也可以轉移到更容易的鴨子任務中。在未來,我希望這類任務增強技術對於真實機器人的遷移學習能發揮重要作用。

ESTool

進化策略最大的賣點在於,可以使用在 CPU 不同核心上的不同線程或者甚至是不同的機器來運行多個工作器,以輕鬆實現並行化。Python 的多重處理機制使得啟動並行進程變得簡單。我更喜歡在mpi4py中使用消息傳遞接口(MPI)為每個作業啟動單獨的 python 進程。這讓我們可以繞過全局解釋器鎖的限制,並且讓給我確信每個進程都有自己的沙盒化 numpy 以及 gym 實例,這一點對於播種隨機數生成器非常重要。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

Roboschool 中的單足、雙足、螞蟻機器人
多圖見證模擬機器人的逆天成長:論進化策略在強化學習中的應用

Roboschool 中的觸碰臂

在各式各樣的 roboschool任務中,智能代理藉助estool實現演進

我實現了一個名為 estool的簡單工具,它使用前一篇文章中介紹的es.py庫來訓練簡單的前饋策略網絡,以執行用 gym 接口編寫的連續控制強化學習任務。我已經使用 estool 工具輕鬆訓練了前面所述的所有實驗,以及 gym 和 roboschool 內部提供的各種各樣其它的連續控制任務。estool 使用 MPI 進行分佈式處理,因此不需要太多工作就可以將工作器分配到多臺機器上。

ESTool 與 pybullet

GitHub 倉庫

除了 gym 和 roboschool 自帶的環境之外,estool 還適用於多數 pybullet gym 環境。通過修改現有的環境來構建自定義 pybullet環境也很容易。例如,我可以毫不費力地在球場環境中製作 Minitaur(在該倉庫的custom_envs目錄下),並且也能夠對環境進行修改以使得更加容易實現新想法。另外如果你想將其它軟件包(例如ROS或者Blender)的 3D 模型納入進來,你可以嘗試構建新的有趣的 pybullet 環境,為其他人提供新的挑戰。

作為近期遷移學習研究中令人興奮的成果,pybullet 中的許多模型和環境,例如 Kuka 機器人手臂和 Minitaur,都在最大的程度上模擬了真實機器人。事實上,這些最新的尖端研究論文(1,2,3,4)中有很多都使用 pybullet 來進行遷移學習實驗。

因此你不需要購買昂貴的 Minitaur 或 Kuka 機器人手臂來嘗試從仿真到真實的實驗。pybullet 內部有一個賽車模型,它是參照MIT 開源賽車硬件工具包進行建模的。甚至還有一個 pybullet 環境,可以將虛擬攝像機安裝到虛擬賽車上,為智能代理提供虛擬屏幕的像素作為觀察結果輸入。

讓我們首先嚐試更簡單的版本,賽車只需要學習一個跟蹤巨型球移動的策略。在 RacecarBulletEnv-v0 環境中,智能代理獲取球的

相對座標作為輸入,並輸出控制電機速度和轉向方向的連續動作。該任務非常簡單,在2014 款 Macbook Pro(8 核 CPU)上只需要花費 5 分鐘(50 次迭代)即可完成訓練。使用 estool,下面的命令將啟動一個含有 8 進程的訓練程序,每個進程負責 4 項作業,這樣總共就有 32 個工作器,然後使用 CMA-ES 來演進策略:

python train.py bullet_racecar -o cma -n 8 -t 4

訓練的進度以及模型參數將被保存在日誌子目錄中。我們可以運行這個命令來可視化環境中智能代理所找到的最佳策略:

python model.py bullet_racecar log/bullet_racecar.cma.1.32.best.json

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

pybullet 賽車環境,基於 MIT 賽車實現

在這個仿真中,我們可以使用鼠標來移動圓球,如果有需要的話,甚至也可以用來移動賽車。

IPython notebook plot_training_progress.ipynb可用於可視化賽車智能代理每次迭代的訓練記錄。每次迭代中,我們都可以獲得最高分、最低分、以及所有賽車的平均分數

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

標準運動任務類似於 roboschool 中的運動任務,例如 Inverted Pendulum、Hopper、Walker、HalfCheetah、Ant 和 Humanoid 也可以在 pybullet 中使用。我發現了一個策略,在 pybullet 的螞蟻任務中獲得了 3000 分,我是使用 PEPG 在智能代理數為 256 的多核機器上花費幾個小時完成訓練的。

python train.py bullet_ant -o pepg -n 64 -t 4

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

AntBulletEnv 的一個樣例展示。我們還可以使用 gym.wrappers.Monitor 將展示結果保存成一個 mp4 格式的視頻

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

總結

在本文中,我討論瞭如何使用進化策略來尋找前饋神經網絡智能體的策略,以執行由 gym 環境接口定義的各式各樣的連續控制強化學習任務。我介紹了 estool,它允許我使用 MPI 框架在分佈式處理環境中快速嘗試不同配置的進化策略算法。

到目前為止,我只討論了通過讓智能體在環境中反覆試驗來訓練智能代理學習策略的方法。這種從頭開始訓練的形式被稱為無模型強化學習。在下一篇文章中,我會更多地討論基於模型的學習,我們的智能體將學習利用以前學習過的模型來完成一個給定任務。另外我仍然會採用進化策略。

多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用

最終,智能代理選擇將所有的絆腳石當做墊腳石

趣味擴展

“Fires of a Revolution” Incredible Fast Piano Music (EPIC)

A Visual Guide to Evolution Strategies

ESTool

Stable or Robust? What’s the Difference?

OpenAI Gym Docs

Evolution Strategies as a Scalable Alternative to Reinforcement Learning

Edward, A library for probabilistic modeling, inference, and criticism

History of Bayesian Neural Networks

BipedalWalkerHardcore-v2

roboschool

pybullet

Emergent Complexity via Multi-Agent Competition

GraspGAN

Via Evolving Stable Strategies,雷鋒網 AI 科技評論編譯


分享到:


相關文章: