在强化学习的算法中,有两大类算法,一类是基于策略的,一类是基于价值的,而
R
E
I
N
F
O
C
E
REINFOCE
REINFOCE就是典型的基于策略的算法。
那什么叫作基于策略呢,为什么强化学习又要分成这两种算法呢?
简单来说,强化学习的最终目的是让 a g e n t agent agent能够获得足够大的 r e w a r d reward reward。那么我们为了让 a g e n t agent agent获得最大的 r e w a r d reward reward,我们就要去找到好的策略,因为基于好的策略所选出来的动作是可以得到较大的 r e w a r d reward reward的,这就是基于策略的强化学习算法的含义。
而基于价值的强化学习算法则是通过评估从当前状态开始往后有可能得到的 r e w a r d reward reward从而得到一个状态价值函数的值 V ( s t ) V(s_t) V(st)或者 Q ( s t , a t ) Q(s_t,a_t) Q(st,at)。(这里的下标t表示的就是当前时刻的状态和当前时刻的动作)接着我们会想办法让我们得到的评估越来越准,并且当我们的评估越来越准之后,我们就会根据评估的值去选择在某一个状态的动作。
我们将一场游戏称为一个回合,将这个游戏里面得到奖励都进行相加,那么得到就是这一场游戏的总奖励,我们定义为 R R R。
同时,我们将环境输出的
s
s
s与我们这个
a
c
t
o
r
actor
actor(也就是
a
g
e
n
t
agent
agent)所采取的动作
a
a
a全部都组合起来。那么我们就可以得到下面的这个集合
τ
=
{
s
1
,
a
1
,
s
2
,
a
2
.
.
.
.
.
.
s
t
,
a
t
}
\tau =\{s_1,a_1,s_2,a_2......s_t,a_t\}
τ={s1,a1,s2,a2......st,at}
其中字母
τ
\tau
τ代表是一个完整的游戏回合。
再假设我们现在给定了 a c t o r actor actor(即 a g e n t agent agent)的参数 θ \theta θ,那我们就可以算出发生一个完整的回合的概率:
p
θ
(
τ
)
=
p
(
s
1
)
p
θ
(
a
1
∣
s
1
)
p
(
s
2
∣
s
1
,
a
1
)
p
θ
(
a
2
∣
s
2
)
p
(
s
3
∣
s
2
,
s
2
)
.
.
.
=
p
(
s
1
)
∏
t
=
1
T
p
θ
(
a
t
∣
s
t
)
p
(
s
t
+
1
∣
s
t
,
a
t
)
\begin{aligned} p_\theta(\tau) &=p(s_1)p_\theta(a_1|s_1)p(s_2|s_1,a_1)p_\theta(a_2|s_2)p(s_3|s_2,s_2)...\\&=p(s_1)\prod_{t=1}^{T}p_\theta(a_t|s_t)p(s_{t+1} |s_t,a_t) \end{aligned}
pθ(τ)=p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)p(s3∣s2,s2)...=p(s1)t=1∏Tpθ(at∣st)p(st+1∣st,at)
于此同时,我们定义在某个回合中得到的奖励为
R
(
τ
)
R(\tau)
R(τ),这个值就代表了在回合
τ
\tau
τ中所取得的奖励。但是有一个问题,这个
τ
\tau
τ虽然是某个回合全部结束后得到的所有奖励,但是这个
τ
\tau
τ并不可以简单的理解为一个标量,而是应该理解为一个随机变量。
为什么要这么理解?因为当我们去玩一个游戏时,我们会玩非常多的回合,而我们每个回合得到的奖励都会差的很多,那么如果我们只把某一此回合的结果当作这一个游戏带给我们的奖励,就会有非常大的误差。所以我们选择将
R
(
τ
)
R(\tau)
R(τ)定义为一个随机变量,这个随机变量要用
τ
\tau
τ这条轨迹出现的概率去乘上这条轨迹返回的奖励来得到,这样我们算出来的就是玩这场游戏会获得的期望奖励,我们将期望奖励定义为
R
‾
(
θ
)
=
∑
τ
R
(
τ
)
p
θ
(
τ
)
\overline{R}(\theta)=\sum_{\tau}R(\tau) p_\theta(\tau)
R(θ)=τ∑R(τ)pθ(τ)
其中
p
θ
(
τ
)
p_\theta(\tau)
pθ(τ)表示我们玩游戏的时候刚好玩到
τ
\tau
τ这个回合的概率。那么现在我们的奖励
R
‾
θ
\overline{R}_\theta
Rθ就表示成了一个带参数
θ
\theta
θ的随机变量,我们想要我们得到的奖励最大,我们就可以对
R
‾
θ
\overline{R}_\theta
Rθ求导,并用梯度上升法求其最大值。
又因为这个式子里只有
p
θ
(
τ
)
p_\theta(\tau)
pθ(τ)是和参数
θ
\theta
θ有关系的,所以我们对
R
‾
θ
\overline{R}_\theta
Rθ求导可以得到下列式子
∇
R
‾
θ
=
∑
τ
R
(
τ
)
∇
p
θ
(
τ
)
\nabla \overline{R}_\theta = \sum_{\tau}R(\tau)\nabla p_\theta(\tau)
∇Rθ=τ∑R(τ)∇pθ(τ)
得到这个式子之后,我们想办法用
p
θ
(
τ
)
p_\theta(\tau)
pθ(τ)对
R
(
τ
)
R(\tau)
R(τ)进行加权,我们就可以得到下列的式子:
∇
R
‾
θ
=
∑
τ
R
(
τ
)
∇
p
θ
(
τ
)
=
∑
τ
R
(
τ
)
p
θ
(
τ
)
∇
p
θ
(
τ
)
p
θ
(
τ
)
=
∑
τ
R
(
τ
)
p
θ
(
τ
)
∇
log
p
θ
(
τ
)
=
E
τ
∼
p
θ
(
τ
)
[
R
(
τ
)
∇
log
p
θ
(
τ
)
]
\begin{aligned}\nabla \overline{R}_\theta &=\sum_\tau R(\tau)\nabla p_\theta(\tau)\\ &=\sum_\tau R(\tau)p_\theta(\tau)\frac{\nabla p_\theta(\tau)}{p_\theta(\tau)}\\ &=\sum_\tau R(\tau)p_\theta(\tau)\nabla \log p_\theta(\tau)\\ &=E_{\tau \sim p_\theta(\tau)}[R(\tau)\nabla\log p_\theta(\tau)] \end{aligned}
∇Rθ=τ∑R(τ)∇pθ(τ)=τ∑R(τ)pθ(τ)pθ(τ)∇pθ(τ)=τ∑R(τ)pθ(τ)∇logpθ(τ)=Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]
但我们可以发现这样直接去计算这个期望值是无法计算的,因为我们所采用的概率并不是后面这个式子的采样概率。所以如果我们现在想要得到中括号里这个式子的数学期望,我们就可以采取最笨但也是最没有误差的。我们利用采样的方式对该期望值进行估计:
E
τ
∼
p
θ
(
τ
)
[
R
(
τ
)
∇
log
p
θ
(
τ
)
]
≈
1
N
∑
n
=
1
N
R
(
τ
n
)
∇
log
p
θ
(
τ
n
)
=
1
N
∑
n
=
1
N
∑
t
=
1
T
R
(
t
n
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
\begin{aligned} E_{\tau \sim p_\theta(\tau)}[R(\tau)\nabla\log p_\theta(\tau)]&\approx\frac{1}{N}\sum_{n=1}^{N}R(\tau^{n})\nabla \log p_\theta(\tau^{n}) =\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T}R(t^{n})\nabla\log p_\theta(a_t^{n}|s_t^{n}) \end{aligned}
Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]≈N1n=1∑NR(τn)∇logpθ(τn)=N1n=1∑Nt=1∑TR(tn)∇logpθ(atn∣stn)
所以我们就可以用采样的方式来求得我们奖励的梯度:
∇
R
‾
θ
=
1
N
∑
n
=
1
N
∑
t
=
1
T
R
(
t
n
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
\nabla \overline{R}_\theta=\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T}R(t^{n})\nabla\log p_\theta(a_t^{n}|s_t^{n})
∇Rθ=N1n=1∑Nt=1∑TR(tn)∇logpθ(atn∣stn)
接着我们就可以用我们对奖励算出来的梯度更新我们的参数,也就是进行梯度上升。到了这里我们已经完成了最简单的 R E I N F O R C E REINFORCE REINFORCE的原理讲解,但是我们通常并不会这样去计算我们的梯度,因为这其中有些不合理的地方。
第一点,在我们的策略梯度法中,我们希望得到的情况是这样的,如果给定了 s s s采取了动作 a a a,并且得到了正的奖励,我们就要增加 ( s , a ) (s,a) (s,a)的概率。如果给定状态 s s s,采取了动作 a a a,整场游戏得到了负的奖励,我们就要减小在该状态采取 a a a的概率。这样看好像没有什么问题,但是如果一些游戏只有正的奖励呢?那么在玩这些只有正值奖励的游戏的时候,如果有一些动作在一整个回合都没有被采样到,这个动作的概率就会下降,因为其它所有采样的动作的概率都会上升,但是这个没有被采样到的动作并不意味着就是一个不好的动作。
所以我们会在我们的奖励上添加一个基线
b
b
b,只有整个回合得到的奖励大于这个基线,该动作的概率才会上升,用公式表示如下
∇
R
‾
θ
=
1
N
∑
n
=
1
N
∑
t
=
1
T
(
R
(
t
n
)
−
b
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
\nabla \overline{R}_\theta=\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T}(R(t^{n})-b)\nabla\log p_\theta(a_t^{n}|s_t^{n})
∇Rθ=N1n=1∑Nt=1∑T(R(tn)−b)∇logpθ(atn∣stn)
第二点,我们在给每个
(
s
,
a
)
(s,a)
(s,a)赋权重的时候是把这一整个回合的奖励都乘了上去,但其实这样是不合理的,因为很有可能所采取的动作明明是一个好的动作,但是因为这个回合所采取的其它动作导致最后整个奖励是一个负值,所以我们就会减少选取这个好的动作的概率。那么为了让奖励变得更合理,我们不再乘整个回合的奖励,我们将当前状态及其之后所得到的奖励作为
(
s
,
a
)
(s,a)
(s,a)的权重,用公式表示如下
∇
R
‾
θ
=
1
N
∑
n
=
1
N
∑
t
=
1
T
(
∑
t
′
=
t
T
γ
t
′
−
t
r
t
′
n
−
b
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
\nabla \overline{R}_\theta=\frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T}(\sum_{t^{'}=t}^{T}\gamma^{t^{'}-t} r_{t^{'}}^{n}-b)\nabla\log p_\theta(a_t^{n}|s_t^{n})
∇Rθ=N1n=1∑Nt=1∑T(t′=t∑Tγt′−trt′n−b)∇logpθ(atn∣stn)
其中
γ
t
′
−
t
r
t
′
n
\gamma^{t^{'}-t} r_{t^{'}}^{n}
γt′−trt′n表示从当前时刻开始到最后的奖励,
γ
\gamma
γ表示的是折扣奖励,意味着我们对后期奖励的重视程度,
γ
=
1
\gamma=1
γ=1代表我们认为长期奖励和当前奖励一样重要,当
γ
=
0
\gamma=0
γ=0时,我们认为当前奖励要远远比长期奖励重要,并且不考虑长期奖励(一般在实际中我们会将这个值设为0.9)
下图就是一个完整的
R
e
i
n
f
o
r
c
e
Reinforce
Reinforce算法的全部流程。
具体的代码可以看我的github(如果觉得代码复现的还不错的话请点一个star噢)