Eligibility Traces 是强化学习的基本原理之一。几乎所有 TD 方法都可以和 eligibility traces 结合起来生成更高效通用的方法。

在 TD() 方法中,,两个极端的例子是 MC () 和 1-step TD ()。

与n-step方法相比:

  • Eligibility Traces 方法只需存储一个trace vector,而不是 n 个最新的 feature vectors
  • 学习过程是连续且均匀的,不会有延迟
  • 不需要在 episode 结束时才进行所有运算
  • 学习可以立刻影响行为,不需要 n step 后才延迟生效

前面讲过的很多方法根据后面的一些 rewards 来更新,这种形式称为 forward views ,通常 forward views 并不实用,因为 update 依赖于当前未知的量,这一章会介绍一种新方法,采用 eligibility trace 往前看最近经过的 states ,从而得到当前 TD error ,称之为 backward views 。

12.1 The -return

n-step return 的定义如下:

现在考虑多个 n-step return 的加权平均,只需权重和为 1,仍能用作 update target,如 ,这种更新方式称为 compound update,其 backup 图如下

TD() 也属于这种 averaging n-step update ,他包括了所有的 n-step updates,权重系数分别为 -return 定义如下(其中 确保能归一化):

其 backup 图如下:

将上式提取一部分出来,可写为

观察可知,当 ,此方法为 MC;当 ,此方法为 1-step TD。

更一般地,将这个 作为 update target ,此算法称为『offline -return algorithm』,采用半梯度法更新:

下图通过一个实例比较了算法效果:

目前我们讨论的方法都是『forward views』算法,在每个 state 处都能得到一些未来的信息,如下面示意图所示。

12.2 TD()

本节介绍的 TD() 对上一节的 offline -return 有三点提升:

  • 单步更新权重向量,无需等待 episode 结束
  • 计算在时间上均匀分布
  • 不仅可用于 episode 问题,还适用于连续问题

本节引入 eligibility trace ,他与权向量 维度相同,权向量有长期的记忆性,其存在时间与系统等长,而 eligibility trace 则体现短期记忆,存在于 episode 内的一个子片段中。

eligibility trace 定义如下:

eligibility trace 一直在追踪那些对『recent state valuation』有贡献的权重分量,这个 recent 体现在系数 上。

在 1-step TD 中,TD error 为

更新式为

将梯度增加一些信息

即可得到 TD() 的更新式

算法伪代码如下

TD() 是 backward 的,即,每个时刻得到新的 TD error 后,又依据它对之前 states 的 eligibility trace 作一些调整,如下面示意图所示。

算法的实际测试效果如下图所示

时,trace 恰好就是 value function 的梯度,此时正好对应 1-step TD ;当 时,可以看出每一个 state 都刚好衰减 倍,跑完这个 episode ,恰好就是 MC 。可以看出,使用了 eligibility trace 后仍能统一地表示各种算法。

若满足条件

线性 TD() 可以在 on-policy 下确保收敛,此时有上界

12.3 n-step Truncated -return Methods

前面讲过的 offline -return 是一个重要的概念,但并不实用,因为他需要跑完一整个 episode 才能结束,而在连续型任务中,n 可以无限大,-return 无法计算,因此需要考虑将序列截断,用估计值来替代抛弃掉的较远的 rewards 。

定义 truncated -return 如下:

而之前定义的完整的 -return 为:

对比可知,truncated -return 提前结束了模拟(后面未模拟部分用估计值代替),在此算法中,update 只被延迟了 n 步。称该算法为 truncated TD() ,或 TTD() 。

下面是算法的 backup 示意图:

算法的更新式为

其中

12.4 Redoing Updates: The Online -return Algorithm

实用 truncated TD 涉及到对 n 的平衡,n 越大越接近 offline -return ,越小则更新速度越快。此平衡是可以达到的,方法是每次获得新数据后,重新从头开始执行所有更新:

其中 都继承自上一个 episode(因此所有的 也都为同一值), 则为每一步的更新结果。

更一般的表示为:

此算法称为『online -return algorithm』,是完全在线算法,每个时间点 t 均使用已有数据产生一个新权重向量

他在每个时间点 h 都能充分利用上 h 时间之前的所有信息,可以看出现在这种算法对数据的利用率更高,更新效果更好,缺点则为每次均需从头计算,复杂度高。

下面是实际的性能比较:

12.5 True Online TD()

online -return 效果很好,但计算复杂度太高,需要考虑利用 eligibility trace 将算法变换为 backward view 算法,这便是本节要讲的『true online TD()』。

之前的 online -return 方法产生的权重序列如下:

事实上,我们需要的只是每行最后一个权重 ,得到

对于 linear case,true online TD() 定义如下:

此算法可以产生和 online -return 算法一样的结果,空间要求和 TD() 相同,计算量稍微增加了 50%,但仍为 复杂度。

这一节 true online TD() 使用的 eligibility trace 称为『dutch trace』,之前的 TD() 中则称为『accumulating trace』。

12.6 Dutch Traces in Monte Carlo Learning

尽管 eligibility trace 于 TD 方法结合紧密,但他们本质上并无联系,事实上,eligibility trace 起源于 MC learning ,下面用一个例子简单介绍一下。

线性情况下,梯度 MC 法的更新式如下:

为了简化问题,这里的 return 只是 episode 结束后得到的单个 reward(因此没有下标),并且没有做 discounting 。想要做的优化就是,在 episode 每一步都进行一些计算,但仍只在 episode 结束后才进行更新,所以复杂度仍为 。算法如下:

这里引入 称为 遗忘矩阵(or 衰退矩阵),接上式,下面进行递归

其中 是 T-1 时刻的两个辅助记忆向量,即使不知道 G ,也能在每步先做一些这样的计算,用以存储一些信息。

