【问题标题】:Stuck in understanding the difference between update usels of TD(0) and TD(λ)坚持理解 TD(0) 和 TD(λ) 的更新用途之间的区别
【发布时间】:2019-02-07 17:06:16
【问题描述】:

我正在学习 this post 的时间差异学习。这里 TD(0) 的更新规则对我来说很清楚,但是在 TD(λ) 中,我不明白如何在一次更新中更新所有先前状态的效用值。

这是机器人更新比较的图表:

上图解释如下:

在 TD(λ) 中,由于资格跟踪,结果被传播回所有先前的状态。

我的问题是,即使我们使用具有资格跟踪的以下更新规则,如何在一次更新中将信息传播到所有先前的状态?

在一次更新中,我们只更新了单个状态Ut(s) 的实用程序,那么之前所有状态的实用程序是如何更新的呢?

编辑

根据答案,很明显,此更新适用于每一步,这就是传播信息的原因。如果是这种情况,那么它再次让我感到困惑,因为更新规则之间的唯一区别是资格跟踪。

因此,即使先前状态的资格跟踪值不为零,在上述情况下,delta 的值也将为零(因为最初的奖励和效用函数被初始化为 0)。那么先前的状态如何在第一次更新时获得除零以外的其他效用值?

同样在给定的python实现中,单次迭代后给出以下输出:

 [[ 0.       0.04595  0.1      0.     ]
 [ 0.       0.       0.       0.     ]
 [ 0.       0.       0.       0.     ]]

这里只更新了 2 个值,而不是如图所示的所有 5 个之前的状态。我在这里缺少什么?

