前言:在本节,我们首先介绍 算法。其次,我们将说明 算法的前向视角(Forward-view)以及后向视角(Backward View)。
1. 算法介绍。
上一节中介绍的 算法,指的是只通过当前这一步实际得到的反馈来更新我的value值, 即。 如果根据后续步实际得到的反馈来更新我的value值的话,则变成了算法。 算法可以表示成如下形式:
从图中我们可以看出, 中表示的是向后看的深度。如果我们将增加,一直增加到最后的终止步骤,则 算法变成了MC算法。
向后看步的返回值可以计算如下:
将向后看步的返回值书写成如下形式:
则的更新公式如下:
我们接下来面临的问题是,我们能否有效的综合性的考虑在取不同值时,所有的 ,从而更有效的利用bootstraping 来提升 value function 呢?为了解决这个问题,引出了策略。
可以用下图来说明:
考虑了所有的步返回值 \cdots G_t^{(n)},并为每一个 \cdots G_t^{(n)}分配了一个权重。 的计算公式如下所示:
利用,值函数的更新公式如下所示:
2. 算法的前向视角和后向视角。
在上述提到的 算法中,我们可以发现 被分配的权重是,, 权重的大小随着与(也可以被认为是时间)的关系以衰减,如下图所示:
为了计算,我们需要从当前状态和当前时刻开始,向后看去,得到所有的 。这就像是一个前向视角,如下图所示:
而 计算 的一个显著缺点就是, 和MC一样,也需要在完整的序列(episodes)。
为了能够在不完整的序列(episode)的情况下仍能够计算,我们考虑采用称为后向视角的方法。
在介绍后向视角之前,首先介绍一个“资格迹”(Eligibility Traces)的概念:
观察下图,到底是铃声响还是灯亮导致的闪电呢?
直观上有两种想法:1)从频率的角度取考虑,则铃响的频率更高(3/4),因此可以认为是铃响导致的闪电;2)从时间的角度考虑,则是灯亮导致的闪电。而资格迹同时考虑了上述两种想法,资格迹的计算如下:
在上图中,
在的后向视角中,我们保存每一个时刻和每一个状态的资格迹,在更新值函数时,同时考虑TD-error 和当前时刻对于状态的资格迹。计算公式如下:
这就像是一个后向视角,即把当前时刻当作终止时刻,回过头去看之前所有发生的状态,以及发生状态的时间,然后利用过去的状态信息来更新值函数,如下图所示:
采用资格迹进行更新值函数之后,可以证明出当时, 的值函数更新方式与采用资格迹进行值函数更新是相同的,即:
而当时, 采用资格迹进行值函数更新等价于每访MC的更新方式,即完全等价于MC的函数值更新。
下面我们讨论一下前向和后向之间的关系。
假设在一个episode中,只在时刻, 访问到了状态一次,则资格迹的更新如下式:
则后向 的进行更新的累计在线误差计算如下:
在上式中我们看出,后向的更新的累计在线误差实际上等于前向的更新的误差,再次看一下后向的更新公式:
和前向
我们从上式可以看出,实际上后向是在一个episode中不断地更新累计误差,但是在最终episode结束时,取得的效果与前向 的效果相同。最终后向 与前向的关系如下图: