1 概述
在之前介紹的幾種方法,我們對值函數一直有一個很大的限制,那就是它們需要用表格的形式表示。雖說表格形式對於求解有很大的幫助,但它也有自己的缺點。如果問題的狀態和行動的空間非常大,使用表格表示難以求解,因為我們需要將所有的狀態行動價值求解出來,才能保證對於任意一個狀態和行動,我們都能得到對應的價值。因此在這種情況下,傳統的方法,比如Q-Learning就無法在內存中維護這么大的一張Q表。
針對上面的問題,於是有人提出用一個模型來表示狀態,動作到值函數的關系。我們令狀態為 $s \in S $,行動為 $a \in A $,引入一個狀態價值函數 $\hat{v}$,函數的參數為 $w$,接收狀態 $s$ 的輸入,則有:
$ \hat{v}(s, w) \approx v_{\pi}(s) $
對於動作-狀態價值函數也是一樣可以表示為:
$ \hat{q}(s,a,w) \approx q_{\pi}(s,a) $
還有一種表現形式是輸入狀態向量 $s$,輸出每個動作 ${a_i}\in{A}$ 所對應的 $\hat{q}(s,a_i,w) $。具體的如下如所示:

雖說有上面三種表達形式,但一般我們用第三種方式,這一種方法會獲得所有動作的Q值,這樣就可以很方便的使用貪婪策略和$\epsilon-greedy$。
現在的問題是我們該用什么樣的函數來表作為價值函數呢?最簡單的就是線性函數,用 $\phi(s)$ 表示狀態 $s$ 的特征向量,則此時我們的狀態價值函數可以表示為:
$ \hat{v}(s, w) = \phi(s)^Tw$
除了線性表示還可以用非線性函數來表示,最常用的非線性表示就是神經網絡,在神經網絡中可以使用DNN,CNN,RNN。
2 Deep Q-Learning 算法
Deep Q-Learning 算法簡稱DQN,DQN是在Q-Learning的基礎上演變而來的,DQN對Q-Learning的修改主要有兩個方面:
1)DQN利用深度卷積神經網絡逼近值函數。
2)DQN利用了經驗回放訓練強化學習的學習過程。
我們現在來具體看看這兩個方面:
1)DQN的行為值函數是利用神經網絡逼近,屬於非線性逼近,DQN所用的網絡結構是三個卷積層加兩個全連接層。用公式表示的話,值函數為$Q(s, a; \theta)$,此時更新網絡其實就是更新參數 $\theta$,一旦$\theta$定了,網絡參數就定了。
2)DQN最主要的特點是引入了經驗回放,即將一個五元組 $(s_j, a_j, R_j, s'_j, {is\_end}_j)$ 添加到一個經驗池中,這些五元組之后將用來更新Q網絡參數,在這里$s_j$ 和$s'_j$ 都是向量的形式,動作和獎勵是標量,$is\_end$是布爾值。
接下來我們看看整體訓練步驟:
假設迭代輪數為EPISODES,采樣的序列最大長度為L,學習速率為$\alpha$,衰減系數為$\gamma$,探索率$\epsilon$,狀態集為S,動作集為A,批量梯度下降時的batch_size = m,經驗回放池最大尺寸n。
1)for episode in range(EPISODES): # 開始迭代
2)初始化狀態s,在這里s為狀態向量
3)for step in range(T): # 序列采樣
a) 在這里將狀態向量$s$輸入到$Q$網絡中,采用${\epsilon}-greedy$ 獲得動作$a$;
b) 在狀態s下執行當前動作$a$,獲得下一狀態$s‘$,當前獎勵$R$,是否終止狀態${is\_end}$;
c) 將上面獲得的五元組 $(s_j, a_j, R_j, s'_j, {is\_end}_j)$ 添加到經驗回放池中:
A)判斷若池子的大小大於m值,則從池子中批量采樣並更新網絡參數;
一)從經驗回放池中隨機采取m個樣本 $(s_j, a_j, R_j, s'_j, {is\_end}_j)$ ,其中$j = 1, 2, 3....,m$,計算目標值$y_j$(若當作監督學習來看,可以將這個看作是樣本的真實值):
$y_j= \begin{cases} R_j& {is\_end_j\; is \;true}\\ R_j + \gamma\max_{a'}Q(s'_j, a'_j, w) & {is\_end_j \;is\; false} \end{cases}$
二)使用均方差損失函數 $\frac{1}{m}\sum\limits_{j=1}^m(y_j-Q(s_j, a_j, w))^2$ 更新$Q$網絡參數(在這里$Q(s_j, a_j, w)$其實可以看作預測值,所以網絡參數更新階段和監督學習一樣)。
B)判斷若池子大小若大於n,則從池子中取出最早加入的五元組,添加新的五元組;
d) 對狀態進行更新,$s = s'$;
e) 判斷is_end是否是最終狀態,若是循環結束,跳轉到1),若不是繼續循環采樣。
看完整個流程之后再來回頭看經驗回放的作用:我們知道在訓練神經網絡的時候是假設訓練數據是獨立同分布的,但如果你采取當前參數下的網絡獲得的樣本來更新當前的網絡參數,那么這些順序數據之間存在很強的關聯性,網絡的訓練會很不穩定,現在利用經驗回放的方法,你在更新當前時刻參數時會隨機用到不同時刻參數下獲得的樣本,這樣樣本之間的關聯性相對來說比較小。直接訓練Q網絡的好處是,只要Q值收斂了,則每個狀態對應的最大動作也就確定了,也就是確定性的策略是已經確定了。
3 Nature DQN 算法
在上面的DQN中,我們可以看到在計算目標值$y_j$時和計算當前值用的是同一個網絡$Q$,這樣在計算目標值$y_j$時用到了我們需要訓練的網絡$Q$,之后我們又用目標值$y_j$來更新網絡$Q$的參數,這樣兩者的依賴性太強,不利於算法的收斂,因此在Nature DQN中提出了使用兩個網絡,一個原網絡$Q$用來選擇動作,並更新參數,另一個目標網絡$Q'$只用來計算目標值$y_j$,在這里目標網絡$Q'$的參數不會進行迭代更新,而是隔一定時間從原網絡$Q$中復制過來,因此兩個網絡的結構也需要完全一致,否則無法進行參數復制。
我們簡單的從公式上介紹下和DQN算法的不同,在這里有兩個網絡$Q$和$Q'$,他們對應的參數分別是$w$和$w'$,在這里的更新頻率可以自己設定,更新參數直接$w'=w$。
除此之外,我們還需要更改的就是目標值$y_j$的計算公式為:
$y_j= \begin{cases} R_j& {is\_end_j\; is \;true}\\ R_j + \gamma\max_{a'}Q’(s'_j, a'_j, w‘) & {is\_end_j \;is\; false} \end{cases}$
其余的和DQN完全相同。
4 Double DQN 算法
無論是DQN,還是Nature DQN都無法克服Q-Learning本身多固有的缺陷-過估計。
過估計是指估計得值函數比真實值函數要大,其根源主要在於Q-Learning中的最大化操作,從上面可以看到在動作選擇中的目標是 $R_j + \gamma\max_{a'}Q’(s'_j, a'_j, w‘)$,其中的$max$操作使得估計的值函數比值函數的真實值大(注:對於真實的策略來說並在給定的狀態下並不是每次都選擇使得Q值最大的動作,因為一般真實的策略都是隨機性策略,所以在這里目標值直接選擇動作最大的Q值往往會導致目標值要高於真實值),為了解決值函數過估計的問題,Hasselt提出了Double DQN的方法,其定義是將動作的選擇和動作的評估分別用不同的值函數來實現,而在Nature DQN中正好我們提出了兩個Q網絡。Double DQN也簡稱DDQN,其計算目標值$y_j$的步驟可以拆分為兩步(針對$is\_end is False$這種條件):
1)$a^{max}(s'_i, w) = \max_{a'}Q(s'_i, a, w) $ 這一步是通過原網絡Q獲得最大值函數的動作$a$;
2) $y_j = R_j + \gamma Q'(s'_j, a^{max}(s'_i, w) , w‘) $ 這一步是通過目標$Q'$網絡獲得上面的動作$a$對應的值。
將兩個結合起來可以得到DDQN的目標值$y_j$的計算式:
$y_j= \begin{cases} R_j& {is\_end_j\; is \;true}\\ R_j + \gamma Q'(s'_j,\arg\max_{a'}Q(s'_j,a,w),w')& {is\_end_j\; is \;false} \end{cases}$
除此之外,其余的和Nature DQN一樣
5 Prioritized Replay DQN 算法
在經驗回放中是利用均勻分布采樣,而這種方式看上去並不高效,對於智能體而言,這些數據的重要程度並不一樣,因此提出優先回放(Prioritized Replay)的方法。優先回放的基本思想就是打破均勻采樣,賦予學習效率高的樣本以更大的采樣權重。
一個理想的標准是智能體學習的效率越高,權重越大。符合該標准的一個選擇是TD偏差$\delta$。TD偏差越大,說明該狀態處的值函數與TD目標的差距越大,智能體的更新量越大,因此該處的學習效率越高。
優先回放DQN主要有三點改變:
1)為了方便優先回放存儲與及采樣,采用sumTree樹來存儲;
2)目標函數在計算時根據樣本的TD偏差添加了權重(權重和TD偏差有關,偏差越大,權重越大):
$\frac{1}{m}\sum\limits_{j=1}^m w_j (y_j-Q(s_j, a_j, w))^2$
3) 在這里TD誤差的計算:$\delta_j = y_j- Q(s_j, a_j, w)$。因此每次更新$Q$網絡參數時,都需要重新計算TD誤差。
除了上面三點,其余的和DDQN一樣,代碼實現起來相對復雜,因為要構建sumTree,另外因為要計算的東西較多,而且每次都需要更新TD誤差,因此算法的速度比較慢,個人感覺不是很好用,因此不做過多的介紹。
6 Dueling DQN 算法
和前面所講的各種DQN算法不同,Dueling DQN將整個模型結構分成了兩個部分,一個為狀態值函數,一個為優勢函數,即:
$ Q^{\pi} (s, a) = V^{\pi} (s) + A^{\pi} (s, a) $
在這里狀態值函數和動作無關,而且其也只會返回一個狀態值,優勢函數和動作和狀態都有關。我們將上面的表達式細化,則有:
$ Q(s, a, w, \alpha, \beta) = V(s, w, \alpha) + A(s, a, w, \beta)$
即狀態值函數和優勢函數會共享一部分參數w,又各自有自己獨有的參數$\alpha$和$\beta$。
Dueling DQN原則上可以和上面任意一個DQN算法結合,只需要將Dueling DQN的模型結構去替換上面任意一個DQN網絡的模型結構。
但一般在使用中我們會對優勢函數$A$做中心化處理:
$Q(s,a, w, \alpha, \beta) = V(s,w,\alpha) + (A(s,a,w,\beta) - \frac{1}{\mathcal{A}}\sum\limits_{a' \in \mathcal{A}}A(s,a', w,\beta))$
