前言
我们在强化学习实践(2)中学到了Q-learning每一步的首选通过ε -Greedy method得到在当前步
s
t
s_t
st的动作
a
t
a_t
at然后利用以下公式进行Q值更新
Q
(
s
,
a
)
=
(
1
−
a
)
⋅
Q
(
s
t
,
a
t
)
+
a
⋅
(
R
(
s
,
a
)
+
γ
⋅
m
a
x
a
t
+
1
{
Q
(
s
t
+
1
,
a
t
+
1
)
}
)
Q(s,a)=(1-a) \cdot Q(s_t,a_t)+a \cdot (R(s,a)+\gamma\cdot max_{a_{t+1}} \left \{Q(s_{t+1},a_{t+1})\right \})
Q(s,a)=(1−a)⋅Q(st,at)+a⋅(R(s,a)+γ⋅maxat+1{Q(st+1,at+1)})
将上式进行简单的变形,就可以得到下面这个式子
Q
(
s
,
a
)
=
Q
(
s
t
,
a
t
)
+
a
⋅
[
R
(
s
,
a
)
+
γ
⋅
m
a
x
a
t
+
1
{
Q
(
s
t
+
1
,
a
t
+
1
)
}
⏞
Q现实
−
Q
(
s
t
,
a
t
)
⏟
Q估计
]
Q(s,a)=Q(s_t,a_t)+a \cdot[ \overbrace {R(s,a)+\gamma\cdot max_{a_{t+1}} \left \{Q(s_{t+1},a_{t+1})\right \} }^{\text{Q现实}}-\underbrace{Q(s_t,a_t)}_{\text{Q估计}}]
Q(s,a)=Q(st,at)+a⋅[R(s,a)+γ⋅maxat+1{Q(st+1,at+1)}
Q现实−Q估计
Q(st,at)]
也就是说,每一次更新,会计算下一个状态 s t + 1 s_{t+1} st+1的最佳Q值,构成Q现实,然后和Q估计(也就是之前的Q值)相减得到更新增量。但是在下一个状态 s t + 1 s_{t+1} st+1中,由于我们使用的是ε -Greedy (也就是有ε的概率随机选取一个动作,1-ε的概率选择Q值最大的动作),所以我们不一定选择上一个状态 s t s_{t} st的Q现实中选择的 a t + 1 a_{t+1} at+1。
SARSA
S A R S A SARSA SARSA五个字母是当前 S S S (状态), A A A(行动), R R R(奖励) 与 下一步 S ′ S' S′(状态) A ′ A' A′(行动) 的组合,即我们不仅需要知道当前的 S , A , R S,A,R S,A,R 还需要知道下一步的 S ′ S' S′ 和 A ′ A' A′。1
S
A
R
S
A
SARSA
SARSA和
Q
−
l
e
a
r
n
i
n
g
Q-learning
Q−learning的算法十分相似,只是在更新公式上不同
S
A
R
S
A
:
Q
(
s
,
a
)
=
(
1
−
a
)
⋅
Q
(
s
t
,
a
t
)
+
a
⋅
(
R
(
s
,
a
)
+
γ
⋅
Q
(
s
t
+
1
,
a
t
+
1
)
)
SARSA:Q(s,a)=(1-a) \cdot Q(s_t,a_t)+a \cdot (R(s,a)+\gamma\cdot Q(s_{t+1},a_{t+1}))
SARSA:Q(s,a)=(1−a)⋅Q(st,at)+a⋅(R(s,a)+γ⋅Q(st+1,at+1))
Q
−
l
e
a
r
n
i
n
g
:
Q
(
s
,
a
)
=
(
1
−
a
)
⋅
Q
(
s
t
,
a
t
)
+
a
⋅
(
R
(
s
,
a
)
+
γ
⋅
m
a
x
a
t
+
1
{
Q
(
s
t
+
1
,
a
t
+
1
)
}
)
Q-learning:Q(s,a)=(1-a) \cdot Q(s_t,a_t)+a \cdot (R(s,a)+\gamma\cdot max_{a_{t+1}} \left \{Q(s_{t+1},a_{t+1})\right \})
Q−learning:Q(s,a)=(1−a)⋅Q(st,at)+a⋅(R(s,a)+γ⋅maxat+1{Q(st+1,at+1)})
这公式上的不同也使得SARSA是 同策略(On Policy) 的算法,因为他是在行动中学习的,而且至始至终只有一个Policy. 使用了两次greedy-epsilon 方法来选择出了Q(S,A)和q(S’,A’)
而Q learning **异策略Off Policy)**的算法,QLearning选择Q(S,A)用了greedy方法,而计算A(S’,A’)时用的是max方法,而真正选择的时候又不一定会选择max的行动, 所以 Q learning 学习和行动分别采用了两套不同的Policy2
SARSA算法:
- 给定参数 γ \gamma γ和reward矩阵R(或reward-fuction,给定 a ∣ s a|s a∣s得到reward)以及学习率 a a a(注: 关于学习率设定,有的资料会考虑历史学习的结果,即学习率小于1;也有的资料并未考虑历史学习的结果,相当于学习率设置为1)
- 令Q表为0或者随机分布
- Repet(for each episode):
- Initialize
s
s
s
- Repeat (for each step of episode):
- Choose possible a a a from s s s use policy deriverd from Q Q Q (e.g. ,ε贪婪方法(ε -Greedy method) )
- Take action a a a,get observe r r r, s ′ s' s′
- Choose possible a ′ a' a′ from s ′ s' s′ use policy deriverd from Q Q Q (e.g. ,ε贪婪方法(ε -Greedy method) )
- Q ( s , a ) = ( 1 − a ) ⋅ Q ( s t , a t ) + a ⋅ ( R ( s , a ) + γ ⋅ Q ( s t + 1 , a t + 1 ) ) Q(s,a)=(1-a) \cdot Q(s_t,a_t)+a \cdot (R(s,a)+\gamma\cdot Q(s_{t+1},a_{t+1})) Q(s,a)=(1−a)⋅Q(st,at)+a⋅(R(s,a)+γ⋅Q(st+1,at+1))
- s ← s t + 1 , a ← a t + 1 s \leftarrow s_{t+1},a\leftarrow a_{t+1} s←st+1,a←at+1
- until s s s is terminal
- Repeat (for each step of episode):
SARSA(lambda)
上面我们说到的SARSA是单步更新的RL算法,每次走一步,更新一次Q值,这种单步更新在一开始没有找到宝藏得到reward的时候,虽然有执行Q值更新,但是实际上都是为0,只有在找到宝藏的时候,找到宝藏的前一步Q值被更新。我们之前讲过RL分为单步更新和回合更新,想一想,如果在找到宝藏的时候,对所有之前走过的路程Q值都予以更新,使得他们更加容易被选择,岂不美哉。但是,这样其实也有不足,因为若寻宝过程中因为信息不足园地绕圈,那么会学习到错误的Q值,所以SARSA(lambda)就应运而生。
此处的 λ \lambda λ和之前计算Q现实时,对下个状态的Q值进行衰减的目的相似,使得越靠近宝藏的步骤Q值更新的幅度更大。
Sarsa(lambda)算法中多了一个矩阵E (eligibility trace),它是用来保存在路径中所经历的每一步
SARSA(lambda)算法:
- 给定参数 γ \gamma γ和reward矩阵R(或reward-fuction,给定 a ∣ s a|s a∣s得到reward)以及学习率 a a a(注: 关于学习率设定,有的资料会考虑历史学习的结果,即学习率小于1;也有的资料并未考虑历史学习的结果,相当于学习率设置为1)
- 令Q表为0或者随机分布
- Repet(for each episode):
- E ( s , a ) = 0 , for all s ∈ S , a ∈ A ( s ) E(s,a)=0,\text{for all s} \in S,a \in A(s) E(s,a)=0,for all s∈S,a∈A(s)
- Initialize
s
s
s
- Repeat (for each step of episode):
- Choose possible a a a from s s s use policy deriverd from Q Q Q (e.g. ,ε贪婪方法(ε -Greedy method) )
- Take action a a a,get observe r r r, s ′ s' s′
- Choose possible a ′ a' a′ from s ′ s' s′ use policy deriverd from Q Q Q (e.g. ,ε贪婪方法(ε -Greedy method) )
- δ = R ( s , a ) + γ ⋅ Q ( s t + 1 , a t + 1 ) − Q ( s t , a t ) \delta =R(s,a)+\gamma\cdot Q(s_{t+1},a_{t+1})-Q(s_t,a_t) δ=R(s,a)+γ⋅Q(st+1,at+1)−Q(st,at)
- E ( s , a ) = E ( s , a ) + 1 E(s,a)=E(s,a)+1 E(s,a)=E(s,a)+1
-
for all s
∈
S
,
a
∈
A
(
s
)
:
\text{for all s} \in S,a \in A(s):
for all s∈S,a∈A(s):
- Q ( s , a ) ← Q ( s , a ) + a δ E ( s , a ) Q(s,a)\leftarrow Q(s,a)+a \delta E(s,a) Q(s,a)←Q(s,a)+aδE(s,a)
- E ( s , a ) ← γ λ E ( s , a ) E(s,a) \leftarrow \gamma \lambda E(s,a) E(s,a)←γλE(s,a)
- s ← s t + 1 , a ← a t + 1 s \leftarrow s_{t+1},a\leftarrow a_{t+1} s←st+1,a←at+1
- until s s s is terminal
- Repeat (for each step of episode):
这里的
E
E
E在每一步都会被
γ
λ
\gamma\lambda
γλ衰减:
E
(
s
,
a
)
←
γ
λ
E
(
s
,
a
)
E(s,a) \leftarrow \gamma \lambda E(s,a)
E(s,a)←γλE(s,a)
单步实时跟新之前每一步的Q值,这加快了学习速度。
Code
环境和之前的一样