前面讲到了MC(蒙特卡洛方法)和TD(0)算法。MC方式是根据采样到的经验轨迹实际得到的奖励来更新轨迹中出现的状态的价值,即在每个轨迹结束之后更新。TD(0)方法中某个状态的价值是根据从当前状态走一步的即时奖励和后续状态的估计价值相加得来的,即在执行一个动作之后就更新价值。
那么,能否将MC和TD(0)结合呢?基于这个想法,就产生了n步时序差分算法。即在某个状态的价值等于在当前状态下走n步得到的奖励加上后续状态的估计价值。
1. n步时序差分预测
关于MC、TD(0)以及n-步TD的关系可以用下面一张图完美诠释。
上图中的空心圆代表状态,实心圆代表动作。最左边是TD(0),最右边是MC。中间就是今天要讲的n步时序差分方法。对于2-step TD,状态
s
s
s的价值是根据其后两步得到的奖励和执行这两步之后到达的状态的估计价值来计算的,公式表示如下,上标(2)表示2-步TD的奖励。
G
t
(
2
)
=
R
t
+
1
+
λ
R
t
+
2
+
λ
2
V
(
S
t
+
2
)
G_t^{(2)} = R_{t+1} + \lambda R_{t+2} + \lambda^2 V(S_{t+2})
Gt(2)=Rt+1+λRt+2+λ2V(St+2)
那么,n步TD的返回奖励就表示为:
G
t
(
n
)
=
R
t
+
1
+
λ
R
t
+
2
+
⋯
+
λ
n
−
1
R
t
+
n
+
λ
n
V
(
S
t
+
n
)
G_t^{(n)} = R_{t+1} + \lambda R_{t+2} + \cdots + \lambda^{n-1} R_{t+n} + \lambda^n V(S_{t+n})
Gt(n)=Rt+1+λRt+2+⋯+λn−1Rt+n+λnV(St+n)
有了某时刻能得到的奖励值之后,就可以进行状态的价值更新,更新方式跟其他方法是类似的:
V
(
S
t
)
=
V
(
S
t
)
+
α
[
G
t
(
n
)
−
V
(
S
t
)
]
V(S_t) = V(S_t) + \alpha[G_t^{(n)} - V(S_t)]
V(St)=V(St)+α[Gt(n)−V(St)]
上面的分析对应的算法伪代码如下:
2. n步Sarsa
上面讲了n步时序差分法怎样进行预测,即策略评估(计算状态价值)。那么这种方法怎样进行策略控制(找到最优策略)呢?TD(0)方法中已经介绍了两种控制方法,即Sarsa和Q-learning。这一节主要讲n步Sarsa如何实现。
在之前的学习中,我们知道,在off-policy的情况下,计算状态价值 V ( s ) V(s) V(s)并不能帮助我们找到一个最优策略。所以在off-policy方法中,我们一般计算动作价值 Q ( s , a ) Q(s, a) Q(s,a),这样就可以在任何一个状态下选择能够使Q值最大的动作,从而得到最优策略。
这里的奖励
G
t
G_t
Gt定义为:
G
t
(
n
)
≐
R
t
+
1
+
λ
R
t
+
2
+
⋯
+
λ
n
−
1
R
t
+
n
+
λ
n
Q
(
S
t
+
n
,
A
t
+
n
)
G_t^{(n)} \doteq R_{t+1} + \lambda R_{t+2} + \cdots + \lambda^{n-1}R_{t+n} + \lambda^n Q(S_{t+n}, A_{t+n})
Gt(n)≐Rt+1+λRt+2+⋯+λn−1Rt+n+λnQ(St+n,At+n)
动作价值的更新为:
Q
(
S
t
,
A
t
)
≐
Q
(
S
t
,
A
t
)
+
α
[
G
t
(
n
)
−
Q
(
S
t
,
A
t
)
]
Q(S_t, A_t) \doteq Q(S_t, A_t) + \alpha[G_t^{(n)} - Q(S_t, A_t)]
Q(St,At)≐Q(St,At)+α[Gt(n)−Q(St,At)]
Sarsa(0)、Expected Sarsa和n步sarsa的关系如下:
上图中的第一个实心圈代表状态动作对(s, a),空心圆圈代表状态,下面的实心圆圈代表动作。比如:sarsa(0)的表示如下:
根据上面分析的更新公式,对应的伪代码如下:
n-步sarsa比sarsa(0)能更快的学习到动作价值。为什么呢?下面给出一个例子来说明。在方格游戏中,每个位置代表一个状态,所有状态的价值初始化为0,从一个点开始做任何动作得到的奖励都为0,除非达到终点G,则得到一个正值的奖励。最左边图中的路径表示一条采样出的轨迹。后面两个图中的箭头表示通过一步sarsa和10步sarsa方法,都分别增强了哪些动作值。具体来说,一步sarsa中,因为只走一步就更新,所以在这个轨迹中,仅有倒数第二个状态的向上的动作价值得到了更新。但在10步sarsa中,走10步更新,所以终点G之前的10个状态的对应动作价值都得到了更新。
3. n步off-policy学习
回想off-policy方法,一般是采用两个策略。一个策略用来采样轨迹,另一个策略是待评估的策略(需要计算该策略下的状态价值函数或动作价值函数)。
在MC方法中,使用重要性采样来学习off-policy下的价值和最优策略。这里也可以根据这样的思路来进行n步off-policy的学习。
由于待评估策略和采样轨迹的策略不是同一个,那么轨迹中得到的奖励值需要乘以重要性采样率才能用来估计待评估策略得到的奖励值。即 ρ t : t + n − 1 G t ( n ) \rho_{t:t+n-1}G_t^{(n)} ρt:t+n−1Gt(n)。
状态价值的更新就表示为:
V
(
S
t
)
≐
V
(
S
t
)
+
α
ρ
t
:
t
+
n
−
1
[
G
t
(
n
)
−
V
(
S
t
)
]
V(S_t) \doteq V(S_t) + \alpha \rho_{t:t+n-1}[G_t^{(n)} - V(S_t)]
V(St)≐V(St)+αρt:t+n−1[Gt(n)−V(St)]
其中的重要性采样率是采样出的轨迹在两个策略下出现的概率比值。即:
ρ
t
:
h
≐
∏
k
=
t
m
i
n
(
h
,
T
−
1
)
π
(
A
k
∣
S
k
)
b
(
A
k
∣
S
k
)
\rho_{t: h} \doteq \prod_{k = t}^{min(h, T-1)} \frac{\pi(A_k | S_k)}{b(A_k | S_k)}
ρt:h≐k=t∏min(h,T−1)b(Ak∣Sk)π(Ak∣Sk)
动作价值的更新也很简单:
Q
(
S
t
,
A
t
)
≐
Q
(
S
t
,
A
t
)
+
α
ρ
t
+
1
:
t
+
n
[
G
t
(
n
)
−
Q
(
S
t
,
A
t
)
]
Q(S_t, A_t) \doteq Q(S_t, A_t) + \alpha \rho_{t+1:t+n}[G_t^{(n)} - Q(S_t, A_t)]
Q(St,At)≐Q(St,At)+αρt+1:t+n[Gt(n)−Q(St,At)]
对应的伪代码如下:
4. n步树备份算法——不需要重要性采样的off-policy学习方法
这一部分我还没有很好的理解。理解之后再来更新。我觉得我还需要思考以下两个问题:
- 关于Q-learning为什么没有重要性采样需要思考。
- 重要性采样和不用重要性采样的方法有什么区别。
5. 总结
这一章主要是在TD(0)方法上做了扩展,让agent走n步之后再更新价值。其中需要掌握的就是:
- n步时序差分算法是怎样计算状态价值和动作价值的
- on-policy的sarsa方法如何扩展到n步的情况
- off-policy的重要性采样方法如何扩展到n步的情况
- off-policy的Q-learning方法如何扩展到n步的情况。
注意:书上的动作价值和状态价值都加上了时间步的概念,我认为不写时间步的话,就相当于in-place方式的更新,两种方法都可以。
对于文中提到的内容如有疑问,或者有不同的见解,请联系我,感谢!