1. 程式人生 > >論文筆記7:Prioritized Experience Replay

論文筆記7:Prioritized Experience Replay

參考資料:

baidu.com/link?

Prioritized Experience Replay (DQN) (Tensorflow) - 強化學習 Reinforcement Learning | 莫煩Python

如有錯誤請指出,謝謝~

知乎同名:https://www.zhihu.com/people/uuummmmiiii/activities


創新點

:在抽取經驗池中過往經驗樣本時,採取按優先順序抽取的方法

改進:同上

改進原因:原來隨機抽取經驗忽略了經驗之間的重要程度,實際上如人腦中一定會有更為重要的記憶

帶來益處:使得演算法更快收斂,效果更好


Abstract

經驗回放使得線上強化學習的agent能夠記住和重新利用過去的經驗,在以往的研究中,過去的經驗(transition,經驗池中的一條記錄,表示為元祖形式,包含state,action,reward,discount factor,next state),只是通過均勻取樣來獲取。然而這種方法,只要原來有過這個經驗,那麼就跟別的經驗以相同的概率會被再次利用,忽略了這些經驗各自的重要程度。

本文我們提出了一種優先回放結構,這種方法可以使重要的經驗被回放的概率大,從而使學習變得更有效率。

Introduction

introduction開始介紹了經驗回放機制的產生:

1、更新完引數立刻丟掉輸入輸出的資料:

造成兩個問題:這種強相關的更新打破了很多常用的基於隨機梯度下降演算法的所應該保證的獨立同分布特性,容易造成演算法不穩定或者發散;放棄了一些在未來有用的需要重放學習的一些稀有經驗。

2、1992年提出Experience Replay,解決了這兩個問題,並在2013年提出的DQN(Mnih et al.)中應用,原始DQN中只是從經驗池中隨機取樣進行回放利用。經驗回放雖然可以減少agent學習所需要的經驗數量(輸入的data),但會增加計算量與記憶體,但是增加的計算量與記憶體對於agent與環境互動而言更cheaper。

Experience replay liberates online learning agents from processing transitions in the exact order they are experienced.

3、這裡我們提出如何對經驗標記優先順序,來使重放比單純的隨機抽樣回放更有效。

Prioritized replay further liberates agents from considering transitions with the same frequency that they are experienced.


我們用TD-error來表示優先順序的大小。

1、這種方式會丟失多樣性,我們用stochasitic prioritization(proportional prioritization和rank-based prioritization)來彌補;

2、這種方式也會引入bias,我們用importance-sample weights來彌補


Prioritized Replay

在利用經驗池的時候會有兩種選擇:一是選擇哪些經驗進行儲存,二是如何進行回放。我們僅研究第二個。分四步逐漸提出我們加入prioritized experience replay的演算法。

3.1 A motivate example 一個給我們提供靈感的例子

作者為理解首先介紹了一個人工設定的稱為‘Blind Cliffwalk’環境,這個環境體現了在reward很少的時候exploration的困難之處(exploration,個人理解在貪婪演算法 \varepsilon -greedy中,以\varepsilon 的概率去探索,exploration,即隨機選擇動作。以1-\varepsilon 選擇最大動作,即利用exploit),為什麼探索過程困難?

首先看這個環境的設定:

agent只有兩個動作,即right和wrong,每個環節episode中以agent採取wrong行動作為terminal,並且只有當不斷採取right動作,從而有過n個狀態後才會得到reward為1,剩下全部為0;上面紅虛線均表示結束該episode,綠線表示在n狀態下采取wrong行動會終止episode並且會得到獎賞1

因為在隨即採取行動的時候,得到獎勵的概率很低是 \left( \frac{1}{2}\right)^{n} ,因此對於一系列的transition,最相關的transition,即少量的成功資訊,隱藏在大量的失敗資訊中。正如一個寶寶學習走路,在學會走路之前會不斷摔倒摔倒。

這樣會使得在探索過程中一直會有失敗出現。


作者用這個環境比較兩種agent:第一個agent採取隨機抽取過去經驗的方式進行Q-learning,第二個agent呼叫oracle去進行優先順序抽取,oracle可以使得在當前狀態下最大限度減少全域性誤差(這裡的oracle感覺不太像所說的資料庫,但我具體又沒查出來是什麼,但作者後面說用oracle方法抽取實際上是不現實的。如果這裡是oracle資料庫,那麼可能是在庫中儲存資料時會有優先順序的從高到低排序,每次選出優先順序最高的batch數目就可以了,實際中不現實可能是因為演算法中要自動實現經驗池的存放,用這個資料庫可能不太容易呼叫或者是工作量消耗比較大,但是算是對於優先順序排序比較準確的方法。如有錯誤請指出。。。)

