如何解决这个 DQN 算法在 TensorFlowJs 上的实现是如何工作的?
开发人员
我找到了一堆 DQN 实现的例子,但因为我不是 TensorFlow 专家,所以我有点困惑。
让我们看看 here 就是其中之一。
我可以理解,在第 73 行,我们准确地切片了一批存储数据 [{state,action,reward,newState,done}]
,然后我们得到 currentStates
,即 [[s1,s2,...]]
,然后在第 75 行我们使用模型来get currentQs
这应该是,我怎么理解,[[act1,act2,...]]
,因为我们的模型用于从 env 的状态中获取操作。 newCurrentStates
和 futureQs
也是如此。
但是在 88 上,我们看到 let maxFutureQ = Math.max(futureQs);
。这里发生了什么? futureQs
是一个数组数组,每个 futureState 都有动作概率?然后 maxFutureQ
应该是一个动作概率,为什么我们将它添加到奖励中?这部分让我很困惑。
我也不明白为什么我们需要在 94 上做 currentQ[action] = newQ;
。
拜托,有人可以帮我了解这里发生的事情并留下评论吗?
提前致谢。
编辑:
讨论的代码:
解决方法
让您感到困惑的部分是 Bellman approximation
,它用于更新定义为 Q-values
的状态的 s
,如果采取了一个动作 a
。
Q
此状态 s
和动作 a
等于目标状态的预期即时奖励和折扣长期奖励。
我们取处于状态 Q-values(or the value of the action)
的 s'
值的最大值,状态 s
是从状态 a'
出发的下一个状态,带有一个动作 s
,作为从状态 s'
到状态 s0
时我们可以采取的动作是一组互斥的离散集(即,您的环境允许您向上、向左、向右或向下移动),因此最优化的动作将是导致动作价值最高的动作。
以上图为例。代理从状态 0.33%
开始,并且能够向上、向左、向右或向下移动这些动作。代理可以采取的行动本质上是随机的而不是确定性的,但是当代理打算向上时,代理可能会向左或向右移动。在这里,我将只为 gamma 赋值 1。
这就是您如何计算状态 Q-values
和动作 s0
的 up
,其中进入状态的值是代理收到的即时奖励 {{ 1}}。
V1 = 1,V2 = 2,V3 = 3,V4 = 4
接下来,如果您计算所有其他可能状态及其动作的 Q 值,您将得到以下结果:
Q(s0,up) = 0.33 * V1 + 0.33 * V2 0.33 * V4
= 0.33 * 1 + 0.33 * 2 + 0.33 * 4
= 2.31
因此,状态的最终值 Q(s0,left) = 1.98
Q(s0,right) = 2.64
Q(s0,down) = 2.97
是这些操作的值的 s0
,即 maximum
。这就是您在代码中真正想要做的。
至于 2.97
的作用是什么,它正在对当前的 currentQ[action] = newQ;
执行更新,以在剧集结束时将其旧值更新为新的更新值。
关于为什么要这样做,您必须了解的一件事是,代理在一个情节之后更新其 Q-values
,然后再次进行训练并重复该过程,直到代理设法完成它的目标(对于引入该算法的 Atari 论文,我认为该目标的平均得分为 19,这相当于赢得 21 场比赛中的 19 场)。
您可以从 original paper 中阅读有关整个过程的更多信息。
但我认为在此之前您需要更多地了解 Bellmans 方程,因为它对于理解强化学习非常重要。 DeepMind 有一个很棒的 Youtube 系列,可以found here。
更妙的是,它的创始人 Richard Sutton 和 Andrew Barto 有关于强化学习的 free book。我相信他们在第 4 章中详细介绍了这一点。
编辑:
我不太确定你所说的它如何影响培训是什么意思,但我会概述整个过程,让你了解培训是如何工作的:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。