赞
踩
搞科研、学习强化学习,重要在于知其然,然后知其所以然。
能够搞清楚,怎么实现强化学习,看源码 看论文其实就可以做到。
但是要真正的抓住核心部分的知识,还是要多做自己的仿真实验,然后认认真真的多看论文。
本系列文章,主要是针对当前主流深度强化学习的各种算法和Trick,分析其背后的原理,从而帮助你改进算法,更适应自己的环境。希望对大家有多帮助。
另外,我会将所有的文章及所做的一些简单项目,放在我的个人网页上。
水平有限,可能有理解不到位的地方,希望大家主动沟通交流。
邮箱:zachary2wave@163.com
整个强化学习的学习过程是一个通过与环境交互中进行学习,寻优的过程。随着环境给出的reward 不断调整自身的从而得到最大的reward。值函数方法是强化学习算法中的一大门类。
首先还是强调一下强化学习基础知识, 任何强化学习算法都需要去估算一个agent所处的状态和动作有多好,即估计值函数 动作值函数。值函数评估当前状态的好坏,动作值函数评估当前状态下做出该动作之后的好坏:
v
π
(
s
)
≐
E
π
[
G
t
∣
S
t
=
s
]
=
E
π
[
∑
k
=
0
∞
γ
k
R
t
+
k
+
1
∣
S
t
=
s
]
,
for all
s
∈
S
v_{\pi}(s) \doteq \mathbb{E}_{\pi}\left[G_{t} | S_{t}=s\right]=\mathbb{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^{k} R_{t+k+1} | S_{t}=s\right], \text { for all } s \in \mathcal{S}
vπ(s)≐Eπ[Gt∣St=s]=Eπ[k=0∑∞γkRt+k+1∣St=s], for all s∈S
q
π
(
s
,
a
)
≐
E
π
[
G
t
∣
S
t
=
s
,
A
t
=
a
]
=
E
π
[
∑
k
=
0
∞
γ
k
R
t
+
k
+
1
∣
S
t
=
s
,
A
t
=
a
]
q_{\pi}(s, a) \doteq \mathbb{E}_{\pi}\left[G_{t} | S_{t}=s, A_{t}=a\right]=\mathbb{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^{k} R_{t+k+1} | S_{t}=s, A_{t}=a\right]
qπ(s,a)≐Eπ[Gt∣St=s,At=a]=Eπ[k=0∑∞γkRt+k+1∣St=s,At=a]
根据bellman方程:
v
π
(
s
)
≐
E
π
[
G
t
∣
S
t
=
s
]
=
E
π
[
R
t
+
1
+
γ
G
t
+
1
∣
S
t
=
s
]
=
∑
a
π
(
a
∣
s
)
∑
s
′
∑
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
s
,
a
+
γ
E
π
[
G
t
+
1
∣
S
t
+
1
=
s
′
]
]
=
∑
a
π
(
a
∣
s
)
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
s
,
a
+
γ
v
π
(
s
′
)
]
,
for all
s
∈
S
公式解读:
从这个状态到下一个状态,首先根据策略
π
\pi
π 来选择动作 ,然后以一定的概率到达下一个状态,
所以对应第二步 到 第三步 为 策略
π
\pi
π 每一个动作的概率 乘以该动作之后的所有可能到达状态概率 再乘 $R_{t+1}+\gamma G_{t+1} $ 。
然而 此时
r
s
,
a
r_{s,a}
rs,a是确定的,但是
G
t
+
1
G_{t+1}
Gt+1 是不确定的 ,所以 还需要对
G
t
+
1
G_{t+1}
Gt+1 继续求期望,也就是下一步的值函数。
q
π
(
s
,
a
)
≐
E
π
[
G
t
∣
S
t
=
s
,
A
t
=
a
]
=
E
π
[
R
t
+
1
+
γ
G
t
+
1
∣
S
t
=
s
,
A
t
=
a
]
=
∑
s
′
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
v
π
(
s
′
)
]
=
∑
s
′
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
∑
a
′
π
(
a
′
∣
s
′
)
q
π
(
s
′
,
a
′
)
]
公式解读:
与上一个类似,但是此时已经选择好了动作
a
a
a,所以直接省去策略
π
\pi
π 的概率。这里用到了
V
V
V和
Q
Q
Q的关系
V
(
s
)
=
∑
π
(
a
∣
s
)
∗
Q
(
s
,
a
)
V(s)=\sum \pi(a | s) * Q(s, a)
V(s)=∑π(a∣s)∗Q(s,a)
Q
(
s
,
a
)
=
∑
P
(
s
′
,
r
∣
s
,
a
)
∗
(
r
+
γ
V
(
s
′
)
)
{Q(s, a)=\sum P\left(s^{\prime}, r | s, a\right) *\left(r+\gamma V\left(s^{\prime}\right)\right)}
Q(s,a)=∑P(s′,r∣s,a)∗(r+γV(s′))
bellman方程说明当前状态的值函数可以用下一个时刻所有的值函数来表示。然后进行迭代求解。可以看出值函数与策略息息相关,其实值函数就是去描述策略的好坏的。所以最优的策略的目的就是使得值函数能够达到最大。
针对公式3,一个最优的策略一定是将当前状态下的最优动作选择出来,也就是
V
(
s
)
=
max
a
Q
π
∗
(
s
,
a
)
=
max
a
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
v
∗
(
s
′
)
]
V(s)=\mathop {\max }\limits_a Q_{\pi*}(s, a)=\max _{a} \sum_{s^{\prime}, r} p\left(s^{\prime}, r | s, a\right)\left[r+\gamma v_{*}\left(s^{\prime}\right)\right]
V(s)=amaxQπ∗(s,a)=amaxs′,r∑p(s′,r∣s,a)[r+γv∗(s′)]
同理
q
∗
(
s
,
a
)
=
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
max
a
′
q
∗
(
s
′
,
a
′
)
]
q_{*}(s, a) =\sum_{s^{\prime}, r} p\left(s^{\prime}, r | s, a\right)\left[r+\gamma \max _{a^{\prime}} q_{*}\left(s^{\prime}, a^{\prime}\right)\right]
q∗(s,a)=s′,r∑p(s′,r∣s,a)[r+γa′maxq∗(s′,a′)]
其实对比5、6式与bellman 方程之间的差距就是一个
π
\pi
π ,
π
\pi
π 总可以使得下一步的最大的
q
q
q 选择出来。
然而最优策略的主要原因在于没有办法知道最优的值函数 和 动作值函数。
目前,解决该问题主要有三种算法动态规划、蒙特卡洛、TD差分方法。
动态规划方法中,假设我们已经知道了所有的转移概率 p p p和每个情况下的r,那么根据值函数的bellman等式,我们把一个固定的策略代入之后,通过迭代的方式就可以求出该策略下的值函数。这个过程叫做策略估计。
算法如下:
随机初始化 V ( s ) V(s) V(s)
循环:
令 Δ \Delta Δ=0
循环:
v
←
V
(
s
)
V
(
s
)
←
∑
a
π
(
a
∣
s
)
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
V
(
s
′
)
]
Δ
←
max
(
Δ
,
∣
v
−
V
(
s
)
∣
)
结束循环 当 Δ < θ \Delta<\theta Δ<θ
这样我们已经知道该策略下准确的值函数,根据公式(4)自然可以根据当前值函数 计算出 动作状态值函数 q q q 。此时如果我们发现存在动作a使得 q π ( s , a ) ≥ v π ( s ) q_{\pi}\left(s, a\right) \geq v_{\pi}(s) qπ(s,a)≥vπ(s) 那么就说明 该动作至少比原来用策略 π \pi π时选择的动作的期望要好。所以可以改变策略 π \pi π使得其更好。这个过程叫做策略提升。
结合整个过程 ,就是动态规划方法。
然而实际上,上述方法必须已经得到所有状态下,所有动作的奖励值 才能计算更新的值函数,然而往往这是做不到的。因为复杂度太高 要完成很多次才可以采到,所以将原来迭代求解值函数的公式改变为:
V
(
s
)
←
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
π
(
s
)
)
[
r
+
γ
V
(
s
′
)
]
V(s) \leftarrow \sum_{s^{\prime}, r} p\left(s^{\prime}, r | s, \pi(s)\right)\left[r+\gamma V\left(s^{\prime}\right)\right]
V(s)←s′,r∑p(s′,r∣s,π(s))[r+γV(s′)]
总结之后 就可以得到:
可以看出的是 该算法是一个确定性的策略,也就是说 每个状态下,只能选择固定的动作,同样在更新的时候依旧是选择最好的动作进行更新。
动态规划算法,可以非常有效的进行求解马尔科夫决策过程,但是往往我们需要所有的状态转移概率。这个实际上是不满足的,比如说两个人下围棋,我下一个子之后,我并不知道对手下在哪里。同样,如果在控制机器人手臂抓握东西的时候,我们虽然知道了控制哪个关节转动了30度,但是我们要建模手臂动了之后所抓握的东西变成什么样是一件非常困难的事情。
这样我们就需要model-free的算法。也就是,如果我们不知道系统的模型是什么样的时候,我们怎么求解这个问题。
首先,直接观察强化学习的目标,如果 我们已经可以估计得到公式(1)、(2)的期望的 G t G_t Gt,那么直接用这个期望的 G t G_t Gt来计算值函数就可以了。蒙特卡洛算法的思路是直接根据采用了平均采样汇报来估算值函数、动作值函数的方法。直接上算法:
初始化策略 π \pi π和值函数 V V V;
循环:
利用策略 π \pi π 与环境交互,这样可以得到 K个轨迹 ,每个轨迹都可以表示为: S 0 , A 0 , S 1 , A 1 , S 2 , A 2 , S 3 , A 3 , … , S T , A T S_0,A_0,S_1,A_1,S_2,A_2,S_3,A_3,…,S_T,A_T S0,A0,S1,A1,S2,A2,S3,A3,…,ST,AT;
令G=0;
循环每一个轨迹,从T ->T-1 ->……>1:
直接计算 G = γ G + R t + 1 G=\gamma G+R_{t+1} G=γG+Rt+1
算法一(first-visit Monte Carlo estimating V V V):如果 S t S_t St第一次出现,那么令 V ( S t ) = G V(S_t)=G V(St)=G
算法二(every-visit Monte Carlo estimating V V V):每当 S t S_t St出现,则记录 G G G。 当所有循环结束 令 V ( S t ) = m e a n ( G ) V(S_t)=mean(G) V(St)=mean(G)。
算法三(every-visit Monte Carlo estimating G G G):每当 S t , A t S_t,A_t St,At出现,则记录 G G G。 当所有循环结束 令 G ( S t , A t ) = m e a n ( G ) G(S_t,A_t)=mean(G) G(St,At)=mean(G)。
更新策略:
π ( s ) ≐ arg max a q ( s , a ) \pi(s) \doteq \arg \max _{a} q(s, a) π(s)≐argmaxaq(s,a)(贪婪策略)
上述算法中,算法一、算法二已经渐渐被算法三替代。
主要原因是首先从本质上来讲,如果不知道转移概率,单纯估计状态值函数是一件误差很大的事儿。
这个道理很简单,对比 V V V函数和 Q Q Q函数的bellman方程,可以看出的 V V V函数估计受到了策略估计影响要大于 Q Q Q函数的,在所有的reward都是没有误差的状态下,从状态 S t S_t St到下一步 S t + 1 S_{t+1} St+1, 这个 S t + 1 S_{t+1} St+1 可能有很多种,因为不确定动作,也不确定转移概率,所以就是经过了2次随机。但是在有限次的采样中,很难反应出来。但是我们都对其平均了,也就是让其转移概率都近似于一致。但是如果确定了动作状态对,那么就相当于取消了一次不确定的动作。但是如果采用了确定性策略,也就是每当达到状态 S t S_t St的时候,一定做出动作 A t A_t At,那么这个时候 V V V和 Q Q Q其实是一样的,也就没什么区别了。
其实TD算法其实与蒙特卡洛类似,面对的是没有办法拿到转移概率的时候的强化学习问题。 那么在这个问题下,假如环境没有终点,可以一直无限的运行下去,那么蒙特卡洛算法就显出了局限性。其次,蒙特卡洛算法采样效率更低,具体对比请看第二篇博文。所以我们想找到一个样本利用率更高的算法。
假如说,在与环境交互的时候,每次到达状态
S
t
S_{t}
St之后,已知了该状态下的损失奖励值估计值
G
t
G_t
Gt,那么更新其值函数
V
(
S
t
)
V\left(S_{t}\right)
V(St)可以用下式来表示:
V
(
S
t
)
←
V
(
S
t
)
+
α
[
G
t
−
V
(
S
t
)
]
V\left(S_{t}\right) \leftarrow V\left(S_{t}\right)+\alpha\left[G_{t}-V\left(S_{t}\right)\right]
V(St)←V(St)+α[Gt−V(St)]
根据上式,即使损失奖励值估计值
G
t
G_t
Gt 每次都不是那么准确的时候或者存在噪声的时候,始终可以使得该值函数收敛。但是上式中,始终存在一些问题,因为损失奖励值估计值
G
t
G_t
Gt 是比较难估计的。所以更近一步,如果我们利用bellman方程的第二步,即已有的值函数去代替原来的损失奖励值估计值
G
t
G_t
Gt 。这样就可以进行循环的迭代,从而得到下式:
V
(
S
t
)
←
V
(
S
t
)
+
α
[
R
t
+
1
+
γ
V
(
S
t
+
1
)
−
V
(
S
t
)
]
V\left(S_{t}\right) \leftarrow V\left(S_{t}\right)+\alpha\left[R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_{t}\right)\right]
V(St)←V(St)+α[Rt+1+γV(St+1)−V(St)]
根据上式来更新的算法叫做TD(0)算法。
初始化策略 π \pi π和值函数 V V V;
循环:
根据策略 π \pi π 选择状态 S S S下的动作 A A A,并执行该动作 A A A。
从环境得到奖励 R R R, S ′ S' S′。
根据该样本更新值函数 V ( S t ) ← V ( S t ) + α [ R t + 1 + γ V ( S t + 1 ) − V ( S t ) ] V\left(S_{t}\right) \leftarrow V\left(S_{t}\right)+\alpha\left[R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_{t}\right)\right] V(St)←V(St)+α[Rt+1+γV(St+1)−V(St)]
更新策略:
π
(
s
)
≐
arg
max
a
q
(
s
,
a
)
\pi(s) \doteq \arg \max _{a} q(s, a)
π(s)≐argmaxaq(s,a) (贪婪策略)
结束循环直到 V ( S t ) V\left(S_{t}\right) V(St) 不在变化。
在这个算法的基础上,又演化出了一系列的算法,包括著名的Q-learning算法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。