深度強化學習技巧 hacks for training deep RL
深度強化學習技巧 hacks for training deep RL
這是一篇舊文,John Schulman 《深度增強學習研究基礎》演講(Aug 2017)中記錄的 tricks。近日重看,發現有些東西在工程中是通用的,值得一讀。
給知乎的 markdown 排版跪了,怎麼排都達不到線下的效果,需要更好觀看體驗,請移步個人網站 https://kuhungio.me/2019/training_rl_systems_hacks
測試新演算法的技巧
- 簡化問題,使用低維變數。
- 使用類似只有角度和速度兩個變數的 Pendulum problem 問題。
- 這樣做方便將目標函數、演算法的最終狀態以及演算法的迭代情況可視化出來。
- 當出現問題時,更容易將出問題的點直觀的表達(比如目標函數是否夠平滑等問題)。
- 構造一個 demo 來測試你的演算法
- 比如:對於一個分層強化學習演算法,你應該構造一個演算法可以直觀學習到分層的問題。
- 這樣能夠輕易地發現那裡出了問題。
- 注意:不要在這樣的小問題上過分的嘗試。
- 在熟悉的場景中測試
- 隨著時間的推移,你將能預估訓練所需的時間。
- 明白你的獎賞是如何變化的。
- 能夠設定一個基線,以便讓你知道相對過去改進了多少。
- 作者使用他的 hpper robot,因為他知道演算法應該學多塊,以及哪些行為是異常的。
快速上手新任務的技巧
- 簡化問題
- 從簡單的開始,直到回到問題。
- 途徑1: 簡化特徵空間
- 舉例來說,如果你是想從圖片(高維空間)中學習,那麼你可能先需要處理特徵。舉個例子:如果你的演算法是想標定某個事物的位置,一開始,使用單一的x,y坐標可能會更好。
- 一旦起步,逐步還原問題直到解決問題。
- 簡化獎賞函數,這樣可以有一個更快的反饋,幫助你知道是不是走偏了。
- 比如:擊中時給 robot 記一分。這種情況很難學習,因為在開始於獎賞之前有太多的可能。將擊中得分改為距離,這樣將提升學習速率、更快迭代。
將一個問題轉化為強化學習的技巧
可能現實是並不清楚特徵是什麼,也不清楚獎賞該是什麼。或者,問題是什麼都還不清楚。
- 第一步:將這個問題使用隨機策略可視化出來。
- 看看那些部分吸引了你。
- 如果這個隨機策略在某些情況下做了正確的事,那麼很大概率,強化學習也可以做到。
- 策略的更新將會發現這裡面的行為,並促使穩定下來。
- 舉個例子: 親自查看處理過圖片,以確保你沒有移出掉關鍵信息或者是在某種程度上阻礙演算法。
- 經驗法則:
- 觀測環境: 確保均值為0,方差為1。
- 獎賞: 如果你能控制它,就把他縮放到一個合理的維度。
- 在所有的數據上都做同樣的處理。
- 交叉熵
- 策略更新
- 一些類型的 Q-learning 演算法: OpenAI Baselines或者 RLLab
復現論文
某些時候(經常的事),復現論文結果特別困難。有如下一些技巧:
- 使用比預計更多的樣本。
- 策略正確,但又不完全正確。
- 嘗試讓模型運行更久一點。
- 調整超參數以達到公開的效果。
- 如果想讓他在所有數據上都奏效,使用更大的 batch sizes。
- 如果 batch size 太小,雜訊將會壓過真正有用的信號。
- 比如: TRPO,作者使用了一個特別小的 batch size,然後不得不訓練10萬次迭代。
- 對於 DQN,最好的參數:一萬次迭代,10億左右的緩存存儲。
對於訓練中的一些處理
檢查你的訓練是否正常:
- 檢查每個超參數的魯棒性
- 如果一個演算法太過敏感,那麼它可能不太魯棒,並且不容樂觀。
- 有些時候,某個策略生效,可能僅僅是因為巧合而已,它並不足以推廣。
- 關注優化過程是否正常的指標
- 變動情況
- 關注目標函數是否正確
- 是否預測正確?
- 它的返回是否正確?
- 每次的更新有多大?
- 有些時候,我們關注一個問題,最後卻把注意力放在了其他問題上。
- 對於一個問題,很容易過擬合。
- 如果不這樣做,那你很有可能是過擬合了。
- 大部分使用 iPython notebooks。
- 資料庫對於存儲結果來說不是很重要。
總的訓練策略
- 數據的白化與標準化(一開始就這樣做,對所有數據)
- 訓練數據(Obervation):
- 計算均值與標準差,然後做標準化轉變。
- 對於全體數據(不僅僅是當前的數據)。
- 至少它減輕了隨時間的變化波動情況。
- 如果不斷地改變對象的話,可能會使優化器迷糊。
- 縮放(僅最近的數據)意味著你的優化器不知道這個情況,訓練將會失敗。
- 縮放但不要轉變對象。
- 影響 agent 的繼續下去的可能。
- 將會改變問題(你想讓它持續多久)。
- 與 rewards 相同。
- 可以起作用。
- 開始時的時候要看看它是否真的對神經網路起作用。
- 大規模的縮放(-1000,1000)到(-0.001,0.001)必然會使學習減緩。
- 最好是看看對應多少的現實時間。
- 直覺上,我們通常在強化學習中離散時間。
- 換句話說,100步是指3秒前嗎?
- 在這個過程中發生了什麼?
- 演算法將非常穩健。
- 作為一個人類,你能控制還是不能控制。
- 查看隨機情況是怎麼樣的。
- 離散化程度決定了你的隨機布朗運動能有多遠。
- 如果連續性地運動,往往模型會走很遠。
- 選擇一個起作用的時間離散化分。
- 最大返回是你的策略能做到的最好程度
- 看看你的策略是否工作正常?
- 在一場遊戲中你場場都輸,從未贏過,但是 episode 時長可以告訴你是不是輸得越來越慢
- 一開始可能看見 episode 時長有改進,但 reward 無反應
策略優化診斷
- 仔仔細細地觀察 entropy
- action 層面的 entropy
- 留意狀態空間 entropy 的變化,雖然沒有好的計量辦法
- KL penalty
- 使 entropy 遠離快速下降
- 增加 entropy bonus
- 對於大部分策略,可以採用分析式方法
- 對於連續變數,通常使用高斯分佈,這樣可以通過微分計算 entropy
- 如果 KL 是0.01,那它是相當小的。
- 如果是10,那它又非常的大。
- 如果是負數,可能是過擬合了或者是雜訊
- 可能需要超參數調節
- 初始最大化隨機 exploration
Q-Learning 策略
- 留意 replay buffer 存儲的使用情況
- 你可能需要一個非常大的 buffer,依代碼而定
- 手邊常備 learing rate 表
- 如果收斂很慢或者一開始有一個很慢的啟動
- 保持耐心,DQNs 收斂非常慢
Translated by kuhung 2017/08/29
不知道看本文的讀者,訓練強化學習時候,是什麼樣的體驗?歡迎就此在評論區發表你的看法。喜歡本文的讀者,別忘了點贊、喜歡、加關注哦,你的鼓勵,將是我寫作分享的動力(^_^)