深度強化學習技巧 hacks for training deep RL

這是一篇舊文,John Schulman 《深度增強學習研究基礎》演講(Aug 2017)中記錄的 tricks。近日重看,發現有些東西在工程中是通用的,值得一讀。

給知乎的 markdown 排版跪了,怎麼排都達不到線下的效果,需要更好觀看體驗,請移步個人網站 https://kuhungio.me/2019/training_rl_systems_hacks

測試新演算法的技巧

  1. 簡化問題,使用低維變數。
  2. 使用類似只有角度和速度兩個變數的 Pendulum problem 問題。
  3. 這樣做方便將目標函數、演算法的最終狀態以及演算法的迭代情況可視化出來。
  4. 當出現問題時,更容易將出問題的點直觀的表達(比如目標函數是否夠平滑等問題)。
  5. 構造一個 demo 來測試你的演算法
  6. 比如:對於一個分層強化學習演算法,你應該構造一個演算法可以直觀學習到分層的問題。
  7. 這樣能夠輕易地發現那裡出了問題。
  8. 注意:不要在這樣的小問題上過分的嘗試。
  9. 在熟悉的場景中測試
  10. 隨著時間的推移,你將能預估訓練所需的時間。
  11. 明白你的獎賞是如何變化的。
  12. 能夠設定一個基線,以便讓你知道相對過去改進了多少。
  13. 作者使用他的 hpper robot,因為他知道演算法應該學多塊,以及哪些行為是異常的。

