强化学习:Q-learning 与 DQN
本章回答什么
怎样从 TD prediction 走到离散动作控制,又怎样把 Q-table 换成神经网络而不让 bootstrap 目标不断追逐自己?本章先划清 SARSA 与 Q-learning 的 on-policy / off-policy 边界,再解释 DQN 的函数逼近、experience replay 与 frozen target network。
这里的可执行实验只证明 CartPole 上发生了一次有限的真实优化更新。它不是收敛基准,也不证明这组超参数能解决 CartPole。
先修知识
先读 动态规划、Monte Carlo 与 TD,尤其是 TD error、terminal mask 与 truncation。最小 GridWorld 的 tabular Q-learning 实现在 gridworld.py;深度版本的环境安装与命令见 示例 README。
最小任务
先运行表格版本,确认 terminal-masked Q-learning update;再运行深度版本。CartPole-v1 的 observation 是 4 维连续向量,action 只有向左、向右两个离散选项。DQN 用小型 MLP 输出两个 ,再用 epsilon-greedy 选择动作。
隔离环境安装完成后,从仓库根目录运行 gridworld.py 与 deep_rl_smoke.py:
1 | python files/assets/examples/reinforcement-learning/gridworld.py --seed 7 |
输出包含 interaction steps、optimizer updates、末次 loss、episode return 均值和参数变化量。有限且非零的更新说明 replay sample、target、loss 与反向传播接通;短回报曲线不能证明学习稳定或已经收敛。
核心机制
SARSA 与 Q-learning 的数据策略边界
SARSA 的一步 target 是 ,其中 来自当前实际行为策略,所以它是 on-policy。Q-learning 改用下一状态的 greedy action:
这里 是步长, 是 discount,且 只表示 terminated。行为仍可用 epsilon-greedy 探索,但 target 假设下一步 greedy,因此 Q-learning 是 off-policy。区别不在“有没有探索”,而在 target 对哪个策略做 backup。
从 Q-table 到函数逼近
状态连续时不能为每个 建表。DQN 用 共享参数,并最小化预测值与 TD target 的误差。神经网络能在相似状态间泛化,也会让一个样本的更新同时改变许多状态估计;bootstrap target、采样分布和参数因而一起移动,训练比表格法更容易不稳定。
当前 Q 与 frozen target network
DQN 的 target 写成:
当前网络 拟合 ,frozen target network 在若干更新间保持不变,再周期性复制当前参数。terminated 令 bootstrap 为零;truncated 若仍有有效 successor observation,则保留 bootstrap。把二者合成 done 会系统性低估时间上限附近的价值。
Replay、探索与损失
replay buffer 保存 (state, action, reward, next_state, terminated),随机 minibatch 打散相邻样本并让旧数据被重复利用。这使 DQN 具备明显的 off-policy 数据复用能力,但旧数据过多也会和当前访问分布脱节。
smoke 实现的探索日程是 epsilon=max(0.1, 1-step/steps):在 step=0 时从 epsilon=1.0 开始,分母 steps 就是命令行请求的 --steps interaction horizon;之后每步线性减小 ,直到被 floor 0.1 截住。以 --steps 256 为例,第一个使用 floor 的索引是 step=231,因为 step 取 0 到 255,而不是额外训练 256 步后才开始衰减。
epsilon-greedy 在训练时给随机动作概率 ;评估时应单独关闭或固定很小的探索,否则评测把策略质量和探索噪声混在一起。Huber loss 在 TD error 小时近似平方误差、大时近似绝对误差,比纯 MSE 更不容易被少量巨大 target 支配。
2013 年早期 DQN展示了深度网络结合 experience replay 的 Atari 结果;2015 Nature DQN给出包含 frozen target network 的完整方法与更广泛结果。引用两者时不能把后者的完整稳定机制倒写成前者已全部使用。
训练数据流
1 | epsilon-greedy policy -> CartPole transition -> replay buffer |
采样和优化不是同一步:environment step 先产生数据,optimizer 再从 replay 中抽旧数据更新。报告实验时至少分别记录 environment steps、gradient updates、buffer size、training epsilon 和 evaluation return。
常见失败
| 失败 | 为什么误导 | 检查方式 |
|---|---|---|
| 当前网络同时生成并追逐 target | target 每步随参数移动 | 保留独立 target network,并记录同步频率 |
| 将 truncation 当 terminal | 丢失有效 bootstrap | 只用 terminated 构造 |
| 训练和评估共用 epsilon | return 下降可能只是随机动作 | 用独立评估 episode 与明确 exploration 设置 |
| 只看 max Q 上升 | 过估计也会抬高 value | 同时看评估 return、TD error、Q 尺度与多 seed |
| replay 未热身就大批更新 | 高度相关的少量样本被反复拟合 | 达到最小 buffer 后再采 minibatch |
| 把单次 reward 峰值当学会 | 偶然长 episode 不是策略改善 | 看滑动统计、独立评估和种子分布 |
自检与练习
- 对
reward=1, next_q=10, gamma=0.9,分别算terminated=True/False的 target。 - 写出同一 epsilon-greedy trajectory 下 SARSA 和 Q-learning 对下一状态使用的 action,并说明哪个 target 与行为策略一致。
- 将 target 同步频率从 32 次更新改为每次更新,观察 loss 与 Q 尺度;不要据单个 seed 下结论。
- 解释为什么 evaluation return 和 replay batch 中的 reward 均值不是同一个指标。
- Title: 强化学习:Q-learning 与 DQN
- Author: Charles
- Created at : 2026-07-06 09:00:00
- Updated at : 2026-07-06 09:00:00
- Link: https://charles2530.github.io/2026/07/06/ai-files-reinforcement-learning-q-learning-and-dqn/
- License: This work is licensed under CC BY-NC-SA 4.0.