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