介绍
Easy RL是由清华大学、北京大学以及中国科学院大学的三名硕士生编写的一门强化学习入门书籍,又称为“蘑菇书”Easy RL github地址。笔者主要从事博弈论、多智能体强化学习等方面的研究。最近在学习该本书,故将学习笔记和心得在这里记录下来,供大家观看交流。之后笔者也会继续更新有关多智能体和强化学习的内容,包括强化学习算法原理和代码实现、论文复现、强化学习竞赛等,对文章内容有任何问题或想一起学习强化学习相关内容可以邮件联系。
三、表格型方法
文章目录
1、动态规划、蒙特卡洛、时序差分方法
①动态规划方法
在前面讲MDP过程时,已经讲过动态规划方法,可以看出DP的特点是:
1、 模型已知,即状态转移函数和奖赏函数已知。
2、每次都对所有状态的值函数进行更新。
在策略评估过程(预测)中,动态规划就是借助状态转移函数和奖赏函数,依据贝尔曼期望方程进行迭代。每次迭代都会更新每个状态的价值,收敛时即可以得到当前策略对应的价值函数。
V
’
π
(
s
)
=
∑
a
∈
A
π
(
a
∣
s
)
(
R
(
s
,
a
)
+
γ
∑
s
′
∈
S
p
(
s
′
∣
s
,
a
)
V
π
(
s
′
)
)
V’_{\pi}\left( s \right) =\sum_{a\in A}{\pi \left( a\left| s \right. \right)}\left( R\left( s,a \right) +\gamma\sum_{s'\in S}{p\left( s'\left| s,a \right. \right)}V_{\pi}\left( s' \right) \right)
V’π(s)=a∈A∑π(a∣s)(R(s,a)+γs′∈S∑p(s′∣s,a)Vπ(s′))
在策略改进过程(控制)的价值迭代方法中,则主要根据贝尔曼最优方程进行迭代。
V
∗
′
(
s
)
=
max
a
(
R
(
s
,
a
)
+
∑
s
′
∈
S
p
(
s
′
∣
s
,
a
)
V
∗
(
s
′
)
)
V'_*\left( s \right) =\max_a \left( R\left( s,a \right) +\sum_{s'\in S}{p\left( s'\left| s,a \right. \right) V_*\left( s' \right) \,\,} \right)
V∗′(s)=amax(R(s,a)+s′∈S∑p(s′∣s,a)V∗(s′))
② 蒙特卡洛方法
蒙特卡洛方法和时序差分方法都是属于免模型的方法,可以在免模型的情况下完成预测和控制过程。
蒙特卡洛方法是通过随机生成多亮初始状态,随后根据策略来生成完整的轨迹,并记录下获得的奖赏。最后,根据每个状态下奖赏的期望值(即:某个状态下的未来期望总奖赏/该状态在轨迹集合的出现次数)作为该状态的值函数估计值。
通过将求平均值的公式改成增量形式,即:
μ
t
=
μ
t
−
1
+
x
t
−
u
t
−
1
t
\mu_t=\mu_{t-1}+\frac{x_t-u_{t-1}}{t}
μt=μt−1+txt−ut−1
可以得出基于蒙特卡洛方法的状态值函数更新公式:
V
π
(
s
t
)
=
V
π
(
s
t
)
+
a
(
G
t
−
V
π
(
s
t
)
)
V_\pi(s_t)=V_\pi(s_{t})+a({G_t-V_\pi(s_{t})})
Vπ(st)=Vπ(st)+a(Gt−Vπ(st))
其中,
G
t
G_t
Gt是在状态s下的未来累积奖赏,可以根据蒙特卡罗采样得到的轨迹计算得到;
a
a
a可以看作是学习率,
G
t
−
V
π
(
s
t
)
G_t-V_\pi(s_{t})
Gt−Vπ(st)是残差。
③ 时序差分方法
时序差分也是一种免模型方法,它同时结合了动态规划的自举特点和蒙特卡洛的采样特点。
自举(Bootstrapping):在非参数统计中,自举是指根据当前的数据抽样生成更多的数据。在强化学习过程中,自举通常是指根据其他估算值来更新当前估算值的思想(即在更新时使用了估计)。
PS:例如MC使用真实的回报值来估计状态价值函数,就不属于自举。而DP、TD使用下一个状态的价值函数估计值来估计当前状态的价值函数,就属于自举
采样:由于模型未知,因此时序差分方法不同于动态规划方法中同时对所有状态进行价值更新(因为已知状态转移概率函数,所以可以实现),其需要通过采样的方式来进行状态值函数更新。
自举:又不同于蒙特卡洛方法随机采样后对获得的 G t G_t Gt取平均值,从而作为状态值函数的估计。时序差分方法借助自举的思想来对估计状态值函数,即用即时奖赏加上下一时刻的状态值函数估计值,作为当前的状态值函数估计。
结合上述两点,可以得出一步时序差分的更新公式为:
V
(
s
t
)
=
V
(
s
t
)
+
a
(
r
t
+
1
+
γ
V
(
s
t
+
1
)
−
V
(
s
t
)
)
V(s_t)=V(s_{t})+a({r_{t+1}+\gamma V(s_{t+1})-V(s_{t})})
V(st)=V(st)+a(rt+1+γV(st+1)−V(st))
其中,
r
t
+
1
+
γ
V
(
s
t
+
1
)
r_{t+1}+\gamma V(s_{t+1})
rt+1+γV(st+1)称作TD目标,其由采样和自举两部分组成;其与
V
(
s
t
)
V(s_t)
V(st)的差车称为TD误差。
总结一下,时序差分方法就是通过采样而到达某个状态,在该状态下根据策略没执行一步动作就做一步自举,用自己得到的估计汇报来更新上一时刻的状态值函数。
PS:一步TD可以拓展到N步TD,只需要每执行N步动作时进行N步自举就可以。即:
G
t
n
=
r
t
+
1
+
γ
r
t
+
2
+
.
.
.
.
γ
n
−
1
r
t
+
n
+
γ
V
(
s
t
+
n
V
(
s
t
)
=
V
(
s
t
)
+
a
(
G
t
n
−
V
(
s
t
)
)
G^n_t=r_{t+1}+\gamma r_{t+2}+....\gamma^n-1 r_{t+n}+\gamma V(s_{t+n}\\ V(s_t)=V(s_{t})+a({G^n_{t}-V(s_{t})})
Gtn=rt+1+γrt+2+....γn−1rt+n+γV(st+nV(st)=V(st)+a(Gtn−V(st))
当N取到无穷时,即认为只有当回合结束才能更新,此时TD就退化成MC。
2、几种方法的比较
三种方法相比,主要有以下几点不同:
1. DP是有模型的、MC和TD都是免模型的。
2. DP和TD都借助了马尔科夫性质,而MC则没有(仅仅通过采样)。因此当所研究的过程是一个马尔科夫过程时(模型未知的情况下),使用TD更合适,否则使用MC合适。
3. MC只能在一个回合结束之后再更新,而TD可以进行在线学习,即每执行一步就更新。因此,MC必须根据完整序列来进行学习,而TD则可以通过不完整序列来学习。
4. MC在更新时,使用的是已经执行过的历史经验,即通过一个个真实的样本来更新估计值。而TD则是通过自举的思想,通过下一时刻的估计值来更新估计值。
图示:
上面几个图表明,时序差分在更新时:如果把深度拓展到无穷,或者说拓展到回合结束,就变成了蒙特卡洛。如果把探索的广度拓展(即在初始时探索到所有可能的状态),就变成了动态规划。如果在深度和广度上同时扩展,也就是涉及到所有时刻所有可能的动作,此时就变成了穷举搜索。
Sarsa、Q-learning
在使用时序差分方法进行策略控制时,根据探索和改进的策略是否是同一个策略,可以将其分为Sarsa(同策略)和Q-learning(异策略)两种方法。
借助时序差分方法进行策略控制,就是把第二章中的用动态规划进行策略评估的方法改成用时序差分来做。因为这里是无模型的,所以多了对环境进行探索的过程,通常使用 ϵ \epsilon ϵ-贪心策略来增加智能体的探索性,在这个过程中通常涉及用于探索和改进的策略是否是同一个策略的问题。
①Sarsa
Sarsa是一种同策略时序差分方法,即用于探索和改进的策略是同一个策略。将时序差分方法中的状态值函数改成动作值函数,即可以得到Sarsa:
Q
(
s
t
,
a
t
)
=
Q
(
s
t
,
a
t
)
+
a
(
r
t
+
γ
Q
(
s
t
+
1
,
a
t
+
1
)
−
Q
(
s
t
,
a
t
)
)
Q(s_t,a_t)=Q(s_{t},a_t)+a({r_t+\gamma Q(s_{t+1},a_{t+1})-Q(s_{t},a_t)})
Q(st,at)=Q(st,at)+a(rt+γQ(st+1,at+1)−Q(st,at))
或者可简化为:
Q
(
s
,
a
)
=
Q
(
s
,
a
)
+
a
(
r
+
γ
Q
(
s
′
,
a
′
)
−
Q
(
s
,
a
)
)
Q(s,a)=Q(s,a)+a({r+\gamma Q(s',a'})-Q(s,a))
Q(s,a)=Q(s,a)+a(r+γQ(s′,a′)−Q(s,a))
Sarsa的过程如下:
1. 通过采样获得状态-动作对
(
s
,
a
)
(s,a)
(s,a);初始化Q表全为0;令策略
π
\pi
π为
ϵ
\epsilon
ϵ-贪心策略,即:
π
(
s
)
=
{
随机选择一个动作,
r
a
n
d
o
m
(
0
,
1
)
<
ϵ
a
r
g
m
a
x
a
Q
(
s
,
a
)
,
e
l
s
e
\pi \left( s \right) =\begin{cases} \text{随机选择一个动作,}random\left( 0,1 \right) <\epsilon\\ argmax _aQ\left( s,a \right) , else\\ \end{cases}
π(s)={随机选择一个动作,random(0,1)<ϵargmaxaQ(s,a),else
2. 在状态s下执行动作a后获得奖赏r到达状态 s ′ s' s′,.根据策略 π \pi π生成 s ′ s' s′下一时刻的动作 a ′ a' a′.
3. 使用上面sarsa的更新公式对Q表中状态动作对(s,a)的价值进行更新,得到新的Q表
Q
′
Q'
Q′。从而完成对策略的更新,即:
π
′
(
s
)
=
{
随机选择一个动作,
r
a
n
d
o
m
(
0
,
1
)
<
ϵ
a
r
g
m
a
x
a
Q
′
(
s
,
a
)
,
e
l
s
e
\pi' \left( s \right) =\begin{cases} \text{随机选择一个动作,}random\left( 0,1 \right) <\epsilon\\ argmax _aQ'\left( s,a \right) , else\\ \end{cases}
π′(s)={随机选择一个动作,random(0,1)<ϵargmaxaQ′(s,a),else
4. 令 π = π ′ , s = s ′ , a = a ′ \pi=\pi',s=s',a=a' π=π′,s=s′,a=a′,转到步骤2,直到Q表收敛。
② Q-learning
Q-learning与Sarsa唯一的不同就是Q-learning中进行探索和改进的策略是两个不同的策略。其中,用于探索的策略是
ϵ
\epsilon
ϵ-贪心策略**(行为策略),而用于改进的是完全贪心策略(目标策略)**。Q-learning的更新公式为:
Q
(
s
,
a
)
=
Q
(
s
,
a
)
+
a
(
r
+
γ
m
a
x
a
Q
(
s
′
,
a
)
−
Q
(
s
,
a
)
)
Q(s,a)=Q(s,a)+a({r+\gamma max_{a}Q(s',a})-Q(s,a))
Q(s,a)=Q(s,a)+a(r+γmaxaQ(s′,a)−Q(s,a))
在公式中可以看出,Q-learning 与Sarsa相比,Sarsa在自举时,使用的是由
ϵ
\epsilon
ϵ-贪心策略生成的动作
a
′
a'
a′,并且在下一时刻也会采取该动作。而Q-learning 在自举时,是直接使用s’在Q表中对应的最大价值的动作。但真正采取的动作却是由
ϵ
\epsilon
ϵ-贪心策略生成的。Q-learning的过程如下:
1. 采样获得状态-动作对
(
s
,
a
)
(s,a)
(s,a);初始化Q表全为0;令策略
π
\pi
π为
ϵ
\epsilon
ϵ-贪心策略,即:
π
(
s
)
=
{
随机选择一个动作,
r
a
n
d
o
m
(
0
,
1
)
<
ϵ
a
r
g
m
a
x
a
Q
(
s
,
a
)
,
e
l
s
e
\pi \left( s \right) =\begin{cases} \text{随机选择一个动作,}random\left( 0,1 \right) <\epsilon\\ argmax _aQ\left( s,a \right) , else\\ \end{cases}
π(s)={随机选择一个动作,random(0,1)<ϵargmaxaQ(s,a),else
2. 在状态s下执行动作a后获得奖赏r到达状态 s ′ s' s′,根据Q表得到 m a x a Q ( s ′ , a ) max_{a}Q(s',a) maxaQ(s′,a).
3. 根据上述Q-learning的更新公式,更新Q(s,a).
4. 令 s = s ′ , a = π ( s ′ ) s=s',a=\pi(s') s=s′,a=π(s′),转到步骤2,直至Q表收敛。