Deep Q-Learning:为什么我们在体验回复时不使用小批量?

人工智能 深度学习 强化学习 梯度下降
2021-10-18 09:46:12

在有关 DQN 的示例和教程中,我经常注意到,在体验回放(训练)阶段,人们倾向于使用随机梯度下降/在线学习。(例如链接1链接2

# Sample minibatch from the memory
minibatch = random.sample(self.memory, batch_size)
# Extract informations from each memory
for state, action, reward, next_state, done in minibatch:
    # if done, make our target reward
    target = reward
    if not done:
      # predict the future discounted reward
      target = reward + self.gamma * \
               np.amax(self.model.predict(next_state)[0])
    # make the agent to approximately map
    # the current state to future discounted reward
    # We'll call that target_f
    target_f = self.model.predict(state)
    target_f[0][action] = target

为什么他们不能使用小批量来代替?我是 RL 的新手,但在深度学习中,人们倾向于使用小批量,因为它们会产生更稳定的梯度。同样的原则是否适用于 RL 问题?引入的随机性/噪声实际上对学习过程有益吗?我错过了什么,还是这些来源都错了?


笔记:

并非所有来源都依赖于随机梯度下降:例如 keras-rl 似乎依赖于小批量(https://github.com/keras-rl/keras-rl/blob/master/rl/agents/dqn.py

1个回答

我见过的 DQN“库”实现确实使用小批量来训练,我通常会推荐这个,因为它通常在权重更新的数量和梯度的准确性之间取得合理的平衡。

在您的第一个链接和代码摘录中,示例列表的字面意思是minibatch. 但是,开发人员随后继续对该样本中的每个项目执行一系列单独的 SGD 步骤。

为什么他们不能使用小批量来代替?

他们可以,而且效果很好。在我的 DQN 探索中,我倾向于每个时间步使用一个小批量,并使用 Adam 优化器来加速学习。我还使用小批量来计算TD 目标值

我是 RL 的新手,但在深度学习中,人们倾向于使用小批量,因为它们会产生更稳定的梯度。同样的原则是否适用于 RL 问题?

确实如此,但我不知道这是否是有效的样本。我更喜欢使用小批量和更复杂的优化器,因为它运行得更快(对于每个时间步的给定数量的重放训练样本),我可以在更短的时间内运行更多时间步的环境。

例如,每个时间步长 32 个重放样本大小,每个时间步长 4 个小批量更新 8 个可能是针对特定问题的最有效的样本方法(因为它从给定样本进行更多更新),但它可能不是CPU 效率最高的。

引入的随机性/噪声实际上对学习过程有益吗?

我不这么认为,但是在 RL 中还有很多其他的调优问题需要考虑。

我错过了什么,还是这些来源都错了?

它们不一定是错误的,但可能是 CPU 效率低下。

在我看来,更有可能的是,您的消息来源是在原则上解释算法,并且不想添加太多优化层,或者可能需要调整太多组件才能工作。典型的 DQN 代理中发生了很多事情,并且进行许多性能优化可以隐藏人们试图教授的细节。