DQN(2013):深度强化学习的起点(里程碑级)

DQN(2013):深度强化学习的起点(里程碑级)

导出时间:2025/12/19 13:29:24





1、DQN(2013)学习与研究的背景 + 需要的准备知识

一、研究背景:DQN 为什么会在 2013 年横空出世?

一个长期未解决的梦想:“让机器像人一样,从看画面学会做事”

在 DQN 出现之前,人工智能领域一直有一个核心梦想:

不告诉规则、不手工设计特征,只给原始感知(图像),让机器自己学会如何行动。

现实中的智能体(人、动物)是这样学习的:
  • 你看到画面(视觉)
  • 你做一个动作
  • 得到结果(奖励或惩罚)
  • 久而久之,你学会“在什么情况下该怎么做”
但在 2013 年之前,这件事对机器来说几乎做不到。

强化学习的尴尬处境(DQN 之前)

(1)强化学习本身并不新

  • Q-learning 在 1992 年就已经提出
  • TD-Gammon(1995)已经能击败人类双陆棋高手
👉 问题不在“算法思想”,而在应用能力

(2)强化学习“只能玩低维世界”

在 DQN 之前,强化学习通常只能处理:
  • 状态是少量数字(位置、速度、角度)
  • 特征是人工设计的
例如:
  • 摆杆问题:状态 = (角度, 角速度)
  • 机器人控制:状态 = (关节角度)
一旦输入变成图像(像素)——直接崩溃。

为什么“图像 + 强化学习”这么难?

从论文中总结,主要有 三大致命困难

困难一:奖励信号极其稀疏、延迟

  • 你做一个动作
  • 可能几百、几千步之后才知道好不好
对比:
  • 监督学习:每个样本都有“标准答案”
  • 强化学习:只有“最终得分”
👉 就像考试只告诉你总分,不告诉你哪道题错了

困难二:数据高度相关(不独立)

深度学习通常假设:
  • 数据是 i.i.d.(独立同分布)
但强化学习中:
  • 连续状态高度相关
  • 今天看到的画面 ≈ 刚才的画面
👉 这会导致神经网络训练极不稳定,甚至发散

困难三:学习过程中,数据分布一直在变

  • 网络在更新
  • 策略在变
  • 看到的状态分布也在变
👉 等于一边学规则,一边规则在变

深度学习的“东风”来了(2009–2012)

就在强化学习长期停滞时,深度学习突然爆发
  • 2009–2012:卷积神经网络在视觉任务中大获成功
  • 2012:AlexNet 让深度学习震惊世界
关键变化
  • 神经网络终于能从“原始像素”中自动学习特征
  • GPU + SGD 让大规模训练成为可能
于是,一个关键问题被正式提出(论文原话含义):

既然深度网络能从像素中学特征,那能不能直接用它来学“如何行动”?


DQN 的历史定位(一句话总结)

DQN 是第一个真正“端到端”:从原始像素 → 动作决策 → 超越人类的通用强化学习系统

  • 不用手工特征
  • 不用游戏规则
  • 同一个网络,玩多款 Atari 游戏
  • 多数游戏中击败此前所有方法,甚至人类
👉 这就是为什么 DQN 被称为 “深度强化学习的起点 / 里程碑”

二、学习 DQN 前需要的准备知识(给小白的最小集合)

1. 强化学习的最基本直觉(不用公式)

你只需要记住 4 个词
名称
直观理解
环境(Environment)
游戏世界
状态(State)
你当前看到的情况
动作(Action)
你能做的选择
奖励(Reward)
环境给你的反馈
目标只有一个:

让“长期累计奖励”最大


Q-learning 的核心思想(DQN 的灵魂)

可以把 Q 理解为:

“在某种情况下,做某个动作,未来能有多好?”

记忆口诀:

Q(s, a) = 在状态 s 做动作 a,有多划算

Q-learning 干的事只有一件:
  • 不断修正这个“划算程度”的估计

为什么需要“深度”Q 网络?

传统 Q-learning:
  • 用表格存 Q(s, a)
  • 只适合状态空间很小
Atari 游戏:
  • 一个状态 = 一张 84×84×4 的图像
  • 状态数量 ≈ 天文数字
👉 只能用神经网络来“近似 Q 函数”
这就是:

Deep Q-Network(DQN)


深度学习方面的最低要求

不需要一开始就精通深度学习,只需理解:

