DQN深度Q网络强化学习Atari游戏:5步跑通Breakout训练并避开Q值高估坑
【免费下载链接】reinforcement-learningImplementation of Reinforcement Learning Algorithms. Python, OpenAI Gym, Tensorflow. Exercises and Solutions to accompany Sutton's Book and David Silver's course.项目地址: https://gitcode.com/gh_mirrors/re/reinforcement-learning
这一节解决一个问题:为什么经典表格法在Atari上直接失效。表格Q学习(Tabular Q-Learning,给每个状态各记一行Q值)思路直观,但它的"表"要求每个可达状态至少占一行。Atari的观测是一张210×160×3的像素图,可达状态数多到无法枚举,表既装不下也填不满。DQN(Deep Q-Network,深度Q网络)就是破局方案:用神经网络替代表格查找,让模型直接吃原始像素、吐出每个动作的价值,Atari游戏强化学习由此从"做不了"变回"能跑"。本文的完整实现都来自开源项目 reinforcement-learning,跟着走一遍即可。
经验回放与目标网络:DQN能跑起来靠的两个设计
这一节解决一个问题:为什么把Q学习直接套到神经网络上会崩。
**经验回放(Experience Replay)**可以理解为错题本:智能体每走一步,就把(状态、动作、奖励、下一状态)这条经验存进回放缓冲区;训练时不再用刚发生的经验,而是从缓冲区里随机抽一个小批量(mini-batch)来更新网络。这样做的好处是抽出来的样本互相独立,网络不会追着一条高度相关的经验链打转,同一份数据还能被反复利用。
**目标网络(Target Network)**则像影子裁判:计算学习目标(TD target)时,不找正在改参数的主网络,而是找一份架构相同但参数冻结的副本去估值,每隔固定步数(代码里是10000步)再把主网络参数抄给它。裁判的"判罚标准"短期内不动,训练目标就稳定,不会自己追自己的尾巴。
DQN本体是一个卷积网络,架构一张表看完:
| 部分 | 配置 |
|---|---|
| 输入 | 4帧 84×84 灰度图(历史4帧叠成通道) |
| 卷积层1 | 32个 8×8 卷积核,步长4 |
| 卷积层2 | 64个 4×4 卷积核,步长2 |
| 卷积层3 | 64个 3×3 卷积核,步长1 |
| 全连接层 | 512个神经元 |
| 输出 | 4个动作各自的Q值 |
🕹️ 五步实操:Breakout训练全流程
这一节解决一个问题:从拿到仓库到看懂训练曲线,中间要做哪五件事。
第1步:克隆仓库
git clone https://gitcode.com/gh_mirrors/re/reinforcement-learning第2步:打开Breakout notebook
先跑 DQN/Breakout Playground.ipynb 感受环境:原始画面、动作列表都在里面直接可视化。然后打开练习 DQN/Deep Q Learning.ipynb,卡住时对照 DQN/Deep Q Learning Solution.ipynb,核心算法代码参考 DQN/dqn.py。
第3步:看懂动作空间
Breakout的Atari动作表里有6个按钮(无操作、发射、左移、右移及组合键),但训练只用前四个:
VALID_ACTIONS = [0, 1, 2, 3]网络输入端的预处理逻辑在 lib/atari/state_processor.py:原始帧先转灰度、裁剪、缩放到84×84,再连续4帧堆叠成网络输入,这一步直接决定了输入维度为什么是4通道。
第4步:启动训练并盯紧奖励曲线
运行 Deep Q Learning 练习的训练单元即可。曲线由 lib/plotting.py 绘制,训练主循环的默认超参数(回放缓冲50万、批量32等)都写在 DQN/dqn.py 里,对照着看比背参数更有效。
第5步:看曲线判断模型好坏
判断标准不复杂:奖励曲线若长期趴在低位且毫无抬升趋势,说明还没收敛,继续训练或检查超参数;若奖励稳步爬升、单回合步数变长,说明模型已经学会把球拍控住、开始主动得分。奖励曲线是最直接的"体检指标"。
排坑指南:从现象反查原因
这一节解决一个问题:训练曲线不对劲时,先怀疑什么、怎么修。
| 现象 | 原因 | 解法 |
|---|---|---|
| Q值持续膨胀,但实际对局分数平平 | DQN用 max 同时做"选动作"和"估价值",同一网络既选又评,高估会累积 | Double DQN:主网络负责选最佳动作,目标网络只负责给这个动作估值,把"选"和"评"拆开,见 DQN/Double DQN Solution.ipynb |
| 损失和奖励曲线剧烈震荡、迟迟不收敛 | 学习目标跟着主网络一起动,等于追移动靶 | 依赖目标网络机制:每10000步才同步一次参数,冻结期内目标保持稳定 |
| 探索期过长或收敛后不再改进 | ε衰减策略不当(探索率长期过高或降得太急) | 沿用代码默认:ε从1.0线性衰减到0.1,历时50万步,起步别乱改 |
一组论文原始超参数,出问题时优先回到这个基线:
| 超参数 | 取值 |
|---|---|
| 学习率(RMSProp) | 0.00025 |
| 折扣因子 γ | 0.99 |
| 回放缓冲区大小 | 500,000 |
| 批量大小 | 32 |
进阶路线:练完DQN往哪走
基础跑通后,项目 README 把后续方向标得很清楚:优先经验回放(Prioritized Experience Replay,让"重要经验"被抽到的概率更高)是下一步练习;再往后是分布式Q学习(Distributional Q-learning,预测整条回报分布而不只是均值)。两条路线都在原代码结构上改,改动范围可控。
DQN的骨架你已经握在手里:像素直接进网络、两个稳定设计托底、一条奖励曲线定好坏——Atari游戏强化学习的大门到这里算推开了。
提示:Atari训练耗时较长,建议GPU加速。
【免费下载链接】reinforcement-learningImplementation of Reinforcement Learning Algorithms. Python, OpenAI Gym, Tensorflow. Exercises and Solutions to accompany Sutton's Book and David Silver's course.项目地址: https://gitcode.com/gh_mirrors/re/reinforcement-learning
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考