1. 程式人生 > 實用技巧 >(零基礎可以看懂)深度強化學習之DQN類演算法之第1篇-2013年NeurIPS版本的DQN(含程式碼)-《強化學習系列專欄第4篇》

(零基礎可以看懂)深度強化學習之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(高

寬)尺寸的,並且有128種顏色,也就是說圖片有3個通道。於是論文中,首先將圖片轉為灰度圖,轉換完之後,圖片就只有1個通道了。接著,再對該灰度圖進行下采樣到11084的尺寸。最後,再將圖片的中間區域裁剪出來,裁剪成8484尺寸大小的圖片。只有經過這樣預處理過後的圖片,才可以放到神經網路裡面進行前向傳播。經過預處理後的圖片如下圖所示,
在這裡插入圖片描述
③由於如果只放一張圖片到神經網路裡面去,神經網路並不會捕捉到動態的資訊,比如球到底是從左邊往右邊飛,還是從右邊往左邊飛(玩遊戲是一個類似視訊一樣有前後動態關係的一種場景),因此,要想讓神經網路知道這是一個動態的狀態,我們將此時此刻這1幀圖片,再加前3幀圖片,組成4個通道,放到神經網路裡,這樣一來,神經網路就知道“前因後果”中的“前因”了,它就知道球從哪個方向飛過來了。

④神經網路部分其實是對圖片進行一個特徵提取,然後對映到可行的動作的數量的維度上。神經網路的結構是這樣的:
    第1層:首先,網路的輸入是4幅 84 ∗ 84 84*84 8484大小的圖片,4幅圖片組成4個通道。所以,網路的輸入資料的shape是[batch_size, 4, 84, 84],接著,使用16個 8 ∗ 8 8*8 88大小,上下左右步長均為4的卷積核,進行卷積操作,然後使用ReLU進行啟用。此時輸出的shape為[batch_size, 16, 20, 20]。
    第2層:使用32個 4 ∗ 4 4*4 44,上下左右步長均為步長為2的卷積核,進行卷積操作,然後使用ReLU進行啟用。此時輸出的shape為[batch_size, 32, 9, 9]。接著將其壓平,變成[batch_size, 2592]的shape。
    第3層:使用 2592 ∗ 256 2592*256 2592256大小的全連線層進行全連線操作。然後使用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