强化学习中的调参经验与编程技巧(on policy篇)
?PaperWeekly 原創(chuàng) ·?作者|張恒瑞
單位|北京交通大學(xué)
研究方向|強(qiáng)化學(xué)習(xí)
在強(qiáng)化學(xué)習(xí)的訓(xùn)練過(guò)程中,常常會(huì)遇見(jiàn)以下問(wèn)題:
在某一環(huán)境中可以 work 的超參數(shù)拿去訓(xùn)練別的環(huán)境卻訓(xùn)練不出來(lái)
訓(xùn)練時(shí)熵在增大
訓(xùn)練動(dòng)作達(dá)到邊界
本文通過(guò)調(diào)試幾個(gè)環(huán)境的案例來(lái)探究強(qiáng)化學(xué)習(xí)的調(diào)參方法。
pendulum
擺錘這個(gè)環(huán)境可以看做連續(xù)控制中的入門(mén)環(huán)境了,環(huán)境初始時(shí)在一個(gè)隨機(jī)的位置,目標(biāo)是將其擺動(dòng)以使其保持直立,它的狀態(tài)維度為 3,動(dòng)作維度為 1。
擬使用 PPO 解決這個(gè)問(wèn)題,ppo 的流程如下:
使用 Actor 網(wǎng)絡(luò)與環(huán)境交互一定步數(shù),記錄下(state, action, reward, v, done)
根據(jù)記錄下來(lái)的值計(jì)算優(yōu)勢(shì)值 adv(更新 actor 網(wǎng)絡(luò)使用)和 v_target(更新 critic 網(wǎng)絡(luò)使用)
計(jì)算 loss 更新 actor 網(wǎng)絡(luò)和 critic 網(wǎng)絡(luò)
首先說(shuō)第一步,在和環(huán)境交互的過(guò)程中,我們往往規(guī)定了步數(shù),在規(guī)定的 step 內(nèi),環(huán)境往往沒(méi)有 done,這會(huì)給我們這一次迭代計(jì)算 adv 有誤差,面對(duì)這個(gè)問(wèn)題,往往有兩種處理方式:完成這次交互,也就是超過(guò)這一次規(guī)定的迭代步數(shù)直到 done,這樣做會(huì)使每一次迭代更新時(shí)的交互 step 不同,比較不同算法在相同的step性能如何時(shí)略顯不公平不完成這次交互,這樣會(huì)使最后 step 采用 gae 對(duì) adv 估值存在近似。
在 John Schulman's 程序中,對(duì) V 估值采用這種方式:
V(s_t+1)?=?{0?if?s_t?is?terminal?????????{v_s_{t+1}?if?s_t?not?terminal?and?t?!=?T?(last?step)?????????{v_s?if?s_t?not?terminal?and?t?==?T也就是最后一個(gè) step 如果不是終止?fàn)顟B(tài),則它下一狀態(tài)的 V 估值為當(dāng)前狀態(tài)的 V 估值。在有的程序中,也采用 V 神經(jīng)網(wǎng)絡(luò)下一狀態(tài)的值作為對(duì)下一狀態(tài)的 V 函數(shù)估值。
第二步流程中計(jì)算 v_target 會(huì)根據(jù)是否采用 gae 有兩種計(jì)算方式:
根據(jù)每一 step 的 reward 按照 gamma return 的方式計(jì)算 v_target
根據(jù)每一 step 的 adv 和 v 估值累加作為 v_target
第三步中 loss 計(jì)算包含有 aloss,vloss 和 entropy。
1.1 初始
我們先使用簡(jiǎn)單的 PPO 來(lái)訓(xùn)練一下環(huán)境,參數(shù)選擇如下:
actor,critic 網(wǎng)絡(luò)初始化為正交初始化
steps=2048;
batch=64;
lr=3e-4 且經(jīng)過(guò)訓(xùn)練迭代數(shù)逐漸減小;
采用 return 方式計(jì)算v_target;
adv 計(jì)算采用 gae
loss 計(jì)算添加熵,系數(shù)(self.c_en)為 0.01
max_grad_norm=0.5
這些都是比較常規(guī)的 PPO 參數(shù)設(shè)置,進(jìn)行 1000 迭代后(2048*1000 step)reward 變化如下:
算法并沒(méi)有很好的學(xué)習(xí),reward 在 100 iter 以?xún)?nèi)還有上升趨勢(shì),100iter 時(shí)突然下降,之后就再也起不來(lái)。
我們來(lái)看一下學(xué)習(xí)過(guò)程中各個(gè)診斷量變化情況。
、
vloss 一開(kāi)始值很大,接著驟降,之后一直處于比較高的水平。
entropy 的變化幅度過(guò)快,最終值小于 0。這里簡(jiǎn)單提一下在連續(xù)密度分布中,熵值可能小于 0,拿高斯分布舉例,如果其 sigma 過(guò)小,均值點(diǎn)處的密度概率可以遠(yuǎn)大于 1,熵值也為負(fù)數(shù)。綜合來(lái)看,熵值出現(xiàn)小于 0 一般為 Actor 網(wǎng)絡(luò)更新時(shí)sigma參數(shù)過(guò)小,可能是 actor 更新過(guò)快的原因。
1.2 clip V
為了讓 critic 更新更合適,一般程序中采用 clipv 的技巧,防止更新前后 V 差距過(guò)大,對(duì)其進(jìn)行懲罰,程序代碼如下:
clip_v?=?oldv?+?torch.clamp(v?-?oldv,?-self.epsilon,?self.epsilon) v_max?=?torch.max(((v?-?v_target)?**?2),?((clip_v?-?v_target)?**?2)) v_loss?=?v_max.mean()同時(shí)程序中采用 gae 方式計(jì)算 v_target。
self.v_target?=?self.adv?+?self.v進(jìn)行 1000 迭代后(2048*1000 step)reward 變化如下:
reward 最終能呈上升趨勢(shì)最終達(dá)到一個(gè)不錯(cuò)的值,但美中不足在于中間出現(xiàn)兩次波折。
vloss 最終也能收斂到較小的值,但和 reward 類(lèi)似在相同的地方出現(xiàn)了波折。
熵值的下降顯得平穩(wěn)多了。
觀察 kl 散度變化,發(fā)現(xiàn)類(lèi)似的地方出現(xiàn) kl 散度過(guò)大的現(xiàn)象。
ppo 在一次迭代中使用同一批數(shù)據(jù)進(jìn)行策略更新,要求策略變化不能過(guò)大,不然重要性采樣就不再適用,所以在 ppo 的策略更新中采用了裁剪的技巧,但事實(shí)上即使這個(gè)技巧也不能保證限制 kl 散度大小,論文 IMPLEMENTATION MATTERS IN DEEP POLICY GRADIENTS: A CASE STUDY ON PPO AND TRPO?也指出裁剪沒(méi)有起到真正作用。
1.3 kl early stop
為了防止 kl 散度過(guò)大,我們?cè)O(shè)置一個(gè)最大 kl 值,在每次迭代中當(dāng)達(dá)到這個(gè)最大 kl 就停止這次迭代,繼續(xù)下次采樣數(shù)據(jù),這里我們?cè)O(shè)置 kl_max=0.03。
繼續(xù)進(jìn)行 1000 迭代后(2048*1000 step)reward 變化如下:
似乎是有了一定改善,但中間還有一次波動(dòng)。
看 kl 散度也比較平均。
1.4 normalization
考慮到 state, reward 我們還沒(méi)有標(biāo)準(zhǔn)化,起初的 vloss 也比較大,我們決定這次從這里入手。
state 和 reward 都是在交互過(guò)程中產(chǎn)生的,我們無(wú)法在預(yù)先知道其平均值和方差,于是我們采用運(yùn)行時(shí)均值和方差作為近似代替。
對(duì)每個(gè) state 減去均值并除以標(biāo)準(zhǔn)差。
x?=?self.pre_filter(x) if?update:self.rs.push(x) if?self.demean:x?=?x?-?self.rs.mean if?self.destd:x?=?x?/?(self.rs.std?+?1e-8) if?self.clip:x?=?np.clip(x,?-self.clip,?self.clip)對(duì) reward 我們只除以標(biāo)準(zhǔn)差。
x?=?self.pre_filter(x) self.ret?=?self.ret*self.gamma?+?x if?update:self.rs.push(self.ret)x?=?x/(self.rs.std?+?1e-8) if?self.clip:x?=?np.clip(x,?-self.clip,?self.clip) return?x繼續(xù)進(jìn)行 1000 迭代后(2048*1000 step)reward 變化如下:
終于,reward 變得比較平穩(wěn)了。
用最后的結(jié)果總結(jié)一下,如果 reward 長(zhǎng)時(shí)間不能很好的上升,需要即時(shí)診斷其他重要變量變化情況,一般情況下 vloss 先下降再稍微上升最終平穩(wěn),entropy 的曲線(xiàn)則是下降最終平穩(wěn),不能太快也不能上升,kl散度變化不能過(guò)大。
mujoco
用我們以上學(xué)到的經(jīng)驗(yàn)去調(diào)試 mujoco 中的 halfcheetah,hopper 和 walker2d。
這里主要調(diào)節(jié)每次 early_stop 的 max_kl,采樣 3 個(gè)隨機(jī)種子完成實(shí)驗(yàn)。
在 halfcheetah 環(huán)境中,目標(biāo) kl0.07 穩(wěn)定性最差,可以看出在其他參數(shù)保持不變時(shí),0.07 的限制依然導(dǎo)致每次策略更新時(shí)幅度過(guò)大,整體效果不夠穩(wěn)定。
在 hopper 環(huán)境中,依然是 kl0.07 的限制最不穩(wěn)定。
在 walker2d 環(huán)境中,kl0.07 的效果卻是最好的,這也說(shuō)明在不同的任務(wù)環(huán)境中,超參數(shù)的選擇也是不同的。
這些結(jié)果的表現(xiàn)來(lái)看也都達(dá)到或超過(guò)部分論文上 ppo 的效果了,如果想試試調(diào)節(jié)超參數(shù)的可以看看:
https://github.com/feidieufo/RL-Implementation/blob/master/algos/ppo/run_ppo_torch.py
如果你還不太清楚如何用 seaborn 繪制強(qiáng)化學(xué)習(xí)訓(xùn)練圖,可以參考這篇:
https://zhuanlan.zhihu.com/p/75477750
deepmind control suite
dmc 是谷歌開(kāi)發(fā)的強(qiáng)化學(xué)習(xí)環(huán)境套件(基于物理控制),和 mujoco 有類(lèi)似的場(chǎng)景,但豐富了其任務(wù)設(shè)置,同時(shí)也提高了難度。
dmc 有相應(yīng)的 gym 接口庫(kù),安裝過(guò) dmc2gym 后即可通過(guò)下面方式使用。
env?=?dmc2gym.make(domain_name=args.domain_name,task_name=args.task_name,seed=args.seed,visualize_reward=False,from_pixels=(args.encoder_type?==?'pixel'),height=args.image_size,width=args.image_size,frame_skip=args.action_repeat )dmc 的狀態(tài)輸入有普通的 state 也有基于圖片的 pixel,這里先用普通的 state 測(cè)試。
使用 cheetah run 作為任務(wù)環(huán)境。
先使用 mujoco 訓(xùn)練時(shí)使用的超參數(shù),reward 如下:
reward 結(jié)果極其不穩(wěn)定,最終也沒(méi)有達(dá)到比較好的結(jié)果。
entropy在訓(xùn)練過(guò)程中由原來(lái)的8左右逐漸增大,這在以前的實(shí)驗(yàn)中都沒(méi)有遇見(jiàn)。
查看 Actor 網(wǎng)絡(luò)動(dòng)作 std 的變化情況,由一開(kāi)始設(shè)置的 1 越變?cè)酱?#xff0c;也正是如此導(dǎo)致了 entropy 的不降反升。
在 ppo 的 loss 中熵項(xiàng)的存在確實(shí)是希望動(dòng)作隨機(jī)保持探索,但最終 entropy 越來(lái)越大,也體現(xiàn)出 ppo 策略網(wǎng)絡(luò)的不自信,我們考慮將 entropy 的系數(shù)變小。
試試系數(shù)為 0 的效果。
reward 有比較好的上升效果了。
熵也能正常的下降了。
比較這兩次的實(shí)際運(yùn)行情況:
可以看出第一次后期翻車(chē)了,第二次還是能比較不錯(cuò)的跑下去。
大家也可以試試熵前面系數(shù) 0~0.01 之間其他值:
https://github.com/feidieufo/RL-Implementation/blob/master/algos/ppo/run_ppo_dmc_torch.py
嘗試總結(jié)一下,雖然 dmc 中的 cheetah-run 和 mujoco 的 halfcheetah 有類(lèi)似的模型和動(dòng)態(tài)轉(zhuǎn)移,一開(kāi)始的動(dòng)作熵也在 8 左右,但 dmc 用同樣的超參數(shù)熵就會(huì)上升,可能在于兩者的 reward 不同,dmc 只有速度 reward,mujoco 還加上了控制 reward。
如果后面有時(shí)間的話(huà)還會(huì)補(bǔ)充上 dmc pixel 狀態(tài)和 Atari 的調(diào)參過(guò)程,全部程序在:
https://github.com/feidieufo/RL-Implementation
歡迎點(diǎn)贊 star 和交流。
參考文獻(xiàn)
[1] The 32 Implementation Details of Proximal Policy Optimization (PPO) Algorithm?costa.sh/blog-the-32-im
[2] IMPLEMENTATION MATTERS IN DEEP POLICY GRADIENTS: A CASE STUDY ON PPO AND TRPO.?ICLR2020
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識(shí)的人。
總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類(lèi)優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得或技術(shù)干貨。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來(lái)。
?????來(lái)稿標(biāo)準(zhǔn):
? 稿件確系個(gè)人原創(chuàng)作品,來(lái)稿需注明作者個(gè)人信息(姓名+學(xué)校/工作單位+學(xué)歷/職位+研究方向)?
? 如果文章并非首發(fā),請(qǐng)?jiān)谕陡鍟r(shí)提醒并附上所有已發(fā)布鏈接?
? PaperWeekly 默認(rèn)每篇文章都是首發(fā),均會(huì)添加“原創(chuàng)”標(biāo)志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請(qǐng)單獨(dú)在附件中發(fā)送?
? 請(qǐng)留下即時(shí)聯(lián)系方式(微信或手機(jī)),以便我們?cè)诰庉嫲l(fā)布時(shí)和作者溝通
????
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁(yè)搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專(zhuān)欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結(jié)
以上是生活随笔為你收集整理的强化学习中的调参经验与编程技巧(on policy篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RealFormer:把残差转移到Att
- 下一篇: 神经网络优化中的Weight Avera