(零基礎可以看懂)深度強化學習之DQN類演算法之第1篇-2013年NeurIPS版本的DQN(含程式碼)-《強化學習系列專欄第4篇》
(零基礎可以看懂)深度強化學習之DQN類演算法-第1篇(含程式碼)-《強化學習系列專欄第4篇》
背景
DQN是由Deep Q-Learning縮寫而來。從名字中可以看出,其本質上還是一種Q-Learning演算法,只不過結合了深度學習。2013年的時候,位於倫敦的DeepMind(現在已經被谷歌收購了,也就是Alpha Go的父母)在NeurIPS發表了一篇名為《Playing Atari with Deep Reinforcement Learning》的論文,它出人不意的將神經網路引進到了Q-Learning演算法中。該模型可以通過訓練後,讓其自主的玩那種我們小時候玩的小霸王的那種遊戲(暴露了我的年齡,哈哈)。下面,我開始講解這篇論文,並將我自己復現的程式碼放上來。
論文原文連結
《Playing Atari with Deep Reinforcement Learning》
介紹
讀懂這篇論文還需要知道一些前置的知識,前置的知識我已經講解過了,在我的部落格上,我附一下連結。
第1篇:(零基礎可以看懂)強化學習中的動態規劃(貝爾曼方程)(含程式碼)-《強化學習系列專欄第1篇》
第2篇:(零基礎可以看懂)強化學習中的蒙特卡羅應用(貝爾曼方程)(含程式碼)-《強化學習系列專欄第2篇》
第3篇:(零基礎可以看懂)強化學習中的時間差分演算法(含程式碼)-《強化學習系列專欄第3篇》
與Q-Learning的區別在於,DQN使用了神經網路當作其Q函式(Q table),由於神經網路的連續及非線性的特徵,使得神經網路可以表示“無限多”的狀態。
模型關鍵部分解釋
我們這裡以打乒乓這個遊戲舉例子,在gym裡面名稱為“Pong-v0”。遊戲如下圖,
①演算法中使用了一個名為replay memory的變數D(程式碼中實際上是一個佇列)去儲存情形(當前的狀態,當前的行為,當前行為的獎勵,下一個狀態),然後訓練的時候,從變數D中隨機選取batch_size個樣本去訓練神經網路部分。這樣做的目的是為了防止訓練資料的連續性導致模型的不夠泛化(因為是隨機抽取的,所以可以保證每次抽取出來的訓練資料不是連續的)。這個replay memory是有最大儲存限制的,論文中是設定了D的最大長度是100萬。
②為了減少狀態的數量,論文中對圖片進行了預處理,由於圖片是210160(高
③由於如果只放一張圖片到神經網路裡面去,神經網路並不會捕捉到動態的資訊,比如球到底是從左邊往右邊飛,還是從右邊往左邊飛(玩遊戲是一個類似視訊一樣有前後動態關係的一種場景),因此,要想讓神經網路知道這是一個動態的狀態,我們將此時此刻這1幀圖片,再加前3幀圖片,組成4個通道,放到神經網路裡,這樣一來,神經網路就知道“前因後果”中的“前因”了,它就知道球從哪個方向飛過來了。
④神經網路部分其實是對圖片進行一個特徵提取,然後對映到可行的動作的數量的維度上。神經網路的結構是這樣的:
第1層:首先,網路的輸入是4幅
84
∗
84
84*84
84∗84大小的圖片,4幅圖片組成4個通道。所以,網路的輸入資料的shape是[batch_size, 4, 84, 84],接著,使用16個
8
∗
8
8*8
8∗8大小,上下左右步長均為4的卷積核,進行卷積操作,然後使用ReLU進行啟用。此時輸出的shape為[batch_size, 16, 20, 20]。
第2層:使用32個
4
∗
4
4*4
4∗4,上下左右步長均為步長為2的卷積核,進行卷積操作,然後使用ReLU進行啟用。此時輸出的shape為[batch_size, 32, 9, 9]。接著將其壓平,變成[batch_size, 2592]的shape。
第3層:使用
2592
∗
256
2592*256
2592∗256大小的全連線層進行全連線操作。然後使用ReLU啟用函式啟用,此時輸出的shape為[batch_size, 256]。
第4層:使用
256
∗
動
作
數
量
256*動作數量
256∗動作數量大小的全連線層進行全連線操作。此時輸出的shape為[batch_size, 動作數量]。在打乒乓球的遊戲中,動作數量為6。
我們講完了關鍵的要點,我們直接將演算法的虛擬碼放上來。
虛擬碼中需要注意的點如下:
①capacity N就是所設定的D的最大長度。
②
Φ
1
Φ_1
Φ1其實就是對影象所作的預處理的操作。
③該演算法和Q-Learning一樣,使用了ε-greedy的方法。
④store transition
(
Φ
t
,
a
t
,
r
t
,
Φ
t
+
1
)
(Φ_t, a_t, r_t, Φ_{t+1})
(Φt,at,rt,Φt+1) in D這句話要注意,儲存是當前的狀態(也就是當前幀的圖片),當前的行為,當前行為所獲得的獎勵,下一個狀態(也就是下一幀圖片)。
⑤標籤值
y
j
y_j
yj是會變化的,如果下一個狀態遊戲已經結束,那麼
y
j
=
r
j
y_j=r_j
yj=rj,否則還要加上一項上述圖中的公式。
⑥使用的是MSE作為損失函式。
程式碼
待填入
程式碼復現、詳細講解及我的Github地址
完整程式碼地址:https://github.com/haitaifantuan/reinforcement_leanring