坚持理解TD(0)和TD(λ)

时间:2018-09-02 10:45:42

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

我正在研究从this post开始的时间差异学习。在这里,我很清楚TD(0)的更新规则,但是在TD(λ)中,我不了解如何在单个更新中更新所有先前状态的效用值。

以下是用于比较机器人更新程序的图:

enter image description here

上图说明如下:

  

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

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

enter image description here

在单个更新中,我们仅更新单个状态Ut(s)的实用程序,然后如何更新所有先前状态的实用程序?

修改

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

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

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

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

此处仅更新2个值,而不是如图所示的所有5个先前状态。我在这里想念什么?

3 个答案:

答案 0 :(得分:3)

  

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

您是正确的,在第一次更新中,所有奖励和更新仍将是0(除非我们已经一步步达到目标,否则奖励不会是0)。

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

合格性跟踪表在每个时间步(<{> gamma * lambda_)都会衰变,因此对很久以前访问过的状态进行更新的幅度将小于该幅度关于我们最近访问过的州的更新,但我们将继续记住所有这些州,它们将具有非零条目(在gamma > 0lambda_ > 0的假设下)。这样可以更新所有访问过的州的值,不尽快到达这些州,但是只要观察到非零奖励,就<< / strong>(或者,在第一个时期之后的时期中,一旦我们达到我们已经具有现有非零预测值的状态)在较早的时间点访问它们之后


  

也在给定的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,就会发现使用此标志意味着我们总是从随机初始位置开始。

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

如果初始位置确实是左下角的位置,则该算法的正确实现确实会更新该路径上所有状态的值(假设未添加其他技巧,例如将条目设置为{{ 1}}(如果它们由于衰减而恰好“足够接近”到0)。


我还要指出的是,该页面上的代码实际上是有一个错误:重置环境/启动a时,它们不会将资格跟踪表中的所有条目都重置为0。新纪元。应该做到这一点。如果不执行此操作,则资格跟踪记录仍将记住在先前时期访问过的状态,并且即使在新时期中没有再次访问过这些状态,仍会更新所有状态。这是不正确的。正确的代码版本应如下所示:

0

答案 1 :(得分:2)

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

修改

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

我不知道为什么在Python实现中(我没有仔细检查过)输出仅更新2个值,但是请确认先前所有5种状态的合格跟踪都不同于0,并且是否为并非如此,请尝试了解原因。有时您不希望将跟踪保持在很小的阈值(例如10e-5)下,因为它在学习过程中影响很小,而且在浪费计算资源。

答案 2 :(得分:0)

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

  • 与此同时,资格跟踪正在使用以前各州的资格跟踪
  • 在资格跟踪中,由于gamma为0.999(小于1),lambda = 0.5乘以gamma和lamba使公用事业大幅下降,
  • 通过仅在当前时间t的状态上加+1来加权。
  • 意味着我们越接近当前状态,权重就越大,乘数就越大
  • 再进一步,乘数就越来越小。

在TD(λ)中,在向计算中添加合格跟踪时也有一个额外的减少 上面的结论是,在第一次迭代中,先前的值是0,因为所有实用程序在开始时都是0,而在更新时的TD(λ)中,通过合格性跟踪,它们的下降幅度要大得多。您可以说它们非常小,太小而无法计算或考虑。