Monte-Carlo RL (MC)蒙特卡洛方法
1、为什么要用 Monte-Carlo
之前提到,第在RL中DP的核心思想是使用价值函数来结构化地组织对最优策略的搜索。但是对于强化学习问题传统的DP作用有限,因为它要求有限MDP给出完备的环境描述(model-based),并且计算复杂度极高!所以直接使用DP是很困难的,而MC则是通过平均样本的回报来估计价值函数并寻找最优策略,并且MC可以不依赖完备的环境。
2、蒙特卡洛预测
蒙特卡洛预测的提出依然是为了解决如何在策略已知的前提下求状态价值函数,和策略评估的作用类似。重温以下状态价值函数的定义:
v
π
(
s
)
=
E
π
[
G
t
∣
S
t
=
s
]
=
E
π
[
R
t
+
1
+
γ
⋅
v
π
(
S
t
+
1
)
∣
S
t
=
s
]
(4.2.1)
\begin{aligned}v_{\pi}(s) &=\mathbb{E}_{\pi}\left[G_{t} | S_{t}=s\right] \\&=\mathbb{E}_{\pi}\left[R_{t+1}+\gamma \cdot v_{\pi}\left(S_{t+1}\right) | S_{t}=s\right]\end{aligned}\tag{4.2.1}
vπ(s)=Eπ[Gt∣St=s]=Eπ[Rt+1+γ⋅vπ(St+1)∣St=s](4.2.1)
DP算法用的就是第二个等号的变形,而MC则是根据第一个等号即原始定义。原始定义告诉我们一个状态的价值等于从这个状态开始的回报的期望,所以应该可以对所有经过这个状态产生的回报求均值,根据大数定律,随着越来越多的回报被观测到,这个均值最终会收敛到期望值!
这里有三点需要注意:
1、每一幕(根据策略)都需要计算,图中红色轨迹只是其中一幕。
2、Returns初始化时一个空的列表,之后就不断往里面添加元素,并不会因为一幕结束了而清零。
3、Returns中的元素是回报的累计和而不是收益的累计和,即 [ R T , γ R T + R T − 1 , γ 2 R T + γ R T − 1 + R T − 2 … ] [R_T,\gamma R_T+R_{T-1}, \gamma^2 R_T+\gamma R_{T-1}+R_{T-2} \dots] [RT,γRT+RT−1,γ2RT+γRT−1+RT−2…] 。
和DP这张图对比:
不难发现,MC与DP是完全不同的两种算法,具体差异如下:
1、DP显示了所有可能的转移,MC仅显示在当前幕中的采样到的那些转移。
2、DP的回溯图仅包含一步转移,MC包含了当前这一幕到结束为止的所有转移概率。
3、MC对一个状态价值的估计完全不依赖对于其他状态的估计(优点之一),没有用到自举法(bootstrap),DP用到了自举法。
3、动作价值函数的蒙特卡洛估计与蒙特卡洛控制
前面说过MC算法可以不依赖环境,但是如果使用状态价值函数: π ′ ( s ) = arg max a ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] \pi^{\prime}(s) =\underset{a}{\arg \max } \sum_{s^{\prime}, r} p\left(s^{\prime}, r | s, a\right)\left[r+\gamma v_{\pi}\left(s^{\prime}\right)\right] π′(s)=aargmax∑s′,rp(s′,r∣s,a)[r+γvπ(s′)] 进行策略改进的话还是依赖环境的动态特性,所以得使用动作价值函数来进行策略更新: π ′ ( s ) = arg max a q π ( s , a ) \pi^{\prime}(s) = \underset{a}{\arg \max } q_{\pi}(s, a) π′(s)=aargmaxqπ(s,a) 。
为了解决好蒙特卡洛控制问题,我们其实得做两个很强的假设:
1、试探性出发假设:为了确保每一个“状态—动作”二元组都能被访问到
2、假设策略评估时有无穷多幕的序列:从理论上确保能精确收敛到 q π q_{\pi} qπ
对假设1再做一些解释:
首先要注意,这张图中红色的轨迹表示的是一幕!
MC算法是逐幕进行的,在向前传播的时候虽然用的是随机策略,却不能保证在一个特定的状态下不同的动作都有概率被选中,更加糟糕的是,因为策略是人为初始化的,如果策略初始化为一个确定的策略,那么每个状态只能观测到一个动作的回报,并且每个回合都是进行一样的操作:
比如上面这种情况,假如我们初始化策略 π ( S 开 始 ) = π ( S 中 间 ) = a \pi(S_{开始}) = \pi(S_{中间})=a π(S开始)=π(S中间)=a ,那么每一幕的样本序列都是唯一的“ S 开 始 , a 去 终 止 , + 1 , S 终 止 S_{开始}, a_{去终止},+1,S_{终止} S开始,a去终止,+1,S终止”,如果还使用贪婪策略,那么策略也永远不会变。而DP算法则不同,DP的一次向前传播包含了所有可能的转移,所以贪婪策略对于DP简直是量身打造。
所以为了解决每一幕向前传播时能够访问到所有的“状态—动作”二元组,我们要采用“柔性策略”,即对 ∀ s ∈ S \forall s \in S ∀s∈S 以及 a ∈ A a \in \mathcal{A} a∈A ,都有 π ( a ∣ s ) > 0 \pi(a|s) > 0 π(a∣s)>0 。
但是为了得到实际可行的MC算法,必须克服上面两个假设。对于假设2,在实际编程的时候,“episode_num”通常都设置的比较大,但是由于硬件、时间等因素不可能无穷大,所以可以参考价值迭代,即每一幕结束后就进行策略评估然后策略改进;对于假设1,策略评估中我们采用了“柔性策略”。对于策略改进我们还可以采用
ϵ
−
g
r
e
e
d
y
p
o
l
i
c
y
\epsilon-greedy \ policy
ϵ−greedy policy :
π
(
a
∣
s
)
=
{
ϵ
/
∣
A
∣
+
1
−
ϵ
if
a
∗
=
argmax
a
∈
A
Q
(
s
,
a
)
ϵ
/
∣
A
∣
otherwise
(4.3.1)
\pi(a | s)=\left\{\begin{array}{ll}\epsilon / |\mathcal{A}|+1-\epsilon & \text { if } a^{*}=\underset{a \in \mathcal{A}}{\operatorname{argmax}} Q(s, a) \\\epsilon / |\mathcal{A}| & \text { otherwise }\end{array}\right.\tag{4.3.1}
π(a∣s)={ϵ/∣A∣+1−ϵϵ/∣A∣ if a∗=a∈AargmaxQ(s,a) otherwise (4.3.1)
它的意思是在进行策略改进的时候将概率分成两个部分,一部分比较小的是
ϵ
\epsilon
ϵ ,把这部分概率平分到每个(包括
a
∗
a^{*}
a∗)动作上,然后把剩下的较大一部分概率分配给
a
∗
a^*
a∗ ,这样就确保了在策略改进的时候也会考虑选择这个状态中的其他动作,但同时仍然采取能够取到最大动作价值函数的动作!针对
ϵ
−
g
r
e
e
d
y
p
o
l
i
c
y
\epsilon-greedy \ policy
ϵ−greedy policy 是“柔性策略”的一个例子。针对上面的例子,如果在策略改进时用了
ϵ
−
g
r
e
e
d
y
p
o
l
i
c
y
\epsilon-greedy \ policy
ϵ−greedy policy ,那么即使还是每次都从
S
开
始
S_{开始}
S开始 出发,在策略改进的时候也是有可能将策略更新成“去中间”的!
这里有个小问题:为什么平分 ϵ \epsilon ϵ 的时候要把 a ∗ a^* a∗ 也包括进去呢?个人猜想可能是这两个原因:首先有一种比较极端的情况是动作集很小,比如说就只有两个动作,如果 ϵ = 0.2 \epsilon=0.2 ϵ=0.2 且不给最优动作分配,则最优动作的概率为0.8,另一个动作的概率是0.2,但是如果分配的话,最优动作的概率就是0.9,另一个动作的概率是0.1,所以某种程度上看这么做可以提高最优动作被选到的可能性,更加体现它的“优越性”。第二个原因可能是因为在进行策略更新的时候要首先保证每个动作都有发生的概率,然后再决定那个是最优动作,即谁的概率应该最大。
它能起到策略改进作用的证明如下:(此时每个策略都是
ϵ
−
g
r
e
e
d
y
p
o
l
i
c
y
\epsilon-greedy \ policy
ϵ−greedy policy )
q
π
(
s
,
π
′
(
s
)
)
=
∑
a
∈
A
π
′
(
a
∣
s
)
q
π
(
s
,
a
)
=
ϵ
/
m
∑
a
∈
A
q
π
(
s
,
a
)
+
(
1
−
ϵ
)
max
a
∈
A
q
π
(
s
,
a
)
≥
ϵ
/
m
∑
a
∈
A
q
π
(
s
,
a
)
+
(
1
−
ϵ
)
∑
a
∈
A
π
(
a
∣
s
)
−
ϵ
/
m
1
−
ϵ
q
π
(
s
,
a
)
=
∑
a
∈
A
π
(
a
∣
s
)
q
π
(
s
,
a
)
=
v
π
(
s
)
(4.3.2)
\begin{aligned}q_{\pi}\left(s, \pi^{\prime}(s)\right) &=\sum_{a \in \mathcal{A}} \pi^{\prime}(a | s) q_{\pi}(s, a) \\&=\epsilon / m \sum_{a \in \mathcal{A}} q_{\pi}(s, a)+(1-\epsilon) \max _{a \in \mathcal{A}} q_{\pi}(s, a) \\& \geq \epsilon / m \sum_{a \in \mathcal{A}} q_{\pi}(s, a)+(1-\epsilon) \sum_{a \in \mathcal{A}} \frac{\pi(a | s)-\epsilon / m}{1-\epsilon} q_{\pi}(s, a) \\&=\sum_{a \in \mathcal{A}} \pi(a | s) q_{\pi}(s, a)=v_{\pi}(s)\end{aligned}\tag{4.3.2}
qπ(s,π′(s))=a∈A∑π′(a∣s)qπ(s,a)=ϵ/ma∈A∑qπ(s,a)+(1−ϵ)a∈Amaxqπ(s,a)≥ϵ/ma∈A∑qπ(s,a)+(1−ϵ)a∈A∑1−ϵπ(a∣s)−ϵ/mqπ(s,a)=a∈A∑π(a∣s)qπ(s,a)=vπ(s)(4.3.2)
这里需要注意:和之前DP的贪婪策略
π
′
(
s
)
=
arg
max
a
q
π
(
s
,
a
)
\pi^{\prime}(s) = \underset{a}{\arg \max } q_{\pi}(s, a)
π′(s)=aargmaxqπ(s,a) 不同,DP 的策略
π
\pi
π 和
π
′
\pi^{\prime}
π′ 都是确定的策略,等价于
a
,
a
′
a,a^{\prime}
a,a′ 。但是上述的MC控制中,
q
π
(
s
,
π
′
(
s
)
)
q_{\pi}\left(s, \pi^{\prime}(s)\right)
qπ(s,π′(s)) 的下标
π
\pi
π 是“软性策略”,
π
′
\pi^{\prime}
π′ 是
ϵ
−
g
r
e
e
d
y
p
o
l
i
c
y
\epsilon-greedy \ policy
ϵ−greedy policy 策略。但无论是DP还是MC,策略都是在选择动作!
在DP中:
π
′
(
s
)
=
argmax
a
∈
A
q
π
(
s
,
a
)
q
π
(
s
,
π
′
(
s
)
)
=
max
a
∈
A
q
π
(
s
,
a
)
≥
q
π
(
s
,
π
(
s
)
)
=
v
π
(
s
)
(4.3.3)
\begin{aligned}\pi^{\prime}(s)=\underset{a \in \mathcal{A}}{\operatorname{argmax}} q_{\pi}(s, a)\end{aligned}\\\begin{aligned}q_{\pi}\left(s, \pi^{\prime}(s)\right)=\max _{a \in \mathcal{A}} q_{\pi}(s, a) \geq q_{\pi}(s, \pi(s))=v_{\pi}(s)\end{aligned}\tag{4.3.3}
π′(s)=a∈Aargmaxqπ(s,a)qπ(s,π′(s))=a∈Amaxqπ(s,a)≥qπ(s,π(s))=vπ(s)(4.3.3)
因为贪婪策略是选择使动作价值函数最大的动作,所以
q
π
(
s
,
π
′
(
s
)
)
q_{\pi}\left(s, \pi^{\prime}(s)\right)
qπ(s,π′(s)) 就直接等于最大的动作价值函数,又因为DP采用的是确定的策略,所以有
q
π
(
s
,
π
(
s
)
)
=
v
π
(
s
)
q_{\pi}(s, \pi(s))=v_{\pi}(s)
qπ(s,π(s))=vπ(s) (公式2.4.15有相关说明)
但是在MC中,我们只是以较大的概率选择使动作价值函数最大的动作,所以不能直接得到最大动作价值函数,而是要对各个动作价值函数以选中它们的概率为权,进行加权平均。这也就是公式(4.3.2)中第一个等号的含义。
同轨策略首次访问MC控制的具体流程如下:
可以看到我们是初始化了一个“柔性策略”(这里还不是
ϵ
−
g
r
e
e
d
y
p
o
l
i
c
y
\epsilon-greedy \ policy
ϵ−greedy policy),随机初始化了动作价值函数,生成空的回报列表。对每一幕根据柔性策略生成一个样本序列,然后预测动作价值函数,每预测完一次就更新一下最优动作然后根据
ϵ
−
g
r
e
e
d
y
p
o
l
i
c
y
\epsilon-greedy \ policy
ϵ−greedy policy 进行策略改进。
这里出现了“同轨策略”,至于它的具体含义是什么等到后面再做描述。
4、增量法
一个序列的平均数可以用增量法计算:
μ
k
=
1
k
∑
j
=
1
k
x
j
=
1
k
(
x
k
+
∑
j
=
1
k
−
1
x
j
)
=
1
k
(
x
k
+
(
k
−
1
)
μ
k
−
1
)
=
μ
k
−
1
+
1
k
(
x
k
−
μ
k
−
1
)
(4.4.1)
\begin{aligned}\mu_{k} &=\frac{1}{k} \sum_{j=1}^{k} x_{j} \\&=\frac{1}{k}\left(x_{k}+\sum_{j=1}^{k-1} x_{j}\right) \\&=\frac{1}{k}\left(x_{k}+(k-1) \mu_{k-1}\right) \\&=\mu_{k-1}+\frac{1}{k}\left(x_{k}-\mu_{k-1}\right)\end{aligned}\tag{4.4.1}
μk=k1j=1∑kxj=k1(xk+j=1∑k−1xj)=k1(xk+(k−1)μk−1)=μk−1+k1(xk−μk−1)(4.4.1)
所以要计算当前的均值只要有之前的均值,然后计算新增的数和之前均值之间的误差再除以总个数,将这两部分相加即可得到结果。
所以之前MC算法的评估部分可以这样修改:
N
(
S
t
)
←
N
(
S
t
)
+
1
V
(
S
t
)
←
V
(
S
t
)
+
1
N
(
S
t
)
(
G
t
−
V
(
S
t
)
)
(4.4.2)
\begin{array}{l}N\left(S_{t}\right) \leftarrow N\left(S_{t}\right)+1 \\V\left(S_{t}\right) \leftarrow V\left(S_{t}\right)+\frac{1}{N\left(S_{t}\right)}\left(G_{t}-V\left(S_{t}\right)\right)\end{array}\tag{4.4.2}
N(St)←N(St)+1V(St)←V(St)+N(St)1(Gt−V(St))(4.4.2)
对于一些非静止的问题还可以用动态的均值:
V
(
S
t
)
←
V
(
S
t
)
+
α
(
G
t
−
V
(
S
t
)
)
(4.4.3)
\begin{aligned}V\left(S_{t}\right) \leftarrow V\left(S_{t}\right)+\alpha\left(G_{t}-V\left(S_{t}\right)\right)\end{aligned}\tag{4.4.3}
V(St)←V(St)+α(Gt−V(St))(4.4.3)
这种方式可以避免记住之前的幕,降低了存储空间的消耗。
5、参考资料
《Reinforcement Learning An Introduction》(Second Edition) Sutton
RL Course by David Sliver
《强化学习原理与python实现》肖智清
下一篇:时序差分学习