标准Q学习及其深度学习扩展DQN,存在高估动作价值的倾向。这是因为其更新规则涉及对可能存在噪声或不准确的Q值估计进行最大化操作。标准DQN的目标值计算如下:$$ y_t^{DQN} = r_t + \gamma \max_{a'} Q_{\theta'}(s_{t+1}, a') $$在这里,目标网络 $\theta'$ 用于两个目的:首先,选择在下一状态 $s_{t+1}$ 中被认为能产生最高Q值的动作 $a'$;其次,评估所选动作的Q值。如果目标网络恰好高估了任何动作 $a'$ 的价值,则 $\max$ 操作符很可能会选择那个被高估的值,从而导致目标值 $y_t^{DQN}$ 出现正向偏差。这种持续的高估会通过学习过程传播,可能导致次优策略收敛和不稳定。双重DQN(DDQN),由Hado van Hasselt、Arthur Guez和David Silver于2015年提出,提供了一种巧妙的方法来缓解这种高估偏差。它的核心思想是将最佳下一动作的选择与其价值的评估分离。DDQN不使用同一个网络(目标网络)来完成这两项任务,而是使用两个不同的网络。双重DQN的更新方式具体而言,DDQN如下修改了目标值的计算:动作选择: 使用当前在线网络 $Q_{\theta}$(正在积极训练的网络)来确定它在下一状态 $s_{t+1}$ 中估计的最佳动作 $a^$。 $$ a^ = \arg\max_{a'} Q_{\theta}(s_{t+1}, a') $$动作评估: 使用目标网络 $Q_{\theta'}$(定期更新的稳定网络)来评估上一步中选定的动作 $a^$ 的Q值。 $$ Q_{\theta'}(s_{t+1}, a^) $$DDQN目标值: 将这些结合起来形成新的目标值 $y_t^{DDQN}$。 $$ y_t^{DDQN} = r_t + \gamma Q_{\theta'}(s_{t+1}, \arg\max_{a'} Q_{\theta}(s_{t+1}, a')) $$将此与标准DQN目标值仔细比较。在DQN中,argmax 和价值估计都完全依赖于目标网络 $Q_{\theta'}$。在DDQN中,argmax 使用在线网络 $Q_{\theta}$,而价值估计则使用目标网络 $Q_{\theta'}$。为何分离有助于改进?在线网络 $\theta$ 和目标网络 $\theta'$ 表示不同的参数集合(回想一下,$\theta'$ 通常是 $\theta$ 的延迟副本)。尽管两个网络都可能产生估计误差,但两个网络同时高估同一动作价值的可能性较小。通过使用在线网络选择动作 ($a^* = \arg\max_{a'} Q_{\theta}(s_{t+1}, a')$),我们仍然选取当前策略认为最佳的动作。然而,随后使用目标网络评估该特定动作的价值 ($Q_{\theta'}(s_{t+1}, a^*)$),我们得到了一个偏差可能更小的估计。如果在线网络错误地选择了一个被 $Q_{\theta}$ 高估但未被 $Q_{\theta'}$ 明显高估的动作,那么产生的目标值 $y_t^{DDQN}$ 将比 $y_t^{DQN}$ 的膨胀程度更小。这有助于打破高估的正向反馈循环。下面的图表说明了DQN与DDQN在目标值计算方式上的差异。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", margin=0.2, color="#495057", fillcolor="#e9ecef", style="filled,rounded"]; edge [fontname="sans-serif", color="#495057"]; subgraph cluster_dqn { label = "DQN目标值计算"; bgcolor="#e7f5ff"; // Light blue background color="#a5d8ff"; // Light blue border dqn_s [label="下一状态\ns_{t+1}"]; dqn_q_target [label="目标网络\nQ_{\theta'}"]; dqn_max [label="max_{a'}"]; dqn_eval [label="评估 Q_{\theta'}"]; dqn_gamma [label="γ"]; dqn_add [label="+", shape=circle, style=filled, fillcolor="#ced4da"]; dqn_r [label="奖励\nr_t", shape=plaintext]; dqn_y [label="目标值\ny_t^{DQN}"]; dqn_s -> dqn_q_target; dqn_q_target -> dqn_max [label="选择最佳 a'"]; dqn_max -> dqn_eval [label="使用最佳 a' 的价值"]; dqn_eval -> dqn_gamma; dqn_gamma -> dqn_add; dqn_r -> dqn_add; dqn_add -> dqn_y; } subgraph cluster_ddqn { label = "双重DQN (DDQN) 目标值计算"; bgcolor="#fff9db"; // Light yellow background color="#ffec99"; // Light yellow border ddqn_s [label="下一状态\ns_{t+1}"]; ddqn_q_online [label="在线网络\nQ_{\theta}"]; ddqn_q_target [label="目标网络\nQ_{\theta'}"]; ddqn_argmax [label="argmax_{a'}"]; ddqn_eval [label="评估 Q_{\theta'}"]; ddqn_gamma [label="γ"]; ddqn_add [label="+", shape=circle, style=filled, fillcolor="#ced4da"]; ddqn_r [label="奖励\nr_t", shape=plaintext]; ddqn_y [label="目标值\ny_t^{DDQN}"]; ddqn_s -> ddqn_q_online; ddqn_s -> ddqn_q_target; ddqn_q_online -> ddqn_argmax [label="选择最佳 a'*"]; ddqn_argmax -> ddqn_eval [label="使用选定的 a'*贝伦森"]; ddqn_q_target -> ddqn_eval [label="获取 a'* 的价值"]; ddqn_eval -> ddqn_gamma; ddqn_gamma -> ddqn_add; ddqn_r -> ddqn_add; ddqn_add -> ddqn_y; } }目标值计算流程的比较。DQN仅使用目标网络来选择最大价值动作并评估其价值。DDQN使用在线网络选择动作,并使用目标网络评估所选动作。实现影响实现DDQN仅需对标准DQN的实现进行少量修改。您无需计算下一状态的 max(target_q_values),而是需要:对下一状态 $s_{t+1}$ 通过在线网络进行一次前向传播,以获取所有 $a'$ 的 $Q_{\theta}(s_{t+1}, a')$。使用 argmax 找出使这些在线Q值最大的动作 $a^*$。对下一状态 $s_{t+1}$ 通过目标网络进行一次前向传播,以获取所有 $a'$ 的 $Q_{\theta'}(s_{t+1}, a')$。选择与第2步中找到的动作 $a^*$ 对应的目标Q值。在贝尔曼更新计算中 ($r_t + \gamma Q_{\theta'}(s_{t+1}, a^*)$) 使用这些选定的目标Q值。DQN的其余机制,包括经验回放和目标网络的定期更新,保持不变。DDQN增加的计算开销通常可以忽略不计,因为它主要是在目标值计算步骤中额外进行一次在线网络的前向传播,这通常比梯度更新的反向传播成本低得多。通过降低高估偏差,DDQN通常能带来更稳定的训练,并且与原始DQN算法相比,可以收敛到更好的策略,使其成为深度强化学习中一项重要且被广泛使用的改进。