标准监督学习通常假设训练数据样本是独立同分布的(i.i.d.)。这个假设对于基于梯度的优化方法的稳定性很重要。然而,当强化学习智能体与环境交互时,它会生成一系列高度相关的经验 (st,at,rt+1,st+1),(st+1,at+1,rt+2,st+2),…。如果Q网络在这些经验按顺序到来时直接进行训练,将会遇到两个主要问题:
- 相关更新: 在连续样本上进行训练违反了i.i.d.假设。从这些相关样本计算出的梯度可能具有高方差,或者可能根据最近的、可能不具代表性的经验,持续地将网络权重推向次优方向。这可能导致训练不稳定和收敛不良。试想智能体卡在环境的特定部分;顺序更新会反复强化在该有限上下文中所采取的动作,可能导致网络“忘记”状态空间的其他部分。
- 数据效率低下: 每个生成的经验只用于一次梯度更新,然后就被丢弃了。这是低效的,特别是考虑到与环境的交互可能耗费高昂(在时间或计算方面)。有些经验可能特别有用或稀有,只学习一次会限制它们的影响。
为解决这些问题,深度Q网络引入了一种名为经验回放的技术。
回放缓冲区
核心思想简单:我们不直接在最新经验上训练网络,而是将智能体的经验存储在一个大型缓冲区中,通常称为回放缓冲区或回放记忆。这个缓冲区通常具有固定容量(比如 N)。
一个“经验”通常存储为元组:et=(st,at,rt+1,st+1)。通常,还会包含一个指示 st+1 是否为终止状态的标志。
过程如下:
- 交互与存储: 智能体使用其当前策略(例如,基于当前Q网络的 ϵ-贪心策略)与环境交互。在每个时间步 t,它观察到转换 (st,at,rt+1,st+1) 并将此经验元组 et 存储在回放缓冲区 D 中。如果缓冲区已满,通常会移除最旧的经验以腾出空间(先进先出)。
- 采样: 在学习阶段(可能在每一步之后,或每隔几步之后进行),我们不使用最新的转换 et,而是从整个回放缓冲区 D 中均匀随机地采样一个小批量经验。例如,我们可能采样 k 个经验:{(sj,aj,rj+1,sj+1)}j=1k∼U(D)。
- 训练: 然后,这个随机选择的经验小批量被用来计算损失(如即将到来的关于DQN损失函数的部分所讨论),并执行梯度下降步骤以更新Q网络参数 θ。
图示经验从智能体与环境交互流向回放缓冲区,然后随机采样小批量以训练Q网络的过程。
经验回放的优点
使用回放缓冲区提供以下几个重要益处:
- 降低相关性: 通过从大量历史经验中随机采样,小批量内样本之间的相关性大大降低。这使得更新更接近标准随机梯度下降所假定的i.i.d.设置,从而带来更稳定、可靠的训练。
- 提高数据效率: 每个经验元组都可能用于多次权重更新。这使得网络能够从每次交互中更充分地学习,这对于稀有但对学习最优策略很重要的经验特别有用。
- 平滑学习: 在小批量上进行训练可以平均多个不同转换的梯度。这种平均效应可以平滑学习过程,防止仅基于最新、可能特异的经验进行训练时可能发生的大幅、可能具有破坏性的更新。
实现考量
- 缓冲区大小: 回放缓冲区 N 的容量是一个重要的超参数。非常大的缓冲区包含多样化的历史经验集合,可能包括来自更旧、相关性较低的策略的转换。较小的缓冲区能更快地适应智能体策略的变化,但可能缺乏多样性并容易对近期经验过拟合。常见大小范围为 104 到 106 次转换,取决于环境的复杂性和可用内存。
- 采样: 虽然均匀随机采样是DQN引入的标准方法,但后来的研究发展出更复杂的采样策略,例如优先经验回放(我们将在第3章简要提及),其中导致较大学习误差的经验会被更频繁地采样。
- 数据结构: Python中带固定
maxlen 的 collections.deque 是实现缓冲区的一种常用且高效的方法,它能自动处理当缓冲区满时旧经验的移除。
经验回放是一种基础技术,它使训练深度Q网络变为可能。通过打破相关性并重用过去的数据,它显著稳定并提高了学习过程的效率。然而,仅靠经验回放还不足够。另一个挑战源于这样一个事实:网络试图预测一个目标值(Rt+1+γmaxa′Q(St+1,a′;θ)),而这个目标值本身依赖于网络当前的权重 θ。这导致了一个“移动目标”问题,我们接下来将通过引入目标网络来解决这个问题。