RL DQN及其各種優化演算法

2021-10-02 16:42:31 字數 2494 閱讀 8613

其實,q表在之前的qlearning中,只是扮演了乙個函式的角色——這句話怎麼理解?給定動作和狀態,他會給你返回乙個價值。

既然我們要使用神經網路,那你總要指定輸入和輸出吧。這裡我們的輸入和輸出總共有兩種:

給定狀態和動作,輸出對應的q值,這個其實挺少用的。優點就是對於連續的動作依然能夠建模

還有一種是給定狀態,輸出所用動作的q值。顯然這種情況就不能對連續的動作建模了

知道輸入輸出以後我們還得知道我們的優化目標。其實我們的優化目標和我們的qlearning一樣:

我們希望我們的估計值和真實的q值越接近越好,因此我們的residual也出來了。

本質上,這就是乙個regression問題。

在做dqn的時候,我們需要引入乙個experience replay的概念

採用replay buffer的好處是:

可以使用之前的資料進行訓練,減少了與環境互動的次數。

使用當前的policy採集訓練資料,可能會採不到很多(s, a)的reward,即使這些(s, a)是過去曾經訪問過的。所以當前這些採不到的地方就沒有training signal,因此q-network在這些(s, a) pair上的**就不會繼續改進。由於網路的capacity 有限,反覆擬合當前policy的資料,甚至會扭曲這些曾經訪問過的(s, a) pair的q**值

其實dqn的流程和qlearning的流程差不太多。關鍵就在於乙個引數的更新:

考慮到未來這些*****裡面各種新穎的名次都會被當作dqn的乙個簡單改進技術,我就不花時間介紹他們了。

這裡我們使用了兩個網路,乙個叫做當前網路,另乙個叫做目標網路。之所以會使用兩個網路,是因為之前用乙個網路的時候,同乙個狀態和動作,你的結果其實是不斷變動的,這就會造成我們訓練的困難。

最好的情況就是,我們能過固定住其中的乙個網路,這樣我們的結果也就固定了——當然兩個網路之間不能差太多,所以要每隔一段時間更新網路引數

用數學公式寫就是:

實驗表明,我們用神經網路擬合出來的q值,其實是比真實值要估得高的。這是由於使用了貪婪法計算q值,使q值的計算可能過早的向乙個早期計算出的區域性的最優q值靠攏,導致出現大的偏差。導致其他較優的區域性狀態動作無法被迭代到,或者就算迭代到,也沒有更新到高的q值。這樣偏差就大了。

乙個解決辦法就是,利用貪婪法+當前網路選擇相應的動作。

之前我們replaybuffer對待所有樣本都一視同仁。實際也是如此嗎?當然不是。

比如,具有較大誤差的樣本,就具有更高的價值,取樣的時候,可以利用這個增加較大誤差樣本被取樣到的機率,來實現這個操作。

實現的方法是利用乙個sumtree的資料結構(其實使用list也行,但是效率低,乙個是o(n), 另乙個是o(logn))

核心思想是把權重轉化為區間,你葉子節點的值就是對應區間的長度。顯然權重越大,落到這個區間的概率也就越大

這顆sumtree是專門用來訪問優先順序的,為此你還要有乙個list用來儲存transiton。

(p.s. 特別注意0的存在!!真的很要命!!)

上圖終,葉子節點就是區間長度,其父節點的值是葉子節點值的和。

這個更簡單,事實上你只要知道他是更改網路結構就對了。他主要是在網路的內部又細分了:

它所細分的,就是分成了乙個價值函式層優勢函式層,最後又將他們線性組合。

注意,優勢函式層還要中心化,最後的數學公式如下:

這樣做得目的是更有效率地進行訓練。比如某一狀態所有的動作的價值,都要+1。那我們就沒必要去對於每乙個s a對進行更新,只要更新乙個v就行了。見下圖所示:

各種優化演算法

窮舉法 列舉所有可能,然後乙個個去,得到最優的結果。如圖一,需要從a點一直走到g點,才能知道,f是最高的 最優解 這種演算法得到的最優解肯定是最好的,但也是效率最低的。窮舉法雖然能得到最好的最優解,但效率是極其低下的。為了能提高效率,可以不要列舉所有的結果,只列舉結果集中的一部分,如果某個解在這部分...

Bellman Ford 演算法及其優化

bellman ford 演算法及其優化 bellman ford 演算法與另乙個非常著名的 dijkstra 演算法一樣,用於求解單源點最短路徑問題。bellman ford 演算法除了可求解邊權均非負的問題外,還可以解決存在負權邊的問題 意義是什麼,好好思考 而 dijkstra 演算法只能處理...

Bellman Ford 演算法及其優化

bellman ford 演算法與另乙個非常著名的 dijkstra 演算法一樣,用於求解單源點最短路徑問題。bellman ford 演算法除了可求解邊權均非負的問題外,還可以解決存在負權邊的問題 意義是什麼,好好思考 而 dijkstra 演算法只能處理邊權非負的問題,因此 bellman fo...