Introduction
在之前的视频中,已经讲解了解决已知的MDP:通过动态规划来评估一个给定的策略,并且得到最优价值函数,根据最优价值函数来确定最优策略;也可以直接进行不基于任何策略的状态价值迭代得到最优价值函数和最优策略。
这节课介绍的是免模型的预测问题,我们不知道MDP的具体细节,直接通过agnet与环境的交互来获得一个估计的最优价值函数。下一讲将利用本讲的主要观念来进行控制进而找出最优策略,最大化Agent的奖励。
Monte-Carlo Learning
在不清楚MDP状态转移及即时奖励的情况下,直接从经历完整的Episode来学习状态价值,通常情况下某状态的价值等于在多个Episode中以该状态算得到的所有收获的平均。
注:收获不是针对Episode的,它存在于Episode内,针对于Episode中某一个状态。从这个状态开始经历完Episode时得到的有衰减的即时奖励的总和。从一个Episode中,我们可以得到该Episode内所有状态的收获。当一个状态在Episode内出现多次,该状态的收获有不同的计算方法,下文会讲到。
完整的Episode 指必须从某一个状态开始,Agent与Environment交互直到终止状态,环境给出终止状态的即时收获为止。所有的Episode必须是有限的,即在有限的步数下,agent终止。
蒙特卡洛强化学习有如下特点:不基于模型本身,直接从经历过的Episode中学习,必须是完整的Episode,使用的思想就是用平均收获值代替价值。理论上Episode越多,结果越准确。
Monte-Carlo Policy Evaluation
- 目标:学习在policy
π
\pi
π 下的
v
π
v_\pi
vπ
S 1 , A 1 , R 2 , … , S k ∼ π S_1,A_1,R_2,\dots,S_k \sim \pi S1,A1,R2,…,Sk∼π -
t
t
t 时刻状态
S
t
S_t
St的收获:
G t = R t + 1 + γ R t + 2 + ⋯ + γ T − 1 R T G_t = R_{t+1}+ \gamma R_{t+2} +\dots + \gamma ^{T-1}R_T Gt=Rt+1+γRt+2+⋯+γT−1RT
T为终止时刻。 - 该策略下某一状态s的 value:
v π ( s ) = E π [ G t ∣ S T = s ] v_\pi (s) = \mathbb{E}_\pi [G_t | S_T = s] vπ(s)=Eπ[Gt∣ST=s]
Monte-Carlo Policy Evaluation 用的是经验平均收获(empirical mean return),而不是期望收获(expected return)。通过反复采样获得状态s的平均return。
注: R t + 1 R_{t+1} Rt+1 表示的是 t t t 时刻个体在状态 S t S_t St 获得的即时奖励,下文都使用这种下标来表示即时奖励。更准确的表述为:个体在状态 S t S_t St 执行一个行为 a a a后离开该状态获得的即时奖励。
首次访问蒙特卡洛策略评估
在给定一个策略,使用一系列完整Episode评估某一个状态s时,对于每一个Episode,仅当该状态第一次出现时列入计算:
状态出现的次数加1:
N
(
s
)
←
N
(
s
)
+
1
N(s) \leftarrow N(s)+1
N(s)←N(s)+1
总的收获值更新: S ( s ) ← S ( s ) + G t S(s) \leftarrow S(s)+G_t S(s)←S(s)+Gt
状态s的价值: V ( s ) ← S ( s ) / N ( s ) V(s) \leftarrow S(s)/N(s) V(s)←S(s)/N(s)
根据大数定律,当 N ( s ) → ∞ N(s) \rightarrow \infin N(s)→∞ 时, V ( s ) → v π ( s ) V(s) \rightarrow v_\pi(s) V(s)→vπ(s)
每次访问蒙特卡洛策略评估
在给定一个策略,使用一系列完整Episode评估某一个状态s时,对于每一个Episode,状态s每次出现在状态转移链时,计算的具体公式与上面的一样,但具体意义不一样。
状态出现的次数加1:
N
(
s
)
←
N
(
s
)
+
1
N(s) \leftarrow N(s)+1
N(s)←N(s)+1
总的收获值更新: S ( s ) ← S ( s ) + G t S(s) \leftarrow S(s)+G_t S(s)←S(s)+Gt
状态s的价值: V ( s ) ← S ( s ) / N ( s ) V(s) \leftarrow S(s)/N(s) V(s)←S(s)/N(s)
根据大数定律,当 N ( s ) → ∞ N(s) \rightarrow \infin N(s)→∞ 时, V ( s ) → v π ( s ) V(s) \rightarrow v_\pi(s) V(s)→vπ(s)
示例:二十一点游戏 Blackjack Example
- 状态空间:(多达200种,根据对状态的定义可以有不同的状态空间,这里采用的定义是牌的分数,不包括牌型)
1、当前牌的分数(12 - 21),低于12时,你可以安全的再叫牌,所以没意义。
2、庄家出示的牌(A - 10),庄家会显示一张牌面给玩家
3、我有“useable” ace吗?(是或否)A既可以当1点也可以当11点。 - 行为空间:
1、停止要牌 stick
2、继续要牌 twist - 奖励(停止要牌):
+1:如果你的牌分数大于庄家分数
0: 如果两者分数相同
-1:如果你的牌分数小于庄家分数 - 奖励(继续要牌):
-1:如果牌的分数>21,并且进入终止状态
0:其它情况 - 状态转换(Transitions):如果牌分小于12时,自动要牌
- 当前策略:牌分只要小于20就继续要牌。
- 求解问题:评估该策略的好坏。
- 最终结果:无论玩家手中是否有A牌,该策略在绝大多数情况下各状态价值都较低,只有在玩家拿到21分时状态价值有一个明显的提升。
累进更新平均值 Incremental Mean
这个公式比较简单。把这个方法应用于蒙特卡洛策略评估,就得到下面的蒙特卡洛累进更新。
蒙特卡洛累进更新
对于一系列Episodes中的每一个:
S
1
,
A
1
,
R
2
,
…
,
S
t
S_1,A_1,R_2,\dots,S_t
S1,A1,R2,…,St
对于Episode中的每一个状态
S
t
S_t
St,有一个收获
s
G
t
sG_t
sGt,对于每个
S
t
S_t
St,都用一下公式更新
V
(
S
t
)
V_(S_t)
V(St):
N
(
S
t
)
←
N
(
S
t
)
+
1
N(S_t) \leftarrow N(S_t)+1
N(St)←N(St)+1
V
(
s
t
)
←
V
(
S
t
)
+
1
N
(
S
t
)
(
G
t
−
V
(
S
t
)
)
V(s_t) \leftarrow V(S_t) + \frac{1}{N(S_t)} (G_t - V(S_t))
V(st)←V(St)+N(St)1(Gt−V(St))
在处理非静态问题时,使用这个方法跟踪一个实时更新的平均值是非常有用的,可以扔掉那些已经计算过的Episode信息。此时可以引入参数
α
\alpha
α来更新状态价值:
V
(
s
t
)
←
V
(
S
t
)
+
α
(
G
t
−
V
(
S
t
)
)
V(s_t) \leftarrow V(S_t) + \alpha (G_t - V(S_t))
V(st)←V(St)+α(Gt−V(St))
以上就是蒙特卡洛学习方法的主要思想和描述,由于蒙特卡洛学习方法有许多缺点(后文会细说),因此实际应用并不多。接下来介绍实际常用的TD学习方法。
Temporal-Difference Learning
时序差分学习简称TD学习,它的特点如下:和蒙特卡洛学习一样,它也从Episode学习,不需要了解模型本身;但是它可以学习不完整的Episode,通过自身的引导(bootstrapping),猜测Episode的结果,同时持续更新这个猜测。MC必须从完整的Episode中学习。
在之前的MC中,
G
t
G_t
Gt是实际获取到的值。
而在TD中,算法在估计某一个状态的价值时,用的是离开该状态的即刻奖励
R
t
+
1
R_{t+1}
Rt+1 与下一状态
S
t
+
1
S_{t+1}
St+1 的预估状态价值乘以衰减系数(
γ
\gamma
γ)组成,这符合Bellman方程的描述:
V
(
S
t
)
←
V
S
t
+
α
(
R
t
+
1
+
γ
V
(
S
t
+
1
)
−
V
(
S
t
)
)
V(S_t) \leftarrow V_{S_t} + \alpha (R_{t+1} + \gamma V(S_{t+1}) - V(S_t))
V(St)←VSt+α(Rt+1+γV(St+1)−V(St))
MC基于采样更新v,TD基于即刻奖励。
示例–驾车返回家
想象一下你下班后开车回家,需要预估整个行程花费的时间。假如一个人在驾车回家的路上突然碰到险情:对面迎来一辆车感觉要和你相撞,严重的话他可能面临死亡威胁,但是最后双方都采取了措施没有实际发生碰撞。如果使用蒙特卡洛学习,路上发生的这一险情可能引发的负向奖励不会被考虑进去,不会影响总的预测耗时;但是在TD学习时,碰到这样的险情,这个人会立即更新这个状态的价值,随后会发现这比之前的状态要糟糕,会立即考虑决策降低速度赢得时间,也就是说你不必像蒙特卡洛学习那样直到他死亡后才更新状态价值,那种情况下也无法更新状态价值。
基于上图所示的数据,下图展示了蒙特卡洛学习和TD学习两种不同的学习策略来更新价值函数(各个状态的价值)。这里使用的是从某个状态预估的到家还需耗时来间接反映某状态的价值:某位置预估的到家时间越长,该位置价值越低,在优化决策时需要避免进入该状态。对于蒙特卡洛学习过程,驾驶员在路面上碰到各种情况时,他不会更新对于回家的预估时间,等他回到家得到了真实回家耗时后,他会重新估计在返家的路上着每一个主要节点状态到家的时间,在下一次返家的时候用新估计的时间来帮助决策;而对于TD学习,在一开始离开办公室的时候你可能会预估总耗时30分钟,但是当你取到车发现下雨的时候,你会立刻想到原来的预计过于乐观,因为既往的经验告诉你下雨会延长你的返家总时间,此时你会更新目前的状态价值估计,从原来的30分钟提高到40分钟。同样当你驾车离开高速公路时,会一路根据当前的状态(位置、路况等)对应的预估返家剩余时间,直到返回家门得到实际的返家总耗时。这一过程中,你会根据状态的变化实时更新该状态的价值。
MC只有到家之后才会更新,TD算法相当于在整个返家的过程中(一个Episode),根据已经消耗的时间和预期还需要的时间来不断更新最终回家需要消耗的时间。
MC必须等到一个Episode结束才会更新
V
(
S
t
)
V_(S_t)
V(St),TD可以实时更新。
MC 和TD的对比 一
TD 在知道结果之前可以学习,MC必须等到最后结果才能学习;
TD 可以在没有结果时学习,可以在持续进行的环境里学习。
MC 和TD的对比 二
G
t
G_t
Gt:MC中的是实际收获,是基于某一策略状态价值的无偏估计
G
t
=
R
t
+
1
+
γ
R
t
+
2
+
⋯
+
γ
T
−
1
R
T
G_t = R_{t+1}+ \gamma R_{t+2} +\dots + \gamma ^{T-1}R_T
Gt=Rt+1+γRt+2+⋯+γT−1RT
TD target:TD目标值,是基于下一状态预估价值计算的当前预估收获,是当前状态实际价值的有偏估计。
R
t
+
1
+
γ
V
(
S
t
+
1
)
R_{t+1} + \gamma V(S_{t+1})
Rt+1+γV(St+1)
True TD target: 真实TD目标值,是基于下一状态的实际价值对当前状态实际价值的无偏估计
R
t
+
1
+
γ
V
π
(
S
t
+
1
)
R_{t+1} + \gamma V_\pi(S_{t+1})
Rt+1+γVπ(St+1)
MC 没有偏倚(bias),但有着较高的方差(Variance),且对初始值不敏感;
TD 方差(variance)较低, 但有一定程度的bias,对初始值较敏感,通常比 MC 更高效;
这里的偏倚指的是距离期望的距离,预估的平均值与实际平均值的偏离程度;方差评估单次采样结果相对于与平均值变动的范围大小。基本就是统计学上均值与方差的概念。
示例——随机行走
- 状态空间:如下图:A、B、C、D、E为中间状态,C同时作为起始状态。灰色方格表示终止状态;
- 行为空间:除终止状态外,任一状态可以选择向左、向右两个行为之一;
- 即时奖励:右侧的终止状态得到即时奖励为1,左侧终止状态得到的即时奖励为0,在其他状态间转化得到的即时奖励是0;
- 状态转移:100%按行为进行状态转移,进入终止状态即终止;
- 衰减系数:1;
- 给定的策略:随机选择向左、向右两个行为。
求解:上图是使用TD算法得到的结果。横坐标显示的是状态,纵坐标是各状态的价值估计,一共5条折线,数字表明的是实际经历的Episode数量,true value所指的那根折线反映的是各状态的实际价值。第0次时,各状态的价值被初始化为0.5,经过1次、10次、100次后得到的价值函数越来越接近实际状态价值函数。
下图比较了MC和TD算法的效率。横坐标是经历的Episode数量,纵坐标是计算得到的状态函数和实际状态函数下各状态价值的均方差。黑色是MC算法在不同step-size下的学习曲线,灰色的曲线使用TD算法。可以看出TD较MC更高效。此图还可以看出当step-size不是非常小的情况下,TD有可能得不到最终的实际价值,将会在某一区间震荡。
示例–AB
已知:现有两个状态(A和B),MDP未知,衰减系数为1,有如下表所示8个完整Episode的经验及对应的即时奖励,其中除了第1个Episode有状态转移外,其余7个均只有一个状态。
V(B) = 6/8,V(A)根据不同算法结果不同,用MC算法结果为0,TD则得出6/8。
应用MC算法,由于需要完整的Episode,因此仅Episode1可以用来计算A的状态价值,很明显是0;同时B的价值是6/8。应用TD算法时,TD算法试图利用现有的Episode经验构建一个MDP(如下图),由于存在一个Episode使得状态A有后继状态B,因此状态A的价值是通过状态B的价值来计算的,同时经验表明A到B的转移概率是100%,且A状态的即时奖励是0,并且没有衰减,因此A的状态价值等于B的状态价值。
MC算法试图收敛至一个能够最小化状态价值与实际收获的均方差的解决方案,这一均方差用公式表示为:
∑
k
=
1
K
∑
t
=
1
T
k
(
G
t
k
−
V
(
s
t
k
)
)
\sum_{k=1}^K \sum_{t=1}^{T_k} (G_t^k - V(s_t^k))
k=1∑Kt=1∑Tk(Gtk−V(stk))
式中,
k
k
k 表示的是Episode序号,
K
K
K为总的Episode数量,
t
t
t为一个Episode内状态序号(第1,2,3…个状态等),
T
k
T_k
Tk 表示的是第
k
k
k 个Episode总的状态数,
G
t
k
G_t^k
Gtk 表示第
k
k
k 个Episode里
t
t
t 时刻状态
S
t
S_t
St 获得的最终收获,
V
(
S
t
k
)
V(S_t^k)
V(Stk) 表示的是第
k
k
k 个Episode里算法估计的
t
t
t 时刻状态
S
t
S_t
St 的价值。
TD算法则收敛至一个根据已有经验构建的最大可能的马尔可夫模型的状态价值,也就是说TD算法将首先根据已有经验估计状态间的转移概率:
P
^
s
,
s
′
a
=
1
N
(
s
,
a
)
∑
k
=
1
K
∑
t
=
1
T
k
1
(
s
t
k
,
a
t
k
,
s
t
+
1
k
=
s
,
a
,
s
′
)
\hat{\mathcal{P}}_{s, s^{\prime}}^{a}=\frac{1}{N(s, a)} \sum_{k=1}^{K} \sum_{t=1}^{T_{k}} \mathbf{1}\left(s_{t}^{k}, a_{t}^{k}, s_{t+1}^{k}=s, a, s^{\prime}\right)
P^s,s′a=N(s,a)1k=1∑Kt=1∑Tk1(stk,atk,st+1k=s,a,s′)
同时估计某一个状态的即时奖励:
R
^
s
a
=
1
N
(
s
,
a
)
∑
k
=
1
K
∑
t
=
1
T
k
1
(
s
t
k
,
a
t
k
=
s
,
a
)
r
t
k
\hat{\mathcal{R}}_{s}^{a}=\frac{1}{N(s, a)} \sum_{k=1}^{K} \sum_{t=1}^{T_{k}} \mathbf{1}\left(s_{t}^{k}, a_{t}^{k}=s, a\right) r_{t}^{k}
R^sa=N(s,a)1k=1∑Kt=1∑Tk1(stk,atk=s,a)rtk
最后计算该MDP的状态函数。
MC对比 TD 三
通过比较可以看出,TD算法使用了MDP问题的马儿可夫属性,在Markov 环境下更有效;但是MC算法并不利用马儿可夫属性,通常在非Markov环境下更有效。
小结——三种强化学习算法
Monte-Carlo, Temporal-Difference 和 Dynamic Programming 都是计算状态价值的一种方法,区别在于,前两种是在不知道Model的情况下的常用方法,这其中又以MC方法需要一个完整的Episode来更新状态价值,TD则不需要完整的Episode;DP方法则是基于Model(知道模型的运作方式)的计算状态价值的方法,它通过计算一个状态S所有可能的转移状态S’及其转移概率以及对应的即时奖励来计算这个状态S的价值。
- 关于是否Bootstrap: MC 没有引导数据,只使用实际收获;DP和TD都有引导数据。
- 关于是否用样本来计算: MC和TD都是应用样本来估计实际的价值函数;而DP则是利用模型直接计算得到实际价值函数,没有样本或采样之说。
MC: 采样,一次完整经历,用实际收获更新状态预估价值
TD:采样,经历可不完整,用喜爱状态的预估状态价值预估收获再更新预估价值
DP:没有采样,根据完整模型,依靠预估数据更新状态价值
TD( λ \lambda λ)
先前所介绍的TD算法实际上都是TD(0)算法,括号内的数字0表示的是在当前状态下往前多看1步,要是往前多看2步更新状态价值会怎样?这就引入了n-step的概念。
n-步预测 n-Step Prediction
在当前状态往前行动n步,计算n步的return,同样TD target 也由2部分组成,已走的步数使用确定的即时reward,剩下的使用估计的状态价值替代。
当走一步时就是TD,当走到终止状态是就是MC。
既然存在n-步预测,那么n=?时效果最好呢,下面的例子试图回答这个问题:
示例——大规模随机行走
这个示例研究了使用多个不同步数预测联合不同步长(step-size,公式里的系数α)时,分别在在线和离线状态时状态函数均方差的差别。所有研究使用了10个Episode。离线与在线的区别在于,离线是在经历所有10个Episode后进行状态价值更新;而在线则至多经历一个Episode就更新依次状态价值。
结果如图表明,离线和在线之间曲线的形态差别不明显;从步数上来看,步数越长,越接近MC算法,均方差越大。对于这个大规模随机行走示例,在线计算比较好的步数是3-5步,离线计算比较好的是6-8步。但是不同的问题其对应的比较高效的步数不是一成不变的。因此选择多少步数作为一个较优的计算参数也是一个问题。
我们考虑能否采用平均 n-step return,进而提出了带权重的
T
D
(
λ
)
TD(\lambda)
TD(λ)。
这里我们引入了一个新的参数:λ。通过引入这个新的参数,可以做到在不增加计算复杂度的情况下综合考虑所有步数的预测。这就是λ预测和λ收获。
λ-收获
λ-收获
G
t
λ
G_t^\lambda
Gtλ 综合考虑了从
1
1
1 到
∞
\infin
∞ 的所有步收获,它给其中的任意一个 n-step 收获施加一定的权重
(
1
−
λ
)
λ
n
−
1
(1-\lambda)\lambda^{n-1}
(1−λ)λn−1 。通过这样的权重设计,得到如下的公式:
G
t
λ
=
(
1
−
λ
)
∑
n
=
1
∞
λ
n
−
1
G
t
(
n
)
G_t^\lambda = (1-\lambda)\sum_{n=1}^{\infin} \lambda^{n-1} G_t^{(n)}
Gtλ=(1−λ)n=1∑∞λn−1Gt(n)
对应的λ-预测写成TD(λ):
V ( S t ) ← V ( S t ) + α ( G t λ − V ( S t ) ) V(S_t) \leftarrow V(S_t) + \alpha (G_t^\lambda - V(S_t)) V(St)←V(St)+α(Gtλ−V(St))
- TD(λ)对于权重分配的图解
这里用的是几何加权,因为它适用于可高效计算的算法。此外,几何加权是没有记忆的。
这张图还是比较好理解,例如对于n=3的3-step收获,赋予其在 λ \lambda λ 收获中的权重如左侧阴影部分面积,对于终止状态的T-步收获,T以后的所有阴影部分面积。而所有节段面积之和为1。这种几何级数的设计也考虑了算法实现的计算方便性。
TD((λ)的设计使得Episode中,后一个状态的状态价值与之前所有状态的状态价值有关,同时也可以说成是一个状态价值参与决定了后续所有状态的状态价值。但是每个状态的价值对于后续状态价值的影响权重是不同的。我们可以从两个方向来理解TD(λ): - 前向认识TD(λ)
引入了λ之后,会发现要更新一个状态的状态价值,必须要走完整个Episode获得每一个状态的即时奖励以及最终状态获得的即时奖励。这和MC算法的要求一样,因此TD(λ)算法有着和MC方法一样的劣势。λ取值区间为[0,1],当λ=1时对应的就是MC算法。这个实际计算带来了不便。 - 反向认识TD(λ)
TD(λ)从另一方面提供了一个单步更新的机制,通过下面的示例来说明。
示例——被电击的原因
这是之前见过的一个例子,老鼠在连续接受了3次响铃和1次亮灯信号后遭到了电击,那么在分析遭电击的原因时,到底是响铃的因素较重要还是亮灯的因素更重要呢?
两个概念:
**频率启发 Frequency heuristic:**将原因归因于出现频率最高的状态
**就近启发 Recency heuristic:**将原因归因于较近的几次状态
给每一个状态引入一个数值:效用追踪(Eligibility Traces, ES,也有翻译成“资质追踪”,这是同一个概念从两个不同的角度理解得到的不同翻译),可以结合上述两个启发。定义:
E
0
(
s
)
=
0
E_0(s) = 0
E0(s)=0
E
t
(
s
)
=
γ
λ
E
(
t
−
1
)
(
s
)
+
1
(
S
t
=
s
)
E_t(s) = \gamma \lambda E_{(t-1)}(s) + \mathbf{1} (S_t = s)
Et(s)=γλE(t−1)(s)+1(St=s)
其中
1
(
S
t
=
s
)
\mathbf{1} (S_t = s)
1(St=s) 是一个条件判断表达式。
上图给出了
E
t
(
s
)
E_t(s)
Et(s) 对于
t
t
t 的一个可能的曲线图:
该图横坐标是时间,横坐标下有竖线的位置代表当前进入了状态 s ,纵坐标是效用追踪值
E
E
E。可以看出当某一状态连续出现,
E
E
E值会在一定衰减的基础上有一个单位数值的提高,此时将增加该状态对于最终收获贡献的比重,因而在更新该状态价值的时候可以较多地考虑最终收获的影响。同时如果该状态距离最终状态较远,则其对最终收获的贡献越小,在更新该状态时也不需要太多的考虑最终收获。
特别的,
E
E
E值并不需要等到完整的Episode结束才能计算出来,它可以每经过一个时刻就得到更新。
E
E
E 值存在饱和现象,有一个瞬时最高上限:
E
m
a
x
=
1
/
(
1
−
γ
λ
)
E_max = 1/(1- \gamma \lambda)
Emax=1/(1−γλ)
把刚才的描述体现在公式里更新状态价值,是这样的:
δ
t
=
R
t
+
1
+
γ
V
(
S
t
+
1
)
−
V
(
S
t
)
\delta_t =R_{t+1}+γV(S_{t+1})−V(S_t)
δt=Rt+1+γV(St+1)−V(St)
V
(
s
)
←
V
(
s
)
+
α
δ
t
E
t
(
s
)
V (s ) ← V (s ) + α\delta_t E_t (s )
V(s)←V(s)+αδtEt(s)
注:每一个状态都有一个
E
E
E 值,
E
E
E 值随时间而变化。
当λ=0时,只有当前状态得到更新,等同于TD(0)算法;
当λ=1时,TD(1)粗略看与每次访问的MC算法等同;在线更新时,状态价值差每一步都会有积累;离线更新时,TD(1)等同于MC算法。
下表给出了λ取各种值时,不同算法在不同情况下的关系。
相较于MC算法,TD算法应用更广,是一个非常有用的强化学习方法,在下一讲讲解控制相关的算法时会详细介绍TD算法的实现。