一、DQN算法是什么
DQN,即深度Q網(wǎng)絡(Deep Q-network),是指基于深度學習的Q-Learing算法。
回顧一下Q-Learing:強化學習——Q-Learning算法原理
Q-Learing算法維護一個Q-table,使用表格存儲每個狀態(tài)s下采取動作a獲得的獎勵,即狀態(tài)-價值函數(shù)Q(s,a),這種算法存在很大的局限性。在現(xiàn)實中很多情況下,強化學習任務所面臨的狀態(tài)空間是連續(xù)的,存在無窮多個狀態(tài),這種情況就不能再使用表格的方式存儲價值函數(shù)。
為了解決這個問題,我們可以用一個函數(shù)Q(s,a;w)來近似動作-價值Q(s,a),稱為價值函數(shù)近似Value Function Approximation,我們用神經(jīng)網(wǎng)絡來生成這個函數(shù)Q(s,a;w),稱為Q網(wǎng)絡(Deep Q-network),w是神經(jīng)網(wǎng)絡訓練的參數(shù)。
二、DQN訓練過程
神經(jīng)網(wǎng)絡的的輸入是狀態(tài)s,輸出是對所有動作a的打分
圖源于:Shusen Wang深度強化學習課程
神經(jīng)網(wǎng)絡的訓練是一個最優(yōu)化問題,我們需要表示網(wǎng)絡輸出和標簽值之間的差值,作為損失函數(shù),目標是讓損失函數(shù)最小化,手段是通過反向傳播使用梯度下降的方法來更新神經(jīng)網(wǎng)絡的參數(shù)。
那么Q網(wǎng)絡的標簽值/目標值是什么呢?
就是TD target :
y
t
=
r
t
+
γ
?
max
?
a
Q
(
s
t
+
1
,
a
;
w
)
{\color{Red}y_t = r_t + \gamma \cdot \max_aQ(s_{t+1},a;w)}
yt?=rt?+γ?maxa?Q(st+1?,a;w)
我們先介紹最原始的DQN算法,后面會加入經(jīng)驗回放、目標函數(shù)等技巧。
具體過程:
1、初始化網(wǎng)絡,輸入狀態(tài) s t s_t st?,輸出 s t s_t st?下所有動作的Q值;
2、利用策略(例如 ε ? g r e d d y \varepsilon-greddy ε?greddy),選擇一個動作 a t a_t at?,把 a t a_t at?輸入到環(huán)境中,獲得新狀態(tài) s t + 1 s_{t+1} st+1? 和 r;
3、計算TD target: y t = r t + γ ? max ? a Q ( s t + 1 , a ; w ) y_t = r_t + \gamma \cdot \max_aQ(s_{t+1},a;w) yt?=rt?+γ?maxa?Q(st+1?,a;w)
4、計算損失函數(shù): L = 1 / 2 [ y t ? Q ( s , a ; w ) ] 2 L = 1/2[y_t - Q(s,a;w)]^2 L=1/2[yt??Q(s,a;w)]2
5、更新Q參數(shù),使得Q( s t s_t st?, a t a_t at?) 盡可能接近 y t y_t yt?,可以把它當做回歸問題,利用梯度下降做更新工作;
6、從以上步驟我們得到一個四元組transition: ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st?,at?,rt?,st+1?),用完之后丟棄掉;
7、輸入新的狀態(tài),重復更新工作
圖源于:[知乎.張斯俊] https://zhuanlan.zhihu.com/p/110620815
三、經(jīng)驗回放 (Experience Replay)
在理解經(jīng)驗回放之前,先看看原始DQN算法的缺點:
1、用完一個transition:
(
s
t
,
a
t
,
r
t
,
s
t
+
1
)
(s_t,a_t,r_t,s_{t+1})
(st?,at?,rt?,st+1?)就丟棄,會造成對經(jīng)驗的浪費;
2、之前,我們按順序使用transition,前一個transition和后一個transition相關(guān)性很強,這種相關(guān)性對學習Q網(wǎng)絡是有害的。
經(jīng)驗回放可以克服上面兩個缺點:
1.把序列打散,消除相關(guān)性,使得數(shù)據(jù)滿足獨立同分布,從而減小參數(shù)更新的方差,提高收斂速度。
2.能夠重復使用經(jīng)驗,數(shù)據(jù)利用率高,對于數(shù)據(jù)獲取困難的情況尤其有用。
在進行強化學習的時候,往往最花時間的步驟是與環(huán)境交互,訓練網(wǎng)絡反而是比較快的,因為我們用GPU訓練很快。用回放緩沖區(qū)可以減少與環(huán)境交互的次數(shù),經(jīng)驗不需要統(tǒng)統(tǒng)來自某一個策略,一些由過去的策略所得到的經(jīng)驗可以再回放緩沖區(qū)被使用多次,反復地再利用。
經(jīng)驗回放會構(gòu)建一個回放緩沖區(qū)(replay buffer),存儲n條transition,稱為經(jīng)驗
某一個策略
π
\pi
π與環(huán)境交互,收集很多條transition,放入回放緩沖區(qū),回放緩沖區(qū)中的經(jīng)驗transition可能來自不同的策略。
回放緩沖區(qū)只有在它裝滿的時候才會吧舊的數(shù)據(jù)丟掉圖源于:Shusen Wang深度強化學習課程
每次隨機抽出一個batch大小的transition數(shù)據(jù)訓練網(wǎng)絡,算出多個隨機梯度,用梯度的平均更新Q網(wǎng)絡參數(shù)w
對經(jīng)驗回放的改進:
優(yōu)先經(jīng)驗回放 (Prioritized Experience Replay):區(qū)別在于用非均勻抽樣代替均勻抽樣。詳細的這里就不贅述了。
四、目標網(wǎng)絡(Target Network)
為什么要用目標網(wǎng)絡?
我引用https://blog.csdn.net/weixin_46133643/article/details/121845874這篇博客的描述:
我們在訓練網(wǎng)絡的時候,動作價值估計和權(quán)重w有關(guān)。當權(quán)重變化時,動作價值的估計也會發(fā)生變化。在學習的過程中,動作價值試圖追逐一個變化的回報,容易出現(xiàn)不穩(wěn)定的情況。
這部分我在有些書上也看到有類似的描述,雖然直覺上認為這樣訓練的確是不穩(wěn)定的,但是這種不穩(wěn)定的具體表現(xiàn)或者說嚴謹?shù)膬?nèi)部邏輯是怎樣的不太理解。
Shusen Wang課程視頻中對目標網(wǎng)絡這部分講的比較清楚,這里面存在一個高估(Overestimation) 問題
1、自舉(Bootstrapping)
這里引入自舉(Bootstrapping) 概念:
Bootstrapping本意是“解鞋帶”,來自《吹牛大王歷險記》中拔靴自助的典故,是指通過拔鞋帶把自己舉起來。
在強化學習中,自舉是指用后繼的估算值,來更新現(xiàn)在狀態(tài)的估算值。
我們計算的 TD target :
y
t
=
r
t
+
γ
?
max
?
a
Q
(
s
t
+
1
,
a
;
w
)
{\color{Red}y_t = r_t + \gamma \cdot \max_aQ(s_{t+1},a;w)}
yt?=rt?+γ?maxa?Q(st+1?,a;w)
r
t
{\color{Red} r_t }
rt? 是根據(jù)實際觀測得到的值
max
?
a
Q
(
s
t
+
1
,
a
;
w
)
{\color{Red}\max_aQ(s_{t+1},a;w)}
maxa?Q(st+1?,a;w) 是根據(jù)Q網(wǎng)絡在
s
t
+
1
s_{t+1}
st+1?時做出的估計值
因此
y
t
y_t
yt?有部分是來自Q網(wǎng)絡的估算,而我們用
y
t
y_t
yt?來更新Q網(wǎng)絡本身,所以這屬于自舉。
我們計算TD target的時候,是最大化Q值的:
max
?
a
Q
(
s
t
+
1
,
a
;
w
)
\max_aQ(s_{t+1},a;w)
maxa?Q(st+1?,a;w)
這里的最大化和上面的Bootstrapping過程都會引起高估的問題,利用目標網(wǎng)絡可以一定程度避免自舉,減緩高估問題。具體分析過程這里就不展開敘述了。
2、目標網(wǎng)絡:
Target Network是在2015年論文 Mnih et al.Human-level control through deep reinforcement learning. Nature, 2015 中提出的,地址:https://www.nature.com/articles/nature14236/
我們使用第二個網(wǎng)絡,稱為目標網(wǎng)絡, Q ( s , a ; w ? ) Q(s,a;{\color{Red} w^-}) Q(s,a;w?),網(wǎng)絡結(jié)構(gòu)和原來的網(wǎng)絡 Q ( s , a ; w ) Q(s,a; w) Q(s,a;w)一樣,只是參數(shù)不同 w ? ≠ w w^- \neq w w?=w,原來的網(wǎng)絡稱為評估網(wǎng)絡
兩個網(wǎng)絡的作用不一樣:評估網(wǎng)絡 Q ( s , a ; w ) Q(s,a; w) Q(s,a;w)負責控制智能體,收集經(jīng)驗;目標網(wǎng)絡 Q ( s , a ; w ? ) Q(s,a;{\color{Red} w^-}) Q(s,a;w?)用于計算TD target: y t = r t + γ ? max ? a Q ( s t + 1 , a ; w ? ) {\color{Red}y_t = r_t + \gamma \cdot \max_aQ(s_{t+1},a;w^-)} yt?=rt?+γ?maxa?Q(st+1?,a;w?)
在更新過程中,只更新評估網(wǎng)絡 Q ( s , a ; w ) Q(s,a; w) Q(s,a;w)的權(quán)重w,目標網(wǎng)絡 Q ( s t + 1 , a ; w ? ) Q(s_{t+1},a;w^-) Q(st+1?,a;w?)的權(quán)重 w ? w^- w?保持不變。在更新一定次數(shù)后,再將更新過的評估網(wǎng)絡的權(quán)重復制給目標網(wǎng)絡,進行下一批更新,這樣目標網(wǎng)絡也能得到更新。由于在目標網(wǎng)絡沒有變化的一段時間內(nèi)回報的目標值是相對固定的,因此目標網(wǎng)絡的引入增加了學習的穩(wěn)定性。
圖源于:博客園.jsfantasy強化學習 7——Deep Q-Learning(DQN)公式推導
五、Double DQN
引入目標網(wǎng)絡可以一定程度減緩高估問題,但是還是有最大化操作,高估問題還是很嚴重,而Double DQN可以更好地緩解高估問題(但也沒有徹底根除高估問題)。
Double DQN做的改進其實很簡單:
我們用原始網(wǎng)絡
Q
(
s
,
a
;
w
)
Q(s,a; w)
Q(s,a;w),選出使Q值最大化的那個動作,記為
a
?
{\color{Red}a^*}
a?,再用目標網(wǎng)絡使用這個
a
?
{\color{Red}a^*}
a?計算目標值:
y
t
=
r
t
+
γ
?
Q
(
s
t
+
1
,
a
?
;
w
?
)
y_t = r_t + \gamma \cdot Q(s_{t+1},{\color{Red}a^*};w^-)
yt?=rt?+γ?Q(st+1?,a?;w?),
由于:
Q
(
s
t
+
1
,
a
?
;
w
?
)
≤
max
?
a
Q
(
s
t
+
1
,
a
;
w
?
)
Q(s_{t+1},{\color{Red}a^*};w^-) \leq \max_{\color{Red}a}Q(s_{t+1},{\color{Red}a};w^-)
Q(st+1?,a?;w?)≤maxa?Q(st+1?,a;w?)
所以進一步減緩了最大化帶來的高估問題。
圖源于:Shusen Wang深度強化學習課程
六、總結(jié)
偽代碼:
整體來說,深度Q網(wǎng)絡與Q學習的目標價值以及價值的更新方式都非常相似。主要的不同在于:深度Q網(wǎng)絡將Q學習與深度學習結(jié)合,用深度網(wǎng)絡來近似動作價值函數(shù),而Q學習則是采用表格存儲;深度Q網(wǎng)絡采用經(jīng)驗回放的訓練方式,從歷史數(shù)據(jù)中隨機采樣,而Q學習直接采用下一個狀態(tài)的數(shù)據(jù)進行學習。文章來源:http://www.zghlxwxcb.cn/news/detail-785246.html
參考:
[1] https://www.bilibili.com/video/BV1rv41167yx?p=10&vd_source=a433a250e74c87c3235dea6a203f8a29
[2] 王琦.強化學習教程[M]
[3] https://zhuanlan.zhihu.com/p/110620815
文章圖源于:百度飛槳AlStudio、Shusen Wang深度強化學習課程等*文章來源地址http://www.zghlxwxcb.cn/news/detail-785246.html
到了這里,關(guān)于深度強化學習——DQN算法原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!