Skip to main content

6. DQN 算法

算法的核心思想是在 算法的基础上引入深度神经网络来近似动作价值函数 ,从而能够处理高维的状态空间。此外, 算法还引入了一些技巧,如经验回放和目标网络等,来提高训练的稳定性和效果。

具身智能视角:DQN 的核心思想——用神经网络逼近价值函数——是后续许多机器人控制算法的基础。理解 DQN 的原理有助于掌握更高级的算法如 DDPG、SAC 等。

6.1 Q 网络

在深度学习基础章节中,我们演示了如何使用神经网络来近似状态价值函数 并使用梯度下降和 误差来更新网络参数。类似地,我们也可以使用神经网络来近似动作价值函数 ,回顾 算法的更新公式,如下所示。

其中 表示期望或目标的 值, 表示实际的 值, 是学习率。引入神经网络近似 函数后,如下所示。

其中参数 是神经网络的参数,可以通过梯度下降的方式来优化。具体来说,可以以最小化 误差为目标,即最小化目标 值和实际 值之间的差距,如下所示。

注意,由于是基于 更新的,因此依然需要判断终止状态:

6.2 经验回放

算法中,我们每次执行一步交互得到一个样本之后,就立即用这个最新的样本去更新 函数:

这种更新方式在引入神经网络后会带来一些问题。首先,每次用单个样本去迭代网络参数很容易导致训练的不稳定,从而影响模型的收敛。其次,每次迭代的样本都是从环境中实时交互得到的,这样的样本是在时间上是连续的,即是有关联的,这与梯度下降法的数据假设不符,即训练集中的样本必须是独立同分布的。此外,每个样本只被使用一次就被丢弃,数据使用率较低,而在强化学习中与环境交互产生样本的成本往往较高,较低的数据使用率会严重影响训练效率

为了解决这些问题, 算法引入了经验回放机制。具体来说,我们会将每次与环境交互得到的样本 存储在一个经验回放池( )中:

然后在每次更新网络参数时,我们会从经验回放池中随机抽取一个小批量的样本进行训练:

其中下标 表示从经验回放池中随机抽取的样本,意味着不再跟时间相关, 是小批量的样本数量。利用这些样本,我们可以计算对应的目标 ,并使用梯度下降的方法来更新网络参数

如图所示,不同于 算法每次用最新的样本直接喂入神经网络去更新网络模型, 算法会把每次与环境交互得到的样本都存储在一个经验回放中,然后每次从经验池中随机抽取一批样本来训练网络。

经验回放示例

6.3 目标网络

注意到在前面的公式中,目标值 的参数 与实际值即当前网络 的参数是相同的。这意味着网络要学习的目标会在每次更新时发生变化,等价于我们在追逐一个不断移动的目标,这很容易造成训练的不稳定,甚至损失发散导致无法收敛(即训练失败)。

为了解决这个问题, 算法引入了目标网络( )的概念。具体来说,我们会维护一个与当前网络结构相同但参数不同的目标网络 ,并使用目标网络来计算目标 值:

目标网络的参数 会定期地从当前网络的参数 复制过来:

其中 是一个超参数,表示每隔多少步更新一次目标网络的参数。这样一来,目标网络的参数在会在一定时间内保持不变,从而使得目标 值相对稳定,避免了追逐不断移动的目标的问题,提高了训练的稳定性和收敛性,如图所示。

目标网络示例

另外,上面的更新方式被称为硬更新( ),即每隔 步直接将当前网络的参数复制给目标网络。除此之外,还有一种软更新( )的方式,即每次更新时将目标网络的参数向当前网络的参数靠近一点:

其中 是一个超参数,通常取值很小(如 ),表示每次更新时目标网络参数向当前网络参数靠近的比例。注意,软更新的方式在 算法中并不常用,原因是硬更新已经能够很好地解决目标不稳定的问题,但在一些后续的强化学习算法例如 中被广泛采用。

6.4 -贪婪策略

为了平衡探索(Exploration)与利用(Exploitation),DQN 使用 -贪婪策略:

  • 以概率 随机选择动作(探索未知区域)
  • 以概率 选择 Q 值最大的动作(利用已有知识)

随着训练的进行, 逐渐衰减,智能体从"大量探索"过渡到"主要利用"。

6.5 算法流程

算法的完整流程如图所示,包括初始化网络和经验回放池、与环境交互采样、存储样本到经验回放池、从经验回放池中随机采样小批量样本、计算目标 值和损失函数、更新网络参数以及定期更新目标网络参数等步骤。

DQN 算法流程

6.6 交互式演示

下面的交互式可视化展示了 DQN 的核心工作原理。在一个 5×5 的网格世界中,智能体(🤖)需要学会避开陷阱(🔥)到达目标(🚩)。你可以观察到:

  • 左侧:网格世界中的热力图会随训练变化,反映各位置的价值高低
  • 中间:神经网络的输入、隐藏层和输出(各动作的 Q 值)
  • 右侧:经验回放缓冲区的内容和训练损失曲线

