文章目錄
- 前言
- 理論篇:為什么需要 Double DQN?
- 代碼實現篇:構建一個 Double DQN 智能體
- 2.1 項目設置與輔助函數
- 2.2 環境 (Environment)
- 2.3 DQN 的核心組件
- 2.3.1 Replay Buffer (經驗回放池)
- 2.3.2 Q-Network (Q網絡)
- 2.3.3 The Double DQN Agent (Double DQN 智能體)
- 訓練與結果
- 3.1 訓練主循環
- 3.2 超參數設置與執行
- 3.3 結果分析
- 總結
前言
歡迎來到“從代碼學習深度強化學習”系列!在強化學習(RL)的世界里,Deep Q-Network (DQN) 算法無疑是一個里程碑,它巧妙地將深度學習的強大感知能力與Q-Learning的決策能力相結合,解決了許多之前無法攻克的復雜問題。
然而,經典的DQN算法并非完美無瑕。它存在一個眾所周知的問題——Q值過高估計 (Overestimation)。這個問題會導致智能體的學習過程不穩定,甚至無法收斂到最優策略。為了解決這一挑戰,研究者們提出了Double DQN,一個對原始DQN的優雅而高效的改進。
本篇博客旨在帶領大家深入理解Double DQN的核心思想,并通過一個完整的、帶有詳細注釋的PyTorch代碼實例,從零開始構建、訓練并評估一個Double DQN智能體。我們將以經典的Pendulum-v1
環境為例,一步步揭開Double DQN如何通過解耦“動作選擇”與“價值評估”來緩解過高估計問題,最終實現更穩定、更高效的學習。
無論您是RL的初學者,還是希望深化對DQN家族算法理解的實踐者,相信通過本文的理論講解和代碼剖析,您都能對Double DQN有一個更透徹的認識。讓我們開始吧!
完整代碼:下載鏈接
理論篇:為什么需要 Double DQN?
在深入代碼之前,我們首先需要理解Double DQN所要解決的核心問題。普通的DQN算法在更新Q值時,通常會系統性地高估動作的價值,這個問題在動作空間較大的任務中尤為嚴重。
讓我們通過下面這張圖文并茂的理論講解來一探究竟。
普通DQN算法通常會導致對Q值的過高估計 (overestimation)。傳統DQN優化的TD誤差目標為:
其中 max ? a ′ Q ω ? ( s ′ , a ′ ) \max_{a^{\prime}}Q_{\omega^{-}}\left(s^{\prime},a^{\prime}\right) maxa′?Qω??(s′,a′)由目標網絡 (參數為ω?) 計算得出,我們還可以將其寫成如下形式:
換句話說,max
操作實際上可以被拆解為兩部分:首先選取狀態s’下的最優動作 a ? = arg ? max ? a ′ Q ω ? ( s ′ , a ′ ) a^*=\arg\max_{a^{\prime}}Q_{\omega^-}\left(s^{\prime},a^{\prime}\right) a?=argmaxa′?Qω??(s′,a′),接著計算該動作對應的價值 Q ω ? ( s ′ , a ? ) Q_{\omega^-}\left(s^{\prime},a^*\right) Qω??(s′,a?)。當這兩部分采用同一套Q網絡進行計算時,每次得到的都是神經網絡當前估算的所有動作價值中的最大值。
問題在于,神經網絡的估算值本身在某些時候會產生正向或負向的誤差。在DQN的更新方式下,神經網絡會正向誤差累積。因為max
操作會傾向于選擇那些被“偶然”高估了價值的動作。因此,當我們用DQN的更新公式進行更新時,用于計算目標值的max Q
本身就可能被高估了。同理,我們拿這個被高估的值來作為更新目標來更新上一步的值時,同樣會過高估計,這樣的誤差將會逐步累積。對于動作空間較大的任務,DQN中的過高估計問題會非常嚴重,造成DQN無法有效工作。
為了解決這一問題,Double DQN算法提出利用兩個獨立訓練的神經網絡估算 max ? a ′ Q ? ( s ′ , a ′ ) \max_{a^{\prime}}Q_*(s^{\prime},a^{\prime}) maxa′?Q??(s′,a′)。具體做法是將原有的 max ? a ′ Q ω ? ( s ′ , a ′ ) \max_{a^{\prime}}Q_{\omega^{-}}\left(s^{\prime},a^{\prime}\right) maxa′?Qω??(s′,a′)更改為 Q ω ? ( s ′ , arg ? max ? a ′ Q ω ( s ′ , a ′ ) ) Q_{\omega^-}\left(s^{\prime},\arg\max_{a^{\prime}}Q_\omega\left(s^{\prime},a^{\prime}\right)\right) Qω??(s′,argmaxa′?Qω?(s′,a′))。
這個公式的核心思想是解耦(Decoupling):
- 動作選擇 (Action Selection): 利用主網絡(參數為ω)的輸出來選取價值最大的動作,即 arg ? max ? a ′ Q ω ( s ′ , a ′ ) \arg\max_{a^{\prime}}Q_\omega\left(s^{\prime},a^{\prime}\right) argmaxa′?Qω?(s