作者經過實驗,優先順序排序用的是TD-error來進行衡量:

作者得到如下效果曲線,發現用優先順序進行抽取與隨機抽取之間到達收斂需要的更新次數相差的gap很大,激勵了作者去尋找如何進行有優先順序的回放:

3.2 Prioritizing with TD-error 用來說明TD-error來表示優先順序的效果

如何衡量每個transition的重要程度是優先回放機制的中心,一種理想的機制是在當前狀態下,按agent從transitions中學習的次數,但這實際不好獲得。更合理的是去計算每個transition的TD-error,這個值表示當前Q值與目標Q值有多大的差距(作者形容為surprising,按莫煩老師所說即Q現實 - Q估計,如果TD-error越大, 就代表我們的預測精度還有很多上升空間, 那麼這個樣本就越需要被學習, 也就是優先順序p越高。)

用TD-error來衡量更加適合增量的,線上的RL演算法,如Sarsa,Q-learning,因為這些在Q值更新上已經有計算TD-error的部分:

但是當reward有noisy的時候,TD-error來估計優先順序也很poor。

為了說明TD-error發揮的潛在effectiveness,我們在'Blind Cliffwalk'環境下比較了隨機抽取方式和基於greedy TD-error prioritization演算法的oracle抽取方式(對於Q-learning)。

greedy TD-error prioritization演算法在經驗池中儲存了每個transition最後encounter的TD-error,用這種方式,將會以TD-error的絕對值最大的進行回放。這裡如果當一個新的transition到來時,我們不知道它的TD-error,那麼就把這個transition的TD-error值設定為最大,這樣可以保證所有的經驗都會被至少回放一次。這種方法效果筆隨機抽取(uniform)效果好。

實現方法:經驗池容量為N,我們用二進位制堆資料結構(binary heap data structure)來儲存優先順序序列。這樣找到找到最高優先順序的transition的複雜度是O(1),更新優先順序的複雜度 為O(logN)

3.3 stochasitic prioritization 為解決採用TD-error喪失多樣性的問題

greedy TD-error prioritization演算法有幾個問題

1、為了避免由於掃描整個經驗池帶來的昂貴代價,只會更新被重放的transition的TD-error值,這樣會造成:第一次見到過的一個有很小的TD-error的transition存放到經驗池後,在很長時間都不會被回放

2、TD-error對於噪聲很敏感,容易將源於噪聲的估計誤差加入。

3、這個演算法專注於經驗的一小部分,TD-error減小慢,特別是在使用函式近似(Function approximation,有linear函式估計,例如線性迴歸,以權重作為引數;有non-linear函式估計,例如NN),高的TD-error由於重放頻繁會使得喪失多樣性造成過擬合。

(為什麼喪失多樣性造成過擬合:對於DQN,回放就是把經驗池中取出的transition中的s狀態輸入到Q-network中,next state 輸入到target Q-network中,然後進行一系列計算loss,反向傳播更新網路引數,如果一直重複這一條資訊輸入,那麼我對於訓練網路過程來說精度會很高,而當測試的時候,輸入別的狀態就會使測試精度降低,即過擬合)


為了解決這些問題

作者引入了一種stochastic sampling的方法,這種方法是一種介於純greedy prioritization演算法與原始uniform random sampling演算法之間的一種方法。

用這種方式,我們可以保證transition被抽取的概率是按優先順序單調的,同時保證對於低優先順序的transition不會出現0概率抽取可能。具體的,抽取標號為i的transition的概率定義為:

這裡pi是transition i 的優先順序,均大於0,α是一個決定我們要使用多少 ISweight 的影響, 如果 alpha = 0, 我們就沒使用到任何 Importance Sampling.就是uniform random sampling

對於pi這個優先順序值的定義,作者提出了兩種變體

第一種 proportional prioritization ,這裡的pi= \left| \delta_{i} \right| + \epsilon ,\epsilon是一個很小的正常數為了使有一些TD-error為0 的特殊邊緣例子也能夠被抽取。

第二種 rank-based prioritization ,這裡pi= \frac{1}{rank(i)} ,這裡的rank(i)是按照\left| \delta_{i} \right|排序時transition i的等級。(這時P將成為冪律分佈)

對於這兩種變體,P都關於\left| \delta_{i} \right|是單調的,對於第二種變體由於對異常值不敏感,可能更具有魯棒性。但是經過試驗,這兩種變體都可以加速演算法收斂:

實驗實現

為了有效地從P分佈中取樣,複雜性不能依賴於經驗池的容量N。

第一種變體 proportional prioritization 實現:(來自莫煩老師,見上面參考文獻連結)

