Q-learning 和 DQN

前段時間了解到DQN網路,噱頭是打2d遊戲機的性能,可以和人類相媲美,有的遊戲已經超越了人類,就想看看它是如何運行的。看了論文中,DQN網路的模型,以及其loss構成,原來這個網路是這麼回事。

網路就是平常的卷積模塊+全聯接模塊。或者是rnn/lstn。最後輸出了n個動作的質量值。比如,如果是打小蜜蜂那個遊戲,就只控制小蜜蜂 向左,向右,不動,即可,就是3個動作,如果是玩魂斗羅,那麼動作就有點多了,主要是組合動作,方向鍵和跳躍,攻擊的動作的組合。不過,網路輸出節點直接就是包含的是基本動作,所以網路輸出節點也不多。

loss是什麼呢?Q-learning中,t 為時刻,每一對狀態s_t和動作a_t,對應一個Q_t值。這裡的s_t就對應網路中的輸入中的一張遊戲截圖,a_t就對應網路中的輸出節點,就是網路看到這個遊戲截圖後,給出的動作。Q-learning學習湊效的原因是對Q矩陣的更新。這個更新遵循一個原則:若當前狀態下執行某動作後的下一個狀態的動作能帶來更多價值,則當前動作的價值就應該往高方向更新,這裡說的動作的價值就是Q值。所以,取loss的思路就是把當前動作計算出的Q值和Q-learning中的要對這個Q進行更新的值進行簡單的比較。這個比較,體現在公式上是兩者的二範數。這裡對這個Q的更新值,就完全按照Q-learning的寫法來寫:由兩部分組成,一是當前動作的遊戲反饋,二是當前動作造成的下一狀態的所有動作下的最大Q值的加權。按照這種思路,我們最終能得到一個合理的Q值矩陣,或者Q值函數,它可以表徵處於某個狀態時,執行某個動作的價值。我們只要沿著價值最大化來做動作,就能得到高回報。Q值函數就是網路,輸入圖片(狀態),輸出Q值。

因為需要下一狀態的所有動作的最大Q,這個loss的也有個特點:網路要多前向計算一次,才能得到下一狀態的所有動作的Q.

其實也是因為這個loss的原因,等於說是把cnn用作生成Q的一個函數了。原來的質量表達Q是個矩陣,參數少,現在的用深度網路了,就叫深度質量網路(DQN)了,其實感覺它全稱叫做DQ-learning更合適。可能因為網路體量比較大,比較顯眼,就忽略了loss的構造,直接只叫DQN了。

總之,叫什麼名字不是那麼重要,理解了DQN原理就好。理解了,然後才能細扣,扣出優點和缺點,扣出改進方法。把我們玩的遊戲玩的更好。

推薦閱讀:

011 Container With Most Water[M]
013 Roman to Integer[E]
二叉樹中相關遞歸求解(c,c++數據結構,演算法設計與分析)
028 Implement strStr()[E]
番外篇 · 補充說明

TAG:深度學習DeepLearning | 演算法設計 |