DQN - 如何为每个动作训练单独的输出?

数据挖掘 神经网络 深度学习 强化学习
2022-02-18 19:38:00

我正在尝试实现一个 Deep Q 网络,但是当您只能收集单个操作的数据时,我一直坚持如何训练网络来预测多个操作值。

在论文中,它建议为每个动作使用不同的输出

相反,我们使用一种架构,其中每个可能的动作都有一个单独的输出单元,只有状态表示是神经网络的输入。输出对应于输入状态的各个动作的预测 Q 值。

由于我们只能访问一个动作,我们只知道该动作的损失(即单个输出)。但据我所知,我们需要为所有输出设置值才能训练网络。您可以使用什么黑魔法来获得其他输出值?

让网络预测其他动作值并将它们反馈回来似乎是个坏主意,因为它会影响优化器。如果你试图忽略其他输出并训练它,就好像只有你当前关注的一个,你仍然会影响其他输出,因为它们会共享边缘。


DQN纸

2个回答

你的网络的输出应该是你动作空间中每个动作的 Q 值(或至少在当前状态下可用)。然后可以使用 softmax 或 epsilon-greedy(或其他策略)来选择最终动作。网络将学习预测哪个动作应该从当前状态返回最大奖励。此外,我们在收集到特定数量的经验后更新网络,并使用该经验缓冲区中的批次来更新网络。我们不会在原版 DQN 中反馈任何值(不重复)。

网上有很多很好的实现可以帮助你理解算法。

其他值由现有的 q 值保持。如果您使用的是深度 Q 网络,那么您的回放内存将记录 <s,a,r,s'> 您是对的,该状态足以满足所有输入。将重放记忆中的动作和奖励归为单一输出。为了使用 minibatch 对所有人进行训练,首先你为神经网络提供了每个状态。然后,记录所有输出的馈电状态的 Q 值。然后,保持其他 Q 值不变,您只需使用贝尔曼方程更新所选动作的 Q 值及其奖励。最后,您将获得所有输出的状态和 Q 值数据集。然后,您将神经网络训练为通常的监督学习。