【问题标题】:How does work this implementation of DQN algorithm on TensorFlowJs?这种 DQN 算法在 TensorFlow Js 中的实现是如何工作的?
【发布时间】:2021-01-08 19:33:03
【问题描述】:

开发者,

我找到了一堆 DQN 实现的例子,但是因为我不是 TensorFlow 专家,所以我有点困惑。

让我们看看here 就是其中之一。

我可以理解,在第 73 行,我们准确地切分了一批存储的数据 [{state, action, reward, newState, done}],然后我们得到 currentStates,即 [[s1, s2, ...]],然后在第 75 行我们使用模型得到 currentQs,这应该是,我如何理解,[[act1, act2, ...]],因为我们的模型用于从 env 的状态中获取操作。 newCurrentStatesfutureQs 也是如此。

但是在 88 上,我们看到了let maxFutureQ = Math.max(futureQs);。这里发生了什么? futureQs 是一个数组,每个未来状态都有动作概率?然后maxFutureQ 应该是一个动作概率,为什么还要加上这个奖励呢?这部分让我很困惑。

我也无法理解为什么我们需要在 94 上做currentQ[action] = newQ;

拜托,有人可以帮我理解这里发生了什么,然后让 cmets 去排队吗?

提前致谢。

编辑:

讨论的代码:

【问题讨论】:

    标签: javascript tensorflow tensorflow.js q-learning dqn


    【解决方案1】:

    让您感到困惑的部分是Bellman approximation,它用于在执行a 的操作时更新定义为s 的状态的Q-values

    此状态Qs 和动作a 等于目标状态的预期即时奖励和折扣长期奖励。

    我们取Q-values(or the value of the action) 的最大值,即处于状态s' 的下一个状态s,带有动作a',作为我们在从状态开始时可以采取的动作状态s 到状态s' 是一组相互排斥的离散集(即,您的环境允许您向上、向左、向右或向下移动),因此最佳动作将是导致动作的最高价值。

    以上图为例。代理从状态s0 开始,并且能够向上、向左、向右或向下移动,这些是动作。代理可以采取的行动本质上是随机的,而不是确定性的,但也就是说,当代理打算向上时,代理可能会向左或向右移动。我将在这里将值 1 分配给 gamma。

    这就是计算状态Q-valuess0 和动作up 的方法,其中进入状态的值是代理收到的即时奖励V1 = 1, V2 = 2, V3 = 3, V4 = 4

    Q(s0,up) = 0.33 * V1 + 0.33 * V2  0.33 * V4  
             = 0.33 * 1 + 0.33 * 2 + 0.33 * 4 
             = 2.31
    

    接下来,如果您计算所有其他可能状态及其动作的 Q 值,您将得到以下结果:

    Q(s0,left) = 1.98
    Q(s0,right) = 2.64
    Q(s0,down) = 2.97
    

    因此,状态的最终值s0 是这些操作值中的maximum,即2.97。这就是你真正想要在代码中做的所有事情。

    至于currentQ[action] = newQ; 的作用,它正在对当前的Q-values 执行更新,以便在剧集结束时从其旧值更新到新的更新值。

    您必须了解它为什么这样做的一件事是,代理会在一个情节之后更新其Q-values,然后再次进行训练并重复该过程,直到代理设法完成其目标(对于引入该算法的 Atari 论文,我认为该目标的平均得分为 19,这相当于在 21 场比赛中赢得 19 场)。

    您可以从original paper 阅读有关整个过程的更多信息。

    但我认为在此之前您需要更多地了解贝尔曼方程,因为它对于理解强化学习极为重要。 DeepMind 有一个关于这方面的优秀 Youtube 系列,可以是found here

    更好的是有一个 free book 来自它的创始人 Richard Sutton 和 Andrew Barto 的强化学习。我相信他们会在第 4 章详细介绍这一点。

    编辑:

    我不太清楚你所说的它如何影响训练是什么意思,但我会概述整个过程,让你了解训练是如何发挥作用的:

    【讨论】:

    • 感谢您的详细回答,但我仍有疑问。因此,在我发现的所有示例中,我们只存储 state - newState 对,而不存储 state - all newStates 那么它如何影响训练?如果我们将数学作为一个黑匣子,那么 currentQ 就是 arr [act1Prob, act2Prob, ...] 更新它也会如何影响训练。最后会变成[0.343, 0.122, 300, 0.33]
    • 另外,我找到了这个,github.com/prouhard/tfjs-mountaincar/blob/master/src/js/… here on 119 line 作者在张量上设置了结果,我也不明白,bc,在这种情况下,我们会在阅读后失去这个值数据。
    • 我不太清楚你所说的它如何影响训练是什么意思,但我更新了答案以包括训练如何工作的整个过程,以便更好地理解。
    • @Vadim 至于第 119 行的问题,这是一个条件语句,用于检查剧集是否在此步骤结束,如果它已经结束,那么我们将处于终端状态,因此存在下一个状态没有最大值Q-value,因为最终状态的状态值将是0,所以当我们对其使用贝尔曼近似时,它只是y = r + gamma * (0),然后相当于y = r。这是按照更新后的答案中的步骤6 完成的。