我目前正在尝试在 Keras 中实现 DDPG。我知道如何更新批评家网络(正常的 DQN 算法),但我目前坚持更新演员网络,它使用以下方程:
因此,为了减少演员网络对其权重 dJ/dtheta 的损失,它使用链式法则来获取 dQ/da(来自批评者网络)* da/dtheta(来自演员网络)。
这看起来不错,但我无法理解如何从这两个网络中导出梯度。有人可以向我解释这部分吗?
所以主要的直觉是,在这里,J 是你想要最大化而不是最小化的东西。因此,我们可以将其称为目标函数而不是损失函数。该方程简化为:
dJ/d'Theta = dQ / da * da / d'Theta = dR/dTheta
这意味着你想要改变参数 Theta 来改变 Q。因为在 RL 中,我们想要最大化 Q,对于这一部分,我们想要做梯度上升。为此,您只需执行梯度下降,除了将梯度作为负值输入之外。
要导出梯度,请执行以下操作:
- 使用在线参与者网络,发送从重播内存中采样的一批状态。 (用于训练批评家的同一批次)
- 计算每个状态的确定性操作
- 将用于计算这些动作的状态发送到在线评论家网络,以将这些确切的状态映射到 Q 值。
- 计算 Q 值相对于步骤 2 中计算的动作的梯度。我们可以使用 tf.gradients(Q value, actions) 来执行此操作。现在,我们有 dQ/dA。
- 再次将状态发送给演员在线评论家并将其映射到操作。
- 再次使用 tf.gradients(a, network_weights) 计算动作相对于在线参与者网络权重的梯度。这将为您提供 dA/dTheta
- 将 dQ/dA 乘以 -dA/dTheta 得到梯度上升。我们留下目标函数的梯度,即梯度 J
-
将梯度 J 的所有元素除以批量大小,即
对于 J 中的 j,
j / batch size
- 通过首先使用网络参数压缩梯度 J 来应用梯度下降的变体。这可以使用 tf.apply_gradients(zip(J, network_params)) 来完成
- 砰,你的演员正在训练其参数以最大化 Q。
我希望这是有道理的!我也很难理解这个概念,而且说实话,我对某些部分仍然有点模糊。如果我能澄清任何事情,请告诉我!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)