DQN(2013):深度强化学习的起点(里程碑级)
1、DQN(2013)学习与研究的背景 + 需要的准备知识
一、研究背景:DQN 为什么会在 2013 年横空出世?
一个长期未解决的梦想:“让机器像人一样,从看画面学会做事”
不告诉规则、不手工设计特征,只给原始感知(图像),让机器自己学会如何行动。
- 你看到画面(视觉)
- 你做一个动作
- 得到结果(奖励或惩罚)
- 久而久之,你学会“在什么情况下该怎么做”
强化学习的尴尬处境(DQN 之前)
(1)强化学习本身并不新
- Q-learning 在 1992 年就已经提出
- TD-Gammon(1995)已经能击败人类双陆棋高手
(2)强化学习“只能玩低维世界”
- 状态是少量数字(位置、速度、角度)
- 特征是人工设计的
- 摆杆问题:状态 = (角度, 角速度)
- 机器人控制:状态 = (关节角度)
为什么“图像 + 强化学习”这么难?
困难一:奖励信号极其稀疏、延迟
- 你做一个动作
- 可能几百、几千步之后才知道好不好
- 监督学习:每个样本都有“标准答案”
- 强化学习:只有“最终得分”
困难二:数据高度相关(不独立)
- 数据是 i.i.d.(独立同分布)
- 连续状态高度相关
- 今天看到的画面 ≈ 刚才的画面
困难三:学习过程中,数据分布一直在变
- 网络在更新
- 策略在变
- 看到的状态分布也在变
深度学习的“东风”来了(2009–2012)
- 2009–2012:卷积神经网络在视觉任务中大获成功
- 2012:AlexNet 让深度学习震惊世界
- 神经网络终于能从“原始像素”中自动学习特征
- GPU + SGD 让大规模训练成为可能
既然深度网络能从像素中学特征,那能不能直接用它来学“如何行动”?
DQN 的历史定位(一句话总结)
DQN 是第一个真正“端到端”:从原始像素 → 动作决策 → 超越人类的通用强化学习系统
- 不用手工特征
- 不用游戏规则
- 同一个网络,玩多款 Atari 游戏
- 多数游戏中击败此前所有方法,甚至人类
二、学习 DQN 前需要的准备知识(给小白的最小集合)
1. 强化学习的最基本直觉(不用公式)
名称
| 直观理解
|
环境(Environment)
| 游戏世界
|
状态(State)
| 你当前看到的情况
|
动作(Action)
| 你能做的选择
|
奖励(Reward)
| 环境给你的反馈
|
让“长期累计奖励”最大
Q-learning 的核心思想(DQN 的灵魂)
“在某种情况下,做某个动作,未来能有多好?”
Q(s, a) = 在状态 s 做动作 a,有多划算
- 不断修正这个“划算程度”的估计
为什么需要“深度”Q 网络?
- 用表格存 Q(s, a)
- 只适合状态空间很小
- 一个状态 = 一张 84×84×4 的图像
- 状态数量 ≈ 天文数字
Deep Q-Network(DQN)
深度学习方面的最低要求
(1)神经网络是函数逼近器
- 输入:状态(图像)
- 输出:每个动作的 Q 值
(2)卷积神经网络(CNN)
- 专门处理图像
- 自动学“边缘 → 形状 → 物体”
“从游戏画面中,学会哪些像素重要”
一个重要心理准备(非常重要)
DQN 不是“优雅理论”,而是“工程奇迹”
- 没有严格收敛证明
- 充满工程技巧
- 但第一次让事情“真的跑起来了”
- 重在 直觉 + 机制
- 不必一开始纠结数学细节
三、小结(给初学者的定位)
- DQN 解决了什么问题
- 它为什么在 2013 年是革命性的
- 你现在站在什么起点上
DQN = 强化学习 × 深度学习 的第一次成功融合
2、DQN 的核心思想
一、一句话版:DQN 的核心思想是什么?
用一个深度神经网络,直接从“画面”中学会评估:在当前情况下,做哪个动作,长期来看最划算。
二、从“普通 Q-learning”开始,看看它哪里不行
1. 传统 Q-learning 在干什么?
- 它维护一张表:
Q(s, a) - 表示:在状态 s 做动作 a,将来能拿多少分
- 每次尝试后,用“现实结果”去修正这张表
- 一张画面 = 几万个像素
- 状态数量 ≈ 无限
- Q 表根本存不下
核心思想一:用神经网络“代替 Q 表”
- 输入:当前状态(游戏画面)
- 输出:
- 向左:值多少钱
- 向右:值多少钱
- 开火:值多少钱
- ……
神经网络 = Q 函数本身
一个非常关键的设计(很多人第一次会忽略)
❌ 错误但直觉的做法
- 输入:(状态, 动作)
- 输出:Q(s, a)
✅ DQN 的聪明做法
- 输入:状态
- 输出:所有动作的 Q 值
- 一次前向传播
- 就能知道“哪个动作最好”
- 计算效率极高
三、真正的难点:训练为什么会崩?
- Q-learning ✔
- 神经网络 ✔
- SGD ✔
直接用神经网络 + Q-learning,几乎必然发散
1. 为什么会发散?(直觉版)
- 网络一边在学习
- 网络同时在“制造自己的训练数据”
- 网络当前认为“向左好”
- 它就经常向左
- 于是数据几乎全是“向左的经历”
- 网络被这种偏置数据进一步强化
- 形成恶性反馈循环
- Q 值被无限放大
- 训练直接崩溃
四、DQN 的真正革命:两个“稳定器”
核心思想二:经验回放(Experience Replay)
1. 人类式的类比
- 回忆过去的经历
- 混合不同时间、不同情境
- 反复反思
经验回放在干什么?
(当前状态,采取的动作,得到的奖励,下一个状态)
- 随机抽取一小批旧经历
- 用它们来训练网络
它解决了什么问题?
- 打破数据相关性
- 不再是连续帧
- 提高数据利用率
- 一次经历,多次学习
- 减弱策略震荡
- 学习不再被“当前策略”绑架
核心思想三:目标网络(Target Network)
问题根源
当前 Q ≈ 奖励 + 折扣 × 下一个状态的最大 Q
- “当前 Q”是网络算的
- “目标 Q”还是网络算的
DQN 的解决方案:分身术
- 维护 两个网络
- 在线网络(正在训练)
- 目标网络(冻结一段时间)
- 在线网络:负责学习
- 目标网络:负责提供“相对稳定的目标”
- 把在线网络参数 复制 给目标网络
直觉理解
不要一边改答案,一边改标准答案
五、把 DQN 的核心思想串起来(全景图)
DQN 使用卷积神经网络,从原始像素中估计每个动作的长期价值;
通过 Q-learning 更新规则进行学习; 同时引入经验回放来打破样本相关性, 使用目标网络来稳定学习目标, 从而首次让“深度网络 + 强化学习”在复杂视觉环境中稳定工作。
3、DQN 的训练流程
一、训练开始前:先把“舞台”搭好
1. 一个环境(Environment)
- 输入:当前游戏画面
- 输出:
- 下一帧画面
- 奖励(分数变化)
- 游戏是否结束
一个函数:你给我一个动作,我给你新的世界状态 + 反馈
两个一模一样的神经网络
(1)在线网络(Online Network)
- 作用:真正被训练的网络
- 用来:
- 选动作
- 更新参数
(2)目标网络(Target Network)
- 作用:提供“相对稳定的学习目标”
- 特点:
- 参数一段时间内不变
- 定期从在线网络复制
一个经验回放池(Replay Buffer)
(状态 s, 动作 a, 奖励 r, 下一个状态 s')
- 容量很大(例如 100 万条)
- 新的经验会覆盖最老的
一个 ε-贪心策略(探索机制)
- 以 ε 的概率:随机乱按
- 以 1−ε 的概率:选当前 Q 值最大的动作
二、真正的训练开始:一个时间步发生了什么?
Step 1:观察当前状态(看画面)
- 当前状态
s_t - 实际上是:
- 最近 4 帧游戏画面
- 叠在一起(用来感知速度和方向)
不是“一张照片”,而是一小段短视频
Step 2:用在线网络“评估所有动作”
s_t 输入在线网络,得到:
Q(s_t, a1), Q(s_t, a2), ..., Q(s_t, ak)
在当前画面下,每个动作值多少钱
Step 3:用 ε-贪心策略选动作
- 有 ε 的概率:
- 随机选一个动作(探索)
- 否则:
- 选 Q 值最大的动作(利用)
DQN 的学习数据,来自“当前策略 + 随机扰动”
Step 4:把动作交给环境
- 奖励
r_t - 下一状态
s_{t+1} - 是否终止(done)
你按了一下键,世界变了,并给了你反馈
Step 5:把这次经历存进“记忆”
(s_t, a_t, r_t, s_{t+1})
三、关键转折点:什么时候开始“真正学习”?
- 已经积累了一定数量的样本
四、一次真正的“参数更新”是怎么发生的?
Step 6:从经验回放池中随机采样一批经历
(s_j, a_j, r_j, s_{j+1}),j = 1...N
- 完全随机
- 不是最近发生的
- 可能来自几万步之前
- 打破时间相关性
- 稳定训练分布
Step 7:用目标网络计算“理想答案”
y_j:
分情况讨论:
情况 1:下一状态是终止状态
y_j = r_j
情况 2:游戏还没结束
y_j = r_j + γ * max_a Q_target(s_{j+1}, a)
- 用的是 目标网络
- 不是正在训练的在线网络
目标网络在告诉你: 如果将来一切顺利,最高能拿多少分
Step 8:在线网络“对照答案,修正自己”
Q_online(s_j, a_j)
loss = (y_j - Q_online(s_j, a_j))²
“你预测的,和你本该预测的,差了多少?”
Step 9:反向传播 + 梯度下降
- 对 loss 求梯度
- 更新在线网络参数
- 只有在线网络被更新
- 目标网络完全不动
五、目标网络什么时候更新?
Step 10:同步目标网络(每隔 K 步)
θ_target ← θ_online
“冻结一段时间,再整体刷新”
- 小步稳定优化
- 大步阶段性对齐
六、把全过程压缩成“一条时间线”
- 看画面
- 选动作
- 与环境交互
- 存经验
- 随机回忆过去
- 用旧网络算目标
- 用新网络学目标
- 偶尔更新目标网络
- ε 逐渐减小
- 策略越来越成熟
七、一个非常重要的认知校正(新手常见误区)
❌ 误区
DQN 是“在线学习,每一步立刻学”
✅ 正确理解
DQN 是“边玩边攒经验,靠反复回忆来学习”
- 人类
- 动物
- 而不是“条件反射机器”
八、到这里,你应该真正“懂流程了”
“DQN 一次参数更新,用了哪些数据?哪些网络?哪些是冻结的?”
- 数据:来自经验回放池
- 目标:由目标网络给
- 更新:只更新在线网络
4、DQN 为什么仍然有问题 & Double DQN 如何修正
一、先给结论(非常重要)
DQN 的核心问题不是不稳定,而是“系统性高估 Q 值”; Double DQN 的本质,是把“选动作”和“评估动作”这两件事拆开。
二、DQN 已经很强了,它“还错在哪”?
- 训练不发散(经验回放 + 目标网络)
- 能处理高维视觉输入(CNN)
DQN 学到的 Q 值,普遍偏大
三、问题的根源:DQN 在“自作主张 + 自我打分”
(s, a, r, s'),目标值是:
“奖励 + 折扣 × 在 s' 下,Q 值最大的那个动作的 Q 值”
- 从所有动作中,挑一个“看起来最好的”
- 用它的 Q 值,作为学习目标
👉 这两件事,是同一个网络干的
1. 一个非常关键的直觉例子(一定要看)
s' 下,真实的 Q 值是:
动作
| 真实价值
|
a₁
| 5
|
a₂
| 5
|
动作
| 网络预测
|
a₁
| 6
|
a₂
| 4
|
- 它会:
- 选择 a₁(因为 6 最大)
- 并且相信 6 是正确的目标
这个“最大值”,几乎一定是“被高估的那个”
这是偶然吗?不是,这是统计必然
- 估计值有噪声(神经网络一定有)
- 你在多个动作里取最大
- 你用同一个估计器做选择 + 评估
max 操作会放大正向误差
后果是什么?
- Q 值整体偏大
- 策略变得:
- 过度自信
- 偏好“看起来好,但其实一般”的动作
- 在复杂任务中:
- 性能明显受限
- 对噪声敏感
四、Double DQN 的核心思想:一刀切开纠缠
1. 关键原则(一定要记住)
用一个网络“选动作”,用另一个网络“评估动作”。
在 Double DQN 中,角色重新分工
网络
| 原本作用
|
在线网络
| 学习
|
目标网络
| 稳定目标
|
Double DQN 的目标值怎么计算?
第一步:用在线网络选动作
“在 s' 下,哪个动作看起来最好?”
a* = argmax_a Q_online(s', a)
第二步:用目标网络评估这个动作
“这个动作,值多少钱?”
Q_target(s', a*)
最终目标:
y = r + γ * Q_target(s', a*)
和 DQN 的关键差异在哪里?
DQN:
- 同一个网络:
- 选最大动作
- 给出最大值
Double DQN:
- 在线网络:
- 负责“判断哪个动作最好”
- 目标网络:
- 负责“给这个动作打分”
五、为什么这能修复“高估问题”?
1. 回到刚才的例子
动作
| 真实
|
a₁
| 5
|
a₂
| 5
|
网络
| a₁
| a₂
|
在线网络
| 6
| 4
|
目标网络
| 5.2
| 4.8
|
- 在线网络选 a₁(6 最大)
- 目标网络评估 a₁ → 5.2
- 直接相信 6
一个非常关键的认知点
两个网络的误差“不完全一致”
六、Double DQN 改了多少代码?
- ❌ 不改网络结构
- ❌ 不改训练流程
- ❌ 不增加计算复杂度
- ✅ 只改了一行“目标值计算”
七、实验结果说明了什么?
- Double DQN:
- 显著降低 Q 值高估
- 提升策略稳定性
- 在多数 Atari 游戏中:
- 分数更高
- 波动更小
它不是“更激进”,而是“更保守、更真实”