(1)神经网络是函数逼近器

  • 输入:状态(图像)
  • 输出:每个动作的 Q 值

(2)卷积神经网络(CNN)

  • 专门处理图像
  • 自动学“边缘 → 形状 → 物体”
DQN 的 CNN 本质上在做:

“从游戏画面中,学会哪些像素重要”


一个重要心理准备(非常重要)

DQN 不是“优雅理论”,而是“工程奇迹”

它:
  • 没有严格收敛证明
  • 充满工程技巧
  • 但第一次让事情“真的跑起来了”
理解 DQN:
  • 重在 直觉 + 机制
  • 不必一开始纠结数学细节

三、小结(给初学者的定位)

到这里,你应该已经明白:
  • DQN 解决了什么问题
  • 它为什么在 2013 年是革命性的
  • 你现在站在什么起点上

DQN = 强化学习 × 深度学习 的第一次成功融合



2、DQN 的核心思想

一、一句话版:DQN 的核心思想是什么?

用一个深度神经网络,直接从“画面”中学会评估:在当前情况下,做哪个动作,长期来看最划算。

如果你只记住一句话,记住这一句就够了。

二、从“普通 Q-learning”开始,看看它哪里不行

1. 传统 Q-learning 在干什么?

想象一个最朴素的 Q-learning 智能体:
  • 它维护一张表:Q(s, a)
  • 表示:在状态 s 做动作 a,将来能拿多少分
  • 每次尝试后,用“现实结果”去修正这张表
问题来了:
👉 如果状态是“游戏画面”呢?
  • 一张画面 = 几万个像素
  • 状态数量 ≈ 无限
  • Q 表根本存不下
所以,DQN 的第一个核心思想出现了。

核心思想一:用神经网络“代替 Q 表”

不要再存一张表了,改成:训练一个“会估价的神经网络”
这个网络做一件事:
  • 输入:当前状态(游戏画面)
  • 输出:
    • 向左:值多少钱
    • 向右:值多少钱
    • 开火:值多少钱
    • ……
也就是说:

神经网络 = Q 函数本身

这就是 Deep Q-Network 这个名字的来源。

一个非常关键的设计(很多人第一次会忽略)

❌ 错误但直觉的做法

  • 输入:(状态, 动作)
  • 输出:Q(s, a)

✅ DQN 的聪明做法

  • 输入:状态
  • 输出:所有动作的 Q 值
为什么?
  • 一次前向传播
  • 就能知道“哪个动作最好”
  • 计算效率极高
👉 这是一个工程上非常重要、但论文里一笔带过的设计决策。

三、真正的难点:训练为什么会崩?

到目前为止,看起来一切都很自然:
  • Q-learning ✔
  • 神经网络 ✔
  • SGD ✔
但现实是:

直接用神经网络 + Q-learning,几乎必然发散

这是 DQN 出现之前,学界反复踩过的坑。

1. 为什么会发散?(直觉版)

你可以把训练过程想象成:
  • 网络一边在学习
  • 网络同时在“制造自己的训练数据”
具体来说:
  1. 网络当前认为“向左好”
  2. 它就经常向左
  3. 于是数据几乎全是“向左的经历”
  4. 网络被这种偏置数据进一步强化
  5. 形成恶性反馈循环
结果:
  • Q 值被无限放大
  • 训练直接崩溃

四、DQN 的真正革命:两个“稳定器”

DQN 真正成为里程碑,不是因为用了 CNN,而是因为它引入了 两个极其关键的机制

核心思想二:经验回放(Experience Replay)

1. 人类式的类比

人不是只从“刚刚发生的事情”中学习的,而是会:
  • 回忆过去的经历
  • 混合不同时间、不同情境
  • 反复反思
DQN 也做了同样的事。

经验回放在干什么?

每一步交互,DQN 都存一条记录:
(当前状态,采取的动作,得到的奖励,下一个状态)
把这些记录丢进一个“大记忆池”。
训练时:
  • 随机抽取一小批旧经历
  • 用它们来训练网络

它解决了什么问题?

经验回放一次性解决了 三个致命问题
  1. 打破数据相关性
    • 不再是连续帧
  2. 提高数据利用率
    • 一次经历,多次学习
  3. 减弱策略震荡
    • 学习不再被“当前策略”绑架
👉 这是 DQN 能跑起来的第一根救命稻草

核心思想三:目标网络(Target Network)

这是 DQN 的第二根救命稻草,也是最反直觉的一点。

