文章目录
- 前言
- 理论篇:为什么需要 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