1. 程式人生 > 實用技巧 >Q-learning的進階版演算法

Q-learning的進階版演算法

文章目錄

Double DQN(DDQN)

DQN的Q-value往往是被高估的,如下圖
在這裡插入圖片描述
上圖為四個遊戲的訓練結果的對比。

橙色的曲線代表DQN估測的Q-value,橙色的直線代表DQN訓練出來的policy實際中獲得的Q-value

藍色的曲線代表Double DQN估測的Q-value,藍色的直線代表Double DQN訓練出來的policy實際中獲得的Q-value

由圖可以看出兩點:

1.從橙色的曲線和橙色的直線可以看出,DQN估測出來的Q-value,往往會高於實際中的Q-value
2.從橙色的直線和藍色的直線可以看出,Double DQN訓練出來的policy,一般會好過DQN訓練出來的policy

在這裡插入圖片描述
從Q-function的概念可以得出, Q ( s t , a t ) Q(s_t,a_t) Q(st,at)的結果會接近於。但是 m a x Q ( s t + 1 , a ) maxQ(s_{t+1},a) maxQ(st+1,a)往往容易會得到高估的結果,以下圖為例子:
在這裡插入圖片描述
4個柱子代表4個action得到的Q-value,實際上都是相同的;右圖綠色的部分表示高估的部分。

因為Q-function本身就是一個network,估測出來的值本身是有誤差的,所以原本4個action都相等的Q-value就變成右圖的樣子。而因為 m a x Q ( s t + 1 , a ) maxQ(s_{t+1},a) maxQ(st+1,a),所以又往往會選擇Q-value最大的那個結果。所以就會導致 Q ( s t + 1 , a t ) = r t + m a x Q ( s t + 1 , a ) Q(s_{t+1},a_t) = r_t + maxQ(s_{t+1},a) Q(st+1,at)=rt+maxQ(st+1,a)的結果總是偏大。
在這裡插入圖片描述
在Double DQN的右邊中,決定採取Q-value最大的action,然後由算出Q-value。

好處:

即便Q過估計了某個值,只要Q^'沒有高估,最後的結果還是正常的
即便Q^'過估計了某個值,只要Q沒有選到那個action,最後的結果還是正常的
Q^'可以採用Target network去算Q-value,這樣就不用訓練額外的network。

Dueling DQN

Dueling DQN做得唯一一件事就是改network的架構 。
如下圖,上半部分為DQN,下半部分為Dueling DQN。
在這裡插入圖片描述
Dueling DQN中,輸出結果變成 Q ( s , a ) = A ( s , a ) + V ( s ) Q(s,a) = A(s,a) + V(s) Q(s,a)=A(s,a)+V(s),因為有時候在某種state,無論做什麼動作,對下一個state都沒有多大的影響,所以將Q-function分解為兩部分。比如,在一個好的state,無論做什麼action,都能得到很高的value;在一個很差的state,無論做什麼action,都只會得到一個很低的value。

舉個例子:
在這裡插入圖片描述
上表中, Q ( s , a ) = A ( s , a ) + V ( s ) Q(s,a) = A(s,a) + V(s) Q(s,a)=A(s,a)+V(s)

初始狀態為左圖所示。假設現在我們sample到新的Q-value Q ( s 2 , a 1 ) , Q ( s 2 , a 2 ) Q(s_2,a_1),Q(s_2,a_2) Q(s2,a1)Q(s2,a2)如中間圖所示。這時network可以選擇不更新 A ( s 2 , a 1 ) A(s_2,a_1) A(s2,a1) A ( s 2 , a 2 ) A(s_2,a_2) A(s2,a2),而去更新 V ( s 2 ) V(s_2) V(s2),如中間圖所示。

更新完 V ( s 2 ) V(s_2) V(s2)後,可以看到 Q ( s 2 , a 3 ) Q(s_2,a_3) Q(s2,a3)也跟著被更新了。這樣的好處是,原本只sample到 Q ( s 2 , a 1 ) , Q ( s 2 , a 2 ) Q(s_2,a_1),Q(s_2,a_2) Q(s2,a1)Q(s2,a2)的更新,但是由於 V ( s 2 ) V(s_2) V(s2)被更新,就使得 Q ( s 2 , a 3 ) Q(s_2,a_3) Q(s2,a3)也同樣被更新,即便 Q ( s 2 , a 3 ) Q(s_2,a_3) Q(s2,a3)沒有在實際中被sample到。這樣實現比較有效率地使用資料,加速訓練。

