Deep Q-Network

DQN

DQN (Deep Q-Network) 是强化学习(Reinforcement Learning)领域的一个里程碑,由 DeepMind 团队在 2013 年和 2015 年提出。它成功地将深度学习(感知能力)与强化学习(决策能力)结合,标志着深度强化学习(DRL)时代的开启。简单来说,DQN 的目标是让智能体(Agent)在给定的环境状态下,学会选择能够获得最大长期累积奖励的动作。

原理概述

之前在时序差分算法介绍Q-learning 算法时,我们以矩阵的方式建立了一张存储每个状态下所有动作值的表格。表格中的每一个动作价值表示在状态下选择动作然后继续遵循某一策略预期能够得到的期望回报。然而,这种用表格存储动作价值的做法只在环境的状态和动作都是离散的,并且空间都比较小的情况下适用,当状态或者动作数量非常大的时候,这种做法就不适用了。

DQN 引入了深度神经网络(DNN)来代替表格。

  • 输入: 当前环境的状态(例如游戏的像素画面)。
  • 输出: 该状态下所有可能动作的 Q 值(即预期收益)。

DQN 通过两个核心机制解决了直接将神经网络套用在强化学习中会导致训练极不稳定甚至不收敛的问题:

A. 经验回放 (Experience Replay)智能体会将它的经历 (s, a, r, s) 存储在一个经验池(Replay Buffer)中。作用: 训练时随机从池中采样。这打破了经验之间的时间相关性(相邻样本太相似会导致网络过拟合),并提高了数据的利用率。

B. 目标网络 (Target Network)DQN 使用两个结构完全相同的网络:估计网络(Q-Network): 用于选择动作和实时更新参数。目标网络(Target Network): 用于计算目标 Q 值,它的参数更新较慢(每隔一段时间才同步一次估计网络的参数)。作用: 避免了“在追逐移动目标”的问题。如果目标 Q 值频繁变动,训练就像是让狗追着自己的尾巴跑,很难稳定。

DQN 的损失函数基于 均方误差(MSE),旨在缩小“预测 Q 值”与“目标 Q 值”之间的差距:

