本文讨论如何应用强化学习中经典模型----马尔可夫链模型对外界信息进行正确处理,包含大量数学推导,但会尽量使用直白的话语让你对Markov chain有所了解。
马尔可夫三要素
如果你要使用该模型,必须要满足一个条件
p
(
s
t
+
1
∣
s
t
,
a
t
)
=
p
(
s
t
+
1
∣
s
h
,
a
t
)
p(s_{t+1}|s_t, a_t) = p(s_{t+1}|s_h, a_t)
p(st+1∣st,at)=p(st+1∣sh,at)
即agent所做的决定仅受当前状态的影响。这是一个大前提,那如何做到这一点呢?只有一种办法即保证
s
t
=
s
h
s_t=s_h
st=sh,但做到这一点相当不易,因此也会有其他模型来解决。不过这并不能否认Markov Chain依然是一个经典模型。
下面我们来讲讲这三个要素代表着什么。state代表着你观察到的状态,reward代表你采取行动时所获得的收益,action即是行动。
这个模型和人类的思维模式十分类似,Agent根据所处的状态计算每一种行动所获得的收益,选择收益最大的一种行动,此时由于行动会World产生了影响,因此会更新state和reward。
Value Function
对于每一种行动当然会有一个统一标准,数学表达为:
G
t
=
r
t
+
γ
r
t
+
1
+
γ
2
r
t
+
2
+
γ
3
r
t
+
3
+
.
.
.
(
γ
≤
1
)
G_t = r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\gamma^3r_{t+3}+...(\gamma\le1)
Gt=rt+γrt+1+γ2rt+2+γ3rt+3+...(γ≤1)
其中
γ
\gamma
γ为超参数,
γ
\gamma
γ越大,越重视长远收益;
γ
\gamma
γ越小,越重视即时收益。这很好理解,把
γ
\gamma
γ看做权重,谁的权重高,就越重视谁。是不是这个道理!
为保证结果准确,那最好的方法就是加个期望,这就是Value Function。
V
(
s
)
=
E
[
r
t
+
γ
r
t
+
1
+
γ
2
r
t
+
2
+
γ
3
r
t
+
3
+
.
.
.
∣
s
]
V
(
s
)
=
E
[
r
t
+
γ
G
t
+
1
∣
s
]
V(s) = \Bbb{E}[r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\gamma^3 r_{t+3}+...|s]\\V(s)=\Bbb{E}[r_t+\gamma G_{t+1}|s]
V(s)=E[rt+γrt+1+γ2rt+2+γ3rt+3+...∣s]V(s)=E[rt+γGt+1∣s]
这时,聪明的同学开始提问了:“那期望怎么算呢?你不可能穷尽所有可能吧。”那是当然,要是我所有可能性都包含了,问题就迎刃而解,还需要什么建模呀!同学:“那该怎么办?”
其中一个解决方法就是模拟。发现当数据量足够大时,V’(s)就无限接近真正的V(s)。
求解V(s)
还要另一种解决方式就是数学求解。我们首先将V(s)写成矩阵形式。
R,
γ
\gamma
γ, P已知,求V就很好求了。
但这里还有一个问题就是矩阵求逆的时间复杂度为
O
(
n
3
)
O(n^3)
O(n3),怎么做还能降低复杂度呢?
前面我们知道当样本足够大的时候,
V
k
=
V
k
+
1
V_k=V_{k+1}
Vk=Vk+1。那可不可以利用这一点呢?答案是当然可以。具体流程如下:
代码实现如下:
import torch
# 初始化 V R P
gamma = 0.5
N = 5
V = torch.zeros(N)
R = torch.Tensor([1, 0, 0, 0, 5])
P = torch.Tensor([[0.6, 0.4, 0, 0, 0],
[0.4, 0.2, 0.4, 0, 0],
[0, 0.4, 0.2, 0.4, 0],
[0, 0, 0.4, 0.2, 0.4],
[0, 0, 0, 0.4, 0.6]])
# 更新V
for k in track: # track为不定长张量 k[0]=[1, 1, 1, 1, 0]
r_future = 0
for i in range(1, len(k)):
r_future += P[i-1, k[i]]*V[k[i]]
V[k[0]] = R[k[0]]+gamma*r_future
选择最佳策略
我们学会了如何定义Value Function,对每一种策略我们都会得到一个
V
π
(
s
)
V^{\pi}(s)
Vπ(s),使
V
π
(
s
)
V^{\pi}(s)
Vπ(s)达到最大的
π
(
s
)
\pi(s)
π(s)就是我的最佳策略。
π
∗
(
s
)
=
arg
max
π
V
π
(
s
)
\pi^*(s) = \arg \max_\pi V^{\pi}(s)
π∗(s)=argπmaxVπ(s)
要得到这个最佳
π
∗
(
s
)
\pi^*(s)
π∗(s),最简单的方法就是穷举,幸亏这并不是一个NP问题(最多需要枚举
∣
A
∣
∣
S
∣
|A|^{|S|}
∣A∣∣S∣次),对于状态少且选择少的问题来说,这不免是一个很好的解决方案。对于大规模问题而言,复杂度太高,需要另寻它法。
迭代通常比枚举的复杂度更低,因此我们将会尝试使用迭代解决。要使用迭代的话,那状态必然不可能是随机的,状态集合会呈现一些特点,将这些特点加以利用尝试解决。因此,我们初步定下的流程是:
初始化使用random函数,
V
(
s
)
V(s)
V(s)也知道如何求解,当务之急是应该如何更新
π
(
s
)
\pi(s)
π(s)。怎么样才能让
V
(
s
)
V(s)
V(s)呈现单调递增呢?
Policy Improvement
定义一个
Q
Q
Q,代表在s状态下采取a行动所获得的收益。
Q
π
i
(
s
,
a
)
=
R
(
s
,
a
)
+
γ
∑
P
(
s
′
∣
s
,
a
)
V
π
i
(
s
′
)
π
i
+
1
(
s
)
=
arg
max
a
Q
π
i
(
s
,
a
)
Q^{\pi_i}(s, a) = R(s, a)+\gamma\sum P(s'|s, a)V^{\pi_i}(s')\\ \pi_{i+1}(s)=\arg\max_a Q^{\pi_i}(s, a)
Qπi(s,a)=R(s,a)+γ∑P(s′∣s,a)Vπi(s′)πi+1(s)=argamaxQπi(s,a)
其中
π
i
+
1
(
s
)
\pi_{i+1}(s)
πi+1(s)便是更新后的策略。
好了,我们来总结一下这个算法的流程:
如果还有什么不懂的,欢迎私信或评论。