日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

强化学习中的调参经验与编程技巧(on policy篇)

發布時間:2024/10/8 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 强化学习中的调参经验与编程技巧(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 且經過訓練迭代數逐漸減小;

    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 默認每篇文章都是首發,均會添加“原創”標志

    ?????投稿郵箱:

    ? 投稿郵箱:hr@paperweekly.site?

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

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

    ????

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

    進入知乎首頁搜索「PaperWeekly」

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

    關于PaperWeekly

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

    總結

    以上是生活随笔為你收集整理的强化学习中的调参经验与编程技巧(on policy篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。