官术网_书友最值得收藏!

8.3 Double DQN

關于如何改善基礎DQN的下一個富有成果的想法來自DeepMind研究人員的論文,該論文名為“Deep Reinforcement Learning with Double Q-Learning”[3]。在論文中,作者證明了基礎DQN傾向于過高估計Q值,這可能對訓練效果有害,有時可能會得到一個次優策略。造成這種情況的根本原因是Bellman方程中的max運算,但是嚴格的證明太復雜,此處做省略處理。為解決此問題,作者建議對Bellman更新進行一些修改。

在基礎DQN中,目標Q值為:

170-02

Q'(st+1, a)是使用目標網絡計算得到的Q值,所以我們每n步用訓練網絡對其更新一次。論文的作者建議使用訓練網絡來選擇動作,但是使用目標網絡的Q值。所以新的目標Q值為:

170-03

作者證明了這個小改動可以完美地修復Q值高估的問題,他們稱這個新的架構為Double DQN。

8.3.1 實現

核心實現很簡單,只需要稍微改動一下損失函數即可。我們來進一步比較一下基礎DQN和Double DQN產生的動作。為此,我們需要保存一個隨機的狀態集合,并定期計算評估集合中每個狀態的最優動作。

完整的示例代碼在Chapter08/03_dqn_double.py中。我們先看一下損失函數:

171-01

額外的double參數決定在執行哪個動作的時候,打開或關閉Double DQN的計算方式。

171-02

前面的片段和之前是一樣的。

171-03

這里和基礎DQN的損失函數有點不同。如果Double DQN激活,則計算下一個狀態要執行的最優動作時會使用訓練網絡,但是計算這個動作的對應價值時使用目標網絡。當然,這部分可以用更快的方式實現,即將next_states_vstates_v合起來,只調用訓練網絡一次,但是這也會使代碼變得不夠直觀。

函數的剩余部分是一樣的:將完成的片段隱藏并計算網絡預測出來的Q值和估算的Q值之間的均方誤差(MSE)損失。最后再考慮一個函數,它計算所保存的狀態價值:

171-04

這沒什么復雜的:只是將保存的狀態數組分成長度相等的批,并將每一批傳給網絡以獲取動作的價值,并根據這些價值,選擇價值最大的動作(針對每一個狀態),并計算這些價值的平均值。因為狀態數組在整個訓練過程中是固定的,并且這個數組足夠大(在代碼中保存了1000個狀態),我們可以比較這兩個DQN變體的平均價值的動態。

03_dqn_double.py文件的其余內容基本一樣,兩個差異點是使用修改過后的損失函數,并保留了隨機采樣的1000個狀態以進行定期評估。

8.3.2 結果

為了訓練Double DQN,傳入--double命令行參數來使擴展代碼生效:

172-01

為了比較它和基礎DQN的Q值,不傳--double參數再訓練一邊。訓練需要花費一點時間,取決于計算能力。使用GTX 1080 Ti,100萬幀需要花費約2小時。此外,我注意到double擴展版本比基礎版本更難收斂。使用基礎DQN,大概10次中有一次會收斂失敗,但是使用double擴展的版本,大概3次中就有一次收斂失敗。很有可能需要調整超參數,但是我們只比較在不觸及超參數的情況下double擴展帶來的性能收益。

無論如何,可以從圖8.6中看到,Double DQN顯現出了更好的獎勵動態(片段的平均獎勵更早增長),但是在最終解決游戲的時候和基礎DQN的獎勵是一樣的。

172-02

圖8.6 Double DQN和基礎DQN的獎勵動態

除了標準指標,示例還輸出了保存的狀態集的平均價值,如圖8.7所示。基礎DQN的確高估了價值,所以它的價值在一定水平之后會下降。相比之下,Double DQN的增長更為一致。在本例中,Double DQN對訓練時間只有一點影響,但這不意味著Double DQN是沒用的,因為Pong是一個簡單的環境。在更復雜的游戲中,Double DQN可以得到更好的結果。

173-01

圖8.7 用網絡預測所保存的狀態的價值

主站蜘蛛池模板: 黎城县| 兴山县| 铜川市| 罗甸县| 昔阳县| 南昌县| 新泰市| 辽宁省| 武川县| 惠安县| 庆城县| 项城市| 马山县| 恩平市| 佳木斯市| 庆安县| 信宜市| 富平县| 黎城县| 浦东新区| 苍溪县| 屯留县| 茂名市| 阳江市| 阜新| 昌平区| 马关县| 武胜县| 平南县| 梁山县| 苗栗市| 色达县| 惠州市| 沧源| 鹤壁市| 通渭县| 商丘市| 太白县| 五莲县| 绥德县| 承德市|