強化學習中的調參經驗與編程技巧(on policy篇)

©PaperWeekly 原創 · 作者|張恆瑞

單位|北京交通大學

研究方向|強化學習

在強化學習的訓練過程中,常常會遇見以下問題:

  • 在某一環境中可以 work 的超參數拿去訓練別的環境卻訓練不出來

  • 訓練時熵在增大

  • 訓練動作達到邊界


本文通過調試幾個環境的案例來探究強化學習的調參方法。

pendulum

擺錘這個環境可以看做連續控制中的入門環境了,環境初始時在一個隨機的位置,目標是將其擺動以使其保持直立,它的狀態維度爲 3,動作維度爲 1。

擬使用 PPO 解決這個問題,ppo 的流程如下:

  1. 使用 Actor 網絡與環境交互一定步數,記錄下(state, action, reward, v, done)

  2. 根據記錄下來的值計算優勢值 adv(更新 actor 網絡使用)和 v_target(更新 critic 網絡使用)

  3. 計算 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 且經過訓練迭代數逐漸減小;

lam = lambda f: 1 - f / train_steps
self.opti_scheduler = torch.optim.lr_scheduler.LambdaLR(self.opti, lr_lambda=lam)
  • 採用 return 方式計算v_target;

  • adv 計算採用 gae

  • loss 計算添加熵,係數(self.c_en)爲 0.01

loss = aloss - loss_entropy*self.c_en + v_loss*self.c_vf
  • max_grad_norm=0.5

torch.nn.utils.clip_grad_norm_(self.critic.parameters(), self.max_grad_norm)
torch.nn.utils.clip_grad_norm_(self.actor.parameters(), self.max_grad_norm)

這些都是比較常規的 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 默認每篇文章都是首發,均會添加“原創”標誌

???? 投稿郵箱:

• 投稿郵箱:[email protected] 

• 所有文章配圖,請單獨在附件中發送 

• 請留下即時聯繫方式(微信或手機),以便我們在編輯發佈時和作者溝通

????

現在,在「知乎」也能找到我們了

進入知乎首頁搜索「PaperWeekly」

點擊「關注」訂閱我們的專欄吧

關於PaperWeekly

PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公衆號後臺點擊「交流羣」,小助手將把你帶入 PaperWeekly 的交流羣裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章