代码之家  ›  专栏  ›  技术社区  ›  Kaushal28

坚持理解td(0)和td(206)的更新用法之间的差异

  •  9
  • Kaushal28  · 技术社区  · 7 年前

    我在研究时间差异 this post . 这里td(0)的更新规则对我来说很清楚,但是在td()中,我不理解如何在一次更新中更新所有先前状态的效用值。

    下面是比较bot更新的图表:

    enter image description here

    上图说明如下:

    在td()中,由于资格跟踪,结果会传播回所有以前的状态。

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

    enter image description here

    在一次更新中,我们只更新一个状态的实用程序 Ut(s) ,则如何更新所有先前状态的实用程序?

    编辑

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

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

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

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

    这里只更新了2个值,而不是图中所示的所有5个先前状态。我错过了什么?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Dennis Soemers    7 年前

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

    你说得对, 在第一次更新中 ,所有奖励和更新仍将是 0 (除非我们已经一步到位了,否则奖励就不会是 )

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

    合格记录表 衰退 每一步(乘以 gamma * lambda_ ,因此,对很久以前访问过的州的更新量将小于对我们最近访问过的州的更新量,但我们将继续记住所有这些州,它们将有非零项(假设 gamma > 0 lambda_ > 0 )这允许值为 所有访问的州 要更新, 我们一到那些州 但是 一旦我们看到一个非零奖励 (或者,在第一个纪元之后的纪元中,当我们达到一个我们已经有一个非零预测值的状态时) 在早些时候拜访过他们之后 .


    同样在给定的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 ,我们看到这个标志的使用意味着我们总是从 随机初始位置 .

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

    如果初始位置确实是左下角的位置,则算法的正确实现将确实更新该路径上所有状态的值(假设没有添加额外的技巧,例如将条目设置为 如果他们碰巧“接近”到 由于腐烂)。


    我还想指出,实际上在该页的代码中有一个错误:它们没有将资格跟踪表的所有条目重置为 当重置环境/开始新纪元时。应该这样做。如果不这样做,合格记录仍然会记住在前一个时代访问过的州,并且仍然会更新所有这些州,即使在新时代没有再次访问过它们。这是不正确的。正确版本的代码应该如下开头:

    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):
            ...
    
        2
  •  2
  •   Pablo EM    7 年前

    您缺少一个小而重要的详细信息,更新规则将应用于 所有状态 ,而不仅仅是当前状态。所以,实际上,你正在更新 e_t(s) 与零不同。

    编辑

    这个 delta 不为零,因为是为当前状态计算的,此时插曲结束,代理收到+1的奖励。因此,在计算 三角洲 不同于零,你用它更新所有的状态 三角洲 以及目前的资格记录。

    我不知道为什么在python实现中(我没有仔细检查过)输出只更新了2个值,但是请验证前5个状态的合格性跟踪是否与0不同,如果不是这样,请尝试理解原因。有时你不想把轨迹保持在一个很小的阈值(如10e-5)下,因为它在学习过程中影响很小,而且浪费了计算资源。

        3
  •  0
  •   Eirini Vandorou    7 年前

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

    • 同时,资格跟踪使用以前州的资格跟踪
    • 在合格跟踪中,因为gamma是0.999(小于1),lambda=0.5乘以gamma,lamba使实用程序大大减少,
    • 仅在当前时间t的状态下添加a+1的权重。
    • 也就是说,我们越接近当前的状态,我们拥有的权重就越大,因此乘数就越大
    • 越远,乘数就越小。

    在td(»)中,在计算中添加合格跟踪时,也会有额外的减少。 上面的结论是,在第一次迭代中,前面的值是0,因为所有实用程序在开始时都是0,在td()中,当更新时,它们会因合格性跟踪而大大减少。你可以说它们非常小,太小,无法计算或考虑。

    推荐文章