问题根源

回忆一下 Q-learning 的更新目标:

当前 Q ≈ 奖励 + 折扣 × 下一个状态的最大 Q

但在神经网络里:
  • “当前 Q”是网络算的
  • “目标 Q”还是网络算的
👉 等于 自己追着自己的影子跑
这在数值上是极其不稳定的。

DQN 的解决方案:分身术

DQN 做了一件很“工程味”的事:
  • 维护 两个网络
    1. 在线网络(正在训练)
    2. 目标网络(冻结一段时间)
训练时:
  • 在线网络:负责学习
  • 目标网络:负责提供“相对稳定的目标”
隔一段时间:
  • 把在线网络参数 复制 给目标网络

直觉理解

你可以把它理解为:

不要一边改答案,一边改标准答案

目标网络 = 暂时不变的“参考答案”
👉 这是让训练不爆炸的关键技巧。

五、把 DQN 的核心思想串起来(全景图)

现在我们把所有核心点连成一句完整的话:

DQN 使用卷积神经网络,从原始像素中估计每个动作的长期价值;

通过 Q-learning 更新规则进行学习; 同时引入经验回放来打破样本相关性, 使用目标网络来稳定学习目标, 从而首次让“深度网络 + 强化学习”在复杂视觉环境中稳定工作。

这就是 DQN 的完整思想闭环

3、DQN 的训练流程

一、训练开始前:先把“舞台”搭好

在 DQN 真正开始学习之前,有 4 个关键组件必须先准备好。

1. 一个环境(Environment)

以 Atari 游戏为例:
  • 输入:当前游戏画面
  • 输出:
    • 下一帧画面
    • 奖励(分数变化)
    • 游戏是否结束
你可以把环境理解为:

一个函数:你给我一个动作,我给你新的世界状态 + 反馈


两个一模一样的神经网络

(1)在线网络(Online Network)

  • 作用:真正被训练的网络
  • 用来:
    • 选动作
    • 更新参数

(2)目标网络(Target Network)

  • 作用:提供“相对稳定的学习目标”
  • 特点:
    • 参数一段时间内不变
    • 定期从在线网络复制
👉 一开始: 两个网络参数是完全相同的

一个经验回放池(Replay Buffer)

