强化学习入门-2
2020.12.8
⊳ \rhd ⊳ 优化问题
上回书说到,我们需要解决以下优化问题:
V
π
(
s
)
=
∑
a
π
(
a
∣
s
)
(
R
(
s
,
a
)
+
γ
∑
s
′
(
P
(
s
′
∣
a
,
s
)
V
π
(
s
′
)
)
)
V_{ \pi }(s)=\sum_a \pi(a|s)(R(s,a)+\gamma\sum_{s'}(P(s'|a,s)V_{\pi}(s')))
Vπ(s)=a∑π(a∣s)(R(s,a)+γs′∑(P(s′∣a,s)Vπ(s′)))
Q
π
(
s
,
a
)
=
R
(
s
,
a
)
+
γ
∑
s
′
(
P
(
s
′
∣
a
,
s
)
V
π
(
s
′
)
)
Q_{ \pi }(s,a)=R(s,a)+\gamma\sum_{s'}(P(s'|a,s)V_{\pi}(s'))
Qπ(s,a)=R(s,a)+γs′∑(P(s′∣a,s)Vπ(s′))
m
a
x
(
V
π
(
s
)
)
max(V_{\pi}(s))
max(Vπ(s))
m
a
x
(
Q
π
(
s
,
a
)
)
max(Q_{\pi}(s,a))
max(Qπ(s,a))
再次强调,我们需要获得的,是一个在状态
s
i
s_i
si下如何能得到最大长期收益的选择策略
π
i
\pi_i
πi。
在此,简要的介绍问题的解决办法。
⊳ \rhd ⊳ Prediction 与Control
优化问题的解决中存在以下两类计算
其中,预测问题的目标是获得价值函数,控制问题的目标是选择最优策略。
⊳ \rhd ⊳ 动态规划(DP)
动态规划,即分步规划一个动态的问题。
策略迭代
其流程如下:
-
对策略进行随机初始化, V 0 = 0 V_0=0 V0=0
-
循环直到 收敛/策略无变化
1.evaluation:依托当前策略与价值,同步更新每个状态的价值函数
V π k + 1 ( s ) = ∑ a π ( a ∣ s ) ( R ( s , a ) + γ ∑ s ′ ( P ( s ′ ∣ a , s ) V π k ( s ′ ) ) ) V_{ \pi }^{k+1}(s)=\sum_a \pi(a|s)(R(s,a)+\gamma\sum_{s'}(P(s'|a,s)V_{\pi}^k(s'))) Vπk+1(s)=a∑π(a∣s)(R(s,a)+γs′∑(P(s′∣a,s)Vπk(s′)))
2.improvement:基于当前的状态价值,寻找最优策略
π k + 1 ( s ) = a r g m a x Q π ( s , a ) \pi^{k+1}(s)=arg maxQ_{\pi}(s,a) πk+1(s)=argmaxQπ(s,a)
注:- 递归中的更新思想源于马尔可夫特性,即当前时刻的变量或状态仅与上一时刻相关
- 模型一定收敛
价值迭代
无预假设,直接推导最优策略,迭代公式为:
V
k
+
1
(
s
)
=
m
a
x
(
R
(
s
,
a
)
+
γ
∑
s
′
(
P
(
s
′
∣
a
,
s
)
V
k
(
s
′
)
)
)
V^{k+1}(s)=max(R(s,a)+\gamma\sum_{s'}(P(s'|a,s)V^k(s')))
Vk+1(s)=max(R(s,a)+γs′∑(P(s′∣a,s)Vk(s′)))
是一个从结局反推导的过程
⊳ \rhd ⊳ 蒙特卡洛策略(MC)
动态规划适用于模型已知的情况,但在实际应用中,我们很难获得一个环境的全部信息,简而言之,我们算不出来价值期望。
实践出真知,这时就需要我们真正进入环境中来,通过实际体验积累经验(比如让算法亲自下场和你来一局五子棋),也就是通过采样积累数据平均,替代价值期望,推断模型信息,进行策略的优化选择。
在当前策略
π
\pi
π下每次采样从
s
0
s_0
s0出发,第i次采样结束后(下棋有一方获胜)可获得一个序列:
i
=
s
i
,
1
,
a
i
,
1
,
r
i
,
1
,
s
i
,
2
,
a
i
,
2
,
r
i
,
2
,
.
.
.
.
.
.
s
i
,
T
i
,
a
i
,
T
i
i=s_{i,1},a_{i,1},r_{i,1},s_{i,2},a_{i,2},r_{i,2},......s_{i,T_i},a_{i,T_i}
i=si,1,ai,1,ri,1,si,2,ai,2,ri,2,......si,Ti,ai,Ti由于游戏总会有个输赢,通常情况下序列不会是无限的。此时本次采样中,状态
s
t
s_t
st的回报为:
G
i
,
t
=
r
i
,
t
+
γ
r
i
,
t
+
1
+
γ
2
r
i
,
t
+
2
+
.
.
.
+
γ
T
i
−
1
r
i
,
T
i
G_{i,t}=r_{i,t}+\gamma r_{i,t+1}+\gamma^2 r_{i,t+2}+...+\gamma^ {T_i-1}r_{i,T_i}
Gi,t=ri,t+γri,t+1+γ2ri,t+2+...+γTi−1ri,Ti
称一次采样过程为一episode,在采样过程中,特定状态s可能出现多次,仅平均第一次访问到s获得的回报算法称为first-visit,平均所有回报的算法称为every-visit。
first-visit
算法流程如下:
-
初始化,N(s)=0,用于计数,G(s)=0, ∀ s ∈ S \forall s \in S ∀s∈S
-
循环(采样次数 i)
-
采样1 episode
-
计算 G i , t = r i , t + γ r i , t + 1 + γ 2 r i , t + 2 + . . . + γ T i − 1 r i , T i G_{i,t}=r_{i,t}+\gamma r_{i,t+1}+\gamma^2 r_{i,t+2}+...+\gamma^ {T_i-1}r_{i,T_i} Gi,t=ri,t+γri,t+1+γ2ri,t+2+...+γTi−1ri,Ti
-
循环(每个状态s)
-
当s第一次出现在本次采样序列中时:
- 更新累加次数 N ( s ) = N ( s ) + 1 N(s)=N(s)+1 N(s)=N(s)+1
- 更新经验回报 G ( s ) = G ( s ) + G i , t G(s)=G(s)+G_{i,t} G(s)=G(s)+Gi,t
- 更新策略估计 V π ( s ) = G ( s ) / N ( s ) V_{\pi}(s)=G(s)/N(s) Vπ(s)=G(s)/N(s)
-
-
every-visit
算法流程如下:
-
初始化,N(s)=0,用于计数,G(s)=0, ∀ s ∈ S \forall s \in S ∀s∈S
-
循环(采样次数 i)
-
采样1 episode
-
计算 G i , t = r i , t + γ r i , t + 1 + γ 2 r i , t + 2 + . . . + γ T i − 1 r i , T i G_{i,t}=r_{i,t}+\gamma r_{i,t+1}+\gamma^2 r_{i,t+2}+...+\gamma^ {T_i-1}r_{i,T_i} Gi,t=ri,t+γri,t+1+γ2ri,t+2+...+γTi−1ri,Ti
-
循环(每个状态s)
-
当s每一次出现在本次采样序列中时:
- 更新累加次数 N ( s ) = N ( s ) + 1 N(s)=N(s)+1 N(s)=N(s)+1
- 更新经验回报 G ( s ) = G ( s ) + G i , t G(s)=G(s)+G_{i,t} G(s)=G(s)+Gi,t
- 更新策略估计 V π ( s ) = G ( s ) / N ( s ) V_{\pi}(s)=G(s)/N(s) Vπ(s)=G(s)/N(s)
-
-
注:更新公式也可以省下储存G更新的空间,优化为:
总结:MC算法是对策略价值函数的无偏估计,同时存在以下问题
1.高方差,需要大量数据来降低
2.有些点难以到达,导致评估不够全面
3.每次采样都要采到结尾
⊳ \rhd ⊳ 时序差分(TD)
MC算法每次采样都要跑到结尾,非常的耗时耗力。在此,时序差分算法选择一种步步更新的策略。以此时与下一时刻的价值函数差分来近似代替蒙特卡洛中的完整价值。算法变为有偏估计过程,但免去了次次都要跑到结尾的复杂采样,同时兼具方差小易计算的好处,在实际中最为常用。
观察MC的更新方法,因为没跑到头所以没有总数可算,将计数N(s)替换为参数
α
∈
[
0
,
1
]
\alpha\in[0,1]
α∈[0,1],其更新方程为:
V
π
(
s
)
=
V
π
(
s
)
+
α
(
G
i
,
t
−
V
π
(
s
)
)
V^{\pi}(s)=V^{\pi}(s)+\alpha(G_{i,t}-V^{\pi}(s))
Vπ(s)=Vπ(s)+α(Gi,t−Vπ(s))
将此式展开,可表达为:
π
(
s
)
=
V
π
(
s
)
+
α
(
[
r
t
+
γ
V
π
(
s
t
+
1
)
]
i
−
V
π
(
s
)
)
^{\pi}(s)=V^{\pi}(s)+\alpha([r_t+\gamma V^{\pi}(s_{t+1})]_i-V^{\pi}(s))
π(s)=Vπ(s)+α([rt+γVπ(st+1)]i−Vπ(s))
简言之,时序差分的核心思想在于使用下一步或几步(时序)的状态价值来修正当前状态价值。个人理解,整个过程是一个从结局向前推导的过程,参考[4]中很详细的介绍了时序差分与MC的对比,与时序差分为什么能减小方差。
TD(0)
算法流程:
- 输入 α \alpha α,初始化 V π ( s ) = 0 , ∀ s ∈ S V^{\pi}(s)=0,\forall s \in S Vπ(s)=0,∀s∈S
- 循环
- 采样 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)
- 更新
V π ( s t ) = V π ( s t ) + α ( [ r t + γ V π ( s t + 1 ) ] i − V π ( s ) ) V^{\pi}(s_t)=V^{\pi}(s_t)+\alpha([r_t+\gamma V^{\pi}(s_{t+1})]_i-V^{\pi}(s)) Vπ(st)=Vπ(st)+α([rt+γVπ(st+1)]i−Vπ(s))
TD(n)
也就是好几步评估
- 输入 α \alpha α,初始化 V π ( s ) = 0 , ∀ s ∈ S V^{\pi}(s)=0,\forall s \in S Vπ(s)=0,∀s∈S
- 循环
- 采样
- 更新
V π ( s t ) = V π ( s t ) + α ( [ r t + γ r t + 1 + γ 2 r i + 2 + . . . + γ n V ( s t + n ) ] i − V π ( s ) ) V^{\pi}(s_t)=V^{\pi}(s_t)+\alpha([r_t+\gamma r_{t+1}+\gamma^2 r_{i+2}+...+\gamma^ {n}V(s_{t+n})]_i-V^{\pi}(s)) Vπ(st)=Vπ(st)+α([rt+γrt+1+γ2ri+2+...+γnV(st+n)]i−Vπ(s))
现在,我们解决了时序差分算法中的预测问题。在下篇记录中,解决时序差分的控制问题。
参考
[1]https://zhuanlan.zhihu.com/p/25319023
[2]https://blog.youkuaiyun.com/qq_39388410/article/details/88795124
[3]https://zhuanlan.zhihu.com/p/34395444
[4]https://www.cnblogs.com/pinard/p/9529828.html