Q-learning 和 DQN
網路就是平常的卷積模塊+全聯接模塊。或者是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 | 演算法設計 |