(那 Q ( s 2 , a 3 ) Q(s_2,a_3) Q(s2,a3)沒有被sample到,然後也跟著更新會不會造成錯誤的結果呢?答案是不會,因為根據sample到的data,在s2無論採取 a 1 a_1 a1 a 2 a_2 a2都會使得 Q ( s 2 , a 1 ) , Q ( s 2 , a 2 ) Q(s_2,a_1),Q(s_2,a_2) Q(s2,a1)Q(s2,a2)進一步上升,所以可以把s2看成是一個好的state,無論採取什麼action,都會得到好的結果)

為了防止network把V(s)直接調成0,然後導致 Q ( s , a ) = A ( s , a ) Q(s,a) = A(s,a) Q(s,a)=A(s,a),這樣Dueling DQN和普通的DQN就沒區別了,所以需要對 A ( s , a ) A(s,a) A(s,a)做一下限制。這樣對 A ( s , a ) A(s,a) A(s,a)進行引數更新比較麻煩,network就會傾向於對V(s)進行引數更新。

具體來說,所加的限制可以是:強制A(s,a)的每一列的和都為0,如上圖所示。

加上這個限制後,按照剛才的例子,如果 Q ( s 2 , a ) Q(s_2,a) Q(s2,a)這一列都加1,network如果不去調 V ( s 2 ) V(s_2) V(s2)而去調 A ( s 2 , a ) A(s_2,a) A(s2,a)的值都加1,就會導致最終 A ( s 2 , a ) A(s_2,a) A(s2,a)這一列的和不為0,沒辦法符合上述的限制。所以加上這個限制後就防止network只調 A ( s , a ) A(s,a) A(s,a)而不去調V(s)。

這時V(s)可以看成Q(s,a)每一列的平均值,推導如下:

Q ( s 1 , a 1 ) + Q ( s 1 , a 2 ) + Q ( s 1 , a 3 ) = V ( s 1 ) + A ( s 1 , a 1 ) + V ( s 1 ) + A ( s 1 , a 2 ) + V ( s 1 ) + A ( s 1 , a 3 ) = V ( s 1 ) + V ( s 1 ) + V ( s 1 ) + 0 Q(s_1,a_1) + Q(s_1,a_2) + Q(s_1,a_3) =V(s_1)+A(s_1,a_1) + V(s_1)+A(s_1,a_2) + V(s_1)+A(s_1,a_3) =V(s_1) +V(s_1)+ V(s_1) + 0 Q(s1,a1)+Q(s1,a2)+Q(s1,a3)=V(s1)+A(s1,a1)+V(s1)+A(s1,a2)+V(s1)+A(s1,a3)=V(s1)+V(s1)+V(s1)+0

下圖展示了實際過程中,如何使 A ( s , a ) A(s,a) A(s,a)的每一列的和都為0:
在這裡插入圖片描述
上圖V(s)的輸出值為1,A(s,a)的輸出值為{7,3,2}

為了使A(s,a)的每一列的和都為0,可以使A(s,a)的每個數減去對應所在列的平均數,即{7,3,2}變成{3,-1,-2},此為Normalization的過程。

優先回放(Prioritized Experience Replay)

之前在buffer中sample資料去訓練network的時候,是無差別地sample每一筆資料,就是說沒有偏向於sample哪些資料。

這樣做的不足是有些:有時候因為sample到的某一筆訓練資料質量不好,造成 Q ( s t , a t ) Q(s_t,a_t) Q(st,at)估測的值和 r t + Q ( s t + 1 , a t + 1 ) r_t + Q(s_{t+1},a_{t+1}) rt+Q(st+1,at+1)的差距比較大(即TD error)。如果接下去還是無差別地sample每一筆資料,就會導致這些TD error比較大的情況沒有得到更多更好的訓練,就會導致Q network 在有些情況估值不準確。
在這裡插入圖片描述

所以使用Prioritized Reply後,對於那些會造成TD error的情況,就會傾向於sample更多相關的資料來訓練network,使得network克服這個TD error。(舉個例子:A同學數學考99分,英語考30分,那他就應該買多點英語資料來學習,而不是數學英語仍然花同樣的力氣去學。)

N step bootstraping

MC是計算的在s_t之後直到episode結束的所有reward,TD是計算 s t 到 s t + 1 s_t到s_{t+1} stst+1的reward。

