強化學習中的調參經驗與程式設計技巧(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 預設每篇文章都是首發,均會新增“原創”標誌
???? 投稿郵箱:
• 投稿郵箱:[email protected]
• 所有文章配圖,請單獨在附件中傳送
• 請留下即時聯絡方式(微信或手機),以便我們在編輯釋出時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜尋「PaperWeekly」
點選「關注」訂閱我們的專欄吧
關於PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智慧前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號後臺點選「交流群」,小助手將把你帶入 PaperWeekly 的交流群裡。
- Traefik 2 基礎授權驗證(後篇)
- 可怕!原來我們看到的世界地圖一直都是“錯”的!多年的地理白學了...
- STM32MP157 韋東山學習板 學習筆記 (一)
- 當黑客不講武德 安全專家也容易被騙
- 高盛:Github開源、Marquee、SecDB
- 異地內部系統升級覆盤
- 強化學習中的調參經驗與程式設計技巧(on policy篇)
- DB2效能優化- REORG慢的分析
- 排序演算法(氣泡排序、直接排序、反轉排序)
- UE4觸控外掛Ultimate Touch Components的使用
- 在中國手機市場衰敗後,三星正悄悄依靠科技創新再度崛起
- 基於FPGA:車牌識別應用的影象後處理
- 201217,成交量異動檢測
- 第三週練習
- UNIX 之父和 Linux 之父:創造新系統真的只是個意外 | 贈書
- 編譯安裝net-snmp 5.4.4
- 課程分類匯入後端實現
- Linux——執行緒深度剖析(二),拿下執行緒安全
- IEEE 2021年新增Fellow出爐,70餘位華人入選
- 好玩、有趣的 Linux 命令學習神器 kmdr!