深度強化學習調(diào)參Tricks合集
點擊上方“程序員大白”,選擇“星標”公眾號
重磅干貨,第一時間送達

極市導讀
?剛?cè)腴T深度強化學習時常會遇到這些問題:算法多種多樣,該如何選擇?訓練環(huán)境該怎么寫?選完后又會疑問該如何調(diào)參?本文對以上的問題進行了解答,文章詳細解釋了以D3QN、TD3、PPO、SAC算法為例該如何調(diào)參。?
剛?cè)腴T深度強化學習的人會問「DDPG算法參數(shù)如何調(diào)節(jié)?(https://www.zhihu.com/question/309162916) (或其他算法如何調(diào)參)」「DRL算法那么多,我該選哪個算法?」為了幫助更多的人,我把這些總結(jié)發(fā)到網(wǎng)上。
寫在前面
深度強化學習 Deep Reinforcement Learning 簡稱為DRL 運行DRL算法代碼(實際使用+調(diào)整參數(shù)),需要更多DL基礎 閱讀DRL算法論文(理解原理+改進算法),需要更多RL基礎
深度強化學習算法能訓練能智能體: 機械臂取物、飛行器避障、控制交通燈、機器人移動、交易股票、訓練基站波束成形選擇合適的權(quán)重超越傳統(tǒng)算法。實際使用時,問題卻很多:
一開始會問:算法那么多,要選哪個?訓練環(huán)境怎么寫? 選完后會問:算法怎么調(diào)參? 收益函數(shù) reward function 要怎么改?(看的人多,有空再寫,太長了)
第一個問題 請看姊妹篇 ↓ 你可以根據(jù)目錄引導,只看與你任務相關的算法。
曾伊言:如何選擇深度強化學習算法?MuZero/SAC/PPO/TD3/DDPG/DQN/等
https://zhuanlan.zhihu.com/p/342919579
后一個問題,就是當前這篇文章 深度強化學習調(diào)參技巧:以D3QN、TD3、PPO、SAC算法為例,我沒有看到滿意的文章,所以才自己寫。第一版 2021-1-24,第二版 2021-01-28。
目錄
訓練環(huán)境怎么寫?循序漸進,三個階段 算法怎么調(diào)參? ------------------------------------ 在off-policy算法中常見的超參數(shù) 在on-policy算法中常見的超參數(shù) 與離散動作探索有關的超參數(shù) 與連續(xù)動作探索有關的超參數(shù) 探索衰減、退火 ------------------------------------ D3QN特有的超參數(shù) TD3特有的超參數(shù) PPO+GAE特有的超參數(shù) SAC特有的超參數(shù) ------------------------------------ 為什么我的算法越訓練越差? 備用層,用于回復評論 對知乎上“DRL超參數(shù)調(diào)優(yōu)”的一些觀點進行點評
訓練環(huán)境怎么寫?
強化學習里的 env.reset() env.step() 就是訓練環(huán)境。其編寫流程如下:
初始階段:
不要一步到位,先寫一個簡化版的訓練環(huán)境。把任務難度降到最低,確保一定能正常訓練。 記下這個正常訓練的智能體的分數(shù),與隨機動作、傳統(tǒng)算法得到的分數(shù)做比較。DRL算法的分數(shù)應該明顯高于隨機動作(隨機執(zhí)行動作)。DRL算法不應該低于傳統(tǒng)算法的分數(shù)。如果沒有傳統(tǒng)算法,那么也需要自己寫一個局部最優(yōu)的算法(就算只比隨機動作的算法高一點點都可以,有能力的情況下,要盡量寫好)。 評估策略的性能: 大部分情況下,可以直接是對Reward Function 給出的reward 進行求和得到的每輪收益episode return作為策略評分。有時候可以需要直接拿策略的實際分數(shù)作為評分(移動速度/股票收益/目標完成情況 等)。 需要保證這個簡化版的代碼:高效、簡潔、可拓展
改進階段:
讓任務難度逐步提高,對訓練環(huán)境env 進行緩慢的修改,時刻保存舊版本的代碼 同步微調(diào) Reward Function,可以直接代入自己的人類視角,為某些行為添加正負獎勵。注意獎勵的平衡(有正有負)。注意不要為Reward Function 添加太多額外規(guī)則,時常回過頭取消一些規(guī)則,避免過度矯正。 同步微調(diào) DRL算法,只建議微調(diào)超參數(shù),但不建議對算法核心進行修改。因為任務變困難了,所以需要調(diào)整超參數(shù)讓訓練變快。同時摸清楚在這個訓練環(huán)境下,算法對哪幾個超參數(shù)是敏感的。有時候為了節(jié)省時間,甚至可以為 off-policy 算法保存一些典型的 trajectory(不建議在最終驗證階段使用)。 每一次修改,都需要跑一下記錄不同方法的分數(shù),確保:隨機動作 < 傳統(tǒng)方法 < DRL算法。這樣才能及時發(fā)現(xiàn)代碼邏輯上的錯誤。要極力避免代碼中出現(xiàn)復數(shù)個的錯誤,因為極難排查。
收尾階段:
嘗試慢慢刪掉Reward Function 中一些比較復雜的東西,刪不掉就算了。 選擇高低兩組超參數(shù)再跑一次,確認沒有優(yōu)化空間。
下面是我在網(wǎng)上搜索到的相關文章,盡管它們標題在說“強化學習調(diào)參”技巧,但文不對題,他們討論的都是:如何寫一個訓練環(huán)境。寫得不錯,真的做過項目的人才寫得出來。我不反對去看這兩篇。
深度強化學習有哪些調(diào)參技巧? - 何之源 - 2020-02(https://www.zhihu.com/question/365294045/answer/995032858) 我認同他的觀點,這是成功做過 custom env 的人該持有的觀點:編寫自定義的訓練環(huán)境,初始階段:降低任務難度,先寫出一個簡單且沒有bug的環(huán)境,保證代碼運行效率,第二階段:確定一個指標(分數(shù))后,迭代修改訓練環(huán)境以及強化學習算法。在這個過程中,可以用上深度學習的trick。
銀河中的太陽系:強化學習RL調(diào)參技巧 2020-11(https://zhuanlan.zhihu.com/p/296700661) 這篇的觀點與上面何之源的相近,寫得對(3個贊同?太少了)
算法怎么調(diào)參?
知乎有人提問:DDPG算法參數(shù)如何調(diào)節(jié)?(或其他算法如何調(diào)參),我下面的內(nèi)容也是對這個問題的回答:
這個問題非常不好。很多DRL庫會把算法也當成一個超參數(shù),那么我為DDPG調(diào)參的時候,第一步就是換掉這個老舊的DDPG. 2016算法。然后為自己的任務選擇一個合適的算法。請看 曾伊言:如何選擇深度強化學習算法?MuZero/SAC/PPO/TD3/DDPG/DQN/等(已完成) ,里面解釋了: 為何DDPG DQN算法只適合入門而不適合使用。
無論是什么任務,你選擇的算法必定與DQN變體、TD3、PPO、SAC這四種算法有關,它們占據(jù)不同的生態(tài)位,請根據(jù)實際任務需要去選擇他們,在強化學習的子領域(多智能體、分層強化學習、逆向強化學習也會以它們?yōu)榛A開發(fā)新的算法):
離散動作空間推薦:Dueling DoubleQN(D3QN) 連續(xù)動作空間推薦:擅長調(diào)參就用TD3,不擅長調(diào)參就用PPO或SAC,如果訓練環(huán)境 Reward function 都是初學者寫的,那就用PPO
所以下面我以這四種算法為例,講這四種算法的調(diào)參技巧。我當然可以直接跟你說遇到什么state,正確的action 是什么,但是我希望多寫一些推理過程。
我小時候,我身邊的人說“不能在昏暗環(huán)境下看書,對眼睛不好”。后來我經(jīng)常在昏暗的環(huán)境下看書,而視力卻一直是頂級的——我開始懷疑這句話的正確性。經(jīng)過思考,這句話其實是“在昏暗環(huán)境下看書,普通人類需要更靠近紙張以獲取更大進光量,眼睛長時間看近處的東西,最終導致疲勞,長此以往導致視力下降”。不開燈的昏暗情況下,如果夜視力正常,且眼睛與書本保持合適距離,別看太久,那么完全可以正??磿?。(不接受任何看不到視力表最下一行的人的反駁)
在DRL中也一樣,我如果直接告訴你某種情況下 折扣因子 gamma 就該選 0.95 0.99 0.999,而不說推理過程,那么不懂的人照樣不懂。我也希望各位抱著懷疑眼光來看我接下來的所有推理。
DRL超參數(shù)的默認值無法給出,但是我可以給出不同任務下的超參數(shù)推薦組合,見「強化學習庫:小雅 AgentRun.py」(https://github.com/Yonv1943/ElegantRL/blob/master/AgentRun.py)文件的 類 class Arguments 以及 函數(shù) train__demo( )。
寫在前面:我極力反對過度調(diào)參:在實驗室中人肉搜索找出一組能刷出虛高分數(shù)的超參數(shù)并沒有用。請不要沉迷調(diào)參。
在off-policy算法中常見的超參數(shù)
網(wǎng)絡寬度:network dimension number。DRL 全連接層的寬度(特征數(shù)量) 網(wǎng)絡層數(shù):network layer number。一個輸入張量到輸出需要乘上w的次數(shù) 隨機失活:dropout 批歸一化:batch normalization 記憶容量:經(jīng)驗回放緩存 experimence replay buffer 的最大容量 max capacity 批次大?。篵atch size。使用優(yōu)化器更新時,每次更新使用的數(shù)據(jù)數(shù)量 更新次數(shù):update times。使用梯度下降更新網(wǎng)絡的次數(shù) 折扣因子:discount factor、gamma
【網(wǎng)絡寬度、網(wǎng)絡層數(shù)】 越復雜的函數(shù)就需要越大容量的神經(jīng)網(wǎng)絡去擬合。在需要訓練1e6步的任務中,我一般選擇 寬度128、256,層數(shù)小于8的網(wǎng)絡(請注意,乘以一個w算一層,一層LSTM等于2層,詳見曾伊言:LSTM入門例子(https://zhuanlan.zhihu.com/p/94757947))。使用ResNet等結(jié)構(gòu)會有很小的提升。一般選擇一個略微冗余的網(wǎng)絡容量即可,把調(diào)整超參數(shù)的精力用在這上面不劃算,我建議這些超參數(shù)都粗略地選擇2的N次方,因為:
防止過度調(diào)參,超參數(shù)選擇x+1 與 x-1并沒有什么區(qū)別,但是 x與2x一定會有顯著區(qū)別 2的N次方大小的數(shù)據(jù),剛好能完整地放進CPU或GPU的硬件中進行計算,如Tensor Core
過大、過深的神經(jīng)網(wǎng)絡不適合DRL,因為:
深度學習可以在整個訓練結(jié)束后再使用訓練好的模型。而強化學習需要在幾秒鐘的訓練后馬上使用剛訓好的模型。這導致DRL只能用比較淺的網(wǎng)絡來保證快速擬合(10層以下) 并且強化學習的訓練數(shù)據(jù)不如有監(jiān)督學習那么穩(wěn)定,無法劃分出訓練集測試集去避免過擬合,因此DRL也不能用太寬的網(wǎng)絡(超過1024),避免參數(shù)過度冗余導致過擬合。
【dropout、批歸一化】 她們在DL中得到廣泛地使用,可惜不適合DRL。如果非要用,那么也要選擇非常小的 dropout rate(0~0.2),而且要注意在使用的時候關掉dropout。我不用dropout。
好處:在數(shù)據(jù)不足的情況下緩解過擬合;像Noisy DQN那樣去促進策略網(wǎng)絡探索 壞處:影響DRL快速擬合的能力;略微增加訓練時間
【批歸一化】 經(jīng)過大量實驗,DRL絕對不能直接使用批歸一化,如果非要用,那么就要修改Batch Normalization的動量項超參數(shù)。詳見 曾伊言:強化學習需要批歸一化(Batch Norm)嗎?(https://zhuanlan.zhihu.com/p/210761985)
【記憶容量】 經(jīng)驗回放緩存 experimence replay buffer 的最大容量 max capacity,如果超過容量限制,它就會刪掉最早的記憶。在簡單的任務中(訓練步數(shù)小于1e6),對于探索能力強的DRL算法,通常在緩存被放滿前就訓練到收斂了,不需要刪除任何記憶。然而,過大的記憶也會拖慢訓練速度,我一般會先從默認值 2 ** 17 ~ 2 ** 20 開始嘗試,如果環(huán)境的隨機因素大,我會同步增加記憶容量 與 batch size、網(wǎng)絡更新次數(shù),直到逼近服務器的內(nèi)存、顯存上限(放在顯存訓練更快)
當然,我不反對你探索新的記憶刪除機制,我試過將“刪除最早的數(shù)據(jù)”改成“越早的數(shù)據(jù)”或“和其他記憶重復的數(shù)據(jù)”有更大概率被刪除。只能消耗一點CPU資源,在特定任務上得到比較好的效果,而且實現(xiàn)很復雜。如果你們探索出更好的方法記得告訴學界,先謝過了。
【批次大小、更新次數(shù)】 一般我會選擇與網(wǎng)絡寬度相同、或略大的批次大小batch size。我一般從128、256 開始嘗試這些2的N次方。在off-policy中,每往Replay 更新幾個數(shù)據(jù),就對應地更新幾次網(wǎng)絡,這樣做簡單,但效果一般。(深度學習里)更優(yōu)秀的更新方法是:根據(jù)Replay中數(shù)據(jù)數(shù)量,成比例地修改更新次數(shù)。Don't Decay the Learning Rate, Increase the Batch Size. ICLR. 2018(https://arxiv.org/abs/1711.00489) 。,經(jīng)過驗證,DRL也適用。我根據(jù)Replay中數(shù)據(jù)個數(shù)來調(diào)整 batch size 和 update times:
replay_max = 'the maximum capacity of replay buffer'replay_len = len(ReplayBuffer)k = 1 + replay_len / replay_maxbatch_size = int(k * basic_batch_size)update_times = int(k * basic_update_times)for _ in range(update_times):data = ReplayBuffer.random_sample(batch_size)????...
【折扣因子】 discount factor(或者叫 discount-rate parameter),gamma 。這個值很容易確定,請回答“你希望你的智能體每做出一步,至少需要考慮接下來多少步的reward?”如果是t 步:
gamma ** t = 0.1 # 0.1 對于當前這一步來說,t步后的reward的權(quán)重gamma = 0.1 ** (1/t)0.93 ~= 0.1 ** (1/32)0.98 ~= 0.1 ** (1/128)0.99 ~= 0.1 ** (1/256)0.995 ~= 0.1 ** (1/512)可以看到 0.93, 0.98, 0.99, 0.995 的gamma值分別對應 32, 128, 256, 512 的步數(shù)
gamma絕對不能選擇1.0。盡管在入門DRl任務選擇gamma=0.1 甚至能訓練得更快,但是gamma等于1 有“讓Q值無限大”的風險。gamma值一般選擇0.99即可,在某些任務上需要調(diào)整。
詳見《Reinforcement Learning An Introduction - Richard S. Sutton》的 Chapter 12 Eligibility Traces。盡管下圖講的是 lambda,但它和 gamma 起作用的原理差不多。若還是不懂,就等我有時間再補充。這本書的pdf版可以在斯坦福網(wǎng)站下載。
https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf

圖片來自 einforcement Learning An Introduction》 Chapter 12 Eligibility Traces
在on-policy算法中常見的超參數(shù)
同策略(A3C、PPO、PPO+GAE)與異策略(DQN、DDPG、TD3、SAC)的主要差異是:
異策略off-policy:ReplayBuffer內(nèi)可以存放“由不同策略”收集得到的數(shù)據(jù)用于更新網(wǎng)絡
同策略on-policy:ReplayBuffer內(nèi)只能存放“由相同策略”收集得到的數(shù)據(jù)用于更新網(wǎng)絡
因此以下超參數(shù)有不同的選擇方法:
記憶容量:經(jīng)驗回放緩存 experimence replay buffer 的最大容量 max capacity
批次大?。篵atch size。使用優(yōu)化器更新時,每次更新使用的數(shù)據(jù)數(shù)量
更新次數(shù):update times。使用梯度下降更新網(wǎng)絡的次數(shù)
【記憶容量】 on-policy 算法每輪更新后都需要刪除“用過的數(shù)據(jù)”,所以on-policy的記憶容量應該大于等于【單輪更新的采樣步數(shù)】,隨機因素更多的任務需要更大的單層采樣步數(shù)才能獲得更多的 軌跡 trajectory,才能有足夠的數(shù)據(jù)去表達環(huán)境與策略的互動關系。詳見下面PPO算法的【單輪更新的采樣步數(shù)】
【批次大小】 on-policy 算法比off-policy更像深度學習,它可以采用稍大一點的學習率(2e-4)。因為【單輪更新的采樣步數(shù)】更大,所以它也需要搭配更大的batch size(2**9 ~ 2**12)。如果內(nèi)存顯存足夠,我建議使用更大的batch size,我發(fā)現(xiàn)一些很難調(diào)的任務,在很大的batch size(2 ** 14) 面前更容易獲得單調(diào)上升的學習曲線(訓練慢但是及其穩(wěn)定,多GPU分布式)。請自行取舍。
【更新次數(shù)】 一般我們不直接設置更新次數(shù),而是通過【單輪更新的采樣步數(shù)】、【批次大小】和【數(shù)據(jù)重用次數(shù)】一同算出【更新次數(shù)】,詳見下面PPO算法的【數(shù)據(jù)重用次數(shù)】
update_times = steps * reuse_times / batch_size
與離散動作探索有關的超參數(shù)
離散動作的探索就是要如何選擇Q值最大以外的動作。
【epslion-Greedy 策略】 按照貪婪策略探索離散動作:每次都從 已經(jīng)被強化學習算法加強過的Q值中,選擇Q值最大的那個動作去執(zhí)行。為了探索,有很小的概率 epslion 隨機地執(zhí)行某個動作。Q Network(Critic) 的更新需要采集所有離散動作的樣本,epslion-Greedy保證了Replay可以收集到足夠豐富的訓練數(shù)據(jù)。超參數(shù) 執(zhí)行隨機動作的概率 epslion我一般選擇 0.1,然后根據(jù)任務需要什么程度的探索強度再修改。如果離散動作很多,我會盡可能選擇大一點的 epslion。
【Noisy DQN 的探索策略】 在網(wǎng)絡中間添加噪聲,得到帶噪聲的Q值,接著沿用貪婪策略,智能體會選擇Q值最高的動作去執(zhí)行。這種模式比起 epslion-Greedy的好處是:能保證多探索Q值高的動作,增加探索效率。壞處是Q值過低的動作可能很難被覆蓋到(所幸Q Network 輸出的Q值一般比較接近)。超參數(shù)就是噪聲大小,一般我從方差0.2開始調(diào)起,然后print出不同動作Q值們的方差輔助我調(diào)參。
【輸出離散動作的執(zhí)行概率】 在MuZero 算法中,讓預測器(大號的 Q Network)額外輸出動作的執(zhí)行概率(使用softmax),詳見 曾伊言:如何選擇深度強化學習算法?MuZero/SAC/PPO/TD3/DDPG/DQN/等(已完成) (搜索 MuZero),這種增加計算量的方法效果會更好。SAC for Discrete Action Space(https://arxiv.org/abs/1910.07207)也有類似的思想。這種方法不需要調(diào)參,智能體會自己決定自己的探索方式。
與連續(xù)動作探索有關的超參數(shù)
連續(xù)動作的探索幾乎都通過加噪聲完成。區(qū)別在于噪聲的大小要如何決定。當你的任務困難到一加噪聲就影響智能體的探索,那么加噪聲也可以與epsilon-Greedy 同時使用:你可以選擇合適加噪聲,何時不加。
【OU-noise】 普通的噪聲是獨立的高斯分布,有小概率會一直出現(xiàn)相同符號的噪聲。OU-noise產(chǎn)出的噪聲更為平緩,適用于慣性系統(tǒng)的任務。詳見 強化學習中Ornstein-Uhlenbeck噪聲是雞肋嗎?(https://zhuanlan.zhihu.com/p/96720878) 我個人認為是雞肋,DDPG作為一個早期的不成熟算法,探索能力弱,因此很需要OU-noise。然而,TD3算法明確在論文中寫明“TD3不用OU-noise”,PPO SAC算法也沒用它,我也不用。它給DRL引入了更多超參數(shù),導致它經(jīng)常能在實驗室內(nèi)調(diào)出自欺欺人的虛胖成績,不適合實際使用
【TD3的探索方式】動作過激活函數(shù)tanh后,加上clip過的噪聲,然后再clip一次,詳見下方的【TD3的探索方式】
【SAC的探索方式】動作加上噪聲后,經(jīng)過激活函數(shù),詳見下方【SAC的探索方式】
請注意,當你使用任何連續(xù)動作空間的DRL算法,請讓它輸出的動作空間規(guī)范為(-1,+1),不需要為了物理含義而選擇其他區(qū)間,因為任何區(qū)間都能通過線性變換獲得(如0~1, -2~+2等)。選擇不規(guī)范的空間百害而無一利:計算策略熵困難,神經(jīng)網(wǎng)絡擬合起來不舒服,clip不方便代,碼實現(xiàn)不方便,不方便print出某個值與其他算法比較、等等。
探索衰減、退火
與探索有關的超參數(shù)都可以使用 衰減、退火。在離散動作中,探索衰減表現(xiàn)為逐步減小執(zhí)行隨機動作的概率 在連續(xù)動作中,探索衰減表現(xiàn)為逐步減小探索噪聲的方差,退火同理。
衰減就是單調(diào)地減小(固定、不固定,比例、定值 ),直至某個限度后停止。在比較簡單的環(huán)境里,算法可以在前期加強探索,后期減少探索強度,例如在訓練前期使用一個比較大的 epslion,多執(zhí)行隨機動作,收集訓練數(shù)據(jù);訓練中期讓epslion逐步減小,可以線性減小 或者 乘以衰減系數(shù),完成平緩過渡;訓練后期干脆讓epslion變?yōu)橐粋€極小的數(shù),以方便收斂。我建議適度地使用探索衰減,能不用盡量不用。(我不建議0,這會降低RelapyBuffer中數(shù)據(jù)的多樣性,加大過擬合風險) 退火就是減小后,(緩慢、突然)增大,周期循環(huán)。比衰減擁有更多的超參數(shù)。我不推薦使用,除非萬不得已。
探索衰減一定會有很好的效果,但這種“效果好”建立在人肉搜索出衰減超參數(shù)的基礎之上。成熟的DRL算法會自己去調(diào)整自己的探索強度。比較兩者的調(diào)參總時間,依然是使用成熟的DRL算法耗時更短。
D3QN特有的超參數(shù)
D3QN即 Dueling DoubleDQN。先按上面的提示,選擇一個略微冗余的Q Netwrok,詳見上面的【在off-policy算法中常見的超參數(shù)】,然后從默認值0.1 開始調(diào)整 epsilon-Greedy的探索概率 epsilon,詳見上面的【epslion-Greedy 策略】
TD3特有的超參數(shù)
探索噪聲方差 exploration noise std 策略噪聲方差 policy noise std 延遲更新頻率 delay update frequency
同樣作為確定策略梯度算法,不存在某個任務DDPG會表現(xiàn)得比TD3好。除了教學,沒有理由使用DDPG。如果你擅長調(diào)參,那么可以可以考慮TD3算法。如果你的算法的最優(yōu)策略通常是邊界值,那么你首選的算法就是TD3(例如:不需要考慮能耗的移動速度;在金融交易任務中每輪交易的最大金額設計得太?。?/p>
MADDPG 使用的 捕食者-被捕食者 環(huán)境,multiagent-particle-envs 最佳策略總在動作邊界
【TD3的探索方式】 讓她很容易在探索「邊界動作」:
策略網(wǎng)絡輸出張量,經(jīng)過激活函數(shù) tanh 調(diào)整到 (-1, +1) 為動作添加一個clip過的高斯噪聲,噪聲大小由人類指定 對動作再進行一次clip操作,調(diào)整到 (-1, +1)
好處: 一些任務的最優(yōu)策略本就存在存在大量邊界動作,TD3可以很快學得很快。壞處: 邊界動作都是 -1或 +1,這會降低策略的多樣性,網(wǎng)絡需要在多樣性好數(shù)據(jù)上訓練才不容易過擬合。對于clip 到正負1之間的action,過大的噪聲方差會產(chǎn)生大量邊界動作

不同標準差的正態(tài)分布,紅線std2=0.2,藍線std2=0.5
【探索噪聲方差 exploration noise std】 就是上圖中的s。我們需要先嘗試小的噪聲方差(如0.05),然后逐漸加大。大的噪聲方差刻意多探索邊界值,特定任務下能讓探索更快。且高噪聲下訓練出來的智能體更robust(穩(wěn)健、耐操)。請注意:過大的噪聲方差(大于上圖藍線的0.5)并不會讓探索動作接近隨機動作,而是讓探索動作更接近單一的邊界動作。此外,過大的噪聲會影響智能體性能,導致她不容易探索到某些state。
因此,合適的探索噪聲方差只能慢慢試出來,TD3適合愿意調(diào)參的人使用。在做出錯誤動作后容易挽回的環(huán)境,可以直接嘗試較大的噪聲。我們也可以模仿 epslion-Greedy,設置一個使用隨機動作的概率,或者每間隔幾步探索就不添加噪聲,甚至也在TD3中使用探索衰減。這些操作都會增加超參數(shù)的數(shù)量,慎用。
【策略噪聲方差 policy noise std】 確定了探索噪聲后,策略噪聲只需要比探索噪聲稍大(1~2倍)。TD3對策略噪聲的解釋是“計算Q值時,因為相似的動作的Q值也是相似的,所以TD3也為動作加一個噪聲,這能使Q值函數(shù)更加光滑,提高訓練穩(wěn)定性? 。見論文的 Target Policy Smoothing Regularization”。詳見 曾伊言:強化學習算法TD3論文的翻譯與解讀?(https://zhuanlan.zhihu.com/p/86297106)。我們還能多使用幾個添加噪聲的動作,甚至使用加權(quán)重要性采樣去算出更穩(wěn)定的Q值期望。在確定策略梯度算法里的這種“在計算Q值時,為動作加noise的操作”,讓TD3變得有點像隨機策略梯度。無論這里的? 是否有clip,策略噪聲方差最大也不該超過0.5。
【延遲更新頻率 delay update frequency】 TD3認為:引入目標網(wǎng)絡進行 soft update 就是為了提高訓練穩(wěn)定性,那么既然 network 不夠穩(wěn)定,那么我們應該延遲更新目標網(wǎng)絡 target network,即多更新幾次 network,然后再更新一次target network。從這個想法再拓展出去,我們甚至可以模仿TTUR的思想做得更細致一點,針對雙層優(yōu)化問題我們能做:
環(huán)境隨機因素多,則需要嘗試更大的延遲更新頻率,可嘗試的值有 1~8 提供策略梯度的critic可以多更新幾次,再更新一次actor,可嘗試的值有 1~4 提供策略梯度的critic可以設計更大的學習率,例如讓critic的學習率是actor 的 0.1~1倍 由于critic 需要處理比 actor 更多的數(shù)據(jù),因此建議讓critic網(wǎng)絡的寬度略大于actor
TTUR的思想,詳見 曾伊言:從雙層優(yōu)化視角理解對抗網(wǎng)絡GAN 的 TTUR (Two Time-Scale Update Rule)(https://zhuanlan.zhihu.com/p/162990438)
對于一個n維度的連續(xù)動作,我們將一個常數(shù)設為動作方差過于樸素,為了刷榜 (這不道德),我甚至可以使用PPO、SAC搜索出來的探索噪聲方差(也是n維的向量)給TD3使用。 甚至在PPO搜出來的噪聲方差的基礎上,根據(jù)物理意義對方差進行微調(diào)。其實這相當于在SAC這種使用了從TD3學來TwinCritic結(jié)構(gòu)的算法,在訓練后期固定噪聲方差進行訓練。
PPO+GAE特有的超參數(shù)
PPO比其他算法更robust(穩(wěn)?。?,這與她使用了 Minorize-Maximization (MM algorithm)有很大關聯(lián),這保證了PPO每次更新策略 總能讓性能獲得單調(diào)的提升,詳見RL — Proximal Policy Optimization (PPO) Explained - 2018-07 - Jonathan Hui(https://jonathan-hui.medium.com/rl-proximal-policy-optimization-ppo-explained-77f014ec3f12) 這是介紹PPO算法極好的文章,寫在版權(quán)保護意識很強的 Medium網(wǎng)站,大陸不能正常訪問。
PPO調(diào)參非常簡單,因為她對超參數(shù)變化不敏感。
sample_step 單輪更新的采樣步數(shù) reuse_times 數(shù)據(jù)復用次數(shù) lambda_entropy 限制新舊策略總體差異的系數(shù) clip epsilon 對估計優(yōu)勢的函數(shù)進行裁剪,讓它保持在信任域內(nèi),防止大規(guī)模的更改 lambda_advantage GAE的折扣因子(與gamma相似,但不同)
【單輪更新的采樣步數(shù)】 我們先刪掉舊的數(shù)據(jù),然后讓智能體與環(huán)境交互,交互完成后,我們使用剛剛采集到的數(shù)據(jù)去訓練網(wǎng)絡,這是一輪更新。交互時,actor就會rollout 出一條 收集記錄了做出某個動作下狀態(tài)轉(zhuǎn)移的軌跡 trajectory。為了盡可能準確地用多條軌跡 去描述環(huán)境與策略的關系,在隨機因素大的環(huán)境中,我們需要加大采樣步數(shù)。這個受環(huán)境影響很大,無法給出默認值(我一般定 2**12)。所幸過大的采樣步數(shù)只是會降低數(shù)據(jù)利用效率,讓訓練變慢而已。嘗試的時候,先在顯存可承受的范圍內(nèi)盡可能嘗試一個偏大的數(shù)值,確保訓練正常之后(學習曲線能緩慢地上漲,且不會突然下降),再逐步地減小采樣步數(shù),用于加快訓練速度。
許多環(huán)境有終止狀態(tài)(done=True)。因此我們不會在達到規(guī)定采樣步數(shù)后馬上退出采樣,而是繼續(xù)采樣,直至遇到終止狀態(tài)。這保證了每一段軌跡 trajectory 的完整。
許多環(huán)境有終止狀態(tài)(done=True),甚至有時候會故意設置一個終止狀態(tài),用于階段性地結(jié)算 reward,或者利用終止狀態(tài)的固定reward降低估值函數(shù)收斂難度,或者只是想要更簡單地使用GAE這類算法。
【數(shù)據(jù)復用次數(shù)】 RelayBuffer內(nèi)的每個樣本要用幾次,主要看看學習率、批次大小和擬合難度。深度強化學習會使用比深度學習更小的學習率(1e-3 → 1e-4),我在多種類型的任務下嘗試,在batch size 為512的情況下,默認值會設為8,然后再去調(diào)整。建議先嘗試偏小的數(shù)值,以避免過擬合。
replay_len = len(ReplayBuffer)assert replay_len >= sample_stepfor _ in range(int(replay_len / batch_size)):data = RelplayBuffer.random_sample(batch_size)????...
PPO使用Adam還是 SGD+動量?都可以,PPO論文建議用Adam,我也建議用Adam,理由是快,它的自適應只需要很短的預熱時間。SGD+動量建議在算力充足的情況下,顯存和采樣允許較大batch size時,搭配更大的 復用次數(shù)去使用,它雖然慢,但不易過擬合。
如果你糾結(jié)于PPO這種on-policy算法,在代碼實現(xiàn)時卻采用了off-policy的更新方式,還對數(shù)據(jù)進行復用抱有疑問,請看 Flood Sung:深度解讀:Policy Gradient,PPO及PPG(https://zhuanlan.zhihu.com/p/342150033) 的“6.1 importance sampling 的使用”。import sampling 的確是在off-policy中使用的,但是PPO會限制新舊策略間的差異,確??梢栽趩屋啍?shù)據(jù)采集中,進行多次更新。
下面這兩個有時間再補充:
【lambda_entropy】 默認值是 0.01(可選 0.005 ~ 0.05) 它越小,會讓新舊策略越相似。它是下面公式中的? 。
【clip epsilon】 默認值是 0.2 (可選 0.1 ~ 0.3),它越小,會讓新舊策略越相似,它是下圖中的? 。

PPO論文圖1, clip epsilon
【限制新舊策略總體差異的系數(shù)】 lambda_entropy,默認值是 0.98 (可選0.96 ~ 0.99),在GAE論文?(https://arxiv.org/abs/1506.02438)section 3 Advantage Function Estimation 解釋了 lambda 值的選取。

方差variance 與偏差bias
lambda值與gamma值不同(盡管它們很像)。增加訓練樣本能讓它更詳細地描述環(huán)境與策略,得到更小的方差與偏差。然而訓練樣本是有限的,這就逼迫我們在 方差和偏差之間做一個取舍。GAE 的lambda值給我我們這種選擇的余地,lambda越?。悍讲钤叫〉钤酱?。我們要做的就是調(diào)整lambda,讓上面圖中的漸變同心圓盡可能地覆蓋我們的目標星星。推薦嘗試的lambda 值有 0.95~0.999。我一般設置默認值為0.98。想了解更多,看 小錯:強化學習中值函數(shù)與優(yōu)勢函數(shù)的估計方法 - 2021-01(https://zhuanlan.zhihu.com/p/345687962) ,介紹全面。
SAC特有的超參數(shù)
盡管下面列舉了4個超參數(shù),但是后三個超參數(shù)可以直接使用默認值(默認值只會有限地影響訓練速度),第一個超參數(shù)甚至可以直接通過計算選擇出來,不需要調(diào)整。
reward scaling 按比例調(diào)整獎勵 alpha 溫度系數(shù) 或 target entropy 目標 策略熵 learning rate of alpha 溫度系數(shù) alpha 的學習率 initialization of alpha 溫度系數(shù) alpha 的初始值
SAC有極少的超參數(shù),甚至這些超參數(shù)可以在訓練開始前就憑經(jīng)驗確定。
【獎勵比例】 reward scaling SAC最大熵算法(https://arxiv.org/abs/1801.01290) 策略網(wǎng)絡的目標函數(shù)是? ,按有監(jiān)督深度學習的寫法,有? :
讓actor 輸出的策略在critic處獲得更高的累計回報 盡可能讓actor 輸出的策略有更高的策略熵
任何存在多個loss相加的目標函數(shù),一定需要調(diào)整系數(shù) lambda,例如SAC算法、共享了actor critic 網(wǎng)絡的A3C或PPO,使用了輔助任務的PPG。我們需要確定好各個 lambda 的比例。SAC的第二篇論文(https://arxiv.org/abs/1812.05905)加入了自動調(diào)整 溫度系數(shù) alpha 的機制,因此處于lambda2位置的溫度alpha 已經(jīng)用于自動調(diào)整策略熵了,所以我們只能修改lambda1。
reward scaling 是指直接讓reward 乘以一個常數(shù)k,在不破壞reward function的前提下調(diào)整reward值,從而間接調(diào)整Q值到合適的大小。? (累計收益Q,沒有寫出 gamma)。修改reward scaling,相當于修改lambda1,從而讓可以讓 reward項 和 entropy項 它們傳遞的梯度大小接近。與其他超參數(shù)不同,只要我們知曉訓練環(huán)境的累計收益范圍,我們就能在訓練前,直接隨意地選定一個reward scaling的值,讓累計收益的范圍落在 -1000~1000以內(nèi)即可,不需要精細調(diào)整:
Environment Episode return Reward scaling (gamma=0.99)--------------------|( min, target, max)---|--------------Ant (PyBullet) ( -50, 2500, 3500) 2 **-3LunarLander (-800, 200, 300) 2 **-2BipdealWalker (-200, 200, 340) 2 ** 0Minitaur?(PyBullet)??(??-2,?????15,???30)????2?**?3
我還建議:為了讓神經(jīng)網(wǎng)絡Critic擬合Q值的時候舒服一點,調(diào)整reward scaling時也要照顧到Q值,讓它的絕對值小于256。請注意:
調(diào)整gamma值也會影響 Critic網(wǎng)絡需要擬合的Q值大小,注意靈活修改reward scaling 調(diào)整reward scaling 能減小神經(jīng)網(wǎng)絡critic擬合Q值的難度,這對于所有DRL算法都有用,只是在SAC算法中效果最好。SAC論文作者自己也在github討論過reward scaling(https://github.com/haarnoja/sac/issues/23),但是解釋太少了。
【溫度系數(shù)、目標策略熵】 Temperature parameters (alpha)、target 'policy entropy'。SAC的第二篇論文加入了自動調(diào)整 溫度系數(shù) alpha 的機制:通過自動調(diào)整溫度系數(shù),做到讓策略的熵維持在目標熵的附近(不讓alpha過大而影響優(yōu)化,也不讓alpha過小而影響探索)
策略熵的默認值是 動作的個數(shù) 的負log,詳見SAC的第二篇論文 section 5 Automating Entropy Adjustment for Maximum Entropy 。SAC對這個超參數(shù)不敏感,一般不需要修改。有時候策略的熵太大將導致智能體無法探索到某些有優(yōu)勢的state,此時需要將目標熵調(diào)小。
策略熵是負log形式 policy_entropy = log_prob = -log(sum(...))目標熵也是負log形式 target_entropy = -log(action.shape)
【溫度系數(shù) alpha 的學習率】 learning rate of alpha 溫度系數(shù)alpha 最好使用 log 形式進行優(yōu)化,因為alpha是表示倍數(shù)的正數(shù)。一般地,溫度系數(shù)的學習率和網(wǎng)絡參數(shù)的學習率保持一致(一般都是1e-4)。當環(huán)境隨機因素過大,導致每個batch 算出來的策略熵 log_prob 不夠穩(wěn)定時,我們需要調(diào)小溫度系數(shù)的學習率。
【溫度系數(shù) alpha 的初始值】 initialization of alpha 溫度系數(shù)的初始值可以隨便設置,只要初始值不過于離奇,它都可以被自動調(diào)整為合適的值。一般偷懶地將初始值設置為 log(0) 其實過大了,這會延長SAC的預熱時間,我一般設置成更小的數(shù)值,詳見 The alpha loss calculating of SAC is different from other repo · Issue #10 · Yonv1943/ElegantRL 。(https://github.com/Yonv1943/ElegantRL/issues/10)
為什么我的算法越訓練越差?
這是很常見, 你可以看看誠實的 Learning Curve 長什么樣子,詳見曾伊言:如何選擇深度強化學習算法?結(jié)尾的【學習曲線怎么看?】,看的人多再寫。
大部分情況下,算法越訓練越差能避免,但也可以不理會。因為DRL只需要根據(jù)學習曲線保存性能最好的策略即可(前提是對每個策略的實際性能評估足夠準確)。
對知乎上“DRL超參數(shù)調(diào)優(yōu)”的一些觀點進行點評
在知乎搜索“強化學習 調(diào)參”,第一頁的搜索結(jié)果有如下(寫于2021-1-19):
DDPG算法參數(shù)如何調(diào)節(jié)?(https://www.zhihu.com/question/309162916/answer/1449186323) 我對其他回答都不滿意,因此才寫了這篇文章。
強化學習:DDPG算法詳解及調(diào)參記錄 - 1335 - 2020-03 (https://zhuanlan.zhihu.com/p/84321382)打臺球。反面例子,完成于2020年的作品竟然使用DDPG. 2016 以及 DQN. 2014 這些舊算法。
強化學習過程中為什么action最后總會收斂到設定的行為空間的邊界處?(https://www.zhihu.com/question/325211251/answer/691728675) 我會回答這個問題
啟人zhr:強化學習中的調(diào)參經(jīng)驗與編程技巧(on policy 篇)(https://zhuanlan.zhihu.com/p/207435700) 可以看,但不夠總結(jié),像實驗報告
Infinity:強化學習調(diào)參心得 2018-03(https://zhuanlan.zhihu.com/p/34442049) ,我反對里面的很多觀點,那些觀點像剛?cè)腴T的人寫出來的。我會給出贊同、反對的理由,逐一討論。這篇文章可能因為寫的早而幫助(誤導)了很多人,里面的錯誤一定要指出。 我推測:他的很多錯誤結(jié)論是在簡單的任務(訓練1分鐘就通關的任務)中得出來的,這些“錯誤改進方法”可以在簡單任務中“有效”,但這不是我們該學的。
(第一點)數(shù)據(jù)預處理:進行resize和變成灰度圖,。。,至于要不要變成灰度圖,。。
(最后一點)skip frame:針對視頻的應用,計算量太大,所以一般使用skip frame
說的有道理,但是這可以總結(jié)為:在不影響性能的情況下,盡可能降低state的數(shù)據(jù)量,以減少DRL算法需要搜索的state space,用于加快訓練速度。
weight初始化:采用隨機或者normal distribution
完全錯誤,應該交給深度學習框架(PyTorch TensorFlow 等)自己去調(diào)節(jié)。若調(diào)節(jié),在DRL中建議使用正交初始化,詳細解釋去查PyTorch官方文檔,如下:
def _layer_norm(layer, std=1.0, bias_const=1e-6):torch.nn.init.orthogonal_(layer.weight, std)torch.nn.init.constant_(layer.bias, bias_const)
activation function:ReLU
講得不清楚,應說:對于初學者,中間層的激活函數(shù)只推薦用 ReLU,不建議耗費精力去嘗試別的。輸出action 的那一層,該用 tanh softmax 還是繼續(xù)用。
Optimizer的選擇:一般使用Adam效果會比較好,也不需要自己設置參數(shù)。RMSProp和Adam效果差不多,不過收斂速度慢一些。
完全錯誤,Adam效果會比較好,但是在RL里,需要自己手動把默認的學習率調(diào)地比DL低一個數(shù)量級。RMSProp比Adam慢很多,在RL、GAN這種雙層優(yōu)化問題中,Adam需要將動量調(diào)小一點(調(diào)到0就近似RMSProp了),RMSProp+動量=Adam,因此沒有任何理由用RMSprop了。
experience sample:自己模擬幾個到達山頂?shù)腟ample,可以大大加快收斂
這個建議太局限了,只是一些萌芽狀態(tài)的想法,在其他任務中沒有用。想要了解更多應該去看模仿學習、以及稀疏收益 sparse reward 的那些強化學習論文。
訓練過程:把episode的reward打出來看,要是很久都沒有改進,基本上可以停了,馬上開始跑新的。
這個建議很對,現(xiàn)在訓練DRL對需要把 學習曲線 learning curve 畫出來。但是reward 不上升,可能是運氣不好,但是更大概率是算法不好,應該換更好的DRL算法,或者針對性地修改 Reward function。更換 random seed 重跑 是刻舟求劍。
exploration decay:一般是從1 decay到0.1,但是如果一開始就有不錯的效果,可以從0.5,0.6開始,效果也是很不錯的。
這非常局限。探索衰減是以前DRL算法發(fā)展不健全的時候,迫不得已使用的方法。以前的DRL算法(DDPG)的探索能力不足,因此需要手動修改動作噪聲,幫助算法完成早期探索過程,并且要在訓練后期將噪聲降下來,幫助算法完成后期的收斂過程。因此才強行增加了很多調(diào)參的工作在“探索衰減”上。我很不建議濫用這種方法,盡管它能在實驗室跑出令人咋舌的極好result,但這事實上是人工梯度下降。如果任務不是特別簡單 就根本用不了這些方法。
gamma:如果reward延時特別嚴重,可以提高gamma,設置成1都可以。如果reward的實時性比較好,可以設置得小一點。
完全錯誤。gamma絕對不可以是1,在每輪步數(shù)很長甚至沒有終止狀態(tài)的任務里,這會導致不收斂。gamma的選取是可計算的,這會影響智能體做出動作要考慮多少步的收益。
target stable:Double network
這里講的是 soft update 時用到的 target network,這樣軟更新目標網(wǎng)絡,會讓網(wǎng)絡變穩(wěn)定,詳細請看論文 Taming the Noise in Reinforcement Learning via Soft Updates 。以及Double DQN、TD3算法的 Double Q Network、Twin Critics。因為低估誤差不會傳播,因此在DRL里,我們要降低高估誤差,而min(Q1, Q2) 能降低Q值的高估誤差,詳細請看原論文,或者看 曾伊言:強化學習算法TD3論文的翻譯與解讀(https://zhuanlan.zhihu.com/p/86297106)
推薦閱讀
國產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(后續(xù))
年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了
關于程序員大白
程序員大白是一群哈工大,東北大學,西湖大學和上海交通大學的碩士博士運營維護的號,大家樂于分享高質(zhì)量文章,喜歡總結(jié)知識,歡迎關注[程序員大白],大家一起學習進步!