Multi-step這個方法結合了MC和TD各自的特點,將TD改為計算 s t 到 s t + n s_t到s_{t+n} stst+n,即由原來跳到下一個狀態,改為跳到之後n個狀態。特殊的,直接跳到episode結束則變為MC方法。
在這裡插入圖片描述
在之前的Q-function的訓練中,從buffer中sample出 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1),左邊Q network的輸入為 s t , a t s_t,a_t stat,輸出結果 Q ( s t , a t ) Q(s_t,a_t) Q(st,at),右邊target network的輸入為 s t + 1 s_{t+1} st+1 a t + 1 a_{t+1} at+1,輸出結果 Q ( s t + 1 , a t + 1 ) Q(s_{t+1},a_{t+1}) Q(st+1,at+1)再加上 r t r_t rt,最終訓練結果應該使這兩個結果儘可能接近。

而使用Multi-step後,假設為N step,則應從buffer中sample出。左邊左邊Q network的輸入為 s t , a t s_t,a_t stat,輸出結果 Q ( s t , a t ) Q(s_t,a_t) Q(st,at),右邊target network的輸入為 s t + N + 1 s_{t+N+1} st+N+1 a t + N + 1 a_{t+N+1} at+N+1,輸出結果 Q ( s t + N + 1 , a t + N + 1 ) Q(s_{t+N+1},a_{t+N+1}) Q(st+N+1,at+N+1)再加上從t到t+N的所有reward的總和。

Noisy Net

在這裡插入圖片描述
這個技術是為了改進exploration的。之前的exploration(epsilon greedy)是在action上做noise。而Noisy Net是在Q-function的引數上做noise。

注意:在每一個episode開始前,對Q-function的引數新增noise,用這個添加了noise的network去玩遊戲,直到episode結束,才可以重新新增新的noise。

在這裡插入圖片描述
在action上加noise,即epsilon-greedy,就算給出同一個state s,也會做出不同的action,可能是按照Q-function的結果,也可能是以random得到的結果。這不符合實際的情況,因為實際上我們希望給出同一個state,都會做出同樣的action。

而在Q-function的引數上加noise,因為在這個方法規定了只在一個episode開始前新增noise,不會在episode中途再增加noise,所以在episode中遇到同一個state都會做出同樣的action。所以它是比較有系統地進行exploration。比如在一個episode中,遇到狀態 s t s_t st都採取“向右”的action,在另一個episode遇到狀態 s t s_t st都採取“向左”的action。

Distributional Q-function

在這裡插入圖片描述
使用同一policy的actor在同一個state採取同一個action,得到的cumulated reward是不同的,因為後續state是具有隨機性的。如果對它進行統計,會發現它是會呈現一個分佈(distribution)。而Q-value就是這些分佈取mean的結果。

這樣做有一個不足就是:即便mean相同,但是可能實際的分佈是完全不同的。然而因為Q-function只輸出Q-value(即分佈的mean),所以我們看不到實際的分佈。

所以Distributional Q-function就是為了能夠實現從輸出Q-value變成輸出Q-function的分佈。
在這裡插入圖片描述
左邊為Q-function,右邊為Distributional Q-function。

三種顏色代表三種action

同一顏色不同柱子代表在同一state下采取同一action產生的reward落在分佈裡的機率,具體來說,在綠色柱子裡,5個柱子的X軸代表5種不同reward,Y軸代表在某一state採取某一action得到的reward落在此處的機率。

Distributional Q-function的好處:有了具體的分佈,我們不僅可以從中挑選一個mean最大的動作之後(其實這一步不用Distributional Q-function也能做),還能進一步考慮哪個分佈的方差最小,進一步降低不穩定的可能性。

Rainbow

在這裡插入圖片描述
這種就是把前面所有的方法全部運用在一起,可以看到最終效果還是很不錯的。

其中,文章前面講到的Multi-step可以看A3C當做參考,因為A3C中就有運用到 Multi-step 的技術。
在這裡插入圖片描述
這張圖講的是,在上面的Rainbow拿掉某一種技術後導致分數降低多少(比如綠色的線就是拿掉Dueling DQN技術)。

其中拿掉Double DQN後沒有產生影響,是因為有使用Distribution Q-function的時候,一般就克服了DQN過估計(over estimate)reward的問題(而這正是Double DQN想解決的問題),甚至會出現略微低估(under estimate)reward的情況,所以使用Double DQN的效果就沒有那麼大。Distribution Q-function之所以能解決過估計,是因為Distribution Q-function的輸出是一個分佈,而這個分佈的X軸(即reward大小)是有一個區間的,假設這個區間是[-10,10],而這時過估計的reward為100,超出這個區間,就沒有被記錄到,所以就不會有過估計(over estimate)的情況發生。