1. 程式人生 > >深度強化學習cs294 Lecture8: Deep RL with Q-Function

深度強化學習cs294 Lecture8: Deep RL with Q-Function

深度強化學習cs294 Lecture8: Deep RL with Q-Function

上節課講到value-based 的函式,其中Q-learning是比較常用的一個演算法。可以有兩種形式,一種是非線上形式,另一個是線上形式。
在這裡插入圖片描述

1. How we can make Q-learning work with deep networks

但是使用上述Q-learning演算法的過程中有些問題,特別是線上形式的。第一個就是線上形式的演算法裡經過的狀態是有很強的關聯的,因為是同一個軌跡中得到的。第二點就是在對擬合函式的係數進行更新的時候其實並不是真正的進行了梯度下降:
在這裡插入圖片描述
首先解決第一個問題。解決這個問題的思路可以借鑑actor-critic中取樣的方法。使用並行的取樣,同時回傳樣本,這樣能夠一定程度上減少樣本間的相關性。也可以使用非同步的方式,效果會更好一點。
在這裡插入圖片描述
還有一種解決樣本相關性的方式是,將採集樣本的過程獨立出來,而且存為一個快取,之後隨機地從快取中抽取樣本點用來更新。因為q-learning演算法是支援off-policy的,因此這樣做沒有問題。
在這裡插入圖片描述


使用了樣本快取之後的演算法就不再是online的形式了。不過因為策略在更新,因此快取中的樣本實際上也應該有著週期性的更新。一直不變的樣本無法學到更好的策略。
在這裡插入圖片描述
這樣做不僅解決了樣本相關性的問題,而且更新的時候可以利用mini-batch的方式,減小更新的方差。

把取樣結果的更新也加入其中,整個演算法流程如下:
在這裡插入圖片描述
取樣更新的時候採用的策略可以是在最新的策略基礎上進行調整的策略比如 ϵ \epsilon -greedy方法。

但是解決了樣本相關性的問題,還有一個問題需要解決。但是這個問題無法完全解決,只能稍微改善。
在這裡插入圖片描述
這個問題就是,在進行引數更新的時候實際上進行的並不是梯度下降,因此最終可能無法得到收斂的結果。想要改善這個問題首先要看一下引數更新的目的。實際上更新引數是為了得到一個對於Q函式的迴歸結果:
在這裡插入圖片描述
之前使用的演算法裡,迴歸的目標是一個用 Q Q 表示的值,因此這個值是一直變化的,也就是迴歸的目標函式是個變化的函式。想要改善這個問題,那就需要減少這個目標函式的變化。也就是讓目標是 y i y_{i} 變成一個相對固定的值。有一個方法可以一定程度完成這個目標,那就是在計算 y i y_{i} 的過程中保持後面的 Q θ Q_{\theta '} 不變,也就是引數 θ \theta 的更新不立即應用到值函式中:
在這裡插入圖片描述
使用了這個技巧之後,在每一次更新引數的內部迴圈中,引數迴歸的目標函式就相對是一個固定的函式,也就可以提高擬合的效果。

2. A generalized view of Q-learning algorithms

同時應用這兩種技巧,樣本快取(replay buffer)和固定目標(target network),可以得到如下演算法:
在這裡插入圖片描述
下方是一個經典的深度Q-learning演算法,也叫作DQN。相當於上方演算法中的K取1時候的效果。

但是實際上這樣的引數更新方式有一些奇怪,那就是每一步的樣本距離當前固定的目標函式的“距離”是在逐漸增加的,讓人感覺有些奇怪。想要改變這一點,可以選擇將 Φ \Phi 緩慢的均勻增加:
在這裡插入圖片描述
我們可以對比一下經過改進後的演算法與不同的Q-learning之間的區別:
在這裡插入圖片描述
可以把Q-learning演算法用更泛化的角度來看,分為3個部分,分別是1.資料收集,2. 引數更新, 3. 函式擬合。
在這裡插入圖片描述
其中還有拋棄舊資料的問題。這個部分可以使用LRU之類的優先順序演算法。
在這裡插入圖片描述
把Q-learning相關的演算法都看成是這三個部分組成,三個部分不同的更新速率就會帶來不同的演算法。

3. Tricks for improving Q-learning in practice

在實際的應用中,實現了Q-learning演算法之後需要及時地畫出對應的reward曲線或是平均reward曲線。一般來說平均reward曲線會隨時間增加,這樣能夠說明演算法實現得比較合理。還可以選取一些代表性的實際場景(breakout)與V值函式進行對比,觀察其表示的值與實際情況是否匹配等等。對於某些離散動作的情況,還可以觀察其動作的概率分佈是否合理:
在這裡插入圖片描述
實際上我們發現,使用Q-learning之後得到的結果與真實值之間有很大的差距,一般而言會高出很多:
在這裡插入圖片描述
造成這個現象的原因是計算目標值的時候用的Q函式與選取最優動作時候的Q函式是同一個。因為其中max的存在,會導致只會選到越來越高的結果,與真實結果有一定的偏離,可以用兩個隨機變數的最大值期望與期望的最大值來理解:
在這裡插入圖片描述
這樣得到的結果一定會高於真實值。解決這個問題的方法是,將選取動作時候的Q函式與計算結果的Q函式使用兩個不同的引數,就能夠消除這種誤差累積:
在這裡插入圖片描述
也就是說,我們需要有兩組Q的引數,一組用來計算,一組用來選擇動作。在實際的應用中,我們只需要使用更新之前的係數計算最優動作即可,不用再刻意保留另外的引數。也就是神經網路擬合的目標函式 Q Φ Q_{\Phi}
在這裡插入圖片描述
實際應用中我們可能經常會遇到Q函式擬合不好的情況,那麼在計算過程中每一步的獎勵是唯一有用的資訊。這個資訊有時候顯得不夠用,因此可以利用多步反饋來增強這一部分的資訊,就像是actor-critic演算法中使用的一樣:
在這裡插入圖片描述
使用了多步反饋的結果之後能夠帶來更小的偏差,一般也會學習得更快。但是會遇到off-policy情況下不太適用的問題。因為多步反饋需要的是在同一個策略下的多步轉移,假如完全利用off-policy的資料,得到的多步反饋可能是在不同策略下的結果,這樣可能沒有意義。不過我們也有三種解決的方式:
在這裡插入圖片描述

4. Continuous Q-learning methods

在Q-learning應用到連續動作空間時也有一個很大的問題,那就是max的操作對於連續動作無法執行。想要進行這個max操作,可以有幾種選擇:
在這裡插入圖片描述
第一種做法是再進行一次最優化求解。但是如果每次max都要求解一次,那麼演算法會變得非常的慢。
在這裡插入圖片描述
不過可以從動作空間中取樣,然後選出樣本中最優的結果作為最優動作。這樣做很方便簡單,也適合平行計算。但是不是非常準確。也可以使用更精確的方式比如交叉熵方法等等。
在這裡插入圖片描述
第二種做法是直接把Q函式實現為一個容易求導的結果,能夠直接得到最優動作。但是這樣會失去神經網路擬合函式的表示能力。
在這裡插入圖片描述
最後一種做法是再用一個神經網路,作為當前狀態最優動作的擬合函式。這樣也能夠得到最終的結果。
在這裡插入圖片描述
總結下來實際應用中Q-learning有幾個注意的要點:
在這裡插入圖片描述
還有一些訓練強化學習演算法的高階技巧:
在這裡插入圖片描述
總結一下:
在這裡插入圖片描述