我们之前讲过的蒙特卡洛方法和时序差分算法有一点不同点,当更新当前状态的值函数的时候,蒙特卡洛方法是使用整个轨迹来预估,而TD算法则是使用一段轨迹来预估,而这个一段轨迹一般是小于整条轨迹的。而通过利用不同的举例来估计,我就称为多步时序差分法也叫做 资格迹法。
而资格迹法一般又分为两个角度来计算。
一种前项视角,估计当前状态的值函数的时候,使用当前时刻以后的几个时刻来估计。
另一种是后项的视角来更新,就是使用当前时刻之前的数据来更新,资格迹是进行资格分配的方法,它是强化学习的一种基本机制。TD(λ)算法中的λ就是对资格迹的运用。包括Q-learning,sarsa等算法都可以借用这种方法提升效率。
多步TD评估
蒙特卡洛的估计公式是
V(st)<−V(st)+α(Gt−V(st))(6.1)
其中更新目标Gt为累计回报。
Gt=rt+1+γrt+2+γ2rt+3...
很容易知道,对于一步的TD更新目标
Gt1=rt+1+γV(st+1)
很容易知道,对于两步的TD更新目标
Gt2=rt+1+γV(st+2)+γ2V(st+2)
以此类推我们就能知道n步的回报是如何表达。由上面的过程我们知道,其实如果我们的n大于轨迹长度,那么就是蒙特卡洛的算法,
前向算法
既然存在n步时序差分,那么这个n取值就是一个值得讨论的问题。
一种简单的方法是通过平均多个不同的n步回报进行更新,最后他们的权重之和为1。
下面我们来举个例子。
假如我们使用2步TD和4步TD相结合。每次更新的时候,2步TD权重是1/2,4步TD也是1/2作为最终的更新量。
前向视角的TD(λ)算法最主要的特点是平均化的操作运用。唯一特别是TD(λ)直接平均化所有步的回报。每个回报的权重是(1−λ)λn−1,通过引用这个λ综合考虑步数的回报。
如果轨迹长度是T的时候,就有
Gtλ=(1−λ)n=1∑T−t−1λn−1Gtn+λT−t−1Gt(6.2)
值更新的公式如下
V(st)<−V(st)+α(Gtλ−V(st))(6.3)
后向算法
刚刚讲的前向算法主要是需要当前时刻以后的几个时刻的状态,其实和蒙特卡洛的思想相近,当时无法直接实现。
我们需要一种无须等到实验结束就更新当前状态值函数的方法。这种增量式更新方法需要利用多步的时序差分的后向观点。它采用的明确的因果性递增机制来实现的。
后向视角,引入一个和每个状态都相关的额外变量(资格迹)。现在外面来讲个打死外星人的例子。外星人被连续的3次拳击和一次电击后死亡,那么我们在分析外星人死亡原因的时候,到底是拳击因素重要还是电击的因素重要呢?
实际进行资格迹分配的时候有两种方式,一种是频率启发式,将资格迹分配给最频繁的拳击方式,还有一种是最近启发式,也就是电击方式。
在t时刻状态s,对应的资格迹标记为Et(s)
Es=0
Ets=γλEt−1(s)+I(St=s)
初始的资格迹,Es=0,当下一个时刻,被访问到的状态,其资格迹为前一个时刻该状态资格迹Et−1(s)乘以退化参数λ和衰减因子γ然后加1,表示当前该状态资格迹变大。其他未被访问的状态,其资格迹只是原有基础上乘以λγ,不用加1.那么我们来看看上文那个例子的更新过程。
在上面的场景中我们分别有两个状态拳击和电击分别是s1和s2,然后λ=0.9,γ=0.8
当t=1的时候。
E1s1=γλE0(s1)+1=1E1s2=γλE0(s2)=0
当t=4的时候
E4s1=γλE3(s1)+1=1.61E4s2=γλE3(s2)+1=1
因此推测外星人的死是拳击的权重更大一些。
我们能够看出可以使用资格迹Et(s)来分配各值函数的资格,也就是说使用资格迹来衡量TD误差发生时,各个状态值函数更新会有多大影响。
δt=Rt+1+γVt(St+1)−Vt(St)(6.4)
结合资格迹更新状态价值
V(s)<−V(s)+αδEt(s)(6.5)
前向Sarsa方法
将资格迹与Sarsa方法结合就形成了一个新的算法就是前向的Sarsa方法,与原始的Sarsa方法不同,需要学习的不是Vt(s),而是学习Q(s,a),其主要思想同TD(λ)一致,通过每个回报赋予权重(1−λ)λn−1的平均多个Q回报进行更新。
这个时候的Q回报相对于累计回报G,指的是状态行为对(s,a)从t时刻开始往后所有回报的衰减的总和。
其中n步以后的Q回报就是
Qtn=rt+1+γrt+2...+γnQ(st+n,at+n)
对Q回报加权求和的λ回报Qtλ
Qtλ=(1−λ)n=1∑infλn−1Qtn(6.6)
那么最后的更新公式是
Q(S,A)=Q(St,At)+α(Qtλ−Q(St,At))
后向Sarsa方法
后向的Sarsa方法引入资格迹,将当前的行为值函数误差按照比例抛给其他状态行为值函数,作为更新额依据。不同的是,资格迹不再是Et(s)而是Et(s,a),就是针对每一个状态行为都有一个资格迹
E0(s,a)=0Et(s,a)=γλEt−1(s,a)+I(St=s,At=a)
其他的部分后后向的TD一样
Qt+1(s,a)=Qt(s,a)+αδtEt(s,a)
Sarsa是一个在线算法,也就是采样的策略和评估改进的同一个策略,对于在线算法,算法更新方式很多,很简单就是依据当前的行为值函数估计值采用σ贪心算法更新。
前向的Watkin’s Q(λ)方法
常用的Qlearning是一个离线算法,就是产生的策略和评估的策略不是同一个策略,也就是我说需要依据带有σ贪心行为的轨迹来学习一个贪心策略。
在进行值函数更新的时候,Q-learning采用的更新公式
Q(s,a)=Q(s,a)+α(R+γ maxQ(s′,a′)−Q(s,a)
而Q-learning是一步更新,如何来进行多步更行的?
假设我们正在进行贪心策略在状态(s,a)的行为值函数,前两个时间步选择的行为是贪心的,但是第三个时间步行为是探索策略,那么有效的轨迹长度,最长就是第二个时间步,从第三个时间步往后的策略都不会理会,也就是说使用最近的一个探索策略对应的时间步长,所以在进行数据探索的时候,一旦发现有探索行为就立刻结束了,
Q回报的加权求和公式同公式6.6
更新公式为
Q(st,at)=Q(st,at)+α(Qtλ−Q(st,at))
后向的Watkin’s Q(λ)方法
后向的Q(λ)的资格迹如何更新呢?
对位状态行为(s,a)的资格迹,更新分为两部分,首先如果当前的行为选择at,是贪心行为,资格迹乘以系数λγ否则资格迹就是0,其次,对于当前在访问的(st,at)其资格迹单独加1.资格迹的更新公式为。
\begin{equation}
E_{t}(s,a)=I_{ss_{t}} I_{aa_{t}} + \left\{
\begin{aligned}
\lambda \gamma E_{t-1}(s,a)\ \ 如果Q_{t-1}(s_t,a_t)=maxQ_{t-1}(s_t,a) \\
0 \ \ \ \ \ \ \ \ 其他\\
\end{aligned}
\right.
\end{equation}
其中IsstIaat表示示例函数,Isst表示当s=st其值为1.
假设当前正在访问的状态行为(s,at),其中at表示探索行为,状态行为对(s,a)的资格迹为:Et(s,a)=0+0=0,与此同时,当前正在访问的状态行为(s,at)的资格迹Et(st,a)=1+0=1.
Qt+1(s,a)=Qt(s,a)+αδtEt(s,a)
其中
δt=rt+1+γmaxQt(st+1,a′)−Qt(s,at)