【问题讨论】:

    标签: machine-learning reinforcement-learning temporal-difference


    【解决方案1】:

    您遗漏了一个小而重要的细节,更新规则适用于所有状态,而不仅仅是当前状态。因此,实际上,您正在更新所有e_t(s) 不为零的状态。

    编辑

    delta 不为零,因为它是针对当前状态计算的,当情节结束并且代理收到 +1 的奖励时。因此,在计算出不同于零的 delta 之后,您可以使用该 delta 和当前的资格跟踪来更新所有状态。

    我不知道为什么在 Python 实现中(我没有仔细检查过)输出只更新了 2 个值,但是请验证所有 5 个先前状态的资格跟踪都不是 0,如果是不是这样,试着理解为什么。有时您对将跟踪保持在非常小的阈值(例如 10e-5)下不感兴趣,因为它在学习过程中的影响非常小,而且会浪费计算资源。

    【讨论】:

    • 感谢您的回答,但我仍然很困惑,请参阅更新后的问题。
    • delta 怎么不为零?在这个例子中,reward 为零,当前状态的效用 U(S_t) 和下一个状态的效用 U(S_t+1) 最初都是零。
    • “单次迭代”到底是什么意思?可能,鉴于你得到的矩阵(和你的图表),一次迭代意味着一个情节,即,直到代理达到最终状态。在您的情况下,它达到了绿色状态,奖励为 +1。在这种情况下,奖励,因此delta 不为零。否则,正如您所注意到的,如果奖励为零并且所有状态的U(s) 也为零,则不可能获得不同于零的效用。顺便说一句,我再次编辑了答案以反映代理已达到最终状态的事实。
    • 你能帮我解决一个相关问题吗:stackoverflow.com/questions/56214885/…
    • 我会试着考虑一下,虽然我对你问的话题不是很熟悉。如果可能,尝试回答@Dennis Soemers 的cmets,它们似乎很有用。
    【解决方案2】:

    因此,即使先前状态的资格跟踪值不为零,在上述情况下,delta 的值也将为零(因为最初的奖励和效用函数被初始化为 0)。那么先前的状态如何在第一次更新时获得除零以外的其他效用值?

    你说得对,第一次更新,所有奖励和更新仍然是0(除非我们已经设法一步达到目标,那么奖励就赢了'不要是0)。

    但是,资格跟踪e_t 将继续“记住”或“记住”我们之前访问过的所有状态。因此,一旦我们确实设法达到目标状态并获得非零奖励,资格跟踪仍将记住我们经历的所有状态。这些州在资格跟踪表中仍将有非零条目,因此一旦您观察到您的第一个奖励,就会立即获得非零更新。

    资格跟踪表在每个时间步都衰减(乘以gamma * lambda_),因此很久以前访问过的状态的更新量将小于更新量对于我们最近访问过的状态,但我们将继续记住所有这些状态,它们将具有非零条目(假设 gamma > 0lambda_ > 0)。这允许更新所有访问过的状态的值,不是在我们到达这些状态时,而是在我们观察到非零奖励时 /strong>(或者,在第一个 epoch 之后的 epoch 中,一旦我们达到我们已经有一个现有的非零预测值的状态)在某个较早的时间点访问过它们之后 .


    同样在给定的python实现中,单次迭代后给出以下输出:

    [[ 0.       0.04595  0.1      0.     ]
     [ 0.       0.       0.       0.     ]
     [ 0.       0.       0.       0.     ]]
    

    这里只更新了 2 个值,而不是如图所示的所有 5 个之前的状态。我在这里缺少什么?

    他们的代码的第一部分如下所示:

    for epoch in range(tot_epoch):
      #Reset and return the first observation
      observation = env.reset(exploring_starts=True)
    

    因此,每个新纪元,他们首先使用exploring_starts 标志重置环境。如果我们查看the implementation of their environment,我们会看到该标志的使用意味着我们总是以随机初始位置开始。

    因此,我怀疑,当运行代码以生成该输出时,初始位置只是随机选择为目标左侧两步的位置,而不是左下角的位置。如果初始位置被随机选择为已经更接近目标,则代理只会访问您看到非零更新的那两个状态,因此这些也是资格表中唯一具有非零条目的状态跟踪,因此是唯一具有非零更新的状态。

    如果初始位置确实是左下角的位置,那么算法的正确实现确实会更新该路径上所有状态的值(假设没有添加额外的技巧,例如将条目设置为 @987654333 @如果他们碰巧因为衰减而“足够接近”0)。


    我还想指出,该页面上的代码实际上存在错误:在重置环境/开始新纪元时,他们没有将资格跟踪表的所有条目重置为 0 .应该这样做。如果不这样做,资格跟踪仍将记住在先前 epoch 期间访问过的状态,并且仍然更新所有这些状态,即使它们在新 epoch 中没有再次访问。这是不正确的。他们的代码的正确版本应该是这样开始的:

    for epoch in range(tot_epoch):
        #Reset and return the first observation
        observation = env.reset(exploring_starts=True)
        trace_matrix = trace_matrix * 0.0    # IMPORTANT, added this        
        for step in range(1000):
            ...
    

    【讨论】:

    【解决方案3】:

    可以看出,使用 δ 来计算状态效用。但是,δ 使用下一个状态的实用程序,如 article 所示。 这意味着对于 TD(0),它将更新所有状态,因为要计算 Ut(s),我们需要计算下一个状态的 U,依此类推。

    • 同时资格跟踪正在使用之前各州的资格跟踪
    • 在资格跟踪中,由于 gamma 为 0.999(小于 1),因此 lambda = 0.5 乘以 gamma 和 lamba 会导致效用大幅下降,
    • 仅在当前时间 t 的状态下添加 +1 的权重。
    • 意味着我们越接近当前状态,我们拥有的权重就越大,因此乘数越大
    • 而且越远,乘数越小。

    在 TD(λ) 中也有额外的减少,同时将资格跟踪添加到计算中 以上得出的结论是,先前的值在第一次迭代中为 0,因为所有效用在开始时为 0,并且在更新时在 TD(λ) 中,它们通过资格跟踪得到了更大的下降。你可以说它们非常小,小到无法计算或考虑。

    【讨论】:

      猜你喜欢
      • 2013-01-03
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2014-10-09
      • 2011-11-04
      • 1970-01-01
      相关资源
      最近更新 更多