什么是“体验回放”,它有什么好处?

数据挖掘 强化学习 q学习
2021-10-04 20:40:36

我一直在阅读 Google 的 DeepMind Atari论文,并试图理解“体验回放”的概念。许多其他强化学习论文(尤其是 AlphaGo 论文)中都提到了经验回放,所以我想了解它是如何工作的。下面是一些摘录。

首先,我们使用了一种称为经验重放的生物学启发机制,该机制对数据进行随机化,从而消除观察序列中的相关性并平滑数据分布的变化。

论文随后详细阐述如下:

虽然在强化学习环境中训练神经网络存在其他稳定的方法,例如神经拟合 Q 迭代,但这些方法涉及从头对网络进行数百次迭代的重复训练。因此,与我们的算法不同,这些方法效率太低,无法成功用于大型神经网络。我们参数化一个近似值函数Q(s,a;θi) 使用图 1 所示的深度卷积神经网络,其中 θi 是迭代时 Q 网络的参数(即权重) i. 为了执行经验回放,我们存储代理的经验et=(st,at,rt,st+1) 在每个时间步 t 在一个数据集中 Dt={e1,,et}. 在学习过程中,我们在经验样本(或小批量)上应用 Q-learning 更新(s,a,r,s)U(D),从存储的样本池中均匀随机抽取。迭代中的 Q-learning 更新i 使用以下损失函数:

Li(θi)=E(s,a,r,s)U(D)[(r+γmaxaQ(s,a;θi)Q(s,a;θi))2]

用外行的话来说,什么是经验回放,它有什么好处?

2个回答

引用文本的关键部分是:

为了执行经验回放,我们存储代理的经验et=(st,at,rt,st+1)

这意味着系统不会在模拟或实际体验期间对状态/动作对运行 Q-learning,而是将发现的 [状态、动作、奖励、下一个状态] 的数据存储在一个大表中。请注意,这不存储关联的值 - 这是稍后馈入操作值计算的原始数据。

然后,学习阶段与获得经验在逻辑上是分开的,并且基于从该表中抽取随机样本。您仍然希望将两个过程交错 - 行动和学习 - 因为改进策略将导致不同的行为,应该探索更接近最佳行为的行为,并且您希望从中学习。但是,您可以按照自己的喜好进行拆分 - 例如迈出一步,从三个随机的先前步骤中学习等。使用体验回放时的 Q-Learning 目标使用与在线版本相同的目标,因此没有新的公式。给出的损失公式也是您在没有经验重放的情况下用于 DQN 的公式。区别仅在于您输入哪个s, a, r, s', a'。

在 DQN 中,DeepMind 团队还维护了两个网络,并切换了哪个网络正在学习,而哪个网络将当前的动作价值估计作为“引导程序”输入。当使用非线性函数逼近器时,这有助于算法的稳定性。这就是酒吧所代表的意义θi ¯- 它表示权重的备用冻结版本。

体验回放的优势:

  • 通过多次学习,更有效地利用以前的经验。当获得现实世界的经验代价高昂时,这是关键,您可以充分利用它。Q-learning 更新是增量的并且不会快速收敛,因此使用相同数据的多次传递是有益的,特别是当给定相同状态、动作对的即时结果(奖励、下一个状态)差异较小时。

  • 训练函数逼近器时更好的收敛行为。部分原因是数据更像是大多数监督学习收敛证明中假设的独立同分布数据。

经验回放的缺点:

  • 更难使用多步学习算法,例如 Q(λ),可以通过平衡偏差(由于自举)和方差(由于长期结果的延迟和随机性)之间的平衡来调整以提供更好的学习曲线。带有体验重放 DQN 的多步 DQN 是Rainbow: Combining Improvements in Deep Reinforcement Learning论文中探索的扩展之一。

David Silver 在本视频讲座的部分内容中简要概述了 DQN 中使用的方法(大约 01:17:00,但值得一看之前的部分)。如果您有时间,我建议您观看整个系列,这是关于强化学习的研究生课程。

该算法(或至少是它的一个版本,在Coursera RL 顶点项目中实现)如下:

  1. 创建一个重放“缓冲区”,用于存储最后的#buffer_sizeSARS(状态、动作、奖励、新状态)体验。

  2. 运行你的代理,让它在重放缓冲区中积累经验,直到它(缓冲区)至少有#batch_size经验。

    • 您可以根据特定策略选择动作(例如,离散动作空间的 soft-max,连续动作空间的高斯等)在您的 Q^(s,a;θ) 函数估计器。
  3. 一旦达到#batch_size或更多:

    • 制作函数估计器的副本(Q^(s,a;θ)) 在当前时间,即权重的副本 θ - 您“冻结”而不更新,并用于计算“真实”状态 Q^(s,a;θ). 运行num_replay更新:

      1. 回放缓冲区中的示例#batch_size体验。

      2. 使用采样经验对您的函数估计器进行批量更新(例如,在 Q-Learning 中Q^(s,a)=神经网络 - 更新网络的权重)。使用冻结权重作为“真实”动作值函数,但继续改进非冻结函数。

    • 这样做直到你达到一个终端状态。

    • 不要忘记不断将新体验附加到 Replay Buffer

  4. 根据需要运行尽可能多的剧集。

我所说的“真实”是什么意思:每次体验都可以被认为是“监督”学习二重奏,你有一个真实的价值函数Q(s,a)和一个函数估计器Q^(s,a). 您的目标是减少价值错误,例如(Q(s,a)Q^(s,a))2. 由于您可能无法访问真正的动作值,因此您可以使用最后一个估计器的自举改进版本,同时考虑到新的经验和给予的奖励。在 Q-learning 中,“真正的”行动价值是Q(s,a)=Rt+1+γmaxaQ^(s,a;θ) 在哪里 R 是奖励和 γ 是折扣因子。

这是代码的摘录:

def agent_step(self, reward, state):
    action = self.policy(state)
    terminal = 0
    self.replay_buffer.append(self.last_state, self.last_action, reward, terminal, state)
    if self.replay_buffer.size() > self.replay_buffer.minibatch_size:
        current_q = deepcopy(self.network)
        for _ in range(self.num_replay):
            experiences = self.replay_buffer.sample()
            optimize_network(experiences, self.discount, self.optimizer, self.network, current_q, self.tau)
    self.last_state = state
    self.last_action = action        
    return action