利用一種更有效的更新和取樣實現方式:基於‘sum-tree’的資料結構,SumTree 是一種樹形結構, 每片樹葉儲存每個樣本的優先順序p, 每個樹枝節點只有兩個分叉, 節點的值是兩個分叉的合, 所以 SumTree 的頂端就是所有p的合. 正如下面圖片(來自Jaromír Janisch), 最下面一層樹葉儲存樣本的p, 葉子上一層最左邊的 13 = 3 + 10, 按這個規律相加, 頂層的 root 就是全部p的合。

抽樣時, 我們會將p的總合 除以 batch size, 分成 batch size 那麼多區間(n= \frac{sum(p)}{batchsize} )如果將所有 node 的 priority 加起來是42的話, 我們如果抽6個樣本, 這時的區間擁有的 priority 可能是這樣.

[0-7], [7-14], [14-21], [21-28], [28-35], [35-42]

然後在每個區間裡隨機選取一個數. 比如在區間[21-28]裡選到了24, 就按照這個 24 從最頂上的42開始向下搜尋. 首先看到最頂上42下面有兩個 child nodes, 拿著手中的24對比左邊的 child29, 如果 左邊的 child 比自己手中的值大, 那我們就走左邊這條路, 接著再對比29下面的左邊那個點13, 這時, 手中的 24 比13大, 那我們就走右邊的路, 並且將手中的值根據13修改一下, 變成 24-13 = 11. 接著拿著 11 和13左下角的12比, 結果12比 11 大, 那我們就選 12 當做這次選到的 priority, 並且也選擇 12 對應的資料.

第二種變體 rank-based prioritization 實現

我們可以用一個分段線性函式來近似累積密度函式,k段的概率是相等的。分段邊界可以預先計算出來(因為只與N和alpha有關係)。在執行時,我們選擇一個片段,然後在這個片段中的所有transition中均勻地取樣。選k為minibatch的大小,從每一個片段中選出一個transition——這是一種分層抽樣,可以平衡minibatch。

我們選擇以陣列為基礎的二進位制堆結構實現的優先佇列中儲存轉換。然後,堆陣列近似代替排序陣列,為防止堆變得不平衡,我們不是在每N步進行一次排序,這是對二進位制堆的非常規使用,但是我們對較小環境的測試表明,與使用完全排序的陣列相比,學習是不受影響的。這可能是由於最後看到的TD-error僅僅是代表一個transition的有用性和我們對隨機優先順序抽樣的使用。在執行過程中,為避免對抽樣分佈的分割槽過度重計算,我們做了一個小改進。我們為N的值重用了相同的分割槽,這些值是緊密聯絡在一起的,並且不經常更新α和β。我們對 rank-based prioritization 驗證時發現增加2%-4%的執行時間,並且可以忽略額外的記憶體使用。這點可以有很多方面的改進去解決,例如,使用更高效的堆實現,但是對於我們的實驗來說已經足夠好了。


總結:這一節中出現的進行transition回放的方式:

1、不進行優先順序排序,然後採用原始的uniform 抽取(uniform random sampling)

2、呼叫oracle進行優先順序排序,然後再抽取優先順序高的transition進行回放

3、呼叫基於‘greedy TD-error prioritization’演算法的oracle進行排序,然後再抽取優先順序高的transition進行回放。

(這裡的‘greedy TD-error prioritization’演算法就是指按照 TD-error的絕對值大小值進行排序,用二進位制堆資料結構從上到下按優先順序高低進行排序)

4、 第一種變體 proportional prioritization,用sumtree結構(更常用),與普通的二進位制堆結構不同,每個節點是其子節點的和

5、 第二種變體 rank-based prioritization ,基於二進位制堆結構用優先佇列直接儲存各個transition



3.4 Annealing the bias(為減少bias提出解決方法)

隨機更新對期望值的估計依賴於與預期相同的分佈相對應的更新。優先重放機制引入了bias,它以一種不受控制的方式改變了這個分佈,因此改變收斂結果(即使策略和狀態分佈是固定的)。我們可以通過引入importance-sample weights來彌補:

這完全補償了當β=1時非均勻概率P(i)。這些權重可以通過使用w_{i}\delta_{i} 而不是 \delta_{i} 來加入到Q-network更新中。

Importance sampling的影響:

在典型的強化學習場景中,更新的無偏性在訓練結束接近收斂時是最重要的,因為由於策略、狀態分佈和引導目標的改變,有bias會高度不穩定,與未修正的優先重放相比,Importance sampling使學習變得不那麼具有侵略性,一方面導致了較慢的初始學習,另一方面又降低了過早收斂的風險,有時甚至是更好的最終結果。與uniform重放相比,修正的優先順序排序平均表現更好。

最終我們得到演算法: