RL ML Learning Lab
08 / 10
深度价值 · 三件套升级

DQN 进阶Advanced DQN

第 6 章的 DQN 会训练,但还不够好——过估计、低效采样、状态价值共享。本步骤把 Double / Dueling / Prioritized Replay 三个经典改进一次讲透,并在 CartPole 上同场对比。

2.5h
阅读 + 实操
3 个
交互演示
进阶
难度

DQN 进阶 · 交互演示

Ep0
步数0
最佳0

当前观看:基线 DQN 的 CartPole

四个算法(基线 / +Double / +优先回放 / +Dueling)同时训练、独立探索。下方按钮切换观看对象,学习曲线图始终展示四条曲线。

四个算法独立训练,比较的是各自收敛速度与稳定性,不是共享参数的接力训练。

学习率 0.01
γ 折扣 0.99
速度 20 步/秒

为什么学这步?

原始 DQN 有三处公认短板:max 运算造成 Q 值过估计(策略被高估的动作带偏)、均匀采样浪费经验、状态价值与动作优势耦合导致学习低效。Double DQN、Prioritized Replay、Dueling DQN 分别对症下药——它们至今仍是 DQN 家族的标准组件,理解三者是理解 DQN 变体(Rainbow 等)的起点。

下一步预告:值方法再强也要靠 argmax 间接出策略;下一章我们绕开 Q 值,用策略梯度直接学策略,并进入现代 RL 的 Actor-Critic / PPO。

📌 发生了什么

  • Double DQN 用「主网络选动作、目标网络估值」打破过估计
  • Prioritized Replay 按 |TD 误差| 加权采样,高误差经验被优先学习
  • Dueling 把 Q 拆成 V(s) + A(s,a),状态价值跨动作共享
  • 三者在学习曲线上各自带来可观测的独立贡献

⚠️ 常见陷阱

  • 把 Double DQN 当成"两个独立网络"——其实主/目标网络是同一个网络的快慢两份
  • 优先回放不重算优先级 → 采样偏置逐渐失真,需定期用新 |δ| 刷新
  • 误以为改进越多越好——三者可叠加(Rainbow),但单看一条曲线分不清谁贡献了什么

本章小结

  • 过估计源于 max 对噪声的乐观偏差,Double DQN 用解耦估值消除它
  • 优先回放把算力花在"最值得学"的经验上
  • Dueling 让价值估计更准、动作优势更聚焦

📐 Double DQN 与过估计

过估计的根源:max 是对含噪声估计的乐观偏差。若 Q 的估计带噪声 ε,则 E[max_a Q(s,a)] ≥ max_a E[Q(s,a)]。

原始 DQN 用目标网络同时完成"选动作"与"估值":max 会放大噪声中的正向误差,Q 值系统性虚高。

Double DQN 把两步解耦:主网络 θ 决定哪个动作最优,目标网络 θ⁻ 只负责给这个动作估值——动作选择与价值评估互不污染,过估计大幅下降。

Dueling:Q(s,a) = V(s) + A(s,a) − mean_a' A(s,a')。共享 V 让不同动作的价值估计相互受益;Prioritized Replay:采样概率 p_i ∝ |δ_i|^α,把梯度步集中在 TD 误差大的经验上。

🎛 三件套超参对比

每个改进各有一个关键旋钮,调错方向反而比基线更差。

超参 表现 结果
Double DQN 目标网络同步间隔过短 目标随主网络漂移,去耦失效 过估计反弹
优先回放 α = 0 退化为均匀采样 无增益
优先回放 α ≈ 0.6 高误差经验占比适中 推荐
Dueling 去掉 mean 项 Q = V + A 有可辨识性退化 不稳定

💡 三者可叠加(Rainbow 同时使用),但单独看时,每个改进都应带来可归因的收益。

💻 Double DQN 核心循环

与 DQN 的唯一区别在目标值:用主网络选动作,用目标网络估值。

// 主网络 Q(s,a;θ) 与目标网络 Q(s,a;θ⁻)
function trainStep(batch) {
  for (const { s, a, r, s2, done } of batch) {
    if (done) { y = r; continue; }
    // Double:主网络选最优动作
    const bestA = argmax(predict(mainNet, s2));
    // 目标网络只负责估值
    y = r + gamma * predict(targetNet, s2)[bestA];
    // 掩码 MSE:仅更新被选动作
    const pred = predict(mainNet, s);
    loss += (y - pred[a]) ** 2;   // 只回传动作 a 的梯度
  }
  sgdStep(loss, mainNet);          // 每 C 步同步 θ⁻ ← θ
}

📚 参考文献与延伸阅读

  1. van Hasselt, H. et al. (2016), Deep Reinforcement Learning with Double Q-learning, AAAI — Double DQN 原始论文
  2. Wang, Z. et al. (2016), Dueling Network Architectures for Deep Reinforcement Learning, ICML — Dueling 架构原始论文
  3. Schaul, T. et al. (2016), Prioritized Experience Replay, ICLR — 优先回放原始论文
  4. Wikipedia: Double Q-learning — 算法与变体总览

📝 课后练习

检验你的理解——答对为止