【强化学习的数学原理】第07课-时序差分方法-笔记
学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰
文章目录
- 一、例子
- 二、TD算法介绍
- 三、TD算法收敛性、与MC的比较
- 四、Sarsa
- 五、Expected Sarsa 和 n-step Sarsa
- 六、Q-learning介绍、 on-policy vs off-policy
- 七、Q-learning 伪代码与例子
- 八、TD算法的统一形式和总结
一、例子
例1:
考虑 mean estimation 问题:已知一个随机变量X,求其期望。目前已有的数据是X的一些采样x。这里用RM算法来求解。求解过程见下图,或者回顾上节课内容。
例2:
该问题比上面那个问题复杂一些,求解的不再是随机变量
X
X
X 的均值,而是函数
v
(
X
)
v(X)
v(X) 的均值。但求解思路还是差不多。实际上能测量到的是
v
(
x
)
v(x)
v(x),这是对
v
(
X
)
v(X)
v(X) 的采样。
例3:
该问题比上面那个问题再复杂一些,目标函数中有2个随机变量,且包含了一个函数
v
v
v。先在在求期望的时候,既需要X的采样x,也需要R的采样r。这个表达式已经和时序差分算法非常相似了。
二、TD算法介绍
下图呈现了TD算法。
TD算法在求解一个给定策略
π
\pi
π 的 state value,它是一种不基于模型、基于数据的方法。
TD算法就是要基于给定策略
π
\pi
π 下,在生成的数据
(
s
0
,
r
1
,
s
1
,
.
.
.
,
s
t
,
r
t
+
1
,
s
t
+
1
,
.
.
.
)
(s_0,r_1,s_1,...,s_t,r_{t+1},s_{t+1},...)
(s0,r1,s1,...,st,rt+1,st+1,...)的基础上计算state value。
v
t
(
s
)
v_t(s)
vt(s) 表示状态 s 在 t 时刻的 state value 估计值。
s
t
s_t
st 表示在 t 时刻所访问到的状态。
下图中的(1)式将会在后面介绍。
下图中的(2)式表示,在t时刻访问了状态
s
t
s_t
st,其他状态没有被访问到,那么这些没有被访问到的状态,其 v 值是不变的。
继续分析上图中TD算法中的(1)式,即:下图中的(3)式。new estimate = old estimate + 修正项。修正项中的
α
t
\alpha_t
αt 是系数,TD target
v
‾
t
=
r
t
+
1
+
γ
v
(
s
t
+
1
)
\overline{v}_t = r_{t+1} + \gamma v(s_{t+1})
vt=rt+1+γv(st+1),设置 TD target 实际上是希望
v
t
(
s
t
)
v_t(s_t)
vt(st) 可以朝着这个方向去靠近。 TD error 表示当前的 value
v
t
(
s
t
)
v_t(s_t)
vt(st) 和 target
v
‾
t
=
r
t
+
1
+
γ
v
(
s
t
+
1
)
\overline{v}_t = r_{t+1} + \gamma v(s_{t+1})
vt=rt+1+γv(st+1) 之间的误差。
下面来详细介绍一下 TD target 和 TD error。
(1)为什么
v
‾
t
\overline{v}_t
vt 被称作 TD target?
因为要把
v
(
s
t
)
v(s_t)
v(st) 朝着
v
‾
t
\overline{v}_t
vt 这个方向去改进。
那么改进后的
v
t
+
1
(
s
t
)
v_{t+1}(s_t)
vt+1(st) 一定比
v
t
(
s
t
)
v_t(s_t)
vt(st) 更接近
v
‾
t
\overline{v}_t
vt 吗?
看下图的推导过程,把式子推导成如下图1式所示的结果。因为
1
−
α
t
(
s
t
)
1-\alpha_t(s_t)
1−αt(st)的值在(0,1)之间,所以可以得到如下图2式所示的结果。所以说,
v
t
+
1
(
s
t
)
v_{t+1}(s_t)
vt+1(st)肯定是更接近
v
‾
t
\overline{v}_t
vt的。
(2)如何理解TD error:
δ
t
=
v
t
(
s
t
)
−
[
r
t
+
1
+
γ
v
t
(
s
t
+
1
)
]
\delta_t= v_t(s_t)-[r_{t+1}+\gamma v_t(s_{t+1})]
δt=vt(st)−[rt+1+γvt(st+1)]
TD error包含两个量:
v
t
(
s
t
)
v_t(s_t)
vt(st)和
[
r
t
+
1
+
γ
v
t
(
s
t
+
1
)
]
[r_{t+1}+\gamma v_t(s_{t+1})]
[rt+1+γvt(st+1)]。并且这两个量是在两个时刻上:t时刻和t+1时刻(所以该方法被称为temproal difference learning)。
实际上,TD error不仅描述了这两个量之间的误差,更描述了
v
π
v_\pi
vπ和
v
t
v_t
vt之间的误差。
v
π
v_\pi
vπ是我们要估计的值,
v
t
v_t
vt是我们当前估计的值。
又定义了一个
δ
π
,
t
\delta_{\pi,t}
δπ,t(如下图所示)。对
δ
π
,
t
\delta_{\pi,t}
δπ,t求期望(如下图所示)。
所以,当
v
π
v_\pi
vπ等于
v
t
v_t
vt的时候,
δ
t
\delta_t
δt应该等于0;若
δ
t
\delta_t
δt不等于0,则说明
v
π
v_\pi
vπ不等于
v
t
v_t
vt。
δ
t
\delta_t
δt可以描述
v
t
(
s
t
)
v_t(s_t)
vt(st)和
[
r
t
+
1
+
γ
v
t
(
s
t
+
1
)
]
[r_{t+1}+\gamma v_t(s_{t+1})]
[rt+1+γvt(st+1)]之间的不一致性。
TD的其他性质:TD算法只是在给定策略的情况下,用来估算state value的。不能估计action value,也不能用来搜索最优策略。不过,下面介绍的一些基于TD的方法能够估计action value,并且和policy improvement的这一步骤相结合。
三、TD算法收敛性、与MC的比较
在数学上,TD算法实际上在求解一个给定策略 π \pi π的贝尔曼公式。与前面提到的贝尔曼公式求解方法(闭式解、迭代的方法)的不同点在于,TD算法是在没有模型的情况下来求解贝尔曼公式。
1.贝尔曼公式的一种新的表达形式
下图公式4给出了state value的定义(immediate reward +
γ
\gamma
γ*return的期望),其中G表示return。
E
[
G
∣
S
=
s
]
E[G|S=s]
E[G∣S=s]也可以写成
E
[
v
π
(
S
′
)
∣
S
=
s
]
E[v_{\pi}(S')|S=s]
E[vπ(S′)∣S=s],也就是说return可以写成下一个状态S’的
v
π
(
S
)
v_{\pi}(S)
vπ(S)。因此,公式4就可以推导成公式5的样子。公式5是贝尔曼公式的另一种表达形式。
2. 用RM算法求解公式5中的贝尔曼公式
首先定义下式
g
(
v
(
s
)
)
g(v(s))
g(v(s)),令
g
(
v
(
s
)
)
=
0
g(v(s))=0
g(v(s))=0,就是要求解
v
(
s
)
−
E
[
R
+
γ
v
π
(
S
′
)
∣
s
]
=
0
v(s)-E[R+\gamma v_{\pi}(S')|s]=0
v(s)−E[R+γvπ(S′)∣s]=0,即求
v
(
s
)
=
E
[
R
+
γ
v
π
(
S
′
)
∣
s
]
v(s)=E[R+\gamma v_{\pi}(S')|s]
v(s)=E[R+γvπ(S′)∣s]。实际上这个式子的解就是上图中的
v
π
(
s
)
v_{\pi}(s)
vπ(s)。
通过一系列的采样来求解这个式子。对
R
R
R的采样为
r
r
r,对
S
′
S'
S′的采样为
s
′
s'
s′。把要求解的式子转换为下图中“
g
(
v
(
s
)
)
g(v(s))
g(v(s))+误差”的形式。
把刚刚推导出的式子代入到TM算法中,得到下图中的公式6。可以观察出,这个形式其实和TD算法很像了。但存在两个不同点:(1)在公式6中需要反复地得到r和s’的采样,需要不断地从s出发,得到r,跳到s’,(2)在公式6中,要知道
v
π
(
s
k
′
)
v_{\pi}(s^{'}_k)
vπ(sk′)的值才能计算,但这个值是不知道的
这两个问题的解决方法如下:
(1)不再反复对r和s’进行采样,即不断地从s出发,得到r,跳到s’,再从s出发,得到r,跳到s’…而是在得到一个trajectory的基础上,如果这个trajectory恰巧访问到了s,就去更新一下s。如果没有访问到s,那么这个s的估计值就保持不动。
(2)不用
v
π
(
s
k
′
)
v_{\pi}(s^{'}_k)
vπ(sk′)的值计算,而是用它的一个估计值
v
k
(
s
k
′
)
v_{k}(s^{'}_k)
vk(sk′)来替代。
TD算法收敛性的严格证明详见赵老师的书。
TD算法与MC算法的比较
两个方法的优势和劣势如下图所示。
TD算法是online(在线)的,即,如果现在得到一个reward,跳到下一个状态,就可以立刻用这些信息来更新当前的一些值。但是MC是offline(离线)的,也就是说,需要等到一个episode都被采集完之后,才能计算从当前s到最后的return是多少, 然后用这个return来作为一个估计值。
所以TD算法适合处理continuing task(task不会停止,会一直持续下去/或者task是一个非常长的任务),MC算法只能处理episodic task,即必须等task停止之后,才能使用MC算法。
TD是bootstrapping的,就是说一开始对某一状态的state value已经有了一个初始的猜测,基于这个初始的猜测,再加上一些新的信息,可以得到一个新的猜测。而MC不是bootstrapping的,是直接根据当前的episode来计算出return。
TD估计的variance/方差比较小,因为在算法中涉及到的随机变量比较少。但MC的varience比较大,因为涉及到很多随机变量。
但是TD的mean/expectation是有bias的,因为TD是bootstrapping,它依赖于初始的估计,如果出事估计不太准确的话,会造成bias。
四、Sarsa
TD算法是根据给定策略估计state value的,而Sarsa算法是根据给定策略估计action value的。Sarsa计算action value的过程实际上就是一个policy evaluation的过程,随后再结合policy improvement找到最优策略。
1.根据给定策略估计action value
Sarsa算法的具体计算方式如下图所示。其中,
q
t
(
s
,
a
)
q_t(s,a)
qt(s,a)是
q
π
(
s
,
a
)
q_{\pi}(s,a)
qπ(s,a)在t时刻的估计值。这个计算和经典的TD算法几乎是一致的,只是把
v
t
(
s
t
)
v_{t}(s_{t})
vt(st)替换成
q
t
(
s
t
,
a
t
)
q_t(s_{t},a_{t})
qt(st,at)了。下图中红色的第二个式子是指,如果当前时刻是
s
t
s_t
st和
a
t
a_t
at,就去更新它的q,对于其他的状态s和动作a则不更新。
为什么这个算法被称作Sarsa? 其实就是state-action-reward-state-action的缩写
Sarsa和TD算法的区别是什么? Sarsa是action value版的TD算法。
Sarsa在数学上做了什么? 实际上也是求解了如下图所示的一个贝尔曼公式,不过这个贝尔曼公式刻画了action value之间的关系。
2.为了计算出最优策略,需要把Sarsa和policy improvement相结合
结合后的算法伪代码如下图所示。根据当前的状态
s
t
s_t
st,根据当前策略选择动作
a
t
a_t
at,得到奖励
r
t
+
1
r_{t+1}
rt+1,跳转到状态
s
t
+
1
s_{t+1}
st+1,再根据当前策略选择动作
a
t
+
1
a_{t+1}
at+1。这就得到了Sarsa所需的experience。然后在这个experience的基础上计算action value(update q-value),也就是policy evaluation。然后做policy update,这个update的方法是基于
ϵ
−
g
r
e
e
d
y
\epsilon -greedy
ϵ−greedy的策略。
注意:
(1)在计算出状态
s
t
s_t
st对应的
q
(
s
t
,
a
t
)
q(s_t,a_t)
q(st,at)后,就立马更新状态
s
t
s_t
st的策略。
(2)基于
ϵ
−
g
r
e
e
d
y
\epsilon -greedy
ϵ−greedy的策略是为了在exploitation和exploration之间达到一个平衡。
五、Expected Sarsa 和 n-step Sarsa
1. Expected Sarsa
下图是Expected Sarsa的计算方法。它和Sarsa的区别在于公式的最后一部分
E
[
q
t
(
s
t
+
1
,
A
)
]
E[q_t(s_{t+1},A)]
E[qt(st+1,A)],这是对a求了一个expectation。,如下图表达式所示,那这个值就是对应着在
s
t
+
1
s_{t+1}
st+1的一个state value
v
t
(
s
t
+
1
)
v_t(s_{t+1})
vt(st+1),而不再是action value。
相比于Sarsa 而言,Expected Sarsa的计算量更大,因为要算期望了,但是也减少了变量个数,不再需要
a
t
+
1
a_{t+1}
at+1,所以其随机性也会减少。
Expected Sarsa在解决什么样的数学问题呢?
它也是在求解一个贝尔曼公式,如下图所示。
2. n-step Sarsa
n-step Sarsa 包含了Sarsa 和 Monte Carlo两个方法。
先复习一下
q
π
(
s
,
a
)
q_{\pi}(s,a)
qπ(s,a),它等于从状态s出发,选择状态a,所得到return的期望。这个return
G
t
G_t
Gt实际上有很多写法,可以按照下图的方式无限展开。当n=1时,这个方法就是Sarsa,当n=无穷大时,这个方法就是MC,当n=n时,这个方法就是n-step Sarsa。
如下图所示,当n=1的时候,把
G
t
(
1
)
G^{(1)}_t
Gt(1)代入到
q
π
(
s
,
a
)
q_{\pi}(s,a)
qπ(s,a)中,就会发现这个式子其实就是sarsa所求解的贝尔曼公式。当n=无穷的时候,代入可得,这就是MC所求解的式子。
n-step Sarsa的计算方法如下图所示。和 Sarsa 以及 Expected Sarsa 的不同之处就在公式最后TD target那个地方。
n-step Sarsa需要的数据如下:
这些数据比较多,因此所面临的问题就是,在t时刻是不知道t+n时刻的一些值的,因此需要等待。TD是online的,MC是offline的,而n-step Sarsa既不是online又不是offline的。
n-step Sarsa的性质也是MC和TD的混合。当n比较大的时候,n-step Sarsa的性质接近于MC,当n比较小的时候,n-step Sarsa的性质接近于TD。
n-step Sarsa也是在做policy evaluation,需要将其和policy improvement相结合来搜索最优策略。
六、Q-learning介绍、 on-policy vs off-policy
Q-learning是RL算法中使用最广泛的方法。之前讲到的Sarsa是在给定策略的基础上,计算action value,随后结合policy improvement的思路,寻找最优策略。但Q-learning可以直接估计optimal action value,并找到optimal policy(因此就不需要结合policy improvement了)。
下图直接给出了Q-learning的算法,这个算法的形式和Sarsa几乎一样,不同的地方在TD target那个部分:
r
t
+
1
+
γ
m
a
x
a
∈
A
q
t
(
s
t
+
1
,
a
)
r_{t+1}+\gamma \mathop{max}\limits_{a∈\Alpha} q_t(s_{t+1},a)
rt+1+γa∈Amaxqt(st+1,a)。
Q-learning在数学上解决什么问题呢? Sarsa是在求解一个贝尔曼方程,而Q-learning是在求解一个贝尔曼最优方程。
on-policy learning 和 off-policy learning
强化学习中,存在两个策略,一个是behavior策略,该策略是和环境交互,生成experience;另一个是target策略,该策略是不断更新,向最优策略发展。
如果behavior策略和target策略是相同的,那么这种学习就被称作on-policy。也就是说,用这个策略和环境进行交互,然后改进策略,得到新的策略,再用新的策略和环境进行交互,如此循环往复。(智能体边探索边改进策略)
如果是不同的,那这种学习就被称作off-policy。比如说,用策略和环境交互,得到很多experience samples,然后用这个经验不断改进策略,最终这个策略收敛到一个最优的策略。(智能体可以在使用一种策略探索的同时优化另一种策略)
PS: 其实这里老师的解释我没太懂,不过可以结合下一节“Q-learning 伪代码与例子”中的内容去理解off policy和on policy。
off-policy的好处是,可以直接拿来别人的经验进行学习,
如何判断一个强化学习算法是on-policy还是off-policy? (如下图所示)
下面是三个例子。
Sarsa是on policy。
如果
(
s
t
,
a
t
)
(s_t,a_t)
(st,at)都给定了,那么
r
t
+
1
r_{t+1}
rt+1和
s
t
+
1
s_{t+1}
st+1都是不依赖于任何策略的,
r
t
+
1
r_{t+1}
rt+1由
p
(
r
t
+
1
∣
s
t
,
a
t
)
p(r_{t+1}|s_t,a_t)
p(rt+1∣st,at)决定,
s
t
+
1
s_{t+1}
st+1由
p
(
s
t
+
1
∣
s
t
,
a
t
)
p(s_{t+1}|s_t,a_t)
p(st+1∣st,at)决定。但
a
t
+
1
a_{t+1}
at+1依赖于策略
π
t
(
s
t
+
1
)
\pi_t(s_{t+1})
πt(st+1),
a
t
+
1
a_{t+1}
at+1是在t+1状态下,根据策略
π
t
(
s
t
+
1
)
\pi_t(s_{t+1})
πt(st+1)采样得到action
a
t
+
1
a_{t+1}
at+1。这就是Sarsa的behaviour policy,因为需要用到它进行采样。target policy是在估计
π
t
(
s
t
+
1
)
\pi_t(s_{t+1})
πt(st+1)所对应的action value,再用action value进行policy improvement从而得到更好的策略。(如下图所画的三角形所示)所以,
π
t
\pi_t
πt既是一个behaviour policy又是一个target policy。是一个on-policy的策略。
MC的分析方法和上面差不多。在此不多赘述。
Q-learning是off-policy。
如果
(
s
t
,
a
t
)
(s_t,a_t)
(st,at)都给定了,那么
r
t
+
1
r_{t+1}
rt+1和
s
t
+
1
s_{t+1}
st+1都是不依赖于任何策略的,
r
t
+
1
r_{t+1}
rt+1由
p
(
r
t
+
1
∣
s
t
,
a
t
)
p(r_{t+1}|s_t,a_t)
p(rt+1∣st,at)决定,
s
t
+
1
s_{t+1}
st+1由
p
(
s
t
+
1
∣
s
t
,
a
t
)
p(s_{t+1}|s_t,a_t)
p(st+1∣st,at)决定。Q-learning中的behavior policy是从
s
t
s_{t}
st出发,根据策略得到
a
t
a_{t}
at。target policy是看哪个
q
(
s
,
a
)
q(s,a)
q(s,a)比较大,就选哪个a。所以,behaviour policy和target policy是不同的。
七、Q-learning 伪代码与例子
Q-learning的伪代码(on-policy version):
on-policy的伪代码和Sarsa很像,主要的区别就是在Update q-value中的TD target那一部分。
在on-policy version中,首先基于策略生成数据experience,然后通过这些数据去计算q-value,通过计算好的q-value更新策略,再基于更新后的策略生成数据…所以,这个策略既是用来生成数据的(是behaviour policy),又不断得被更新(是target policy),所以这版伪代码是on-policy version。
Q-learning的伪代码(off-policy version):
首先假设一个策略是
π
b
\pi_b
πb,用这个策略来生成一系列的数据experience:{
s
0
,
a
0
,
r
1
,
s
1
,
a
1
,
r
2
,
.
.
.
s_0, a_0, r_1, s_1, a_1, r_2,...
s0,a0,r1,s1,a1,r2,...},然后根据这些已有的experience来寻找最优的策略。下面针对t的每一个时刻做update q-value和update target policy。在这里,update q-value的过程和on-policy中的一样。update target policy的过程和on-policy中的有所差别,on-policy中用的是
ϵ
−
g
r
e
e
d
y
\epsilon -greedy
ϵ−greedy算法,而off-policy中用的是
g
r
e
e
d
y
greedy
greedy算法。使用
ϵ
−
g
r
e
e
d
y
\epsilon -greedy
ϵ−greedy算法的目的是为了让后续采样的结果更具探索性,而off-policy中是不用更新后的策略
π
T
\pi_T
πT采样的,而是用
π
b
\pi_b
πb采样,因此无需策略
π
T
\pi_T
πT具有探索性,就不需要用
ϵ
−
g
r
e
e
d
y
\epsilon -greedy
ϵ−greedy算法了。渐渐地,随着q的估计越来越准确,
π
\pi
π也会逐渐收敛到最优的策略。这里有两个策略
π
T
\pi_T
πT和
π
b
\pi_b
πb,所以这是off policy的情况。
例子:网格世界,找到每一个状态所对应的最优策略。
首先是用behaviour policy来生成一些数据experience,一共有5个action,每个action给1/5=0.2的概率,因此这个behaviour的探索性是比较强的。下图的episode进行了100万步。然后用off-policy Q-learning来对数据进行计算。算出来的结果如下图所示。这个结果和ground truth几乎是一模一样的。
假设behaviour policy的探索性没有那么强(如下图所示,有些状态没有被探索到),那么最后计算的结果离最优策略的差距还是挺大的。
八、TD算法的统一形式和总结
所有的TD算法都可以用下图中的统一形式表示。不同的TD算法,它们的不同点就在
q
‾
t
\overline{q}_t
qt上。
并且这些TD算法所做的事情就是在求解贝尔曼公式/贝尔曼最优公式。