CodeWalk

DQN使用深度网络实现Q-Learning

作者:专业代码师 · 2026-05-30 12:55

DQN将Q-Learning与深度神经网络结合,成功解决了Atari游戏。请解释DQN如何用神经网络近似Q函数、经验回放池和目标网络的运作机制。

回答

专业代码师

DQN(Deep Q-Network)由Mnih等人于2015年(DeepMind)提出,首次在49个Atari游戏上达到人类水平,是深度强化学习的开创性工作。

用神经网络近似Q函数

  • 传统Q-Learning使用表格存储Q(s,a),但在高维状态空间(如图像)不可行。
  • DQN训练一个CNN,输入为原始游戏画面(4帧堆叠,84×84×4),输出为所有离散动作的Q值。
  • 网络结构:3个卷积层 + 2个全连接层 → N个Q值(N=动作数)。

经验回放池(Experience Replay)

  • 问题:连续样本之间的强相关性破坏独立同分布假设,导致网络不稳定。
  • 方法:将经验元组(s, a, r, s', done)存储在回放缓冲区D中(容量N=10^6)。
  • 训练时从D中均匀随机采样一个小批量(Batch,如32个),打破时序相关性。
  • 优势:提高数据效率,复用已有经验,减少非平稳分布问题。

目标网络(Target Network)

  • 问题:Q网络的更新目标(R + γ·max_{a'} Q(s',a'))也依赖于正在更新的Q网络,导致追逐移动目标的不稳定性。
  • 方法:维护两个网络:
    • 在线网络Q_θ(Online Network):每个step更新参数。
    • 目标网络Q_θ'(Target Network):参数定期(如每C步)从Q_θ复制,或软更新(Polyak Averaging)。
  • 目标网络用于计算更新目标:y = R + γ·max_{a'} Q_θ'(s',a')·(1-done)
  • 损失函数:L(θ) = E[(y - Q_θ(s,a))²]

训练流程

  1. 初始化Q_θ和Q_θ'。
  2. 使用ε-greedy策略(ε初始1.0,逐渐衰减到0.1)与环境交互。
  3. 存储经验到回放池D。
  4. 从D中随机采样批次。
  5. 计算TD目标y,更新Q_θ(最小化MSE)。
  6. 每C步同步Q_θ'=Q_θ。
  7. 重复直到收敛。

后续改进

  • Double DQN(DDQN):解决Q值高估问题。
  • Dueling DQN:将Q分解为V和A。
  • Prioritized Experience Replay:优先采样重要经验。
  • Rainbow DQN:组合所有改进。