跳到主要内容

从 Q-Learning 到 DQN — 没有标准答案的学习

这一章讲三件事: 没有标签的学习怎么定义(Q-Learning 的 Q 表与 ε-greedy); 同样框架下 SARSA 为什么学得「胆小」;状态一多表格就爆,深度学习怎么救(DQN 的两件武器)。 全书以强化学习收尾——它是唯一一章「训练数据不是给定的、而是自己挣来」的学习。

1. 顶层全景:五元素与一个循环

┌──────────── 动作 a ────────────┐
│ ▼
【主体 Agent】 ◄── 奖励 r+新状态 s' ──【环境 Environment】

└─ 策略 Policy:状态 → 动作 的函数(要学的东西)

图说:书里的场景是一个 5×5 网格迷宫:25 个格子=25 个状态,
上下左右 4 个动作;吃到宝藏(五角星)+100,撞到树 −100。
学习目标:找到一个让累计奖励最多的策略。

书里用一个比喻点破强化学习与监督学习的差别:像爱迪生发明电灯——没有方案、没有先例,只有不断尝试后的结果反馈;监督学习模仿标签,强化学习只能从奖惩里自己悟1。四个要素各有明确定义:环境(外部系统)、主体(动作行使者)、状态(处境)、动作、奖励(动作成败的反馈)2;迷宫例子里,状态=所在格子,动作=四方向,奖励=当前格的回报3

注意输出与输入的差别:输入是状态/动作/奖励,输出是 Policy——一个「给定状态就给动作」的函数;学习的全部目标就是让这个函数挣到最多奖励4

2. 主走查:Q-Learning 在 25 格迷宫里怎么学

Q-Learning 的核心是一张表(Q-Table):行是状态、列是动作,格子里填 Q(s,a)——「在状态 s 做动作 a 之后,能指望的最大累计奖励」5。表初始全 0,靠试错一笔笔填。每走一步的更新式(α=学习率,γ=折扣率——未来的奖励打多少折):6