$$ L(\omega) = \mathbb{E} \left[ ( \underbrace{r + \gamma \max_{a'} Q(s', a'; \omega^-)}_{\text{目标 Q 值 (Target)}} - \underbrace{Q(s, a; \omega)}_{\text{当前预测 Q 值}} )^2 \right] $$

其中:r 是即时奖励。γ 是折扣因子(对未来奖励的看重程度)。ω 是目标网络的参数。

算法流程

若动作是连续(无限)的,神经网络的输入是状态s和动作a,然后输出一个标量,表示在状态下s采取动作a能获得的价值。若动作是离散(有限)的,除了可以采取动作连续情况下的做法,还可以只将状态s输入到神经网络中,使其同时输出每一个动作a的值。假设神经网络用来拟合函数的参数是 θ,即每一个状态下所有可能动作的值我们都能表示为 Q(s, a; θ)。我们将用于拟合函数函数的神经网络称为Q 网络,如图所示。

Q 网络

问题的关键在于,我们如何设计Q网络的损失函数呢?回忆一下,Q-learning 的更新规则为:

Q(s, a) ← Q(s, a) + α[R + γmaxaQ(s, a) − Q(s, a)]

上述公式用时序差分(temporal difference,TD)学习目标 r + γmaxaQ(s, a)来增量式更新 Q 值,也就是说要使Q(s, a)和 TD 目标靠近。于是,对于一组数据 (si, ai, ri, si),我们可以很自然地将 Q 网络的损失函数构造为均方误差的形式:

$$ \omega^* = argmin_{\omega} \frac{1}{2N} \sum_{i=1}^{N} \left[ (r_i + \gamma \max_{a'} Q(s_i', a'; \omega^-) - Q(s_i, a_i; \omega))^2 \right] $$

其中:ri 是即时奖励。γ 是折扣因子(对未来奖励的看重程度)。至此,我们就可以将 Q-learning 扩展到神经网络形式——深度 Q 网络(deep Q network,DQN)算法。由于 DQN 是离线策略算法,因此我们在收集数据的时候可以使用一个 ϵ-贪婪策略来平衡探索与利用,将收集到的数据存储起来,在后续的训练中使用。DQN 中还有两个非常重要的模块——经验回放和目标网络,它们能够帮助 DQN 取得稳定、出色的性能。

经验回放

在一般的有监督学习中,假设训练数据是独立同分布的,我们每次训练神经网络的时候从训练数据中随机采样一个或若干个数据来进行梯度下降,随着学习的不断进行,每一个训练数据会被使用多次。在原来的 Q-learning 算法中,每一个数据只会用来更新一次值。为了更好地将 Q-learning 和深度神经网络结合,DQN 算法采用了经验回放(experience replay)方法,具体做法为维护一个回放缓冲区,将每次从环境中采样得到的四元组数据(状态、动作、奖励、下一状态)存储到回放缓冲区中,训练 Q 网络的时候再从回放缓冲区中随机采样若干数据来进行训练。这么做可以起到以下两个作用。

(1)使样本满足独立假设。在 MDP 中交互采样得到的数据本身不满足独立假设,因为这一时刻的状态和上一时刻的状态有关。非独立同分布的数据对训练神经网络有很大的影响,会使神经网络拟合到最近训练的数据上。采用经验回放可以打破样本之间的相关性,让其满足独立假设。

(2)提高样本效率。每一个样本可以被使用多次,十分适合深度神经网络的梯度学习。

强化学习的样本是连续产生的,相邻样本之间高度相关(比如走迷宫时,连续几步的状态几乎一样)。如果直接训练,神经网络会产生严重的过拟合,陷入局部最优。随机采样让数据看起来像独立同分布(i.i.d)的,符合监督学习的假设。提高数据利用率:每一条经验可以被多次抽取参与训练,而不仅仅是使用一次就扔掉,这在数据获取成本较高的环境下非常有效。

目标网络

DQN 算法最终更新的目标是让 Qω(s, a) 逼近 r + γmaxaQω(s, a) ,由于 TD 误差目标本身就包含神经网络的输出,因此在更新网络参数的同时目标也在不断地改变,这非常容易造成神经网络训练的不稳定性。为了解决这一问题,DQN 便使用了目标网络(target network)的思想:既然训练过程中 Q 网络的不断更新会导致目标不断发生改变,不如暂时先将 TD 目标中的 Q 网络固定住。为了实现这一思想,我们需要利用两套 Q 网络。

(1)原来的训练网络 Qω ,用于计算原来的损失函数中的 $\frac{1}{2}[Q_{\omega}(s,a)-r-\gamma \max_{a'} Q_{\omega^-}(s', a')]^2$Qω(s, a) ,并且使用正常梯度下降方法来进行更新。

  1. 目标网络 Qω ,用于计算原先损失函数中的 $\frac{1}{2}[Q_{\omega}(s,a)-r-\gamma \max_{a'} Q_{\omega^-}(s', a')]^2$Qω(s, a) ,其中表示目标网络中的参数。如果两套网络的参数随时保持一致,则仍为原先不够稳定的算法。为了让更新目标更稳定,目标网络并不会每一步都更新。具体而言,目标网络使用训练网络的一套较旧的参数,训练网络在训练中的每一步都会更新,而目标网络的参数每隔步才会与训练网络同步一次,即 Qω ← Qω 。这样做使得目标网络相对于训练网络更加稳定。

初始化: 经验池 D,随机化预测网络 ω 和目标网络 ω = ω

循环每一个 Episode:

  1. 获取初始状态 s1
  2. 循环每一步 t
  • ϵ-greedy 策略选择动作at(探索与利用的平衡)。
  • 执行 at,观测奖励rt和新状态 st + 1
  • (st, at, rt, st + 1)存入 D。从 D 中随机采样一个 Batch。
  • 计算梯度并更新 ω(最小化损失函数 L)。
  • 每隔 C步,执行一次参数同步:ω ← ω

改进的DQN算法