事实上, 是一个 dutch-style eligibility trace,初始值为 ,他的更新式为:

辅助向量 初始值为 ,更新式为

在 t < T 时,每步更新辅助向量 ,当 T 时刻获得 G 后再最终计算出 。得到的结果和 MC 相同,但计算更简单。

本例说明了 eligibility trace 并不局限于 TD 方法,只要想做长期预测,都可以采用 eligibility trace 。

12.7 Sarsa()

这一节把 eligibility trace 从 state-value 扩展到 action-value,只需简单地将 变为

action-value 形式的 n-step return 为:

利用这个 return ,可以根据前面公式构造 action-value 形式的 truncated -return ,进而得到 action-value 形式的 offline -return 算法:

算法示意图如下:

Sarsa() 和 TD() 相似,更新式为

算法伪码如下:

该算法与传统的 n-step sarsa 效果对比如下:

上面是 offline -return 算法,下面介绍 action-value 的 online -return 算法。

本节算法之间的比较:

12.8 Variable and

为了更泛化地表示每一步中 bootstrapping 和 discounting 的程度,需要更通用的 ,现定义函数 ,从而得到

函数 称为『termination function』,现在重新定义 return :

为保证结果有限,需要

这种形式的好处是,episodic 任务无需再指定开始状态和结束状态,只需使 即可,因此便能统一 episodic 和 discounted-continuing 。

上面说了对 discounting 的泛化,下面再介绍对 bootstrapping 的泛化。

若考虑对 state-value 做 bootstrap ,则泛化参数记为 ,同理若对 action-value 做 bootstrap ,则泛化参数记为 控制了 bootstrap 的程度,当为 1 时完全不做 bootstrap ,当为 0 时则完全是在 bootstrap )。于是可以得到新的递归形式的 state-based -return :

或是 action-based -return :

或者 Expected Sarsa 形式:

12.9 Off-policy Traces with Control Variates

本节主要将 importance sampling 整合进算法。这里采用第 7 章的 per-decision 方法,定义如下的 -return :

他的 truncated 形式可由 state-based TD error 逼近得到:

通过上面形式的 -return ,可以方便地进行 forward-view 更新

下面探究 forward view 和 backward view 的近似关系。对整个 forward view 过程进行求和,得到:

其中第二个等号用到了一个求和规则:

若上式的第二个求和项可写作 eligibility trace 并用于更新,则更新式变为 backward view TD update 。即,若表达式为 k 时刻的 trace,那他可由 k-1 时刻的值更新而得:

整理即得

这个 eligibility trace 结合 半梯度 TD() 更新即为一般的 TD() 算法( 时对应 on-policy)。在 off-policy 情况下,算法性能还不错,但是作为一个半梯度算法,稳定性欠佳(后面几节会考虑扩展此算法来保证稳定性)。

对于 action-value 情况的算法,其实和 state-value 情况类似,现构造一个 action-based -return :

其中

同样又基于 action-based TD error 来逼近 -return :

然后做类似变换,得到 eligibility trace for action values:

将其用于半梯度更新可得到更一般的 Sarsa() ,同样可通用于 on-policy 和 off-policy 。

时,目前这些算法和 MC 联系密切,而 时,上面所有的 off-policy 算法都将面临 11 章提到过的『致命三因素(the deadly triad)』—— approximation、bootstrapping、off-policy 。

12.10 Watkins’s Q() to Tree-Backup()

近些年提出了很多在 Q-learning 上使用 eligibility trace 的扩展算法,最早的便是 Watkins’s Q() :若采取 greedy action,则照常对 eligibility trace 进行衰退,否则,就将首个 non-greedy action 之后的 traces 重置为 0 。算法的 backup 示意图如下:

第 7 章介绍过无需 importance sampling 的 n-step tree backup 算法,下面将 eligibility trace 结合于其中,称为 Tree-Backup() 或 TB() 算法,示意图如下:

该算法的 -return 为使用 action values 的递归式:

再对 return 做逼近:

最后得到 eligibility trace update:

再利用更新规则

组成了完整的 TB() 算法。该算法依然不稳定,同样需要结合后面的方法。

12.11 Stable Off-policy Methods with Traces

前面几节中的一些 eligibility trace 方法是可以在 off-policy 中取得稳定解的,这一节介绍四种最为重要的使用了 bootstrapping 和 discounting 的函数,他们的思想都基于 11 章中的 Gradient-TD、Emphatic-TD。下面的算法都假定了线性函数逼近这一前提(至于非线性,理论上也能做相似的处理),符号若无特殊说明,都和前面相同。

(1) GTD() :TDC 算法的 eligibility trace 形式

目标:学习 ,更新式如下:

(2) GQ() :Gradient-TD 算法(action-value)的 eligibility trace 形式

目标:学习 ,更新式如下:

(3) HTD() :由 GTD() 和 TD() 的结合算法

目标:学习 ,更新式如下:

(4) Emphatic TD() :Emphatic TD 的 eligibility trace 形式

目标:学习 ,此算法在 off-policy 下收敛性很强(代价是高方差、慢速),允许任何程度的 bootstrapping 。更新式如下:

其中,

  • :emphasis
  • :followon trace
  • :interest

12.12 Implementation Issues

看起来 eligibility trace 比 one-step 方法更复杂,因为他需要在每个时间点对所有状态做更新。但其实执行起来并不是什么大问题,因为实际中绝大多数 state 的 trace 都为 0,只有少量最近经历过的 state 的trace 大于 0 ,所以也只需做少量更新。

在有函数逼近的情况下,不使用 eligibility trace 的方法的计算优势有所下降,尤其是当使用了神经网络,使用 trace 时的内存和计算力的消耗只是原来的两倍。