在第四章 动态规划中,已知模型(即状态转换概率)能够对策略进行评估和更新,最终得到最优的策略和最优价值函数。但是,很多情况下,状态转移概率 p ( s ′ , r ∣ s , a ) p(s', r | s, a) p(s′,r∣s,a)并不知道,那要怎么求解最优策略呢?
本章将的蒙特卡洛方法可以利用经验学习到价值函数和策略。经验是指agent和环境交互生成的(状态,动作,奖励)的轨迹序列。
文章目录
- 5.1 蒙特卡洛预测 (Monte Carlo Prediction)
- 5.2 动作价值的蒙特卡洛估计 (MC Estimation of action values)
- 5.3 蒙特卡洛控制 (Monte Carlo Control)
- 5.4 非探索开端的蒙特卡洛控制 (Monte Carlo Control without Exploring Starts)
- 5.5 通过重要性采样的off-policy 预测 (Off-policy Prediction via Importance Sampling)
- 5.6 off-policy蒙特卡洛控制 (off-policy MC control)
- 5.7 总结
5.1 蒙特卡洛预测 (Monte Carlo Prediction)
上一章的动态规划方法是model-based的方法,因为我们已知模型。蒙特卡洛方法是model-free的,不知道具体的模型,只是根据完整的状态序列(episode)来估算价值函数。
这里的序列指的是在某个策略 π \pi π下的一系列状态、动作、奖励,表示为: S 0 , A 0 , R 1 , S 1 , A 1 , R 2 , ⋯ , S T − 1 , A T − 1 , R T S_0, A_0, R_1, S_1, A_1, R_2, \cdots, S_{T-1}, A_{T-1}, R_T S0,A0,R1,S1,A1,R2,⋯,ST−1,AT−1,RT。
怎样根据这样的序列来估计价值呢?比如,对于某个状态
s
s
s来说,它的状态价值
v
π
(
s
)
v_{\pi}(s)
vπ(s)等于所有该状态获得奖励的期望,表示为:
v
π
(
s
)
=
E
π
(
G
t
∣
S
t
=
s
)
=
E
π
(
R
t
+
1
+
γ
R
t
+
2
+
γ
2
R
t
+
3
+
⋯
∣
S
t
=
s
)
v_{\pi}(s) = E_{\pi}(G_t | S_t = s) = E_{\pi}(R_{t+1}+\gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots | S_t = s)
vπ(s)=Eπ(Gt∣St=s)=Eπ(Rt+1+γRt+2+γ2Rt+3+⋯∣St=s)
那么,在蒙特卡洛方法中,要求某个状态的价值,可以计算出所有序列中从这个状态开始到最终状态的累积奖励,再对其取平均。
但是还有一个问题是:如果一个状态在一个序列中出现了多次,该怎么处理?这里对应两种方法,一种是只计算这个状态在序列中第一次出现的累积奖励,这种方法称为"first-visit MC method";另一种方法是这个状态每次出现时都计算积累奖励,再取平均,称为"every-visit MC method"。
下面给出了"first-visit MC method"计算状态价值函数的伪代码:
5.2 动作价值的蒙特卡洛估计 (MC Estimation of action values)
在模型未知的情况下,如果我们只计算出状态价值 V ( s ) V(s) V(s),将难以指导agent学习策略。所以,我们可以计算动作价值 q ( s , a ) q(s, a) q(s,a),这样对于选择最优策略是非常方便的。
计算动作价值的方法和5.1中计算状态价值的方法基本一致,只是将 v ( s ) v(s) v(s)变为 q ( s , a ) q(s,a) q(s,a)。即计算状态 s s s下采取动作 a a a能得到的奖励的平均值。
但是这里也存在一个问题:有许多状态-动作对没有被访问到,就没有办法更新他们的动作价值。
针对这个问题,书中给出了两个解决方案:
- exploring starts:要求每个状态-动作对都有机会作为序列的起始,即如果无限次采样,每个状态-动作对也被采样了很多次,这样就可以计算出对应的动作价值。
- stochastic policy:选择一个随机的策略,这个策略能够保证在每个状态下,每个动作被选择的概率都是非0的。
5.3 蒙特卡洛控制 (Monte Carlo Control)
蒙特卡洛控制就是进行策略提升,得出最优策略。
我们首先考虑经典的策略迭代版本的蒙特卡洛控制,与动态规划中的策略迭代思想一致,即不断迭代以下过程,直至策略收敛到最优策略,价值函数也收敛至最优。
π
0
→
E
q
π
0
→
I
π
1
→
E
q
π
1
→
I
π
2
→
E
⋯
→
I
π
∗
→
E
q
π
∗
\pi_0 \overset{E}{\rightarrow} q_{\pi_0} \overset{I}{\rightarrow} \pi_1 \overset{E}{\rightarrow} q_{\pi_1} \overset{I}{\rightarrow} \pi_2 \overset{E}{\rightarrow} \cdots \overset{I}{\rightarrow} \pi_* \overset{E}{\rightarrow} q_{\pi_*}
π0→Eqπ0→Iπ1→Eqπ1→Iπ2→E⋯→Iπ∗→Eqπ∗
其中, → E \overset{E}{\rightarrow} →E表示策略评估, → I \overset{I}{\rightarrow} →I表示策略提升。策略评估就是5.2节中讲到的计算动作价值函数 q ( s , a ) q(s, a) q(s,a)。策略提升是指根据动作价值函数改进策略。
如果使用贪心方法进行策略提升,状态
s
s
s下的策略为:
π
(
s
)
≐
arg max
a
q
(
s
,
a
)
\pi(s) \doteq \argmax_{a} q(s, a)
π(s)≐aargmaxq(s,a)
利用Exploring starts的蒙特卡洛控制伪代码如下:
为了使蒙特卡洛算法能收敛到最优价值,得到最优策略,这里用了两个假设:
- 探索式开端(exploring starts),即每个状态-动作对都有可能作为开端,并执行多次。
- agent和环境交互无限次,得到了无限的状态序列。
针对这两个假设在实际应用中,不太可能满足的情况,也需要进行一些改进。比如,下一节会讲到非探索开端的蒙特卡洛控制。以及为了避免无限状态序列,改变策略评估和策略提升的粒度等。
5.4 非探索开端的蒙特卡洛控制 (Monte Carlo Control without Exploring Starts)
5.2节中也提到了,针对许多状态-动作对没有被访问到的问题,其中一个解决方法是exploring starts,还有一个方法是选择一个策略,这个策略能保证在每一个状态下,所有动作被选择的概率都是非0的。
接下来第二种方法进行介绍,这种方法中有分为两类,一类是on-policy的, 一类是off-policy的。本节中介绍on-policy方法,下一节介绍off-policy方法。
关于on-policy和off-policy的区别:
- on-policy是指生成状态序列的策略和要评估改进的策略是同一个。
- off-policy是指生成状态序列的策略和要评估改进的策略不同。
on-policy方法中, ϵ \epsilon ϵ-greedy策略常用且简单。即在每个状态下,有 ϵ \epsilon ϵ的概率随机选择动作。所以,对于当前状态下非贪心动作,选择它的概率为 ϵ ∣ A ( s ) ∣ \frac{\epsilon}{|\mathcal{A}(s)|} ∣A(s)∣ϵ。选择当状态下Q值最大的动作的概率为 1 − ϵ + ϵ ∣ A ( s ) ∣ 1-\epsilon+\frac{\epsilon}{|\mathcal{A}(s)|} 1−ϵ+∣A(s)∣ϵ。其中的 ∣ A ( s ) ∣ |\mathcal{A(s)}| ∣A(s)∣表示状态 s s s下的动作空间大小。
所以,
ϵ
\epsilon
ϵ-greedy策略和之前的蒙特卡洛控制方法的区别就在于更新策略的部分,之前是选择一个贪心动作,现在也给其他非贪心动作一定的机会被选择。对应的伪代码为(first-visit):
5.5 通过重要性采样的off-policy 预测 (Off-policy Prediction via Importance Sampling)
on-policy的方法实际上是做了一个折中,它学到的不是一个最优的策略,而是一个带有探索的接近最优策略(near-optimal policy)。
另一个更直接的方法是使用两个策略,一个是我们要评估的策略,另一个探索性的策略用来生成状态序列。我们要评估的策略称为目标策略,生成状态序列的策略称为行为策略。
目标策略可以是确定性的,在每个状态下选择贪心动作。行为策略需要保持随机性和更多的探索性,比如一个 ϵ \epsilon ϵ-greedy策略。
几乎所有的off-policy方法都使用了重要性采样。它用来评估随机变量在一个分布上的期望值,但采样的样本来自另一个分布。我们在off-policy的方法中使用重要性采样,可以根据目标策略和行为策略下发生某个轨迹的概率,得到加权的奖励。某个状态动作轨迹在两个策略下出现的概率的比值称为重要性采样率。
比如,给定初始状态 S t S_t St,接下来的状态动作轨迹为: A t , S t + 1 , A t + 1 , ⋯ , S T A_t, S_{t+1}, A_{t+1}, \cdots, S_T At,St+1,At+1,⋯,ST。其在策略 π \pi π下发生的概率为:
P r { A t , S t + 1 , A t + 1 , ⋯ , S T ∣ S t , A t : T − 1 ∼ π } = π ( A t ∣ S t ) p ( S t + 1 ∣ S t , A t ) π ( A t + 1 ∣ S t + 1 ) ⋯ p ( S T ∣ S T − 1 , A T − 1 ) = ∏ k = t T − 1 π ( A k ∣ S k ) p ( S k + 1 ∣ S k , A k ) Pr\{A_t, S_{t+1}, A_{t+1}, \cdots, S_T | S_t, A_{t: T-1} \sim \pi\} \\ = \pi(A_t | S_t) p(S_{t+1}|S_t, A_t)\pi(A_{t+1}|S_{t+1}) \cdots p(S_T | S_{T-1}, A_{T-1}) \\ = \prod_{k=t}^{T-1} \pi(A_k | S_k)p(S_{k+1}| S_k, A_k) Pr{At,St+1,At+1,⋯,ST∣St,At:T−1∼π}=π(At∣St)p(St+1∣St,At)π(At+1∣St+1)⋯p(ST∣ST−1,AT−1)=k=t∏T−1π(Ak∣Sk)p(Sk+1∣Sk,Ak)
所以,该状态动作轨迹发生的相对概率为:
ρ
t
:
T
−
1
≐
∏
k
=
t
T
−
1
π
(
A
k
∣
S
k
)
p
(
S
k
+
1
∣
S
k
,
A
k
)
∏
k
=
t
T
−
1
b
(
A
k
∣
S
k
)
p
(
S
k
+
1
∣
S
k
,
A
k
)
=
∏
k
=
t
T
−
1
π
(
A
k
∣
S
k
)
b
(
A
k
∣
S
k
)
\rho_{t:T-1} \doteq \frac{\prod_{k = t}^{T-1} \pi(A_k | S_k)p(S_{k+1}| S_k, A_k)}{\prod_{k = t}^{T-1} b(A_k | S_k)p(S_{k+1}| S_k, A_k)} = \prod_{k =t}^{T-1}\frac{\pi(A_k|S_k)}{b(A_k|S_k)}
ρt:T−1≐∏k=tT−1b(Ak∣Sk)p(Sk+1∣Sk,Ak)∏k=tT−1π(Ak∣Sk)p(Sk+1∣Sk,Ak)=k=t∏T−1b(Ak∣Sk)π(Ak∣Sk)
从上式可以看出,重要性采样率和转移概率无关,仅依赖于两个策略和状态动作轨迹。
由于状态动作轨迹是通过策略
b
b
b生成的,我们要计算的是策略
π
\pi
π下的状态价值函数。所以,在得到累积奖励之后,需要乘以重要性采样率来预测策略
π
\pi
π下的奖励值。
v
π
(
s
)
=
E
[
ρ
t
:
T
−
1
G
t
∣
S
t
=
s
]
v_{\pi}(s) = \mathbb{E}[\rho_{t:T-1}G_t | S_t = s]
vπ(s)=E[ρt:T−1Gt∣St=s]
这里不能直接得到期望值,所以对于状态
s
s
s和价值估计
V
(
s
)
V(s)
V(s)是用它在多个轨迹中得到的
ρ
t
:
T
−
1
G
t
\rho_{t:T-1}G_t
ρt:T−1Gt求和取平均。公式表达为:
V
(
s
)
≐
∑
t
∈
T
(
s
)
ρ
t
:
T
(
t
)
−
1
G
t
∣
T
(
s
)
∣
V(s) \doteq \frac{\sum_{t \in \mathcal{T}(s)}\rho_{t:T(t)-1}G_t}{|\mathcal{T}(s)|}
V(s)≐∣T(s)∣∑t∈T(s)ρt:T(t)−1Gt
其中的 T ( s ) \mathcal{T}(s) T(s)是一个集合,存储着各个轨迹中第一次访问到状态 s s s的时间点, ∣ T ( s ) ∣ |\mathcal{T}(s)| ∣T(s)∣表示的就是状态 s s s出现在了多少个轨迹中。
这种方式是对采样得到的轨迹中所有第一次访问到状态 s s s得到的奖励,乘以重要性采样率,然后直接除以 s s s第一次出现在轨迹中的次数。这种称为原始重要性采样。
另一种是加权重要性采样,定义为:
V
(
s
)
≐
∑
t
∈
T
(
s
)
ρ
t
:
T
(
t
)
−
1
G
t
∑
t
∈
T
(
s
)
ρ
t
:
T
(
t
)
−
1
V(s) \doteq \frac{\sum_{t \in \mathcal{T}(s)}\rho_{t:T(t)-1}G_t}{\sum_{t \in \mathcal{T}(s)}\rho_{t:T(t)-1}}
V(s)≐∑t∈T(s)ρt:T(t)−1∑t∈T(s)ρt:T(t)−1Gt
原始重要性采样和加权重要性采样的区别就在于偏差和方差。原始重要性采样是对 v π ( s ) v_{\pi}(s) vπ(s)的无偏估计,但是方差很大。加权重要性采样是有偏的,但方差更小。
举个例子,当我们仅采样了一个轨迹序列,如: s 1 , a 1 , r 2 , s 2 , a 2 , s T s_1, a_1, r_2, s_2, a_2, s_T s1,a1,r2,s2,a2,sT。这个轨迹中的 s 2 s_2 s2的状态价值用两种加权方法计算出来为:
- 原始重要性采样: V ( s 2 ) = ρ ∗ r 3 1 = ρ ∗ r 3 V(s_2) = \frac{\rho * r_3}{1}= \rho* r_3 V(s2)=1ρ∗r3=ρ∗r3
- 加权重要性采样: V ( s 2 ) = ρ ∗ r 3 ρ = r 3 V(s_2) = \frac{\rho * r_3}{\rho} = r_3 V(s2)=ρρ∗r3=r3
从上面的结果可以看出,加权重要性采样的估计值是 r 3 r_3 r3,但 r 3 r_3 r3是根据行为策略估计出来的,所以这种估计是有偏的。但由于它对采样比进行了加权,使得比值最大为1,所以得到的估计值差距不大,方差较小。原始重要性采样理论上是无偏估计,但有时采样比会很大,导致方差较大。
增量式实现:即不用每次存储这次的奖励,而是将之前的所有奖励用一个值表示,当新得到一个奖励就直接计算之前的奖励和这个奖励即可。
伪代码中给出了off-policy MC的预测步骤,在计算动作价值函数
Q
(
s
,
a
)
Q(s, a)
Q(s,a)使用了加权重要性采样的方法,并采用增量式的实现。
5.6 off-policy蒙特卡洛控制 (off-policy MC control)
所谓控制,就是根据计算出来的动作价值函数,更新策略 π \pi π。
所以,如果
π
\pi
π采用的是贪心策略,只需要在5.5节中计算出来的Q(s, a)中选择一个最大的,作为状态
s
s
s下要采取的动作就可以了。即:
π
(
s
)
=
arg max
a
Q
(
s
,
a
)
\pi(s) = \argmax_{a}Q(s, a)
π(s)=aargmaxQ(s,a)
5.7 总结
在蒙特卡洛方法中,最重要的特点是使用生成的轨迹来计算价值函数。计算的方法是求和平均。在计算出动作价值函数 Q ( s , a ) Q(s, a) Q(s,a)之后,就很容易的能确定策略。
比较难的一点是理解off-policy的方法,使用一个策略生成轨迹,另一个是我们要评估的策略。这样做的目的是为了让行为策略更多的探索,目标策略贪心达到最优。其中用到的重要性采样需要好好理解。