外观
价值学习:从动态规划到 DQN
一句话定位:这一页讲清楚价值学习(Value-based RL)的完整脉络——先学"价值函数"(V 或 Q),再从价值导出策略;从模型已知的动态规划,到无模型的蒙特卡洛与时序差分,再到深度时代的 DQN 家族;读完后你能手写 Q-learning 表格算法、解释 TD 误差,并说清 DQN 的每一项工程技巧为什么必要。
一、价值学习的总思路:学 Q,再从 Q 导出策略
1. 核心逻辑链
价值学习的思想极其朴素,只有三步:
text
价值学习三步走
─────────────────────────────────────────────
第一步:学一个价值函数 Q(s,a)("每个动作值多少")
第二步:策略 = argmax_a Q(s,a)("选最值的动作")
第三步:用 (s, r, s') 的经验不断改进 Q
─────────────────────────────────────────────也就是说,价值函数是主角,策略是配角(由 Q 自动导出)。这与策略梯度方法正好相反——那边直接学策略,价值是配角(甚至没有)。
2. 学 Q 就是解贝尔曼方程
回顾马尔可夫决策过程(MDP)页的贝尔曼最优方程:
$$ Q^(s,a) = \sum_{s'} P(s' \mid s,a) \left[ R(s,a,s') + \gamma \max_{a'} Q^(s', a') \right] $$
价值学习的全部历史,就是**"如何解这个方程"的不同算法**。按"解方程时用了多少信息",依次是:
| 时代 | 用什么信息 | 代表方法 |
|---|---|---|
| 动态规划 | 完整模型 P、R | 策略迭代、值迭代 |
| 采样时代 | 与环境交互的样本 | MC、TD(0)、SARSA、Q-learning |
| 深度时代 | 样本 + 神经网络 | DQN 及家族 |
二、模型已知时:动态规划(DP)
1. 策略迭代:评估 → 改进 → 评估 → 改进
策略迭代(policy iteration) 分两步交替进行:
text
┌─────────────┐ ┌──────────────┐
│ 策略评估 │ │ 策略改进 │
│ 求 V^π │ ─────▶ │ π' = greedy │
│ (贝尔曼方程 │ │ (对 V^π 取 │
│ 迭代求解) │ ◀───── │ argmax) │
└─────────────┘ └──────────────┘
▲ │
└─────────直到策略不再变化──────┘- 策略评估(policy evaluation):给定策略 π,用贝尔曼方程迭代求 $V^\pi$:
$$ V_{k+1}(s) = \sum_a \pi(a|s) \sum_{s'} P(s'|s,a)\left[ R + \gamma V_k(s') \right] $$
- 策略改进(policy improvement):有了 $V^\pi$,把策略改成"贪婪于价值":
$$ \pi'(s) = \arg\max_a \sum_{s'} P(s'|s,a) [R + \gamma V^\pi(s')] $$
策略改进定理保证:新策略 π' 一定不比 π 差。重复直到不动点 → 最优策略。
2. 值迭代:评估和改进合并成一步
值迭代(value iteration) 把"评估到收敛"这一步砍掉,每轮只做一次贝尔曼最优方程更新:
$$ V_{k+1}(s) = \max_a \sum_{s'} P(s'|s,a)\left[ R(s,a,s') + \gamma V_k(s') \right] $$
直觉:值迭代是"边评估边改进"——价值每更新一次,策略隐含地也换一次。
3. 策略迭代 vs 值迭代
| 维度 | 策略迭代 | 值迭代 |
|---|---|---|
| 每轮做什么 | 完整评估 + 一次改进 | 一次贝尔曼更新(隐含改进) |
| 迭代轮数 | 少(但每轮贵) | 多(但每轮便宜) |
| 收敛速度 | 通常更快 | 较慢,需要很多轮 |
| 适用 | 状态少、模型精确 | 同上 |
DP 的现实意义
真实问题没有完美模型,DP 很少直接用于实战。但它是所有价值学习的理论基线:Q-learning 是"用采样替代 DP 中的求和",DDPG/SAC 的 target 计算本质是"一次贝尔曼备份"。理解 DP 才能理解后续所有"近似"做了什么、丢了什么。
三、模型未知时:蒙特卡洛(MC)与时序差分(TD)
现实中拿不到 $P$ 和 $R$,但智能体可以与环境交互采样。用样本代替模型,就是 MC 和 TD。
1. MC:跑完一整局再回头算价值
蒙特卡洛法的直觉:"这个状态值多少?多玩几局,看看从这个状态出发平均赢多少。"
对每一条完整轨迹 ${s_0,a_0,r_1,s_1,\dots,r_T}$,计算每个访问过状态的回报 $G_t = r_{t+1}+\gamma r_{t+2}+\cdots$,然后对 $V(s_t)$ 做平均:
$$ V(s_t) \leftarrow V(s_t) + \alpha \left( G_t - V(s_t) \right) $$
特性:无偏($G_t$ 是真实回报的样本均值)、方差大(一条轨迹运气成分大)、必须等回合结束才能更新(episodic 限定)。
2. TD:走一步就更新(自举)
时序差分(Temporal Difference, TD)的直觉:"我不用等到结局。走一步看看实际发生了什么,用'这一步的经验 + 对下一步的估计'来修正当前估计。"
$$ V(s_t) \leftarrow V(s_t) + \alpha \left[ r_{t+1} + \gamma V(s_{t+1}) - V(s_t) \right] $$
括号里的东西就是TD 误差(TD error):
$$ \delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t) $$
直觉:$\delta_t$ 度量"我原本以为状态 s_t 值 $V(s_t)$,但实际走一步后发现应该值 $r_{t+1} + \gamma V(s_{t+1})$"——两者的差就是修正方向。TD 误差为正是"比预期好",为负是"比预期差"。
3. MC vs TD 对比
| 维度 | MC | TD(0) |
|---|---|---|
| 更新时机 | 回合结束 | 每步 |
| 偏差 | 无偏 | 有偏(依赖 $V(s_{t+1})$ 的当前估计) |
| 方差 | 大(整条轨迹的运气都算进去) | 小(只引入一步随机性) |
| 需要回合结束 | 是 | 否(支持持续式任务) |
| 是否自举(bootstrap) | 否 | 是 |
| 收敛特性 | 样本内一定收敛 | 表格下收敛到 MDP 价值 |
面试必答:"MC 和 TD 各有什么毛病"
- MC:方差大——同一条轨迹既包含"策略好"也包含"运气好",无法区分;
- TD:有偏——$V(s_{t+1})$ 一开始是错的,这个错会被"自举"传播;
- 折衷是 TD(λ)/GAE:用"多步回报"在这两者之间滑动(见策略梯度方法的 GAE 一节)。
四、SARSA 与 Q-learning:on-policy 与 off-policy 的分水岭
TD 思想用在动作价值上,派生出两个经典算法——它们只在更新公式里的一个位置不同,却代表了 RL 最重要的概念分野。
1. Q-learning(off-policy):学"最优",用"次优"的行为
$$ Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[ r_{t+1} + \gamma \max_{a'} Q(s_{t+1}, a') - Q(s_t, a_t) \right] $$
关键在 $\max_{a'}$:更新时用的是"下一步的最优动作"的 Q,而不管实际下一步真的做了什么动作。也就是说:
- 行为策略(behavior policy):ε-greedy,负责与环境交互、产生数据;
- 目标策略(target policy):贪婪,负责定义"要学的最优策略"。
两者可以不一样 → off-policy(离策略)。
2. SARSA(on-policy):学"我正在用的策略"
$$ Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[ r_{t+1} + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t) \right] $$
区别只有一个:把 $\max_{a'} Q(s_{t+1}, a')$ 换成 $Q(s_{t+1}, a_{t+1})$——用实际采取的下一步动作的价值。SARSA 学的是"包含探索在内的当前策略"的价值 → on-policy(在策略)。
| 维度 | SARSA | Q-learning |
|---|---|---|
| 全称 | State-Action-Reward-State-Action | (无缩写的缩写) |
| 更新用 | 实际动作 $a_{t+1}$ 的 Q | 最优动作 $\max_{a'}$ 的 Q |
| on/off-policy | on-policy | off-policy |
| 探索敏感性 | 害怕悬崖:把 ε 探索的代价算进价值 | 无视探索:学纯最优策略 |
| 收敛 | 收敛到"ε-greedy 策略"的价值 | 收敛到最优策略的价值 |
3. 悬崖行走的经典故事:SARSA 更"怂"但更安全
Sutton & Barto 的悬崖行走(Cliff Walking)例子:从起点到终点,紧贴悬崖的路线最短但有掉下去的风险。
- Q-learning:学的是"每一步都走最优"的价值 → 贴悬崖走,因为最优策略本来就走最短路线;但训练期间 ε-greedy 有概率掉下悬崖 → 表现波动大;
- SARSA:把"探索时会摔下去"也算进了价值 → 学会离悬崖远一点走 → 训练过程更稳。
工程启示
在训练期间要控制风险的系统(真实机器人、资金交易)里,on-policy 的"保守"是优点;在离线学一个最终策略(比如先训练后上线)的场景里,off-policy 的"大胆"更合适。没有绝对好坏,只有策略与部署是否匹配。
4. Q-learning 表格算法伪代码
python
# Q-learning 表格版
def q_learning(env, episodes, alpha=0.1, gamma=0.99, eps=0.1):
Q = defaultdict(lambda: zeros(n_actions)) # 初始 Q 全 0
for _ in range(episodes):
s = env.reset()
done = False
while not done:
a = eps_greedy(Q, s, eps) # 行为策略:ε-greedy
s_next, r, done = env.step(a)
# 更新公式(off-policy,用 max)
td_target = r + gamma * max(Q[s_next]) if not done else r
Q[s][a] += alpha * (td_target - Q[s][a])
s = s_next
return Q表格 Q-learning 的实现坑
- done 的处理:终止状态没有"下一步",$td_target = r$(不能加 $\gamma Q(s_{next})$)。漏掉这个,终止状态的价值会被高估/低估,是入门最常见 bug;
- 连续状态必须先离散化(分桶),否则表格爆炸;
- α 和 ε 要配合:探索猛的时候 α 要小一点,否则估计抖动。
五、DQN:把 Q 换成神经网络
1. 问题:表格装不下真实世界
Atari 游戏输入是 210×160 的像素画面,状态空间天文数字,表格不存在。深度 Q 网络(Deep Q-Network, DQN)用神经网络 $Q_\theta(s,a)$ 逼近 Q 函数(Mnih et al., 2015, Nature)。
网络输出:给定 $s$,输出所有动作的 Q 值向量 $[Q_\theta(s,a_1), \dots, Q_\theta(s,a_K)]$。损失函数是"让 Q 满足贝尔曼方程":
$$ L(\theta) = \mathbb{E}{(s,a,r,s') \sim \mathcal{D}} \left[ \left( r + \gamma \max Q_{\bar\theta}(s', a') - Q_\theta(s,a) \right)^2 \right] $$
其中 $Q_{\bar\theta}$ 是目标网络的参数(定期拷贝自 $\theta$)。括号里就是 TD 误差;目标 = 平方最小化 TD 误差。
2. 两大工程技巧:为什么 DQN 缺了它们就不收敛
技巧一:经验回放(experience replay)
把 $(s,a,r,s')$ 存进一个回放缓冲区,训练时随机抽样小批量。两个作用:
| 问题 | 回放怎么解决 |
|---|---|
| 样本强相关(前后步高度相关) | 随机抽样打破时序相关 → 更像 i.i.d.,SGD 才稳 |
| 样本浪费(用完即弃) | 一条经验可反复学习 → 数据效率提升 |
技巧二:目标网络(target network)
DQN 的回归目标 $r + \gamma \max Q$ 本身依赖正在更新的同一个网络。如果直接用 $\theta$ 计算目标,目标也在变 → 梯度追着一个移动的靶子 → 振荡甚至发散。解法:冻结一个副本 $\bar\theta$,每 N 步才把 $\theta$ 拷贝过去。这样"靶子"每 N 步才动一次,训练稳定。
一句话记住 DQN 的动机
"回归目标里含有模型自身"(自举)是 DQN 不稳定的根源;回放解决样本相关,目标网络解决目标移动。这两个技巧从此成为深度 RL 的通用基建——几乎所有现代算法(包括 SAC、TD3)都带。
3. DQN 的预处理与结构
Atari 上的经典配置:灰度化 → 84×84 裁剪 → 最近 4 帧堆叠成 84×84×4 输入(用历史帧给"速度"信息,弥补马尔可夫性质)→ 卷积网络 → 输出 18 个动作的 Q 值。完整案例见Atari 与电子游戏。
六、DQN 家族:七项改进与 Rainbow
1. Double DQN:治"价值高估"
Q-learning 的 $\max$ 天然高估价值(max 算子会把噪声往大的方向带)。Double DQN(van Hasselt et al., 2016)把"选动作"和"评估价值"拆到两个网络:
$$ r + \gamma , Q_{\bar\theta}\left(s', \arg\max_{a'} Q_\theta(s', a')\right) $$
直觉:用在线网络选"哪个动作最优",用目标网络评估"它值多少"。两套估计的噪声部分抵消,高估显著减小。
2. Dueling DQN:价值与优势解耦
Dueling(Wang et al., 2016)把输出拆成两条支路:
$$ Q(s,a) = V(s) + A(s,a) - \overline{A}(s) $$
- $V(s)$:状态本身值多少(跟动作无关的部分);
- $A(s,a)$:这个动作相对平均的优势(advantage)。
直觉:有些游戏里"局面本身好不好"比"具体动作"重要得多(比如球快落地时,往哪跑都差不多)。Dueling 让网络专注于真正有差异的信息,学得更快更稳。
3. Prioritized Replay:回放也要分轻重
普通回放均匀抽样。但TD 误差大的样本信息量更大(说明预测最不准)。Prioritized Replay(Schaul et al., 2016)按 $|\delta_t|$ 加权抽样,并加重要性采样修正权重(防止高频样本过拟合)。
4. C51(分布式 RL):学分布而不是均值
C51(Bellemare et al., 2017)不学 $Q(s,a)$ 的期望,而是直接学回报的整个分布(用 51 个固定支点的分类分布表示)。分布信息更丰富,还能刻画风险,在 Atari 上效果拔群。
5. NoisyNet:把探索装进网络
前面探索与利用提过,NoisyNet 在层里加可学习噪声,替代 ε-greedy 的随机探索,见多臂老虎机页的探索讨论。
6. Rainbow 汇总表
Rainbow(Hessel et al., 2018)把七项改进打包,逐一消融实验证明每一项都有用:
| 改进 | 解决的问题 | 一句话机制 |
|---|---|---|
| Double DQN | 价值高估 | 选动作与估值分离 |
| Prioritized Replay | 样本利用率 | 按 TD 误差加权抽样 |
| Dueling | 动作冗余 | V 与 A 分开学 |
| 多步回报(n-step) | 自举偏差 | 走 n 步再自举(类似 TD(λ)) |
| 分布式 Q(C51) | 只学均值 | 学回报分布 |
| NoisyNet | 探索不智能 | 网络内噪声 |
| 参数更新 | 学习不稳定 | 循环学习率(替代固定 α) |
工程启示
不需要从零实现 Rainbow。实际项目(尤其连续控制)首选 SAC/TD3(见Actor-Critic 家族);只有离散动作空间且要榨干性能时才上 Rainbow 系。
七、价值学习的局限
| 局限 | 原因 | 后果 |
|---|---|---|
| 连续动作空间瘫痪 | 策略 = argmax Q,连续空间里 max 不可直接算 | 价值学习几乎退出连续控制(DQN 无法用于机器人) |
| 价值高估 | max 算子的统计偏差 | 需要 Double 等修正,但只是缓解 |
| 对奖励缩放敏感 | Q 值随奖励量级变化 | 需要 reward scaling 等工程技巧 |
| 收敛性无保证(深度版) | 自举 + 非线性近似 | 训练不稳定,需要大量技巧堆叠 |
什么时候别用价值学习
- 动作连续 → 用策略梯度/Actor-Critic(SAC、PPO);
- 要求策略显式带随机性(扑克、博弈)→ 策略梯度天然支持;
- 环境奖励极其稀疏 → 价值学习需要额外探索组件(RND 等)。 价值学习的理论意义不亚于实践意义:它是理解 TD、自举、off-policy 这些所有 RL 共用的地基概念的载体。
八、实践落点
- 想亲手跑 Q-learning 表格版 → 渐进式教程:Gymnasium 三版跑起来(版本一就是表格 Q-learning 完整代码);
- 想读懂 DQN 论文原文 → 经典论文精读(Watkins Q-learning 与 Mnih DQN 逐篇精读);
- 数学细节(TD 收敛证明、贝尔曼算子的压缩映射)→ 数学基础速查;
- 价值学习在 Actor-Critic 中如何与策略网络协同 → Actor-Critic 家族。
延伸阅读
- 马尔可夫决策过程(MDP) —— 贝尔曼方程是本页所有算法的起点
- Actor-Critic 家族 —— 价值网络在 actor-critic 中退居"评委"角色
- Atari 与电子游戏 —— DQN 与 Rainbow 的实战与七项改进验证
- 经典论文精读 —— Q-learning 与 DQN 的原始论文精读
- 数学基础速查 —— 期望、自举与收敛性背后的数学
- 渐进式教程:Gymnasium 三版跑起来 —— 手写表格 Q-learning 并看到学习曲线
参考资料
- Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction (2nd ed.). MIT Press. 第 5-7 章(MC/TD/Q-learning/SARSA)与第 11 章(off-policy 近似)。
- Watkins, C. J. C. H., & Dayan, P. (1992). Q-learning. Machine Learning, 8(3-4), 279-292. Q-learning 的原始论文与收敛证明。
- Mnih, V., Kavukcuoglu, K., Silver, D., et al. (2015). Human-level control through deep reinforcement learning. Nature, 518, 529-533. DQN 的 Nature 论文。
- van Hasselt, H., Guez, A., & Silver, D. (2016). Deep Reinforcement Learning with Double Q-learning. AAAI. arXiv:1509.06461
- Wang, Z., Schaul, T., Hessel, M., et al. (2016). Dueling Network Architectures for Deep Reinforcement Learning. ICML. arXiv:1511.06581
- Schaul, T., Quan, J., Antonoglou, I., & Silver, D. (2016). Prioritized Experience Replay. ICLR. arXiv:1511.05952
- Hessel, M., Modayil, J., van Hasselt, H., et al. (2018). Rainbow: Combining Improvements in Deep Reinforcement Learning. AAAI. arXiv:1710.02298