点击「训练」按钮开始,观察智能体如何从随机探索逐渐学会最优路径:

DQN 算法原理可视化

Deep Q-Network: 结合深度学习(感知)与强化学习(决策)

高价值区域
陷阱
目标
🤖
🔥
🔥
🚩
Episode
0
Total Reward
0.0
Epsilon (探索率)
50%
Step Count
0
速度:

神经网络 (Q-Network)

DQN (Deep Q-Network)
X
0
Y
0
Hidden Layers
0.00
UP
0.00
DOWN
0.00
LEFT
0.00
RIGHT
输出: 各动作的Q值 (Q-Values)

当前决策解析

等待开始... 点击训练按钮。

经验回放 (Replay Buffer)

存储最近的经验元组 (s, a, r, s')
Buffer Empty

训练损失 (Loss)

暂无 Loss 数据
Loss (MSE)

原理说明: DQN 使用神经网络(此处简化为 Q-Table 可视化)来近似 Q 函数。 它通过 Experience Replay(经验回放) 打破数据相关性,并利用 Target Network(目标网络)思想稳定训练。 观察上面的"热力图":随着训练进行,到达终点的路径颜色会变深(Q值变高),陷阱周围会变暗(Q值变低)。

6.7 DQN 的局限与改进

尽管 DQN 取得了重大突破,但它仍有一些局限:

局限改进方案
Q 值过高估计Double DQN:使用在线网络选择动作,目标网络评估价值
均匀采样效率低Prioritized Experience Replay:优先采样 TD 误差大的经验
仅支持离散动作空间DDPG、SAC 等算法将其扩展到连续动作空间
只关注期望回报Distributional DQN:学习回报的完整分布

这些改进方案将在后续章节中详细介绍。

6.8 思考

相比于 算法, 算法做了哪些改进?

主要包括:引入深度神经网络 算法中使用的是表格法来存储动作价值函数,但对于状态空间较大的问题,表格法会变得不可行。 通过引入深度神经网络来近似动作价值函数,能够处理高维连续状态空间的问题。经验回放:传统的 算法每次更新时只使用当前状态和动作的信息,但这种方式可能会导致样本之间的相关性和不稳定性。 采用经验回放机制,将所有的状态、动作、奖励、下一状态组成的经验存储在经验池中,然后从经验池中随机取样进行训练,可以缓解样本相关性和不稳定性的问题。目标网络 还引入了目标网络来解决动作价值函数的不稳定性问题。目标网络是一个与当前神经网络结构相同的网络,但其参数被固定一段时间。在训练时,使用目标网络来计算目标Q值,从而减少当前神经网络参数对目标Q值的影响,提高训练稳定性。

为什么要在 算法中引入 - 策略?

目的是为了平衡探索和利用的关系。具体来说,- 策略会以一定的概率 随机选择动作,以一定的概率 选择当前状态下具有最大 值的动作,从而在训练过程中保证一定的探索性,使得智能体能够尝试一些未知的状态和动作,从而获得更多的奖励。如果在训练过程中完全按照当前状态下的最大Q值选择动作,可能会导致智能体过于保守,无法获得更多的奖励。而如果完全随机选择动作,可能会导致智能体无法学习到更优的策略,从而影响学习效果。因此,引入 - 策略可以在探索和利用之间进行平衡,从而在训练过程中获得更好的性能。

算法为什么要多加一个目标网络?

目标网络的作用是为了解决动作价值函数的不稳定性问题。目标网络是一个与当前神经网络结构相同的网络,但其参数被固定一段时间。在训练时,使用目标网络来计算目标 值,从而减少当前神经网络参数对目标 值的影响,提高训练稳定性。具体来说,当使用当前神经网络来计算目标 值时,当前神经网络的参数和目标 值的计算都是基于同一批数据的,这可能导致训练过程中出现不稳定的情况。而使用目标网络来计算目标 值时,目标网络的参数是固定的,不会受到当前神经网络的训练过程的影响,因此可以提高训练的稳定性。

经验回放的作用是什么?

经验回放主要作用在于缓解样本相关性和不稳定性问题,提高算法的训练效率和稳定性。缓解样本相关性问题:在深度强化学习中,每个样本通常都是与前几个样本高度相关的。如果直接使用当前样本进行训练,可能会导致样本之间的相关性过高,从而影响算法的训练效果。经验回放机制通过从经验池中随机取样,可以打破样本之间的相关性,提高训练的效果。缓解不稳定性问题:在深度强化学习中,每个样本的值函数都是基于当前神经网络的参数计算的。由于神经网络的参数在每个训练步骤中都会发生变化,因此每个样本的值函数也会随之变化。这可能会导致算法的训练过程不稳定,经验回放机制可以通过随机取样的方式,减少每个训练步骤中样本值函数的变化,从而提高训练的稳定性。