DQN
Q-Learning 的深度学习升级版——用神经网络记住"所有情况",让智能体学会玩 Atari 游戏、操控机器人
✦ 先看效果:小车撑杆
智能体要左右移动小车,让杆子尽量不倒。用 PD 控制器模拟已学习好的策略——想看 DQN 真实训练过程,到下面的代码区运行。
01 大白话讲 DQN
Q-Learning 遇到了什么困难?
Q-Learning 用一张大表格记录"每个状态下每个动作值多少分"。在 5×5 的迷宫里,这张表只有 25 行,完全没问题。
但如果玩 Atari 游戏,屏幕上每一帧图像就是一个状态——像素组合数量是天文数字,根本存不下这张表。
状态空间爆炸:Atari 游戏每帧有 210×160×3 个像素,不同组合比宇宙中原子数还多,Q 表根本装不下
不用表格,改用神经网络。输入状态,直接输出每个动作的 Q 值——神经网络会自动归纳规律,相似的状态给出相似的预测
两个让训练稳定的关键技巧
直接用神经网络替换 Q 表会训练崩溃——就像你同时改考试答案又改评分标准,根本学不稳。DQN 用两个技巧解决这个问题:
智能体每走一步,把「当前状态、动作、奖励、下一步状态」存进一个"记忆库"。训练时从记忆库里随机抽一批数据。
就像背单词不按顺序背,而是随机抽卡片复习——打乱时间顺序,防止网络只记住最近发生的事。
同时维护两个完全相同的网络:一个「在线网络」实时更新,一个「目标网络」每隔几百步才同步一次参数。
就像考试时有一份固定的标准答案。如果标准答案也跟着你的作答实时变化,你永远不知道往哪个方向改——目标网络提供稳定的"参照系"。
DQN 的完整训练流程
大多数时候按网络预测的最优动作走;小概率随机探索,避免陷入局部最优
把 (s, a, r, s') 存进 Replay Buffer;凑够一批(如 32 条)就开始训练
用「目标网络」计算 y = r + γ·max Q(s', a'),作为训练标签
最小化在线网络输出的 Q(s,a) 与目标 y 的均方误差,梯度下降一步
每隔 C 步把在线网络参数复制到目标网络
DQN 能做什么?
2013 年 DeepMind 用 DQN 超越人类水平,直接输入游戏画面像素
连续状态空间下的运动控制,替代手写控制器
把用户行为序列作为状态,学习最优推荐策略
复杂路网状态下的红绿灯控制、路径规划
一步步构建 DQN
从 CartPole 物理到经验回放训练,逐步搭建。
用牛顿力学模拟推车摆杆,状态是 [位置, 速度, 角度, 角速度]。
两个网络(在线 + 目标)+ 经验回放队列,解决数据相关性问题。
从缓冲区随机采样,计算 TD 目标,训练在线网络逼近 Q*。
02 代码
03 学术性讲解
DQN(Deep Q-Network)是 Q-Learning 的深度学习版本,使用神经网络来近似 Q 函数,解决了 Q-Learning 在状态空间大时 Q 表无法存储的问题。
为什么需要 DQN?
Q-Learning 的 Q 表在状态空间大时(如下棋、自动驾驶)无法存储。DQN 使用神经网络来近似 Q 函数:
DQN 的两个关键技术
将经验存储在 replay buffer 中,随机抽样进行训练,打破数据间的时序相关性
使用两个网络:一个用于选择动作,一个用于计算目标值,定期同步参数
损失函数
DQN 的损失函数是时序差分误差:
为什么经验回放能稳定训练?
强化学习中连续采集的样本高度相关(前后帧相似),如果直接顺序训练,网络会过拟合到最近的经历,忘掉之前学到的知识(灾难性遗忘)。Replay Buffer 随机采样打乱了时序依赖,使样本分布更接近 i.i.d.,梯度估计更稳定。
为什么需要目标网络?
TD 目标 y = r + γ·max Q_θ(s', a') 中的 Q_θ 如果和被更新的网络是同一个,则每步更新都会改变目标,产生"追逐移动靶"问题,导致训练震荡甚至发散。目标网络 Q_θ⁻ 的参数每隔 C 步才从在线网络复制一次,提供了一个短期稳定的监督信号。
算法对比
Q 表存储所有状态-动作值;只适合小状态空间;off-policy
神经网络近似 Q;经验回放 + 目标网络;适合高维状态
用在线网络选动作、目标网络估值,消除 Q 值高估偏差
把 Q 分解为状态价值 V(s) 和优势函数 A(s,a),提升样本效率
收敛条件与局限性
表格型 Q-Learning 在满足 Robbins-Monro 条件时保证收敛;DQN 使用函数近似,理论收敛性较弱,但实践中通过经验回放和目标网络已足够稳定
仅适合离散动作空间;连续动作需要改用 DDPG、TD3 等 Actor-Critic 方法;样本效率相对较低,需要大量环境交互
总结
近似 Q 函数
经验回放缓冲区
目标网络
梯度下降