譯者 | 朱先忠
審校 | 重樓
本文將使用五篇新發表的強化學習論文中介紹的五種算法(DDPG、SAC、PPO、I2A和決策轉換器)來訓練模擬人形機器人互相打斗并對訓練結果進行排名。
訓練模擬人形機器人的五種強化學習技術大PK-AI.x社區
簡介
我想起了最近的一個老電視節目《Battlebots》,并想對這個節目進行進一步的改造。因此,我將使用最新發表的五篇有關強化學習的論文中提到的技術來分別訓練模擬人形機器人并讓它們展開決斗,以便比較這些算法的不同排名。
通過閱讀本文中介紹的內容,你將學習到關于這五種強化學習算法的工作原理和數學原理,并了解我是如何實現這些不同算法的。同時,您還可以領略一下這些機器人是如何面對面地展開決斗,并最終確定哪一種算法是最后的冠軍!
- 深度確定性策略梯度(DDPG)算法
- 決策轉換器算法
- 柔性演員-評論家(Soft Actor-Critic:SAC)算法
- 基于近鄰策略優化(PPO)的想象增強智能體(I2A)算法
設置模擬環境
在本文實驗中,我將使用Unity機器人學習智能體模擬器,針對每個機器人身體在9個關節上構建21個執行器,通過他們頭上的虛擬相機實現了10乘10的RGB視覺,還有一把劍和一個盾牌。然后,我使用C#代碼來定義它們的獎勵和物理交互。智能體可以通過三種主要方式來獲得獎勵:
- 用劍攻擊對手(“擊敗”對手)
- 將頭部的y位置保持在身體上方(以激勵他們站起來)
- 比以前更接近對手(以鼓勵智能體會聚在一起并展開決斗)
智能體將在1000個時間步后重置,我盡量大規模并行化執行環境,以加快訓練速度。
大規模并行化訓練環境(我個人的截圖)
然后,就是編寫算法了。為了理解我使用的算法,您首先需要理解Q學習,這是至關重要的。
Q學習(如果已熟悉,請跳過本節)
在強化學習中,我們讓智能體采取行動來探索其環境,并根據其與目標的接近程度對其進行積極或消極的獎勵。那么,智能體如何調整其決策標準以獲得更好的獎勵呢?
Q學習(Q Learning)算法提供了一種解決方案。在Q學習中,我們跟蹤Q函數Q(s,a);這個函數能夠跟蹤從狀態s_t到動作a_t后的預期返回結果。
在上面公式中,R(s,a)表示當前狀態和動作的獎勵,γ表示折扣因子(超參數),E[]表示期望值。
如果我們學習了這個Q函數,那么我們可以簡單地選擇返回最高Q值的那個動作。
接下來,我們來看如何學習這個Q函數?
從訓練回合結束時開始,我們已知道真實的Q值(也就是我們當前的獎勵)。我們可以使用以下更新方程并使用遞歸技術來填充之前的Q值:
在上面公式中,α表示學習率,r表示即時獎勵,γ表示折扣因子(權重參數),s'表示下一個狀態,max_a'Q(s',a')表示所有可能動作中下一個狀態的最大Q值。
從本質上講,我們的新Q值變成了舊Q值+當前獎勵+下一個最大Q值和舊Q值之間差值的一小部分。現在,當我們的智能體想要選擇一個動作時,他們可以選擇產生最大Q值(預期獎勵)的那個動作。
不過,你可能會注意到這樣一個潛在的問題:我們正在每個時間步對每個可能的操作評估Q函數。如果我們在離散空間中僅有有限數量的可能動作,這倒是很好的;但是,這種情況在連續動作空間中卻會崩潰——此時不再可能對無限數量可能動作上的Q函數展開有效的評估。于是,這就引出了我們的第一個競爭算法——DDPG。
深度確定性策略梯度(DDPG)算法
DDPG(Deep Deterministic Policy Gradient)算法試圖以一種新穎的方式在連續動作空間中使用Q網絡。
創新點1:演員與評論家
我們不能使用Q網絡直接做出決策,但我們可以用它來訓練另一個單獨的決策函數。這就要使用所謂的演員-評論家(actor-critic)設置。其中,演員(actor)代表決定行動的策略,評論家(critic)則根據這些行動確定未來的預期獎勵。
其中,目標評論家的計算公式如下所示:
在上面公式中,r表示即時獎勵,γ表示折扣因子,s'表示下一個狀態,μ'(s')表示目標策略網絡對下一狀態的動作,Q'表示目標批評網絡,目標演員:預期返回值wrt策略的梯度約等于:
本質上,在N個樣本上,策略(wrt-策略)選擇的操作的Q值的變化方式會改變wrt-策略參數。
為了更新這兩者,我們使用隨機梯度上升更新的辦法,在當前Q和目標Q的MSE損失上使用lr*梯度。請注意,演員和評論家都是作為神經網絡實現的。
創新點2:確定性動作策略
我們的策略可以是確定性的(每個狀態的保證動作)或隨機性的(根據概率分布對每個狀態的采樣動作)。用于高效評估Q函數的確定性動作策略由于每個狀態只有一個動作,因此是奇異型的遞歸評估。
然而,我們如何使用確定性策略來進行探索呢?我們不會一次又一次地重復同樣的動作嗎?確實如此,我們可以通過添加隨機生成的噪聲以鼓勵探索來增加智能體的探索(這看起來有點像通過研究基因突變所具有的獨特的遺傳可能性來探索它是如何促進進化的一樣)。
創新點3:交互式環境中的批處理學習
我們還希望通過觀察到的每個時間步(由“狀態-動作-獎勵-下一個狀態”組成)獲得更大的回報:這樣我們就可以存儲之前的時間步數據元組,并將其用于未來的訓練。
這允許我們離線使用批處理學習(這意味著使用之前收集的數據,而不是通過環境進行交互),此外還允許我們并行化以提高GPU的訓練速度。我們現在也有了獨立的同分布數據,而不是我們經常得到的有偏差的順序數據(其中數據點的值取決于之前的數據點)。
創新點4:目標網絡
通常,使用神經網絡的Q學習太不穩定,也不容易收斂到最優解,因為更新太敏感/太強大了。
因此,我們使用目標演員和評論家網絡,它們與環境相互作用,在訓練過程中部分但不完全接近真實的演員和評論家((大因子)目標+(小因子)新目標)。
算法運行和代碼
初始化評論家、演員、目標評論家和目標演員、重放緩沖區。
對于視覺,我在任何其他層之前都使用卷積神經網絡(因此算法使用了視覺的最重要特征)。
然后,針對每一個回合(episode),執行如下操作:
- 觀察狀態,選擇并執行動作mu+噪聲。
- 獲得獎勵,轉到下一個狀態。
- 將(s_t,a_t,r_t, s_(t+1))存儲在重放緩沖區中。
- 從緩沖區中提取小批量樣品。
- 更新y_i = reward_i + gamma Q(s表示給定θ)。
- 遞歸計算。
- 更新critic以最小化L = y_i - Q(s,a|theta)。
- 使用策略梯度J更新演員,期望遞歸型的Q給定策略。
- 將目標更新為:大因子*目標+(1-大因子)*實際值。
【參考】github.com源碼倉庫地址:AlmondGod/Knights-of-Papers/src/DDPG/DDPG.py文件。
柔性演員-評論家(SAC)算法
DDPG算法確實存在一些問題。盡管評論家更新算法中包括貝爾曼方程:
Q(s,a)=r+max Q(s'a')
但是,神經網絡作為Q網絡近似器會產生大量噪聲,噪聲的最大值意味著我們高估了,也就是我們對我們的策略過于樂觀,并獎勵了平庸的行為。DPPG算法還需要大量的超參數調整(包括添加噪聲),并且除非其超參數在窄范圍內;否則,不能保證收斂到最優解。
創新點1:最大熵強化學習
現在,演員不再試圖純粹地最大化獎勵,而是最大化獎勵+熵。
那么,為什么要使用熵呢?
熵本質上是我們對某個結果的不確定性(例如,最大熵偏置的硬幣總是有0熵顯示形式)。
通過將熵作為最大化因子,我們鼓勵了廣泛的探索,從而提高了對局部最優解的敏感性,允許對高維空間進行更一致和穩定的探索(這正是比隨機噪聲更好的原因)。對熵的優先級進行加權的alpha參數,進行了自動調整(如何調整呢?)。
創新點2:使用兩個Q函數
這一變化旨在通過獨立訓練兩個Q網絡并在策略改進步驟中使用兩者中的最小值來解決Q函數的貝爾曼高估偏差。
算法運行和代碼
初始化演員、2個Q函數、2個目標Q函數、回放緩沖區、alpha
重復執行下面操作直到收斂,對于每個環境步驟執行:
- 從策略中取樣行動,觀察下一個狀態并獎勵
- 將(s_t,a_t,r_t,s_t+1)存儲在重放緩沖區中
在每個更新步驟中,執行:
- 抽樣批次
- 更新Qs:
- 計算目標y=獎勵+策略的最小Q+阿爾法熵
- 最小化Q預測-y
- 更新策略以最大化策略Q+阿爾法獎勵
- 更新alpha以滿足目標熵
- 更新目標Q網絡(柔性更新目標為:大因子*目標+(1-大因子)*實際值)
【參考】github.com源碼倉庫地址:AlmondGod/Knights-of-Papers/src/SAC/SAC.py文件。
I2A算法與PPO算法
這里有兩種算法(額外的alg層可以在任何算法之上工作)。
近端策略優化(PPO)算法
使用與DDPG和SAC不同的方法,我們的目標是一種可擴展、數據高效、魯棒性強的收斂算法(對超參數的定義不敏感)。
創新點1:代理目標函數
代理目標允許進行非策略性訓練,因此我們可以使用更廣泛的數據(特別有利于存在大量預先存在的數據集的現實世界場景)。
在我們討論代理目標之前,理解優勢(Advantage)的概念至關重要。優勢的定義是:采取s策略后,s的預期回報與s的預期回報之間的差異。本質上,它量化了一個行動在多大程度上比“平均”行動更好或更差。
我們估計它的表達式是:A=Q(A,s)-V(A)。其中,Q是動作值(動作A后的預期回報),V是狀態值(當前狀態的預期回報);兩者都可以學習。
現在,代理目標的計算公式是:
其中:
J(θ)表示代理目標;
ê_t[…]表示有限批樣品的經驗平均值;
r_t(θ)=π_θ(a_t|s_t)/π_θ_old(a_t| s_t),即:新策略中行動的可能性/舊策略中的可能性;
?_t代表時間步長t的估計優勢。
這相當于量化新策略在多大程度上提高了更高回報行動的可能性,并降低了更低回報行動的可能。
創新點2:剪切目標函數
這是解決超大策略更新問題以實現更穩定學習的另一種方法。
L_CLIP(θ)=E[min(r(θ)*A,CLIP(r(σ),1-ε,1+ε)*A)]
在此,剪切目標是真實代理和代理的最小值,其中比率被截斷在1-epsilon和1+epsilon之間(基本上是未修改比率的信任區域)。Epsilon通常為~0.1/0.2。
它本質上選擇了更保守的剪切比和正態比。
PPO的實際目標函數是:
其中,
1. L^{VF}(θ)=(V_θ(s_t)-V^{target}_t)2
2. Sπ_θ代表狀態S_t的策略π_θ的熵
從本質上講,我們優先考慮更高的熵、更低的值函數和更高的削波優勢。
此外,PPO算法還使用小批量和交替數據訓練。
算法運行和代碼
針對每次迭代,執行如下操作;對于N個演員中的每一個演員執行如下操作:
- 運行T時間步策略
- 計算優勢
- 針對K個迭代周期和最小批處理大小M<NT的策略優化代理函數
- 更新策略
【參考】github.com源碼倉庫地址:AlmondGod/Knights-of-Papers/src/I2A-PPO/gpuI2APPO.py文件。
增強想象智能體算法
我們的目標是為任何其他算法創建一個額外的嵌入向量輸入,以提供關鍵的有價值信息,并作為環境的“思維模型”。
創新點:想象向量
想象向量允許我們在智能體的觀察中添加一個額外的嵌入向量,以便對多個“想象的未來運行”的動作和對其獎勵的評估進行編碼(目標是“看到未來”和“行動前思考”)。
那么,我們是如何計算想象向量的呢?我們的方法是使用一個學習環境近似函數,它試圖對環境進行模擬(這被稱為基于模型的學習,因為我們試圖學習一個環境的模型)。我們將其與推出策略(rollout policy)相結合,這是一種非常簡單且快速執行的策略(通常是隨機的),用于決定“探索未來”的行動。
通過在推出策略上運行環境近似器,我們可以探索未來的行動及其回報,然后找到一種方法將所有這些想象中的未來行動和回報通過一個向量來描述。但是,這里也存在一個值得注意的缺點:正如你所料,它增加了大量的訓練,因此這樣的訓練就更依賴于必要的大量數據。
組合I2A算法和PPO算法的運行與代碼
- 每次我們收集PPO的觀察結果:
- 初始化環境模型與推出策略。
然后,對于多個“想象的跑動”循環執行如下操作:
- 從當前狀態開始運行環境模型,并決定推出策略,直到產生一個想象軌跡的地平線(s、a、r序列)。
- 想象編碼器:將多個想象的軌跡轉化為實際決策網絡的單個輸入嵌入。
決策轉換器
我們的目標是利用轉換器架構的優勢進行強化學習。借助決策轉換器(Decision Transformer,簡稱“DT”),我們可以在稀疏/分散的獎勵中識別重要的獎勵,享受更廣泛的分布建模以實現更大的泛化和知識轉移,并從預先獲得的次優的有限數據中學習(稱為離線學習)。
對于決策轉換器,我們本質上將強化學習視為序列建模問題。
創新點1:轉換器
如果你想真正了解轉換器的話,我推薦您觀看李飛飛高徒、被譽為AI“網紅”的Karpathy發布的“從零開始構建GPT2”的有關視頻。以下是適用于DT的有關轉換器技術的一個快速回顧:
假設我們已經有一些表示狀態、動作、回報(預期收到的未來獎勵的總和)和時間步長的令牌序列。我們現在的目標是接收一系列令牌并預測下一步行動:這將作為我們的策略。
這些令牌都有鍵、值和查詢,我們將使用復雜的網絡將它們組合在一起,以表達每個元素之間的關系。然后,我們將這些關系組合成一個“嵌入”向量,該向量對輸入之間的關系進行編碼。這個過程被稱為注意力。
請注意,“因果自注意力掩碼”能夠確保嵌入只能與序列中出現在它們之前的嵌入相關,因此我們不能使用未來來預測未來,而是使用過去的信息來預測未來(因為我們的目標是預測下一個動作)。
一旦我們有了這個嵌入向量,我們就可以把它傳遞到神經網絡層(大牛Karpathy使用的類比是,在這種情況下,我們“推理”令牌之間的關系)。
這兩個組合(用注意力查找令牌之間的關系,用神經網絡層推理關系)是轉換器的一個頭部,我們多次堆疊它。在這些頭部的最后,我們使用一個學習的神經網絡層將輸出轉換為我們的動作空間大小和要求。
在推理時,我們預先定義了回報,作為我們最終想要的總獎勵。
算法運行和代碼
對于數據加載器中的(R,s,a,t)執行如下操作:
- 預測行動
- 模型將obs、vision(帶卷積神經網絡的層)、rtg和timestep轉換為唯一的嵌入,并將timestep嵌入添加到其他嵌入中
- 所有另外三個用作轉換器層的輸入參數最終使用動作嵌入
- 計算MSE損失(a_pred-a)*2
- 使用具有該損耗的梯度參數wrt在決策轉換器模型上執行SGD計算
【參考】github.com源碼倉庫地址:Knights-of-Papers/src/Decision-Transformer/DecisionTransformer.py。
結果評析
為了訓練所有上述這些模型,我選擇在NVIDIA RTX 4090 GPU計算機上運行了這些算法,以便利用這些算法中新加入的在GPU加速方面的支持。在此,非常感謝GPU共享市場vast.ai!以下給出各算法對應的損失曲線:
DDPG算法損失(2000回合)
使用Matplotlib表示的損失圖表(本人繪制)
I2APPO算法損失(3500回合)
使用Matplotlib表示的損失圖表(本人繪制)
SAC算法損失(5000集)
使用Matplotlib表示的損失圖表(本人繪制)
決策轉換器算法損失(1600回合,每40個回合記錄一次損失)
使用Matplotlib表示的損失圖表(本人繪制)
通過比較以上各種算法的運行結果(我自主地按訓練時間進行了加權),我發現策略轉換器的表現最好!考慮到DT是專門為利用GPU而構建的,這是有道理的。最后,有興趣的讀者可以觀看我制作的視頻(https://www.youtube.com/watch?v=kpDfXqX7h1U),它將有助于你更細致地了解這些算法的實際性能。最后的比賽結果是,這些機器人模型都在不同程度上學會了爬行和防止摔倒;但是,要想成為專業的拳擊手還有很長的一段路要走。
有待改進的方面
我了解到訓練人形機器人是非常困難的。本實驗中,我們是在高維輸入空間(視覺RGB和執行器位置/速度)和令人難以置信的高維輸出空間(27維連續空間)中進行的操作。
從一開始,我所希望的最好的結果就是他們能夠彼此爬到一起,并相互決斗,盡管這也是一個挑戰。然而,大多數的訓練結果甚至都沒有體驗到將劍觸碰對手的高回報,因為獨自行走太難了。
總結一下的話,需要改進的主要方面也就是增加訓練時間和使用的計算量。正如我們在現代人工智能革命中所看到的那樣,這些增加的計算和數據趨勢似乎沒有上限!
最重要的是,我學到了很多!下一次,我會使用NVIDIA的技能嵌入或終身學習,讓機器人在學會戰斗之前學會走路!
最后,如果您要觀看我制作的視頻,了解創建這個項目的完整過程,并觀看機器人的戰斗場景,請觀看下面的視頻(https://youtu.be/kpDfXqX7h1U):
我試著用新的強化學習論文中的算法讓模擬機器人進行打斗(本人自制圖片)
譯者介紹
朱先忠,51CTO社區編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。
原文標題:The Tournament of Reinforcement Learning: DDPG, SAC, PPO, I2A, Decision Transformer,作者:Anand Majmudar