Policy Gradient,策略梯度法是强化学习中的一种常用方法。
比较详细的推导可以看:https://datawhalechina.github.io/easy-rl/#/chapter4/chapter4?id=tips
文章目录
1. 定义强化学习的问题
强化学习由三个组件构成:Actor、Environment、Reward Function。
Actor 决定如何执行下一个动作;
Environment 就是电脑主机或者对手会根据Actor的动作产生变化;
Reward Function 会根据我们做的动作进行打分。
在强化学习里面 Environment 和 Reward Function 都是不可操作的,我们的目标就是调整Actor的策略(Policy)获得最大的奖励期望。
-
一场游戏叫做一个 回合(episode) 或者 试验(trial);
-
过程就是Env先初始化一个状态 s 1 s_1 s1,而后我们的Actor根据该初始状态做出动作;
-
产生一个Trajectory,我们用 τ \tau τ表示,如下:
τ = { 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}
2. Policy Network
我们使用神经网络来完成动作的选择,以打电动游戏为例子:
我们有策略网络来实现策略
π
\pi
π,网络的参数为
θ
\theta
θ,输入为游戏的图像,输出的我们的操作。
在一场游戏中(一个episode),我们的Actor可以与环境交互产生一个回合的记录序列 Trajectory:
τ
=
{
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
τ产生的概率为:
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
,
a
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,a_2)... \\ &=p(s_1)\prod_{t=1}^Tp_\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,a2)...=p(s1)t=1∏Tpθ(at∣st)p(st+1∣st,at)
每一个
τ
\tau
τ的总回报为:
R
(
τ
)
=
∑
t
=
1
T
r
t
R(\tau) = \sum_{t=1}^Tr_t
R(τ)=t=1∑Trt
我们的
τ
\tau
τ是利用Actor与环境互动产生的,在动作选择过程中存在很多随机性,环境本身也存在很多随机性,所以
R
(
τ
)
R(\tau)
R(τ)是一个随机变量(random variable)。
所以我们不能用
R
(
τ
)
R(\tau)
R(τ)评价一个策略网络
θ
\theta
θ的好坏,但是我们可以使用
R
(
τ
)
R(\tau)
R(τ)的期望评价:
E
[
R
(
τ
)
]
=
R
ˉ
(
τ
)
=
∑
τ
R
(
τ
)
p
θ
(
τ
)
=
E
τ
~
p
θ
(
τ
)
[
R
(
τ
)
]
\begin{aligned} E[R(\tau)] = \bar{R}(\tau) = \sum_\tau R(\tau)p_\theta(\tau) = E_{\tau~p_\theta(\tau) }[R(\tau)] \end{aligned}
E[R(τ)]=Rˉ(τ)=τ∑R(τ)pθ(τ)=Eτ~pθ(τ)[R(τ)]
因此我们的目标就是最大化(maximize)
R
ˉ
(
τ
)
\bar{R}(\tau)
Rˉ(τ),那么我们只需要朝着
R
ˉ
(
τ
)
\bar{R}(\tau)
Rˉ(τ)梯度上升的方向调整参数
θ
\theta
θ即可,
∇
R
ˉ
(
τ
)
=
∑
τ
R
(
τ
)
∇
p
θ
(
τ
)
=
∑
τ
R
(
τ
)
p
θ
(
τ
)
∇
p
θ
(
τ
)
p
θ
(
τ
)
=
∑
τ
R
(
τ
)
p
θ
(
τ
)
∇
l
o
g
p
θ
(
τ
)
=
E
τ
~
p
θ
(
τ
)
[
R
(
τ
)
∇
l
o
g
p
θ
(
τ
)
]
≈
1
N
∑
n
=
1
N
R
(
τ
)
∇
l
o
g
p
θ
(
τ
)
=
1
N
∑
n
=
1
N
∑
t
=
1
T
n
R
(
τ
n
)
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
\begin{aligned} \nabla\bar{R}(\tau) &= \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~p_\theta(\tau) }[R(\tau) \nabla log p_\theta(\tau) ] \\ & \approx \frac1N \sum_{n=1}^N R(\tau) \nabla log p_\theta(\tau) \\ &= \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} R(\tau^n) \nabla log p_\theta(a_t^n|s_t^n) \end{aligned}
∇Rˉ(τ)=τ∑R(τ)∇pθ(τ)=τ∑R(τ)pθ(τ)pθ(τ)∇pθ(τ)=τ∑R(τ)pθ(τ)∇logpθ(τ)=Eτ~pθ(τ)[R(τ)∇logpθ(τ)]≈N1n=1∑NR(τ)∇logpθ(τ)=N1n=1∑Nt=1∑TnR(τn)∇logpθ(atn∣stn)
直观理解这个梯度公式:我们知道在
s
t
s_t
st状态下执行了
a
t
a_t
at,如果最终的回报
R
(
τ
n
)
R(\tau^n)
R(τn)是好的,那么就增加
(
s
t
∣
a
t
)
( s_t| a_t)
(st∣at)的选择概率,否则减少。
3. Policy Network 训练过程如下:
- 先初始化一个策略网络 θ \theta θ
- 用这个策略网络进行
N
N
N次游戏,产生
N
N
N个
τ
\tau
τ(游戏记录):
τ 1 : { s 1 1 , a 1 1 , s 2 1 , a 2 1 , . . . } , R ( τ 1 ) τ 2 : { s 1 2 , a 1 2 , s 2 2 , a 2 2 , . . . } , R ( τ 2 ) . . . τ N : { s 1 N , a 1 N , s 2 N , a 2 N , . . . } , R ( τ N ) \tau^1: \{s_1^1, a_1^1, s_2^1, a_2^1, ... \}, R(\tau^1) \\ \tau^2: \{s_1^2, a_1^2, s_2^2, a_2^2, ... \}, R(\tau^2) \\ ... \\ \tau^N: \{s_1^N, a_1^N, s_2^N, a_2^N, ... \}, R(\tau^N) \\ τ1:{s11,a11,s21,a21,...},R(τ1)τ2:{s12,a12,s22,a22,...},R(τ2)...τN:{s1N,a1N,s2N,a2N,...},R(τN) - 我们利用这
N
N
N个
τ
\tau
τ进行梯度上升,调整策略网络的参数:
∇ R ˉ ( τ ) = 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ l o g p θ ( a t n ∣ s t n ) θ ← θ + η ∇ R ˉ ( τ ) \nabla\bar{R}(\tau) = \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} R(\tau^n) \nabla log p_\theta(a_t^n|s_t^n) \\ \theta \larr \theta + \eta\nabla\bar{R}(\tau) ∇Rˉ(τ)=N1n=1∑Nt=1∑TnR(τn)∇logpθ(atn∣stn)θ←θ+η∇Rˉ(τ) - 再如此重复2、3步。
4. 实现过程中的Tips
Tip 1: Add a Baseline
回顾一下我们的参数更新方法:
θ
←
θ
+
η
∇
R
ˉ
(
τ
)
\theta \larr \theta + \eta\nabla\bar{R}(\tau)
θ←θ+η∇Rˉ(τ)
- 在许多问题中我们的回报 R ( τ ) {R}(\tau) R(τ)没有负值,那么也就是说无论是否决策是否是好的,只要被采样到,都会提升被选中的概率。
- 如果我们的采样是无穷大的,那么这并不是个问题,但在实际中我们只能做到少量采样,那么没有被采样到的动作的选中概率就会一直下降,这样是不合理的。
- 所以我们要设计一种方法,让我们的reward不总是正值。
- 解决方法就是设置一个Baseline
b
b
b,如果
R
(
τ
n
)
{R}(\tau^n)
R(τn)大于
b
b
b就让它的概率上升,否则就让概率下降,因此我们的梯度计算方法修正为:
∇ R ˉ ( τ ) = 1 N ∑ n = 1 N ∑ t = 1 T n ( R ( τ n ) − b ) ∇ l o g p θ ( a t n ∣ s t n ) \nabla\bar{R}(\tau) = \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} (R(\tau^n) - b) \nabla log p_\theta(a_t^n|s_t^n) \\ ∇Rˉ(τ)=N1n=1∑Nt=1∑Tn(R(τn)−b)∇logpθ(atn∣stn) - b的一个最简单的计算方法就是取本次采样的平均回报:
b = E [ R ( τ ) ] b = E[R(\tau)] b=E[R(τ)] - 在一些情况中会使用一个神经网络计算 b b b
Tip 2: Assign Suitable Credit
上面我们将梯度的计算方法调整为:
∇
R
ˉ
(
τ
)
=
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
R
(
τ
n
)
−
b
)
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
\nabla\bar{R}(\tau) = \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} (R(\tau^n) - b) \nabla log p_\theta(a_t^n|s_t^n) \\
∇Rˉ(τ)=N1n=1∑Nt=1∑Tn(R(τn)−b)∇logpθ(atn∣stn)
从公式中我们可以看出,在同一个episode里面,所有的
(
s
t
n
∣
a
t
n
)
( s_t^n| a_t^n)
(stn∣atn)都具有相同的调整权重
(
R
(
τ
n
)
−
b
)
(R(\tau^n) - b)
(R(τn)−b),这显然是不合理的:
- 游戏结果是好的,不代表该场游戏中每一个决策都是好的;
- 游戏结果是坏的,不代表该场游戏中每一个决策都是坏的;
一种解决的思路是:
- 对于每一个 ( s t , a t ) (s_t, a_t) (st,at)我们只计算该决策产生之后的反馈的累加;
- 因为这个决策并不会对之前的决策产生影响,所以之前决策的反馈值也不属于这个决策;
- 数学上就是做如下替换:
R ( τ n ) ← ∑ t ′ = t T r t ′ n R(\tau^n) \larr \sum_{t'=t}^T r_{t'}^n R(τn)←t′=t∑Trt′n - 也就是:
∇ R ˉ ( τ ) = 1 N ∑ n = 1 N ∑ t = 1 T n ( ∑ t ′ = t T r t ′ n − b ) ∇ l o g p θ ( a t n ∣ s t n ) \nabla\bar{R}(\tau) = \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} ( \sum_{t'=t}^T r_{t'}^n - b) \nabla log p_\theta(a_t^n|s_t^n) \\ ∇Rˉ(τ)=N1n=1∑Nt=1∑Tn(t′=t∑Trt′n−b)∇logpθ(atn∣stn)
我们继续观察现在的梯度公式,这里还存在一个问题,就是未来十分久远的决策的反馈并不一定受当前决策的影响:
- 我们在时刻2做的动作会影响时刻3的动作;
- 但我们在时刻2的动作对时刻1000的影响几乎为0,所以时刻1000产生的反馈不应该被加到时刻2中;
- 总结来说就是随着时间的推移,后面动作受前面动作的影响越来越小;
- 所以这里我们可以引入一个discount factor(衰减因子) γ , γ ∈ [ 0 , 1 ] \gamma, \gamma \in[0,1] γ,γ∈[0,1]。
- 变换如下:
R ( τ n ) ← ∑ t ′ = t T r t ′ n ← ∑ t ′ = t T r t ′ n γ t ′ − t R(\tau^n) \larr \sum_{t'=t}^T r_{t'}^n \larr \sum_{t'=t}^T r_{t'}^n \gamma^{t'-t} R(τn)←t′=t∑Trt′n←t′=t∑Trt′nγt′−t
所以最终的梯度公式如下:
∇
R
ˉ
(
τ
)
=
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
∑
t
′
=
t
T
r
t
′
n
γ
t
′
−
t
−
b
)
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
,
γ
∈
[
0
,
1
]
\nabla\bar{R}(\tau) = \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} (\sum_{t'=t}^T r_{t'}^n \gamma^{t'-t} - b) \nabla log p_\theta(a_t^n|s_t^n) , \gamma \in[0,1]
∇Rˉ(τ)=N1n=1∑Nt=1∑Tn(t′=t∑Trt′nγt′−t−b)∇logpθ(atn∣stn),γ∈[0,1]
我们将
R
−
b
R-b
R−b这一项定义为 Advantage function(比较优势) 符号表示为
A
θ
(
s
t
,
a
t
)
A^{\theta}(s_t, a_t)
Aθ(st,at):
A
θ
(
s
t
,
a
t
)
=
∑
t
′
=
t
T
r
t
′
n
γ
t
′
−
t
−
b
A^{\theta}(s_t, a_t) = \sum_{t'=t}^T r_{t'}^n \gamma^{t'-t} - b
Aθ(st,at)=t′=t∑Trt′nγt′−t−b
- 表示:How good it is if we take a t a_t at other than actions at s t s_t st.
- 也就是在 s t s_t st状态下,选择动作 a t a_t at,相比于选择其他动作有多大的优势;
- 它在意的不是一个绝对的好,而是相对的好;
- A θ ( s t , a t ) A^{\theta}(s_t, a_t) Aθ(st,at)通常可以由一个网络估计出来,这个网络就是著名的A3C中的“critic”网络。