本文档提供了 labml_nn 仓库中深度Q网络(DQN)实现的技术概述。它涵盖了核心算法、模型架构、优先经验回放和训练过程。有关其他强化学习算法(如近端策略优化)的信息,请参阅近端策略优化。
深度Q网络结合了Q学习与深度神经网络,用于近似离散动作空间下的动作价值函数。此实现包括对原始DQN算法的几项重要扩展
来源: labml_nn/rl/dqn/__init__.py12-17 labml_nn/rl/dqn/experiment.py9-12
DQN算法旨在找到最优动作价值函数Q*(s,a),它表示在状态s下采取动作a并随后遵循最优策略时的预期回报
$$Q^*(s,a) = \max_\pi \mathbb{E} \Big[r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + ... | s_t = s, a_t = a, \pi\Big]$$
这可以用贝尔曼方程表示
$$Q^(s,a) = \mathop{\mathbb{E}}{s' \sim \varepsilon} \Big[r + \gamma \max{a'} Q^ (s', a') | s, a\Big]$$
来源: labml_nn/rl/dqn/__init__.py34-48
此实现使用对偶网络架构,将Q函数分解为状态价值(V)和动作优势(A)
$$Q(s,a) = V(s) + \Big(A(s,a) - \frac{1}{|\mathcal{A}|} \sum_{a' \in \mathcal{A}} A(s,a')\Big)$$
这种架构允许网络学习哪些状态是有价值的,而无需学习每个动作对每个状态的影响。
来源: labml_nn/rl/dqn/model.py18-46
该网络包括
最终的Q值通过结合价值流和优势流计算得出。
来源: labml_nn/rl/dqn/model.py49-106
DQN使用带有目标网络的时间差分(TD)学习,以提供稳定的训练目标
$$\mathcal{L}i(\theta_i) = \mathop{\mathbb{E}}{(s,a,r,s') \sim U(D)} \Bigg[\bigg(r + \gamma \textcolor{orange}{Q}\Big(s', \mathop{\operatorname{argmax}}_{a'} \textcolor{cyan}{Q}(s', a'; \textcolor{cyan}{\theta_i}); \textcolor{orange}{\theta_i^{-}}\Big) - Q(s,a;\theta_i)\bigg) ^ 2\Bigg]$$
其中
此实现使用Huber损失而非MSE,以提高对异常值的稳定性。
来源: labml_nn/rl/dqn/__init__.py50-99 labml_nn/rl/dqn/__init__.py102-165
为减少过高估计偏差,双Q学习将动作选择和评估分离开来
来源: labml_nn/rl/dqn/__init__.py68-99 labml_nn/rl/dqn/experiment.py164-205
优先经验回放(PER)以与TD误差成比例的概率采样转换
$$P(i) = \frac{p_i^\alpha}{\sum_k p_k^\alpha}$$
其中
为了纠正非均匀采样引入的偏差,应用了重要性采样权重
$$w_i = \bigg(\frac{1}{N} \frac{1}{P(i)}\bigg)^\beta$$
其中 $\beta$ 在训练过程中从初始值退火到1。
此实现使用二叉线段树,以高效计算
这为两项操作提供了O(log n)的性能。
来源: labml_nn/rl/dqn/replay_buffer.py20-277
Trainer 类管理整个DQN训练过程
初始化
采样循环
训练循环
| 参数 | 描述 | 默认 |
|---|---|---|
updates(更新次数) | 总更新次数 | 1,000,000 |
epochs(周期数) | 每次更新的训练周期数 | 8 |
n_workers(工作器数量) | 并行环境数量 | 8 |
worker_steps(每个工作器步数) | 每次更新每个工作器的步数 | 4 |
mini_batch_size(小批量大小) | 训练批次大小 | 32 |
update_target_model(目标模型更新频率) | 目标网络更新频率 | 250 |
learning_rate(学习率) | 初始学习率 | 1e-4 |
来源: labml_nn/rl/dqn/experiment.py38-252 labml_nn/rl/dqn/experiment.py254-290
此实现使用带有线性时间表的ε-贪婪探索策略
来源: labml_nn/rl/dqn/experiment.py109-127 labml_nn/rl/dqn/experiment.py67-73
DQN实现主要分为四个文件
__init__.py - 主要算法定义和损失函数model.py - 对偶网络架构实现replay_buffer.py - 优先经验回放实现experiment.py - 训练循环和环境交互该系统通过 labml_nn.rl.game 模块中的 Worker 类与游戏环境进行交互。
来源: labml_nn/rl/dqn/__init__.py1-166 labml_nn/rl/dqn/model.py1-107 labml_nn/rl/dqn/replay_buffer.py1-278 labml_nn/rl/dqn/experiment.py1-291