一條鹹魚的強化學習之路10之關於Reward Shaping的小小體會

Reward Shaping,中文翻譯過來叫獎勵塑造?ennnn……未免太google了……(腦補oh my God ——> 噢 我的上帝……)。我覺得叫做獎勵設計可能更正常點,想必做RL的大家對這個詞肯定也都不會陌生。一般情況下,當你的環境中的reward過於稀疏的時候(比如,Agent只在n步後的episode結束才收到一個reward信號),單純依靠Agent無腦的隨機探索來找到問題的解決方案可能會很難或者很慢,這時候呢,我們可以依據我們的經驗,對探索過程中Agent所獲得的獎勵進行加工設計,以幫助提升其學習效率,儘快收斂,這是一個工程上的加法過程。但同時呢,由於引入了我們自己的經驗,便可能會喪失一些複雜問題的最優解,所以一般還是倡導在做完加法的工作後還是要做減法的,比如對中間的這些reward decay等,我們今天就先聊聊做加法的小trick吧。

我們知道,做Reward shaping其實有時候是件風險很大的事情,特別是在一個複雜環境中,一個不合適的reward加上去得到的結果可能有時候並不能幫助你的Agent學的更快,相反,有時候反而會把Agent帶跑偏……記得上次那個網紅長文關於什麼RL勸退的,裡邊列舉了很多研究人員由於設計的reward不合適繼而導致了Agent最終學會了種種啼笑皆非的表現。這些其實都屬於「眼鏡蛇效應」[1]:即之前某地政府為了讓民眾幫忙一起抓眼鏡蛇,就給抓到蛇的那些人一定的獎賞,然後,民眾們就開始養蛇了…… 這裡注意在reward shaping過程中,你最終得到的是你所鼓勵或者抑制的行為,而不是你的意圖,除非你能保證這兩者是match的。一般來講,正向獎勵一般的結果是使得AI更傾向於去累積這個獎勵,除非你結束的那個獎勵相當大否則他可能會故意不結束。而負向獎勵一般的結果是使得AI更傾向於儘快結束來避免一直受到處罰。

一般情況下,我們可以考慮把Agent所獲得的reward分為兩部分,即中間獎勵和最終獎勵。前者這個一般是連續的引導式的獎勵系統(如一個函數),從計算方面考慮,一般最好是在[-1,1]的區間之內,後者呢,一般是個一鎚子的買賣,要告訴AI這個狀態到這裡就該結束了!所以一般是一個比較大的reward,經驗數值是至少比引導式的reward大一到兩個數量級,這個比較簡單和容易理解。我們接下來詳細探討這個連續的引導式獎勵系統。

在很多場景下,我們可以將Agent所獲得的獎勵聯繫到某種時間或者空間上的度量從而對reward進行shaping。比如Agent和某個目標點的距離,或者其達到目標的時間等。當然,我們完全可以將這個基於距離或者時間的獎勵函數設計成線性的,但是據說一個帶有梯度的reward function可能會更好用哦[2]~~~比如,下圖中的這兩個函數:

我們可以把目光聚焦到x軸和y軸的[0,1]區間內,其中藍色的那根曲線是y=1-(x)^0.4,這根曲線隨著x的減小y值逐漸增加,並且梯度也逐漸增加。屎黃色的那根曲線是y=1-(1-x)^0.4, 這根曲線正好和藍色的那根相反,是隨著x的增加y值逐漸增大,同時梯度也在不斷增加。這兩根曲線可以分別用在你對距離或者時間變大變小的獎勵限制上,你所做的只需要將變數x均一化到(0,1)區間內,比如,除以個距離或者時間的最大值什麼的。然後得到的y值也正好在(0,1)之間,如果環境要設置多段reward的話,這個還可以直接乘以某個倍數來控制各段之間的比例,感覺也是極好的!當然,除此之外,還可以根據具體環境嘗試下其他的獎勵函數,比如指數形式的,二次函數,三次函數等。

為了比較下帶有梯度的reward function和線性reward function的效果差異,我們通過修改莫凡大神手寫的一個機器人手臂環境(紅色手臂以接近藍色方塊為目標)的reward function來做了個簡單的驗證,演算法用的DDPG那個[3]:

  • 不添加中間reward,只有最終reward時候,Agent探索時間較長,收斂較慢;

  • 添加中間reward,但reward以負獎勵形式出現。對應三個函數形式,黃色為線性reward,紅藍為梯度reward,但梯度變化是相反的。從結果可以看出,在目前這個環境下呢,這個帶有梯度的reward從收斂速度上來講好像並沒有表現出比較明顯的差異。

  • 添加中間reward,但reward以正獎勵形式出現。對應三個函數形式,黃色為線性reward,紅藍為梯度reward,但梯度變化是相反的。可以看到,紅黃應該還是學到了些東西的,藍色就很慘了,根本就沒收斂……這就提示我們,如果我們要開始用正向reward的時候呢,一定要小心了,畢竟Agent是以累積最大獎勵為目標的,所以設計的reward如果一個不小心的話,可能Agent就跑偏了……

  • 我們還繼續用正向reward,但這次我們試試把final reward在原來基礎上增加兩個數量級看能不能好點:好吧,結果這次這仨啥都沒學到,只顧著轉圈撈獎勵了。

由此可見吶,在特別稀疏的獎勵空間中增加中間狀態的獎勵函數能幫助快速收斂。但是如果要加正向獎勵的時候一定要小心,因為很可能Agent並不會朝你期望的方向發展,人家只在意儘可能多的去撈你設置的正向獎勵。

我感覺,一般情況下,如果我們要對達到一個目標做reward shaping的話,一般來講是有兩種思路的,即獎勵靠近目標和懲罰遠離目標,如果我們已經設置一個較大的正向final reward的話,那麼可能用懲罰遠離目標這個思路會更穩妥一點;反之,如果我們是想規避某些東西的話,我們肯定設了一個很大的負向final reward,這時候如果中間過程不給Agent一些正向的獎勵的話,那麼他所做的所有行為都會受到懲罰,然後可能他就真的茫然了……所以呢,感覺還真有點像「胡蘿蔔加大棒」[4],「打一巴掌再給個糖」,保持均衡才能有更好的發展吧~至於梯度的獎勵函數,可能由於本實驗比較簡單而沒能驗證出有具體的效果,但不排除在其他環境或者演算法中也能發揮不錯的效應,大伙兒可以試一試~~~

Reference:

[1]zh.wikipedia.org/wiki/%

[2]bons.ai/blog/reward-fun

[3]morvanzhou.github.io/tu

[4]zh.wikipedia.org/wiki/%


推薦閱讀:

九陰手游門派戰 獎勵掉落多 嗎?
孩子要獎勵,該不該給,怎麼給?

TAG:深度學習DeepLearning | 強化學習ReinforcementLearning | 獎勵 |