DQN 如何反向传播其损失?

人工智能 深度学习 强化学习 q学习 反向传播 dqn
2021-10-21 13:16:41

我目前正在尝试在深度学习方面迈出下一步。到目前为止,我设法在没有任何框架(只有 numpy 和 pandas)的情况下用 python 编写了自己的基本前馈网络,所以我想我理解了反向传播背后的数学和直觉。现在,我被深度 q-learning 困住了。我试图让代理在各种环境中学习。但不知何故,没有任何结果。所以一定有什么我错了。似乎我不理解关键部分,至少我是这么想的。在此处输入图像描述

截图来自这个视频。

我想在这里画的是我对简单 DQN 的基本过程的理解。假设这是正确的,损失是如何反向传播的?由于只有选定的Q(s,a)值(5 和 7)在损失函数中进一步处理,如何计算其他神经元的影响,以便调整它们的权重以更好地预测真实的 q 值?

1个回答

在 DQN 中,用神经网络来表示函数是很常见的f(s,a)=q^(s,a,θ)直接,它实际上代表f(s)=[q^(s,1,θ),q^(s,2,θ),q^(s,3,θ)...q^(s,Na,θ)]在哪里Na是最大动作,输入是当前状态。这就是这里发生的事情。通常这样做是为了提高性能,因为一次计算所有值比单独计算更快。

但是,在 Q 学习更新中,您无法针对您未采取的操作调整此输出值向量。您可以执行以下两项操作之一:

  • 计算出由于具有 TD 错误的一项导致的梯度,并将其向后传播。这涉及将已知梯度插入到特定位置的正常训练更新步骤中并从那里开始工作。如果您使用低级工具实现自己的反向传播,这将最有效,否则在像 Keras 这样的框架中弄清楚如何做到这一点可能有点繁琐。

  • 通过将目标输出设置为学习网络当前生成的任何内容,强制所有其他项目的梯度为零。

如果您使用的是 Keras 之类的东西,则第二种方法是可行的方法。一个具体的例子,你有两个网络n_learn并且n_targetQ 值的输出数组可能是这样的:

  • 对于您的小批量中的每个样品(s, a, r, next_s, done)*

    • 从您的学习网络计算一系列动作值qvals = n_learn.predict(s)
    • 计算 TD 目标(s,a)例如td_target = r + max(n_target.predict(next_s))(未显示折扣因子和如何处理终端状态)
    • 更改您从此示例中了解的一个数组项qvals[a] = td_target
    • 附加s到您的train_X数据和qvals您的train_Y数据
  • 适合小批量n_learn.fit(train_X, train_Y)


* 可以将这些计算向量化以提高效率。我将它显示为一个 for 循环,因为这样描述起来更简单