DQN(Deep Q-learning)入門教程(五)之DQN介紹

簡介

DQN——Deep Q-learning。在上一篇博客DQN(Deep Q-learning)入門教程(四)之Q-learning Play Flappy Bird 中,咱們使用Q-Table來儲存state與action之間的q值,那麼這樣有什麼不足呢?咱們能夠將問題的稍微複雜化一點了,若是在環境中,State不少,而後Agent的動做也不少,那麼毋庸置疑Q-table將會變得很大很大(好比說下圍棋),又或者說若是環境的狀態是連續值而不是離散值,儘管咱們能夠將連續值進行離散化,可是又可能會致使q-table變得龐大,而且可能還有一個問題,若是某一個場景沒有訓練過,也就是說q-table中沒有儲存這個值,那麼當agent遇到這種狀況時就會一臉懵逼。html

這個時候咱們聯想咱們在神經網絡中學到的知識,咱們能夠將Q-table變成一個網絡模型,以下所示:(圖來自莫煩git

之前咱們想得到Q值,須要去q-table中進行查詢,可是如今咱們只須要將狀態和動做(或者僅輸入狀態)便可得到相對應的Q值,這樣,咱們在內存中僅僅只須要保存神經網絡模型便可,簡單又省內存兒。github

若是不瞭解神經網絡的話,能夠先去看一看相關的知識,或者看一看我以前的博客,裏面包含了相關的介紹以及具體的實例使用:算法

  1. 數據挖掘入門系列教程(七點五)之神經網絡介紹
  2. 數據挖掘入門系列教程(八)之使用神經網絡(基於pybrain)識別數字手寫集MNIST
  3. 數據挖掘入門系列教程(十點五)之DNN介紹及公式推導
  4. 數據挖掘入門系列教程(十一)之keras入門使用以及構建DNN網絡識別MNIST
  5. 數據挖掘入門系列教程(十一點五)之CNN網絡介紹
  6. 數據挖掘入門系列教程(十二)之使用keras構建CNN網絡識別CIFAR10

神經網絡中有兩個很重要的概念:訓練預測。預測咱們很好理解,就是輸入一個狀態\(s_1\),它會返回對應的\(q(s_1,a_1),q(s_1,a_2) \cdots q(s_1,a_n)\),而後咱們選擇最大值對應的Action就好了。那麼咱們怎麼進行訓練呢?網絡

神經網絡的訓練

在傳統的DNN or CNN網絡中,咱們是已知訓練集,而後進屢次訓練的。可是在強化學習中,訓練集是未知的,由於咱們的要求是機器進行自我學習。換句話來講,就是神經網絡的更新是實時的,一邊進行遊戲獲得數據集一邊使用數據進行訓練。app

首先咱們假設模型是下圖這樣的:輸入一個 \(s\) 返回不一樣動做對應的 \(q\) 值。函數

那麼咱們進行訓練的時候,\(x\_train\) 即爲狀態 \(s_1\)\(y\_train\) 則爲 \(q(s_1,a_1),q(s_1,a_2) \cdots q(s_1,a_n)\)。🆗,如今的問題就回到了咱們如何獲得「真實」的 \(y\_train\) 。在DQN(Deep Q-learning)入門教程(三)之蒙特卡羅法算法與Q-learning算法中咱們提到使用以下的公式來更新q-table:學習

\[{\displaystyle Q^{new}(s_{t},a_{t})\leftarrow \underbrace {Q(s_{t},a_{t})} _{\text{舊的值}}+\underbrace {\alpha } _{\text{學習率}}\cdot \overbrace {{\bigg (}\underbrace {\underbrace {r_{t}} _{\text{獎勵}}+\underbrace {\gamma } _{\text{獎勵衰減因子}}\cdot \underbrace {\max _{a}Q(s_{t+1},a)} _{\text{estimate of optimal future value}}} _{\text{new value (temporal difference target)}}-\underbrace {Q(s_{t},a_{t})} _{\text{舊的值}}{\bigg )}} ^{\text{temporal difference}}} \]

對應的圖以下所示:優化

其中咱們將\(Q(s_1,a_1) = R+\gamma^{*} \max Q(s_2)\)稱之爲Q現實,q-table中的\(Q(s_1,a_1)\)稱之爲Q估計。而後計算二者差值,乘以學習率,而後進行更新Q-table。ui

咱們能夠想想神經網絡中的反向傳播算法,在更新網絡權值的時候,咱們是獲得訓練集中的真實值和預測值之間的損失函數,而後再乘以一個學習率,再向前逐漸地更新網絡權值。這樣想想,彷佛二者之間很類似。

在DQN中咱們能夠這樣作:

具體的使用,能夠看一看下一篇博客的具體使用,用代碼來表達更加的絲滑。

經驗回放(Experience Replay)

經驗回放是一個很妙的方法。實際上,咱們訓練神經網絡模型須要訓練不少次才能夠獲得一個比較好的模型,也就是說,數據會被重複的填入到神經網絡中訓練不少次。而經驗回放就是將數據進行保存,好比說agent再\(S_1\)狀執行動做\(a_1\)獲得了\(r_1\)的獎勵,而後狀態轉移到了\(S_2\),則經驗池就會將\((S_1,a_1,r_1,S_2)\)進行保存,而後咱們在訓練的時候,隨機從經驗池中抽取必定數量的數據來進行訓練。這樣就能夠不停的優化網絡模型。

若是沒有經驗回放,咱們則須要每次獲得一個數據,則就進行訓練,咱們每次訓練的內容都是目前的數據。可是,有了經驗回放,咱們就能夠從歷史數據中選擇數據進行訓練。

算法流程

下面介紹一下算法流程:

下面是來自Playing Atari with Deep Reinforcement Learning論文中算法流程:

下面是來自強化學習(八)價值函數的近似表示與Deep Q-Learning對算法的中文翻譯:

總結

以上即是DQN的介紹,實際上DQN還有不少優化算法,好比說 Nature DQN使用兩個Q網絡來減小相關性,Double DQN(DDQN,Nature DQN的優化)……

下一篇博客將具體的使用DQN進行訓練,同時DQN入門博客也就快結束了。

參考

相關文章
相關標籤/搜索