这是一个“记忆仓库”,里面存的是四元组:
(状态 s, 动作 a, 奖励 r, 下一个状态 s')
  • 容量很大(例如 100 万条)
  • 新的经验会覆盖最老的

一个 ε-贪心策略(探索机制)

规则非常简单:
  • 以 ε 的概率:随机乱按
  • 以 1−ε 的概率:选当前 Q 值最大的动作
👉 一开始 ε 很大(疯狂探索)
👉 后期 ε 变小(逐渐理性)

二、真正的训练开始:一个时间步发生了什么?

下面是DQN 训练的核心循环。 我们按一个时间步 t来拆解。

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:把动作交给环境

环境返回三样东西:
  1. 奖励 r_t
  2. 下一状态 s_{t+1}
  3. 是否终止(done)
你可以理解为:

你按了一下键,世界变了,并给了你反馈


Step 5:把这次经历存进“记忆”

将这条完整经历存入经验回放池:
(s_t, a_t, r_t, s_{t+1})
⚠️ 注意: 这一步不训练,只是存起来

三、关键转折点:什么时候开始“真正学习”?

不是每一步都立刻更新网络。
当经验池中:
  • 已经积累了一定数量的样本
才开始下面这个过程 👇

四、一次真正的“参数更新”是怎么发生的?

这是 DQN 最核心、最精细的一段流程

Step 6:从经验回放池中随机采样一批经历

随机抽取一个小批量(mini-batch):
(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 步)

每隔固定步数(例如 10,000 步):
θ_target ← θ_online
直觉理解:

“冻结一段时间,再整体刷新”

这让学习过程呈现出:
  • 小步稳定优化
  • 大步阶段性对齐

六、把全过程压缩成“一条时间线”

如果你从“上帝视角”看整个 DQN 训练:
  1. 看画面
  2. 选动作
  3. 与环境交互
  4. 存经验
  5. 随机回忆过去
  6. 用旧网络算目标
  7. 用新网络学目标
  8. 偶尔更新目标网络
  9. ε 逐渐减小
  10. 策略越来越成熟

七、一个非常重要的认知校正(新手常见误区)

❌ 误区

DQN 是“在线学习,每一步立刻学”

✅ 正确理解

DQN 是“边玩边攒经验,靠反复回忆来学习”

这更接近:
  • 人类
  • 动物
  • 而不是“条件反射机器”

八、到这里,你应该真正“懂流程了”

如果现在我问你:

“DQN 一次参数更新,用了哪些数据?哪些网络?哪些是冻结的?”

你应该能清楚回答:
  • 数据:来自经验回放池
  • 目标:由目标网络给
  • 更新:只更新在线网络
👉 如果你能做到这一点,说明你已经跨过了 DQN 最难的门槛

4、DQN 为什么仍然有问题 & Double DQN 如何修正

一、先给结论(非常重要)

一句话总结:

DQN 的核心问题不是不稳定,而是“系统性高估 Q 值”; Double DQN 的本质,是把“选动作”和“评估动作”这两件事拆开。

如果你能理解这一句,后面的内容都会非常顺。

二、DQN 已经很强了,它“还错在哪”?

在 2013 年的 DQN 里,其实已经解决了两件生死攸关的大问题
  • 训练不发散(经验回放 + 目标网络)
  • 能处理高维视觉输入(CNN)
但研究者很快发现一个更隐蔽、也更危险的问题

DQN 学到的 Q 值,普遍偏大

而且这是结构性问题,不是调参能解决的

三、问题的根源:DQN 在“自作主张 + 自我打分”

我们回到 DQN 的关键更新公式(不写公式,用逻辑说)。
在 DQN 中,对一条经验 (s, a, r, s'),目标值是:

“奖励 + 折扣 × 在 s' 下,Q 值最大的那个动作的 Q 值”

注意这里有两个动作:
  1. 从所有动作中,挑一个“看起来最好的”
  2. 用它的 Q 值,作为学习目标
而在 DQN 里:

👉 这两件事,是同一个网络干的


1. 一个非常关键的直觉例子(一定要看)

假设在某个状态 s' 下,真实的 Q 值是:
动作
真实价值
a₁
5
a₂
5
但你的神经网络并不完美,它的预测是:
动作
网络预测
a₁
6
a₂
4
现在 DQN 会怎么做?
  • 它会:
    • 选择 a₁(因为 6 最大)
    • 并且相信 6 是正确的目标
问题来了:

这个“最大值”,几乎一定是“被高估的那个”


这是偶然吗?不是,这是统计必然

只要满足三点:
  1. 估计值有噪声(神经网络一定有)
  2. 你在多个动作里取最大
  3. 你用同一个估计器做选择 + 评估
那么结论是确定的:

max 操作会放大正向误差

这在统计上叫: 最大化偏置(Maximization Bias)

后果是什么?

DQN 的后果不是“直接崩”,而是:
  • Q 值整体偏大
  • 策略变得:
    • 过度自信
    • 偏好“看起来好,但其实一般”的动作
  • 在复杂任务中:
    • 性能明显受限
    • 对噪声敏感
👉 这是一个**“慢性病”**,不是“致命 bug”。

四、Double DQN 的核心思想:一刀切开纠缠

2015 年,Hasselt 提出 Double DQN,思想极其简单,但非常深刻。

1. 关键原则(一定要记住)

用一个网络“选动作”,用另一个网络“评估动作”。

这就是 Double 的真正含义。

在 Double DQN 中,角色重新分工

我们已经有两个网络:
网络
原本作用
在线网络
学习
目标网络
稳定目标
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
Double DQN 会:
  1. 在线网络选 a₁(6 最大)
  2. 目标网络评估 a₁ → 5.2
而不是:
  • 直接相信 6
👉 噪声不再被“自己放大自己”

一个非常关键的认知点

Double DQN 并不要求目标网络更准
它只要求:

两个网络的误差“不完全一致”

这在实践中几乎必然成立。

六、Double DQN 改了多少代码?

这是它成为“经典改进”的原因之一:
  • ❌ 不改网络结构
  • ❌ 不改训练流程
  • ❌ 不增加计算复杂度
  • ✅ 只改了一行“目标值计算”
👉 这是性价比极高的改进。

七、实验结果说明了什么?

大量实验表明:
  • Double DQN:
    • 显著降低 Q 值高估
    • 提升策略稳定性
    • 在多数 Atari 游戏中:
      • 分数更高
      • 波动更小
重要的是:

它不是“更激进”,而是“更保守、更真实”