书籍网址JoyRL
绪论
我们在认识人工智能之前就已经接触过强化学习,例如将蚯蚓放在一个盒子中,盒子中间有一个分叉路口,路的尽头分别放有食物和电极,让蚯蚓自己爬行到其中一条路的尽头,在放有食物的路的尽头蚯蚓会品尝到食物的美味,而在放有电极的路的尽头则会受到轻微的电击。
在此过程中,蚯蚓可能会一直朝着有电极的路爬行并且遭到电击。每次蚯蚓遭到电击或者吃到食物之后实验人员会将其放回原处,经过多次实验,蚯蚓会逐渐学会朝着有食物的路爬行,而不是朝着有电极的路爬行。
在人工智能的角度下看,这是很经典的带有较为鲜明的强化学习的“味道”,即试错学习。
试错学习由以下部分组成:
- 尝试:通过做出行为来达到目的或者奖励,比如上边蚯蚓移动
- 错误:在尝试的过程中可能会出现错误,比如上边蚯蚓向电极移动
- 结果:每次尝试的后果,移动到食物时可以吃到美味的食物,移动到电极时会受到电击
- 学习:通过不断地尝试并出现错误,自身会逐渐积累经验,了解哪些动作或行为会产生有利的结果,从而在下一次尝试中做出更加明智的选择。比如吃到美味的食物后下次会接着去食物的地方,受到电击后下次会选择远离电极的方向
强化学习应用
- 游戏:围棋、马里奥、星际争霸
- 机器人:通过每次输出相应关节的参数来活动手臂,然后通过摄像头观测当前的状态,最后通过人为设置的奖励(例如接近目标就给一个奖励)来学习到正确的抓取策略。
- 金融:股票交易、期货交易、外汇交易等
- 自动驾驶、推荐系统、交通派单、广告投放以及近来大火的ChatGPT
强化学习方向
- 多智能体强化学习:多个智能体在同一环境下进行学习,此时其他智能体对本智能体来说也算是环境的一部分,智能体之间的关系可以是合作也可以是竞争
- 从数据中学习:从数据中学习,或者从演示中学习,都利用了数据来辅助强化学习。例如以模仿学习为代表的从专家数据中学习策略、以逆强化学习为代表的从人类标注的数据中学习奖励模型来进行微调、还包括离线强化学习、世界模型等等
- 探索策略:像之前的蚯蚓例子一样,在探索时智能体在探索的过程中选择做出动作,并得到相应的反馈(奖励或惩罚);在利用时,智能体会选择已知的动作,从而可能会获得较少的奖励,但同时也可能会遭受较少的惩罚
- 实时环境: 像目前火热的自动驾驶领域,智能体需要在实时或者在线环境中做出决策,这种情况下会效率及带来安全隐患。可以通过离线强化学习解决该问题,即在离线环境中进行训练,然后将训练好的模型部署到在线环境中进行决策,但这种方法可能存在在线环境及离线环境状态分布不同的问题可能会在在线环境中出现意外。另一种方法是世界模型,即离线环境中训练一个世界模型,然后将世界模型部署到在线环境中进行决策
- 多任务强化学习:智能体往往需要同时解决多个任务,例如机器人需要同时完成抓取、搬运、放置等任务,而不是单一的抓取任务,如何在多个任务之间做出权衡是一个难题。目前比较常用的方法有联合训练(将多个任务的奖励进行加权求和,然后通过强化学习来学习一个策略)和分层强化学习(将多个任务分为两个层次,一个是高层策略,决策当前的任务;另一个是低层策略,决策当前任务的动作)
马尔科夫决策过程
马尔可夫决策过程
马尔可夫决策过程是强化学习的基本问题模型之一:
智能体与环境是在一系列时步交互的,一般用t表示。
例:智能体根据
t
t
t时刻的状态
S
0
S_0
S0做出动作
a
0
a_0
a0,根据动作
a
0
a_0
a0对环境造成的影响产生对应的奖励
r
1
r_{1}
r1,智能体再根据上次动作
a
0
a_0
a0得到的奖励
r
1
r_{1}
r1及此时状态
S
1
S_{1}
S1做出动作
a
1
a_{1}
a1如此循环下去,我们就可以在这个交互过程中得到一串轨迹:
s
0
s_0
s0,
a
0
a_0
a0,
r
1
r_1
r1,
s
1
s_1
s1,
a
1
a_1
a1,
r
2
r_2
r2,
s
2
s_2
s2,
a
2
a_2
a2,
r
3
r_3
r3,
s
3
s_3
s3,
a
3
a_3
a3,…,
s
t
s_t
st,
a
t
a_t
at,
r
t
+
1
r_{t+1}
rt+1,…
在强化学习中我们通常考虑的是有限马尔可夫决策过程,即
t
t
t是有限的,这个上限一般用
T
T
T表示。
马尔可夫性质
P
(
s
t
+
1
∣
s
t
)
=
P
(
s
t
+
1
∣
s
0
,
s
1
,
.
.
.
s
t
)
P(s_{t+1}|s_t)=P(s_{t+1}|s_0,s_1,...s_t)
P(st+1∣st)=P(st+1∣s0,s1,...st)
即在给定历史状态
s
0
,
s
1
,
.
.
.
s
t
s_0,s_1,...s_t
s0,s1,...st时,此时状态只与上一个状态有关,与之前状态无关。
回报
我们把累计的奖励
r
r
r称为回报
G
t
G_t
Gt,公式为
G
t
=
r
t
+
1
+
r
t
+
2
+
r
t
+
3
+
.
.
.
+
r
T
G_t = r_{t+1}+ r_{t+2}+ r_{t+3}+...+r_T
Gt=rt+1+rt+2+rt+3+...+rT
而当
T
T
T没有上限也就是当
T
=
∞
T=\infty
T=∞时上面回报公式是有问题的,所以我们在此基础上引入一个折扣因子
γ
\gamma
γ:
G
t
=
r
t
+
1
+
γ
r
t
+
2
+
γ
2
r
t
+
3
+
.
.
.
=
∑
k
=
0
T
=
∞
γ
k
r
t
+
k
+
1
(
0
<
γ
<
1
)
G_t = r_{t+1}+ \gamma r_{t+2} + \gamma^2r_{t+3} +...=\sum_{k=0}^{T=\infty}\gamma^kr_{t+k+1}(0<\gamma<1)
Gt=rt+1+γrt+2+γ2rt+3+...=∑k=0T=∞γkrt+k+1(0<γ<1)
状态转移矩阵
当环境的状态数有限时我们可以用一种状态流向图来表示智能体与环境交互过程中的走向,比如智能体为老师,环境为老师与学生且学生有三种状态分别为认真听课
s
1
s_1
s1、玩手机
s
2
s_2
s2和睡觉
s
3
s_3
s3时。我们可以用无向图的表示方法表示马尔可夫决策过程中的状态流向:
这张图没有完整地描述出马尔科夫决策过程,因为没有包含动作、奖励等元素,所以我们称之为马尔可夫链或离散时间的马尔可夫过程。
我们可以用一个概率表示状态之间的切换:
P
12
=
P
(
S
t
+
1
=
s
2
∣
S
t
+
1
=
s
2
)
=
0.4
P_{12}=P(S_{t+1}=s_2|S_{t+1}=s_2)=0.4
P12=P(St+1=s2∣St+1=s2)=0.4
也就是当前时刻为认真听课切换到玩手机即
s
1
s_1
s1切换到
s
2
s_2
s2时的概率为0.4,我们把这个概率称为状态转移概率,当它拓展到所有状态时我们可以表示为:
P
s
s
,
=
P
(
S
t
+
1
=
s
,
∣
S
t
=
s
)
P_{ss^,}=P(S_{t+1}=s^,|S_t=s)
Pss,=P(St+1=s,∣St=s)
即当前状态为
s
s
s时,下一个状态为
s
,
s^,
s,的概率,其中
S
S
S表示所有状态的集合,即
S
=
S=
S={
s
1
,
s
2
,
s
3
s_1,s_2,s_3
s1,s2,s3}
我们可以把概率绘制成表格的形式:
状态 | S t + 1 = s 1 S_{t+1}=s_1 St+1=s1 | S t + 1 = s 2 S_{t+1}=s_2 St+1=s2 | S t + 1 = s 3 S_{t+1}=s_3 St+1=s3 |
---|---|---|---|
S t = s 1 S_t=s_1 St=s1 | 0.2 | 0.4 | 0.4 |
S t = s 2 S_t=s_2 St=s2 | 0.2 | 0.5 | 0.3 |
S t = s 3 S_t=s_3 St=s3 | 0.1 | 0.3 | 0.6 |
在数学上也可以用矩阵表示:
[
0.2
0.4
0.4
0.2
0.5
0.3
0.1
0.3
0.6
]
\left[ \begin{matrix} 0.2 & 0.4 & 0.4 \\ 0.2 & 0.5 & 0.3 \\ 0.1 & 0.3 & 0.6 \end{matrix} \right]
0.20.20.10.40.50.30.40.30.6
这个矩阵叫做状态转移矩阵,拓展到所有状态可表示为式:
在马尔可夫链(马尔可夫过程)的基础上增加奖励元素就会形成马尔可夫奖励过程,在马尔可夫奖励过程基础上增加动作的元素就会形成马尔可夫决策过程。
我们可以把马尔可夫决策过程描述成一个今天常用的写法,即用一个五元组
<
S
,
A
,
R
,
P
,
γ
>
<S,A,R,P,\gamma>
<S,A,R,P,γ>来表示。
其中
S
S
S表示状态空间,即所有状态的集合,
A
A
A表示动作空间,
R
R
R表示奖励函数,
P
P
P表示状态转移矩阵,
γ
\gamma
γ表示折扣因子。
练习题
- 强化学习所解决的问题一定要严格满足马尔可夫性质吗?请举例说明。
不一定要满足马尔可夫性质的,比如书中提到的棋类游戏,因为在我们决策的过程中不仅需要考虑到当前棋子的位置和对手的情况,还需要考虑历史走子的位置例如吃子等。 - 马尔可夫决策过程主要包含哪些要素?
马尔可夫决策过程主要包含 S S S状态空间,即所有状态的集合, A A A动作空间, R R R奖励函数, P P P状态转移矩阵, γ \gamma γ折扣因子。 - 马尔可夫决策过程与金融科学中的马尔可夫链有什么区别与联系?
马尔可夫奖励过程在马尔可夫决策过程的基础上增加了奖励元素,即马尔可夫链只有 S S S状态空间,即所有状态的集合, A A A动作空间, P P P状态转移矩阵, γ \gamma γ折扣因子,没有 R R R奖励函数。
动态规划
动态规划具体指的是在某些复杂问题中,将问题转化为若干个子问题,并在求解每个子问题的过程中保存已经求解的结果,以便后续使用。实际上动态规划更像是一种通用的思路,而不是具体某个算法。在强化学习中,动态规划被用于求解值函数和最优策略。
动态规划的编程思想
如图所示机器人位于一个
m
×
n
m\times n
m×n网格的左上角,机器人每次只能向下或者向右移动一步,求当机器人可以有多少条不同的路径到达右下角终点。
动态规划的解法主要有几个步骤:确定状态,写出状态转移方程和寻找边界条件。
在此例题中我们先定义一个
f
(
i
,
j
)
f(i,j)
f(i,j),表示从左上角到
(
i
,
j
)
(i,j)
(i,j)的数量,因为机器人只能向下或者向右移动一步,所以:
f
(
i
,
j
)
=
f
(
i
−
1
,
j
)
+
f
(
i
,
j
−
1
)
f(i,j)=f(i-1,j)+f(i,j-1)
f(i,j)=f(i−1,j)+f(i,j−1)
我们写出了此题的状态转移方程,即走到当前位置
(
i
,
j
)
(i,j)
(i,j)的路径数量等于走到前一个位置
(
i
−
1
,
j
)
(i-1,j)
(i−1,j)和
(
i
,
j
−
1
)
(i,j-1)
(i,j−1)的所有路径之和
我们根据方程与题目的边界条件,即
i
,
j
i,j
i,j均为0时
f
(
i
,
j
)
=
0
f(i,j)=0
f(i,j)=0,
i
i
i为0时
f
(
i
,
j
)
=
1
f(i,j)=1
f(i,j)=1,同理
j
j
j为0时
f
(
i
,
j
)
=
1
f(i,j)=1
f(i,j)=1,完善状态转移方程:
f
(
i
,
j
)
=
{
0
,
i
=
0
,
j
=
0
1
,
i
=
0
,
j
≠
0
1
,
i
≠
0
,
j
=
0
f
(
i
−
1
,
j
)
+
f
(
i
,
j
−
1
)
f(i,j)=\left\{\begin{matrix}0,i=0,j=0\\1,i=0,j\neq0\\1,i\neq0,j=0\\f(i-1,j)+f(i,j-1)\end{matrix}\right.
f(i,j)=⎩
⎨
⎧0,i=0,j=01,i=0,j=01,i=0,j=0f(i−1,j)+f(i,j−1)
再根据状态转移方程写出代码
def solve(m,n):
# 初始化边界条件
# 这行刚开始自己没看明白, 意思为创建一个第一行全为1,再创建n-1行第一列为1,后m-1列为0的数组
# 当n=3,m=7时数组如下
# [[1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0]]
f = [[1] * n] + [[1] + [0] * (n - 1) for _ in range(m - 1)]
# 状态转移
for i in range(1, m):
for j in range(1, n):
f[i][j] = f[i - 1][j] + f[i][j - 1]
return f[m - 1][n - 1]
一般动态规划问题有三个性质,最优化原理、无后效性和有重叠子问题:
最优化原理指,如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。这与马尔可夫决策过程最大化累积回报的目标不谋而合。
无后效性指某阶段状态一旦确定,就不受这个状态以后决策的影响,这其实就是前面所说的马尔可夫性质。
至于有限重叠子问题,不是动态规划问题的必要条件,这里就不展开叙述。
状态价值函数和动作价值函数
在马尔可夫决策过程中,每个状态是有一定的价值的,可以定义为:
V
π
(
s
)
=
E
π
[
R
t
+
1
+
γ
R
t
+
2
+
γ
2
R
t
+
3
+
.
.
.
∣
S
t
=
s
]
=
E
π
[
G
t
∣
S
t
=
s
]
V_\pi(s)=E_\pi[R_{t+1}+\gamma R_{t+2}+\gamma ^2R_{t+3}+...|S_t=s]\\=E_\pi [G_t|S_t=s]
Vπ(s)=Eπ[Rt+1+γRt+2+γ2Rt+3+...∣St=s]=Eπ[Gt∣St=s]
当状态
S
t
S_t
St为
s
s
s时,该状态价值为
G
t
G_t
Gt即
R
t
+
1
+
γ
R
t
+
2
+
γ
2
R
t
+
3
+
.
.
.
R_{t+1}+\gamma R_{t+2}+\gamma ^2R_{t+3}+...
Rt+1+γRt+2+γ2Rt+3+...
这就是状态价值函数:从特定状态出发,按照某种策略
π
\pi
π进行决策所能得到的回报期望值
当我们引入动作的函数后会有一个
Q
Q
Q函数,也叫做动作价值函数即:
Q
π
(
s
,
a
)
=
E
π
[
G
t
∣
s
t
=
s
,
a
t
=
a
]
Q_\pi (s,a)=E_\pi [G_t|s_t=s,a_t=a]
Qπ(s,a)=Eπ[Gt∣st=s,at=a]
动作价值函数和状态价值函数会有一个关系:
V
π
(
s
)
=
∑
a
∈
A
π
(
a
∣
s
)
Q
π
(
s
,
a
)
V_\pi (s)=\sum_{a\in A}\pi (a|s)Q_\pi (s,a)
Vπ(s)=∑a∈Aπ(a∣s)Qπ(s,a)
其中
π
(
a
∣
s
)
\pi (a|s)
π(a∣s)表示策略函数,一般指在
s
s
s状态下执行动作
a
a
a的概率分布。
这个公式的意思就是在给定状态
s
s
s情况下,智能体所有动作的价值期望(所有动作价值函数乘以对应动作的概率之和)就等于该状态的价值,这其实就是利用了数学中的全期望公式。
贝尔曼方程
类比于回报公式
G
t
=
G
t
+
1
+
γ
G
t
+
2
+
.
.
.
G_t=G_{t+1}+\gamma G_{t+2}+...
Gt=Gt+1+γGt+2+...,我们对状态价值函数和动作价值函数做一个类似的推导:
V
π
(
s
)
=
E
π
[
G
t
∣
S
t
=
s
]
=
E
π
[
R
t
+
1
+
γ
R
t
+
2
+
γ
2
R
t
+
3
+
.
.
.
∣
S
t
=
s
]
=
R
(
s
)
+
γ
E
[
G
t
+
1
∣
S
t
=
s
]
=
R
(
s
)
+
γ
E
[
V
π
(
s
t
+
1
)
∣
S
t
=
s
]
=
R
(
s
)
+
γ
∑
s
,
∈
S
P
(
S
t
+
1
=
s
,
∣
S
t
=
s
)
V
π
(
s
,
)
=
R
(
s
)
+
γ
∑
s
,
∈
S
p
(
s
,
∣
s
)
V
π
(
s
,
)
V\pi(s)=E_\pi [G_t|S_t=s]\\=E_\pi[R_{t+1}+\gamma R_{t+2}+\gamma ^2R_{t+3}+...|S_t=s]\\=R_{(s)}+\gamma E[G_{t+1}|S_t=s]\\=R_{(s)}+\gamma E[V_\pi(s_{t+1})|S_t=s]\\=R_{(s)}+\gamma \sum_{s^,\in S}P(S_{t+1}=s^,|S_t=s)V_\pi(s^,)\\=R_{(s)}+\gamma\sum_{s^,\in S}p(s^,|s)V_\pi(s^,)
Vπ(s)=Eπ[Gt∣St=s]=Eπ[Rt+1+γRt+2+γ2Rt+3+...∣St=s]=R(s)+γE[Gt+1∣St=s]=R(s)+γE[Vπ(st+1)∣St=s]=R(s)+γ∑s,∈SP(St+1=s,∣St=s)Vπ(s,)=R(s)+γ∑s,∈Sp(s,∣s)Vπ(s,)
其中
G
t
G_t
Gt为回报公式,时间从t到结束的累积奖赏;
V
π
V_\pi
Vπ是策略为
π
\pi
π的状态-值函数,即状态s下预计累计回报的期望值
R
(
s
)
R_{(s)}
R(s)为t时获得的奖赏
在最优策略下,状态价值函数也是最优的,相应的动作价值函数也最优,此时的状态价值函数(贝尔曼最优方程)可以表示为:
V
∗
(
s
)
=
m
a
x
a
E
[
R
t
+
1
+
γ
V
∗
(
S
t
+
1
)
∣
S
t
=
s
,
A
t
=
a
]
=
m
a
x
a
∑
(
s
,
,
r
∣
s
,
a
)
[
r
+
γ
V
∗
(
s
,
)
]
V^*(s)=max_aE[R_{t+1}+\gamma V^*(S_t+1)|S_t=s,A_t=a]\\=max_a\sum_{(s^,,r|s,a)}[r+\gamma V^*(s^,)]
V∗(s)=maxaE[Rt+1+γV∗(St+1)∣St=s,At=a]=maxa∑(s,,r∣s,a)[r+γV∗(s,)]
动作价值函数表示为:
Q
∗
(
s
,
a
)
=
E
[
R
t
+
1
+
γ
m
a
x
a
,
Q
∗
(
S
t
+
1
,
a
,
)
∣
S
t
=
s
,
A
t
=
a
]
=
∑
s
,
,
r
p
(
S
,
,
r
∣
s
,
a
)
[
r
+
γ
max
a
,
Q
∗
(
s
,
,
a
,
)
]
Q^*(s,a)=E[R_{t+1}+\gamma max_{a^,}Q^*(S_{t+1},a^,)|S_t=s,A_t=a]\\=\sum _{s^,,r}p(S^,,r|s,a)[r+\gamma \max_{a^,}Q^*(s^,,a^,)]
Q∗(s,a)=E[Rt+1+γmaxa,Q∗(St+1,a,)∣St=s,At=a]=∑s,,rp(S,,r∣s,a)[r+γmaxa,Q∗(s,,a,)]
策略迭代
策略迭代算法思路分为两个步骤:
- 策略估计:首先固定策略 π \pi π不变,然后估计对应的状态价值函数 V V V
- 策略改进:根据估计好的状态价值函数 V V V结合策略推算出动作价值函数 Q Q Q,并对 Q Q Q函数优化然后进一步改进策略。此过程一般用贪心策略优化,即定义策略函数为:
π ( a ∣ s ) = m a x a Q ( s , a ) \pi(a|s)=max_aQ(s,a) π(a∣s)=maxaQ(s,a)
然后在策略改进时选择最大的
Q
(
s
,
a
)
Q(s,a)
Q(s,a)值更新。在一轮策略估计和改进之后,又会进入新的一轮策略估计和改进,直到收敛为止。
如图所示,图(a)描述了上面所说的策略估计和改进持续迭代的过程,图(b)则描述了在迭代过程中策略
π
\pi
π和状态价值函数
V
V
V最后会同时收敛到最优。
策略迭代算法伪代码如下:
价值迭代
价值迭代算法直接根据以下公式来迭代更新。
V
(
s
)
⇐
m
a
x
a
∈
A
(
R
(
s
,
a
)
+
γ
∑
s
,
∈
S
p
(
s
,
∣
s
,
a
)
V
(
s
,
)
)
V{(s)}\Leftarrow max_{a\in A}(R_{(s,a)}+\gamma \sum_{s^,\in S}p(s^,|s,a)V(s^,))
V(s)⇐maxa∈A(R(s,a)+γ∑s,∈Sp(s,∣s,a)V(s,))
价值迭代的伪代码如下:
它首先将所有的状态价值初始化,然后不停地对每个状态迭代,直到收敛到最优价值
V
∗
V^*
V∗,并且根据最优价值推算出最优策略
π
∗
\pi^*
π∗。这样其实更像是一个动态规划本身的思路,而不是强化学习的问题。
练习题
- 动态规划问题的主要性质有哪些?
动态规划问题有三个性质,最优化原理,无后效性,有重叠子问题 - 状态价值函数和动作价值函数之间的关系是什么?
V π ( s ) = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) V_\pi (s)=\sum_{a\in A}\pi (a|s)Q_\pi (s,a) Vπ(s)=∑a∈Aπ(a∣s)Qπ(s,a) - 策略迭代和价值迭代哪个算法速度会更快?
策略迭代会更快
尽管两种方法都需要多次遍历,但是在策略迭代算法中考虑了中间每个时步可能遇到的最优策略并及时加以改进,这意味着就算策略在早期并不完美(也许需要改进),策略迭代仍能够更快地接近最优解。
免模型预测
有模型与免模型
当状态转移概率是已知的时,使用的算法称为有模型算法,当环境为未知的时,使用的算法为免模型算法
预测与控制
在环境的状态转移概率是未知时,这种情况下会去近似环境的状态价值函数,这其实跟状态转移概率是等价的,我们把这个过程称为预测。换句话说,预测的主要目的是估计或计算环境中的某种期望值,比如状态价值函数
V
(
s
)
V{(s)}
V(s)或动作价值函数
Q
(
s
,
a
)
Q(s,a)
Q(s,a)。
控制的目标则是找到一个最优策略,该策略可以最大化期望的回报。控制问题通常涉及两个相互交替的步骤:策略评估(使用当前策略估计值函数)和策略改进(基于当前的值函数更新策略)。
蒙特卡洛估计
蒙特卡洛方法的思路是我们可以采样大量的轨迹,对于每个轨迹计算对应状态的回报然后取平均近似,称之为经验平均回报。蒙特卡洛方法有一定的局限性,即只适用于有终止状态的马尔可夫决策过程。
蒙特卡洛方法主要分成两种算法,一种是首次访问蒙特卡洛方法,另外一种是每次访问蒙特卡洛方法。
首次访问蒙特卡洛方法主要包含两个步骤,首先是产生一个回合的完整轨迹,然后遍历轨迹计算每个状态的回报。
更新公式可以表示为:
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)]
其中
α
\alpha
α为学习率
时序差分估计
时序差分估计方法是一种基于经验的动态规划方法,它结合了蒙特卡洛和动态规划的思想。最简单的时序差分可以表示为:
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)←V(st)+α[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)
时序差分和蒙特卡洛的比较
时序差分方法每走一步就可以学习(更新一次参数),而蒙特卡洛方法必须等游戏结束时才可以结束学习。
因此这些特点带来不少差异,比如:
时序差分可以在不完整的序列上学习,也可以在连续的环境中学习,这些都是蒙特卡洛方法不能够实现的
另外,时序差分方法利用了马尔可夫性质,在马尔可夫环境下有更高的学习效率。蒙特卡洛方法没有假设环境具有马尔可夫性质,利用采样的价值来估计某个状态的价值,在不是马尔可夫的环境下更加有效。
n步时序差分
把时序差分扩展就可以得到n步时序差分:
n
=
1
(
T
D
)
G
t
(
1
)
=
r
t
+
1
+
γ
V
(
s
t
+
1
)
n=1(TD) G^{(1)}_t=r_{t+1}+\gamma V(st+1)
n=1(TD)Gt(1)=rt+1+γV(st+1)
n
=
2
G
t
(
2
)
=
r
t
+
1
+
γ
r
t
+
2
+
γ
2
V
(
s
t
+
1
)
n=2 G^{(2)}_t=r_{t+1}+\gamma r_{t+2}+\gamma^2 V(st+1)
n=2Gt(2)=rt+1+γrt+2+γ2V(st+1)
n
=
∞
(
M
C
)
G
t
∞
=
r
t
+
1
+
γ
r
t
+
2
+
.
.
.
+
γ
T
−
t
+
1
r
T
n=\infty(MC) G^\infty_t=r_{t+1}+\gamma r_{t+2}+...+\gamma^{T-t+1}r_T
n=∞(MC)Gt∞=rt+1+γrt+2+...+γT−t+1rT
当
n
n
n趋向于
∞
\infty
∞时
n
n
n步时序差分就变为了蒙特卡洛方法,当
n
n
n为1时就成为了时序差分方法
我们可以通过调节
n
n
n的大小来实现蒙特卡洛方法和时序差分方法之间的权衡,我们通常用
λ
\lambda
λ来表示
n
n
n
另外我们可以通过以下方法来选择合适的
λ
\lambda
λ:
网格搜索
随机搜索
自适应选择
交叉验证
经验取值
练习题
- 有模型与免模型算法的区别?举一些相关的算法?
当状态转移概率是已知时,这种情况下使用的算法称之为有模型算法,例如动态规划算法
当状态转移概率是未知时,这种情况下使用的算法称之为免模型算法,例如Q-learn算法、DQN算法等。(目前学习不太多后期会补充) - 举例说明预测与控制的区别与联系。
当环境的状态转移概率未知时去拟合状态价值函数的过程为预测
而控制则是找到一个能够将回报最大化的策略 - 蒙特卡洛方法和时序差分方法的优劣势。
蒙特卡洛方法准确但是计算量大,效率低
时序差分方法同样准确且能够在线学习,效率高,且能够在不完整或者无尽的序列中学习
免模型控制
Q-learn算法
策略与状态价值函数是存在联系的,该联系为动作价值函数,因此我们可以通过预测动作价值函数并选取Q值最大的动作来解决控制问题,这就是
Q
−
l
e
a
r
n
Q-learn
Q−learn算法的思路:
Q
(
s
t
,
a
t
)
←
Q
(
s
t
,
a
t
)
+
α
[
r
t
+
1
+
γ
m
a
x
a
Q
(
s
t
+
1
,
a
)
−
Q
(
s
t
,
a
t
)
]
Q_{(s_t,a_t)}\leftarrow Q_{(s_t,a_t)}+\alpha[r_{t+1}+\gamma max_aQ(s_{t+1},a)-Q(s_t,a_t)]
Q(st,at)←Q(st,at)+α[rt+1+γmaxaQ(st+1,a)−Q(st,at)]
Q表格
机器人在左上角,目的是去右下角的s9格子,且机器人可以上下左右运动
我们把机器人的9个位置看作状态,上下左右四个动作为
a
1
,
a
2
,
a
3
,
a
4
a1,a2,a3,a4
a1,a2,a3,a4,将位置设为列,动作设为行,且初始化表格为0,就有了以下表格:
此表格就为Q表格。
书中并提到Q值更新过程比较复杂,会在后期结合具体情况补充
探索策略
Q-learn采用
ε
−
g
r
e
e
d
y
\varepsilon-greedy
ε−greedy的探索策略,智能体在探索的过程中,会以
1
−
ε
1-\varepsilon
1−ε的概率按照
Q
Q
Q函数执行动作,并以
ε
\varepsilon
ε的概率随机动作,一般
ε
\varepsilon
ε的值会设的比较小比如0.1。
下面是
Q
−
l
e
a
r
n
Q-learn
Q−learn算法的伪代码:
Sarsa算法
S
a
r
s
a
Sarsa
Sarsa算法是与
Q
−
l
e
a
r
n
Q-learn
Q−learn算法极为相似但模式不同的两种算法,
S
a
r
s
a
Sarsa
Sarsa算法
Q
Q
Q值更新公式如下:
Q
(
s
t
,
a
t
)
←
Q
(
s
t
,
a
t
)
+
α
[
r
t
+
γ
Q
(
s
t
+
1
,
a
t
+
1
)
−
Q
(
s
t
,
a
t
)
]
Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha[r_t+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t)]
Q(st,at)←Q(st,at)+α[rt+γQ(st+1,at+1)−Q(st,at)]
以下为伪代码:
同策略与异策略
S
a
r
s
a
Sarsa
Sarsa算法在训练的过程中当前策略来生成数据样本,并在其基础上进行更新。换句话说,策略评估和策略改进过程是基于相同的策略完成的,这就是同策略算法。
Q
−
l
e
a
r
n
Q-learn
Q−learn算法这样从其他策略中获取样本然后利用它们来更新目标策略,我们称作异策略算法。
Q-learn算法实战
下图为之前机器人最短路径是类似的,但是起点到了左下角,且红色部分为悬崖,走到悬崖游戏会结束。
具体代码详见文章开头,本人在阅读代码时对Q_table的数据类型及更新方式不甚了解,现在给出个人对于Q_table数据类型及其更新方式过程:
Q_table数据类型为collections库中的defaultdict类,defaultdict与dict主要区别为在访问不存在的key时dict会报错,但是defaultdict会生成该key并将其初始化为默认值。
创建该类代码为self.Q_table = defaultdict(lambda: np.zeros(self.n_actions))
,刚创建时Q_table为空。
def update(self, state, action, reward, next_state, done):
''' 更新模型
Args:
state (array): 当前状态
action (int): 当前动作
reward (float): 当前奖励信号
next_state (array): 下一个状态
done (bool): 表示是否达到终止状态
'''
Q_predict = self.Q_table[str(state)][action]
if done: # 终止状态
Q_target = reward
else:
Q_target = reward + self.gamma * np.max(self.Q_table[str(next_state)])
self.Q_table[str(state)][action] += self.lr * (Q_target - Q_predict)
Q_table的更新在Qlearning类中的update函数,其中Q_predict为算法中的
Q
(
s
t
,
a
t
)
Q(s_t,a_t)
Q(st,at),Q_target为算法中的
r
t
+
γ
m
a
x
a
Q
(
s
t
+
1
,
a
)
r_t+\gamma max_aQ(s_{t+1},a)
rt+γmaxaQ(st+1,a),最终
Q
(
s
t
,
a
t
)
Q(s_t,a_t)
Q(st,at) =
Q
(
s
t
,
a
t
)
+
α
[
r
t
+
γ
m
a
x
a
Q
(
s
t
+
1
,
a
)
−
Q
(
s
t
,
a
t
)
]
Q(s_t,a_t)+\alpha[r_t+\gamma max_aQ(s_{t+1},a)-Q(s_t,a_t)]
Q(st,at)+α[rt+γmaxaQ(st+1,a)−Q(st,at)] 。
为了加深理解我们将对照图来手动更新Q_table:
注意动作0,1,2,3对应的分别是上右下左,每走一个白色网格(包括起点)奖励为-1,走到终点奖励为0.
开始时state为36,只能往上走因此action为0,reward为-1,next_state为24,done为False:执行Q_predict = self.Q_table[str(state)][action]
后Q_predict为0,执行完
if done: # 终止状态
Q_target = reward
else:
Q_target = reward + self.gamma * np.max(self.Q_table[str(next_state)])
后Q_target
=
−
1
+
0.9
m
a
x
[
0
,
0
,
0
,
0
]
=
−
1
=-1+0.9max[0, 0, 0, 0]=-1
=−1+0.9max[0,0,0,0]=−1,执行完self.Q_table[str(state)][action] += self.lr * (Q_target - Q_predict)
后Q_table[‘36’][0]=Q_table[‘36’][0]
+
l
r
∗
(
Q
t
a
r
g
e
t
−
Q
p
r
e
d
i
c
t
)
=
0
+
0.1
∗
(
−
1
−
0
)
=
−
0.1
+lr*(Qtarget-Qpredict)=0+0.1*(-1-0)=-0.1
+lr∗(Qtarget−Qpredict)=0+0.1∗(−1−0)=−0.1,此时Q_table为[‘36’]=array[-0.1, 0, 0, 0],又因为在第二段代码中出现过self.Q_table[str(next_state)]
所以还有[‘24’]=array[0, 0, 0, 0].
第二次更新Q_table,state为24,action为1,reward为-1,next_state为25,done为False,第一段代码后Q_predict=0,第二段代码后Q_target=-1,运行第三段代码后Q_table[‘24’]=array[0, -0.1, 0, 0],新增Q_table[‘25’]=array[0, 0, 0, 0]:
第三次更新Q_table,state为24,action为3,reward为-1,next_state为24,done为False,第一段代码后Q_predict=0,第二段代码后Q_target=-1,运行第三段代码后Q_table[‘25’]=array[0, 0, 0, -0.1]:
第三次更新Q_table,state为25,action为1,reward为-1,next_state为25,done为False,第一段代码后Q_predict=-0.1,第二段代码后Q_target=-1,运行第三段代码后Q_table[‘24’]=array[0, -0.19, 0, 0],相信大家对于Q_table已经有了初步了解,只有自己动手走一遍算法才能更好的了解算法。