快速上手新任務的技巧

  1. 簡化問題
  2. 從簡單的開始,直到回到問題。
  3. 途徑1: 簡化特徵空間
  • 舉例來說,如果你是想從圖片(高維空間)中學習,那麼你可能先需要處理特徵。舉個例子:如果你的演算法是想標定某個事物的位置,一開始,使用單一的x,y坐標可能會更好。
  • 一旦起步,逐步還原問題直到解決問題。
  • 途徑2:簡化獎賞函數
    • 簡化獎賞函數,這樣可以有一個更快的反饋,幫助你知道是不是走偏了。
    • 比如:擊中時給 robot 記一分。這種情況很難學習,因為在開始於獎賞之前有太多的可能。將擊中得分改為距離,這樣將提升學習速率、更快迭代。

    將一個問題轉化為強化學習的技巧

    可能現實是並不清楚特徵是什麼,也不清楚獎賞該是什麼。或者,問題是什麼都還不清楚。

    1. 第一步:將這個問題使用隨機策略可視化出來。
    2. 看看那些部分吸引了你。
    3. 如果這個隨機策略在某些情況下做了正確的事,那麼很大概率,強化學習也可以做到。
    • 策略的更新將會發現這裡面的行為,並促使穩定下來。
  • 如果隨機策略永遠都做不到,那麼強化學習也不可能。
  • 確保可觀測
  • 確保你能夠掌控系統,且給 agent 的也是同樣的系統環境。
    • 舉個例子: 親自查看處理過圖片,以確保你沒有移出掉關鍵信息或者是在某種程度上阻礙演算法。
  • 確保所有的事物都在合理的尺度
    • 經驗法則:
    • 觀測環境: 確保均值為0,方差為1。
    • 獎賞: 如果你能控制它,就把他縮放到一個合理的維度。
    • 在所有的數據上都做同樣的處理。
  • 檢查所有的觀測環境以及獎賞,以確保沒有特別離奇的異常值。
  • 建立一個好的基線
  • 一開始並不清楚哪些演算法會起作用,所以設定一系列的基線(從其他方法)。
    • 交叉熵
    • 策略更新
    • 一些類型的 Q-learning 演算法: OpenAI Baselines或者 RLLab

    復現論文

    某些時候(經常的事),復現論文結果特別困難。有如下一些技巧:

    1. 使用比預計更多的樣本。
    2. 策略正確,但又不完全正確。
    3. 嘗試讓模型運行更久一點。
    4. 調整超參數以達到公開的效果。
    5. 如果想讓他在所有數據上都奏效,使用更大的 batch sizes。
    • 如果 batch size 太小,雜訊將會壓過真正有用的信號。
    • 比如: TRPO,作者使用了一個特別小的 batch size,然後不得不訓練10萬次迭代。
    • 對於 DQN,最好的參數:一萬次迭代,10億左右的緩存存儲。

    對於訓練中的一些處理

    檢查你的訓練是否正常:

    1. 檢查每個超參數的魯棒性
    2. 如果一個演算法太過敏感,那麼它可能不太魯棒,並且不容樂觀。
    3. 有些時候,某個策略生效,可能僅僅是因為巧合而已,它並不足以推廣。
    4. 關注優化過程是否正常的指標
    5. 變動情況
    6. 關注目標函數是否正確
    • 是否預測正確?
    • 它的返回是否正確?
    • 每次的更新有多大?
  • 一些標準的深度神經網路的診斷方法
  • 有一套能夠連續記錄代碼的系統
  • 有成型的規則。
  • 注意過去所作的所有嘗試。
    • 有些時候,我們關注一個問題,最後卻把注意力放在了其他問題上。
    • 對於一個問題,很容易過擬合。
  • 有一大推之前時不時測試的基準。
  • 有時候會覺得系統運行正常,但很可能只是巧合。
  • 例如: 有3套演算法處理7個任務,可能會有一個演算法看起來能很好地處理所有問題,但實際上,它們不過是一套演算法,不同的僅僅是隨機種子而已。
  • 使用不同的隨機種子
  • 運行多次取平均。
  • 在多個種子的基礎上運行多次。
    • 如果不這樣做,那你很有可能是過擬合了。
  • 額外的演算法修改可能並不重要
  • 大部分的技巧都是在正則化處理某些對象,或者是在改進你的優化演算法。
  • 許多技巧有相同的效果......所以,你可以通過移除它們,來簡化你的演算法(很關鍵)。
  • 簡化你的演算法
  • 將會取得更好的泛化效果。
  • 自動化你的實驗
  • 不要整天盯著你的代碼讀取和寫入數據。
  • 將實驗部署在雲端並分析結果。
  • 追蹤實驗與結果的框架:
    • 大部分使用 iPython notebooks。
    • 資料庫對於存儲結果來說不是很重要。

    總的訓練策略

    1. 數據的白化與標準化(一開始就這樣做,對所有數據)
    2. 訓練數據(Obervation):
    • 計算均值與標準差,然後做標準化轉變。
    • 對於全體數據(不僅僅是當前的數據)。
      • 至少它減輕了隨時間的變化波動情況。
      • 如果不斷地改變對象的話,可能會使優化器迷糊。
      • 縮放(僅最近的數據)意味著你的優化器不知道這個情況,訓練將會失敗。
  • 獎賞(Rewards):
    • 縮放但不要轉變對象。
      • 影響 agent 的繼續下去的可能。
      • 將會改變問題(你想讓它持續多久)。
  • 歸一化目標(Standardize targets)
    • 與 rewards 相同。
  • PCA 白化
    • 可以起作用。
    • 開始時的時候要看看它是否真的對神經網路起作用。
    • 大規模的縮放(-1000,1000)到(-0.001,0.001)必然會使學習減緩。
  • 衰減因子的調參
  • 判斷分配多少權重。
  • 舉個例子:如果因子是0.99,那麼你將忽略100步以前的事情,這意味著某種程度的短視。
    • 最好是看看對應多少的現實時間。
      • 直覺上,我們通常在強化學習中離散時間。
      • 換句話說,100步是指3秒前嗎?
      • 在這個過程中發生了什麼?
  • 如果是用於 fx 估計的策略更新 TD 演算法,gamma 可以選擇靠近1(比如0.999)。
    • 演算法將非常穩健。
  • 觀察問題是否真的能被離散化處理
  • 例如:在一個遊戲有跳幀。
    • 作為一個人類,你能控制還是不能控制。
    • 查看隨機情況是怎麼樣的。
    • 離散化程度決定了你的隨機布朗運動能有多遠。
    • 如果連續性地運動,往往模型會走很遠。
    • 選擇一個起作用的時間離散化分。
  • 密切關注返回的 episode
  • 不僅僅是均值,還包括極大極小值
    • 最大返回是你的策略能做到的最好程度
    • 看看你的策略是否工作正常?
  • 查看 episode 時長(有時比 episode reward 更為重要)
    • 在一場遊戲中你場場都輸,從未贏過,但是 episode 時長可以告訴你是不是輸得越來越慢
    • 一開始可能看見 episode 時長有改進,但 reward 無反應

    策略優化診斷

    1. 仔仔細細地觀察 entropy
    2. action 層面的 entropy
    • 留意狀態空間 entropy 的變化,雖然沒有好的計量辦法
  • 如果快速地下降,策略很快便會固定然後失效
  • 如果沒有下降,那麼這個策略可能不是很好,因為它是隨機的
  • 通過以下方式補救:
    • KL penalty
      • 使 entropy 遠離快速下降
    • 增加 entropy bonus
  • 如何測量 entropy
    • 對於大部分策略,可以採用分析式方法
      • 對於連續變數,通常使用高斯分佈,這樣可以通過微分計算 entropy
  • 觀察 KL 散度
  • 觀察 KL 散度的更新尺度
  • 例如:
    • 如果 KL 是0.01,那它是相當小的。
    • 如果是10,那它又非常的大。
  • 通過基線解釋方差
  • 查看價值函數是不是好的預測或者給予回報
    • 如果是負數,可能是過擬合了或者是雜訊
      • 可能需要超參數調節
  • 初始化策略
  • 非常重要(比監督學習更重要)
  • 最後一層取0或者是一個很小的值來最大化 entropy
    • 初始最大化隨機 exploration

    Q-Learning 策略

    1. 留意 replay buffer 存儲的使用情況
    2. 你可能需要一個非常大的 buffer,依代碼而定
    3. 手邊常備 learing rate 表
    4. 如果收斂很慢或者一開始有一個很慢的啟動
    5. 保持耐心,DQNs 收斂非常慢

    Translated by kuhung 2017/08/29

    不知道看本文的讀者,訓練強化學習時候,是什麼樣的體驗?歡迎就此在評論區發表你的看法。喜歡本文的讀者,別忘了點贊、喜歡、加關注哦,你的鼓勵,將是我寫作分享的動力(^_^)


    關注微信公眾號【穀粒先生】,回復【強化學習】獲取原版 PPT

    推薦閱讀:

    相關文章