new_q = r + γ · max Q(s', ·) 「即时奖励 + 下一格的最好指望」
Q(s,a) += α · (new_q − Q(s,a)) 「往新估计的方向挪一小步」

数走一遍(数字为演示编的):γ=0.9,α=0.1
在格子 s 向右走一步,得 r=0,走到 s';
Q(s') 的四个动作里最大值当前是 5.0
→ new_q = 0 + 0.9×5.0 = 4.5
→ Q(s,右) += 0.1×(4.5 − 2.0) = +0.25,从 2.0 更新到 2.25

max Q(s') 是这套算法的性格所在:更新时假定下一步永远走最优——哪怕实际走出的是臭棋,表格也按「理想情况」填。这叫离线(off-policy)学习,稍后与 SARSA 对照。书里的实现参数:学习率 0.01、折扣 0.9、ε=0.1,跑 200 局7

怎么选动作? 一味选表里最大的动作,会困死在已知经验里(不去探索没走过的路)。ε-greedy 策略:掷一次骰子,以小概率 ε(如 0.1)随机乱走一步探索,以 1−ε 概率按 Q 表走「经验上最优」的一步——「平衡经验与探索」就这六个字8

3. SARSA:同样一张表,学出不同的性格

SARSA(State-Action-Reward-State-Action)与 Q-Learning 几乎逐行相同,唯一差别在更新式里9:

Q-Learning: new_q = r + γ · max Q(s', ·) 按理想(不管实际会做什么)
SARSA: new_q = r + γ · Q(s', a') 按现实(a' 是实际将选的动作)

Q-Learning 优化「假设我接下来总走最优」的价值;SARSA 优化「照我这套带探索的策略走」的价值——前者离线、后者在线。书里给了一个性格化的观察:同样在有两个陷阱(−100 的树)的迷宫里,SARSA 更「胆小」——它把「探索时可能掉陷阱」也算进价值,于是躲开陷阱附近的格子、活动范围明显变小,更难到达宝藏,但也更少掉进陷阱10

这不是段子,是两个目标的真实分野:要学「最优路径」用 Q-Learning 式;要学「安全策略」(探索本身有代价的场景,如真实机器人)用 SARSA 式。书里的 Q 表可视化直接显示了 SARSA 的活动范围收缩11

4. Q 表的天花板:从表格到函数

Q-Table 的前提是状态和动作都能数得过来。自动驾驶要看摄像头画面选方向——画面是高维(维数巨大)且连续的,「列举所有情况然后迭代,显然不可取、不可行」12。解法方向书里一句话点透:把「查表」变成「拟合函数」——用参数 θ 的函数逼近 Q 值:Q(s,a;θ) ≈ Q(s,a);而拟合函数正是神经网络的强项,于是「深度」+「强化学习」合体13

但直接把神经网络塞进 Q-Learning 会散架,书里列了四个矛盾14:深度学习要大量带标签样本、RL 只有奖励没有标签;深度学习要样本独立、RL 前后状态相关;深度学习要目标分布固定、RL 的分布随策略一直变;非线性网络表示值函数本身就不稳定。DQN 的两件武器,正是对着这四个矛盾去的。

5. DQN 的两件武器:经验回放与目标网络

DQN(深度 Q 网络,Mnih 等人 2013 年提出、2015 年在 Nature 上优化)的机制清单15:

武器一:经验回放(Experience Replay)
每走一步,把 (状态 φt, 动作 at, 奖励 rt, 新状态 φt+1) 存进回放记忆 D
训练时不按时间顺序喂,而是从 D 里【均匀随机抽一批】
→ 打破「样本前后相关」、缓解「分布漂移」两个矛盾[^16]

武器二:目标网络(Target Network)
拿两份同样的网络:policy_net 算当前 Q,target_net 算目标 Q
目标 Q = r + γ·max Q(s',a';θ⁻) ← θ⁻ 是旧参数
每 C 步才把 policy_net 的参数抄给 target_net 一次
→ 学习目标短期内固定不动,治「追逐移动靶」的不稳定[^17]

损失:L(θ) = E[(TargetQ − Q(s,a;θ))²] 把第 2 节的表更新式
原样翻译成了回归任务的损失;书里的实现用 Huber(smooth L1)损失,
比 MSE 对离谱的大误差更钝感[^18]

看清这两件武器的对应关系:DQN 没有发明新数学,它把「表格更新式」逐字翻译成「网络回归损失」,再用工程手段(存储重放、参数延迟(隔几步才做)同步)堵住让网络散架的四个矛盾。第 2 节那张表的「手算更新」与这里的「损失反传」是同一条公式的两种载体——Q-Table 被神经网络参数替代了16

6. 实战:CartPole 与这套方法的边界

书里的实现直接取自 PyTorch 官方教程:CartPole(小车上一根杆,左右移动保持不倒)。三个实现细节值得记17:

  • 状态是「两帧画面的差」——state = current_screen − last_screen:静态背景被减掉,只剩下「发生了什么变化」;网络是三层卷积+BN 接全连接(第 06 章的 CNN 在这里当特征提取器用);
  • 训练 50 轮,每轮里「选动作→存经验→抽样优化」循环;每 TARGET_UPDATE 轮同步一次目标网络;
  • 环境 gym 安装:pip install gym[all]

边界要当面讲: Q-Learning 家族只适合离散动作(左右移、上下走);动作连续(油门开多少度)要换 policy gradient 一系,书里只在开头提了一个名字。以及 DQN 的样本效率低、超参敏感——「游戏里惊艳、现实里难用」的差距,书出版时已显现,书里没展开。

判断(我们的,不是书里的): 本章的深意在第 4 节那个「表格→函数」的转换:凡是「查表」式的智能(规则库、状态机、Q 表),状态空间(所有可能处境的集合)一大就撞墙,「换成网络拟合」是通用逃生通道。DQN 是这条通道的第一个大胜利(2015 年雅达利游戏超人类),后来 AlphaGo 把它推上顶点——书里提了 AlphaGo Zero 完全弃人类知识、碾压早期版本18如果错,会错在: 如果后续研究证明表格法在适当抽象(状态聚合等)下足以覆盖大多数实用场景,「必换网络」的普遍性就要打折——事实上小状态空间里表格法至今仍是最稳的首选。

7. 作者的判断与证据

给了证据的: 迷宫实验的 Q 表演化、SARSA 的活动范围收缩图、CartPole 的完整训练代码,都有实跑支撑;ε-greedy 的 ε=0.1、学习率 0.01、折扣 0.9 全部给出具体值。

给了机制对比的: Q-Learning 与 SARSA 的差别被压到一个 max 与一个具体动作之差,并配了「胆小」的行为证据——全书里这对概念讲得最清楚的地方。

转述结论的: 「Adam 之外,强化学习各算法优劣」书未评;「RMSprop/Adam 在 RL 里的选择」「DQN 的后续算法(Double DQN、Dueling DQN)」只有名字没有展开——书自己承认只讲「基础及多个实例」。

8. 边界与局限

  • 只覆盖价值函数一族。 Policy Gradient、Actor-Critic、A3C/PPO 这条如今更主流的线,书里零展开;「Policy Gradients」这个词出现过,仅此而已。
  • 没有 AlphaGo 级案例的拆解。 MCTS 与网络怎么结合、自我博弈怎么设计,全在书外。
  • DQN 的三个已知改进(Double DQN 治过高估计、优先回放、Dueling 架构)只字未提;照本书实现遇不稳时,先去补这三件。
  • 奖励函数设计(reward shaping)全书未讲——实际 RL 项目里最耗时的是它,不是网络。

9. 可带走的

  1. 强化学习的输入是状态/动作/奖励,输出是策略函数;没有标签,只有奖惩;
  2. Q(s,a)=「在此状态做此动作后能指望的最大累计奖励」;Q 表靠 r + γ·maxQ(s') 逐步填;
  3. ε-greedy 六个字:以 ε 概率探索、1−ε 概率走经验最优——平衡经验与探索的全部机制;
  4. Q-Learning 按「理想下一步」更新(离线),SARSA 按「实际下一步」更新(在线)——后者更安全也更保守;
  5. 状态空间一大,表格必死;Q 表换成网络 Q(s,a;θ) 就是 DQN 的出发点;
  6. DQN 两件武器:经验回放(随机采样打破相关性)、目标网络(延迟同步稳住靶子);损失用 Huber;
  7. 状态表示可以设计:两帧画面相减,静态背景消失、变化浮现;
  8. 这套方法只管离散动作;连续动作要换 policy gradient 一族——本书没讲,接着学 RL 从那里开始。

10. 原文地图

主题原书章原文位置
爱迪生比喻第15章 强化学习text/16-ch15.txt:7(搜「爱迪生」)
五元素定义第15章 强化学习text/16-ch15.txt:53(搜「环境(Environment」) · text/16-ch15.txt:69(搜「五角星」)
输入输出与 Policy第15章 强化学习text/16-ch15.txt:82(搜「Policy」) · text/16-ch15.txt:97(搜「最优的策略」)
Q-Table 核心第15章 强化学习text/16-ch15.txt:112(搜「Q-Table」)
更新式与代码第15章 强化学习text/16-ch15.txt:143(搜「new_q」) · text/16-ch15.txt:144(搜「learning_rate」)
ε-greedy第15章 强化学习text/16-ch15.txt:162(搜「贪婪」) · text/16-ch15.txt:195(搜「epsilon」)
200 局与参数第15章 强化学习text/16-ch15.txt:193(搜「discount_factor」) · text/16-ch15.txt:235(搜「200次游戏」)
SARSA 差别第15章 强化学习text/16-ch15.txt:254(搜「SARSA」) · text/16-ch15.txt:283(搜「next_action」)
SARSA 胆小第15章 强化学习text/16-ch15.txt:316(搜「胆小」) · text/16-ch15.txt:322(搜「活动空间也小」)
Q 表局限第16章 深度强化学习text/17-ch16.txt:4(搜「二维表格」) · text/17-ch16.txt:7(搜「高维」)
函数拟合第16章 深度强化学习text/17-ch16.txt:33(搜「函数拟合」) · text/17-ch16.txt:38(搜「参数学习」)
四个矛盾第16章 深度强化学习text/17-ch16.txt:47(搜「标签值」) · text/17-ch16.txt:51(搜「分布一直变化」)
DQN 三机制第16章 深度强化学习text/17-ch16.txt:61(搜「Q-Learning使用Reward」) · text/17-ch16.txt:66(搜「Target-Net」)
损失与 TargetQ第16章 深度强化学习text/17-ch16.txt:76(搜「TargetQ」) · text/17-ch16.txt:80(搜「TargetQ=r」)
回放动机第16章 深度强化学习text/17-ch16.txt:93(搜「独立同分布」)
目标网络 Nature第16章 深度强化学习text/17-ch16.txt:99(搜「Nature」)
四元组第16章 深度强化学习text/17-ch16.txt:165(搜「四元组」)
Huber 损失第16章 深度强化学习text/17-ch16.txt:231(搜「Huber」) · text/17-ch16.txt:240(搜「smooth_l1_loss」)
CartPole 实战第16章 深度强化学习text/17-ch16.txt:244(搜「num_episodes = 50」) · text/17-ch16.txt:248(搜「last_screen」) · text/17-ch16.txt:278(搜「TARGET_UPDATE」)

Footnotes

  1. 出处:「第15章 强化学习」第 7 段(text/16-ch15.txt:7,搜「爱迪生」)与第 11 段(text/16-ch15.txt:11,搜「没有预先给定标签或模板」)。

  2. 出处:「第15章 强化学习」第 53 段(text/16-ch15.txt:53,搜「环境(Environment」)、第 57 段(text/16-ch15.txt:57,搜「主体(Agent」)与第 69 段(text/16-ch15.txt:69,搜「五角星」)。

  3. 出处:「第15章 强化学习」第 86 段(text/16-ch15.txt:86,搜「25个格子」)与第 89 段(text/16-ch15.txt:89,搜「上,下,左,右」)。

  4. 出处:「第15章 强化学习」第 82 段(text/16-ch15.txt:82,搜「Policy」)与第 97 段(text/16-ch15.txt:97,搜「最优的策略」)。

  5. 出处:「第15章 强化学习」第 112 段(text/16-ch15.txt:112,搜「Q-Table」)与第 148 段(text/16-ch15.txt:148,搜「最大期望奖励值」)。

  6. 出处:「第15章 强化学习」第 143 段(text/16-ch15.txt:143,搜「new_q」)。α 与 γ 的含义见第 135 段(text/16-ch15.txt:135,搜「折扣率」)。

  7. 出处:「第15章 强化学习」第 193 段(text/16-ch15.txt:193,搜「discount_factor」)、第 195 段(text/16-ch15.txt:195,搜「epsilon」)与第 235 段(text/16-ch15.txt:235,搜「200次游戏」)。

  8. 出处:「第15章 强化学习」第 162 段(text/16-ch15.txt:162,搜「贪婪」)。

  9. 出处:「第15章 强化学习」第 254 段(text/16-ch15.txt:254,搜「SARSA」)与第 283 段(text/16-ch15.txt:283,搜「next_action」)。

  10. 出处:「第15章 强化学习」第 316 段(text/16-ch15.txt:316,搜「胆小」)与第 322 段(text/16-ch15.txt:322,搜「活动空间也小」)。

  11. 出处:「第15章 强化学习」第 320 段(text/16-ch15.txt:320,搜「Q表更新情况」)。

  12. 出处:「第16章 深度强化学习」第 10 段(text/17-ch16.txt:10,搜「不可取、不可行」)。

  13. 出处:「第16章 深度强化学习」第 33 段(text/17-ch16.txt:33,搜「函数拟合」)与第 38 段(text/17-ch16.txt:38,搜「参数学习」)。

  14. 出处:「第16章 深度强化学习」第 47 段(text/17-ch16.txt:47,搜「标签值」)与第 51 段(text/17-ch16.txt:51,搜「分布一直变化」)。

  15. 出处:「第16章 深度强化学习」第 61 段(text/17-ch16.txt:61,搜「Q-Learning使用Reward」)与第 66 段(text/17-ch16.txt:66,搜「Target-Net」)。

  16. 出处:「第16章 深度强化学习」第 109 段(text/17-ch16.txt:109,搜「神经网络参数替代Q-Table」)。

  17. 出处:「第16章 深度强化学习」第 244 段(text/17-ch16.txt:244,搜「num_episodes = 50」)、第 248 段(text/17-ch16.txt:248,搜「last_screen」)与第 278 段(text/17-ch16.txt:278,搜「TARGET_UPDATE」);gym 安装见第 292 段(text/17-ch16.txt:292,搜「gym[all]」)。

  18. 出处:「第5章 机器学习基础」第 74 段(text/06-ch05.txt:74,搜「AlphaGo Zero」)。