最近自己会把自己个人博客中的文章陆陆续续的复制到CSDN上来,欢迎大家关注我的 个人博客,以及我的github。
本文主要讲解有关 Policy Gradient(PG)算法的相关内容。
之前提到的 Sarsa、Q-Learning 和 DQN 算法都是基于价值的方法,也就是先计算每个状态对应的动作的 Q 值,再选择 Q 值最大的动作执行。而 Policy Gradient 是一种更加直接的方式,它直接计算每个状态对应的动作或者动作的概率。这样做的优点就是它可以在一个连续区间内选取动作。
Policy Gradient 算法就是对策略函数进行建模,然后用梯度下降更新网络的参数。但是在强化学习中并没有实际的损失函数,而 PG 算法的目的是最大化累计奖励的期望值,所以可以将损失函数设为: l o s s = − E [ log [ π ( a ∣ s ) ] ⋅ Q ( s , a ) ] loss=-E[\log{[\pi(a|s)]}\cdot Q(s,a)] loss=−E[log[π(a∣s)]⋅Q(s,a)],可以理解为如果一个动作的奖励值较大,则下次选取该动作的可能性增加的幅度也大,反之选取该动作的可能性增加的幅度小。
但是因为策略 π \pi π 不易求得,所以可以将其改写为 l o s s = − E [ log [ p θ ( τ ) ] ⋅ R ( τ ) ] loss=-E[\log[p_\theta(\tau)]\cdot R(\tau)] loss=−E[log[pθ(τ)]⋅R(τ)],其中 p θ ( τ ) p_\theta(\tau) pθ(τ) 是轨迹 τ \tau τ 出现的概率, R ( τ ) R(\tau) R(τ) 是轨迹 τ \tau τ 的总奖励值。因此,策略梯度的直观含义是增大高回报轨迹的概率,降低低回报轨迹的概率。
而取对数的原因是取对数后不会改变函数的单挑性,又会避免指数的计算(如果有的话),同时可以将乘法转化为加法,既降低了计算复杂度,又避免了多个小于 1 的数相乘导致下溢出的情况。
根据采样方式的不同可以分为两种情况,第一种是基于蒙特卡洛的方式,此时会采一个回合(episode)的样本然后计算 loss;第二种是基于 TD 的方式,此时会采单步的样本然后计算 loss。前一种的代表是 REINFORCE 算法,后一种的代表是 Actor-Critic 算法。
以上是关于 PG 算法的一些感性认识和拼凑起来的总结,下面将从理性的角度以数学公式推理的形式推导一下 PG 算法的损失函数。以下内容主要是根据李宏毅老师的 RL 教程整理的。
轨迹:
τ
=
{
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},则该轨迹出现的概率为:
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_\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θ(τ)=p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)p(s3∣s2,a2)...
= p ( s 1 ) ∏ t = 1 T p θ ( a t ∣ s t ) p ( s t + 1 ∣ s t , a t ) 公 式 ( 1 ) =p(s_1)\prod_{t=1}^Tp_\theta(a_t|s_t)p(s_{t+1}|s_t,a_t)\quad\quad\quad 公式(1) =p(s1)t=1∏Tpθ(at∣st)p(st+1∣st,at)公式(1)
在上式中,因为在给定状态 s t s_t st 确定要采取什么动作 a t a_t at 时,需要神经网络来完成,所以 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st) 带参数 θ \theta θ,相反, p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1∣st,at) 是由环境决定的,所以不带参数 θ \theta θ。
每一个动作 a t a_t at 获得相应的奖励 r t r_t rt,则总奖励为 $ R(\tau)=\sum_{t=1}^Tr_t$,我们希望总奖励最大化。
奖励的期望为: R ˉ θ = ∑ τ R ( τ ) p θ ( τ ) = E τ − p θ ( τ ) [ R ( τ ) ] \bar R_\theta=\sum_\tau R(\tau)p_\theta(\tau)=E_{\tau-p_\theta(\tau)}[R(\tau)] Rˉθ=∑τR(τ)pθ(τ)=Eτ−pθ(τ)[R(τ)],即奖励的期望为所有轨迹出现的概率与该轨迹奖励值乘积之和。
因为我们要求的是使得总奖励值
R
ˉ
θ
\bar R_\theta
Rˉθ 最大的最优策略
π
\pi
π,所以损失函数可以设为:
L
(
θ
)
=
−
R
ˉ
θ
L(\theta)=-\bar R_\theta
L(θ)=−Rˉθ
损失函数(负的奖励的期望)对参数
θ
\theta
θ 求导:
∇
L
(
θ
)
=
−
∇
R
ˉ
θ
=
−
∑
τ
R
(
τ
)
∇
p
θ
(
τ
)
=
−
∑
τ
R
(
τ
)
p
θ
(
τ
)
∇
p
θ
(
τ
)
p
θ
(
τ
)
\nabla L(\theta)=-\nabla \bar 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)}
∇L(θ)=−∇Rˉθ=−τ∑R(τ)∇pθ(τ)=−τ∑R(τ)pθ(τ)pθ(τ)∇pθ(τ)
因为
∇
f
(
x
)
=
f
(
x
)
∇
log
f
(
x
)
\nabla f(x)=f(x)\nabla\log f(x)
∇f(x)=f(x)∇logf(x),所以:
=
−
∑
τ
R
(
τ
)
p
θ
(
τ
)
∇
log
p
θ
(
τ
)
=-\sum_\tau R(\tau)p_\theta(\tau)\nabla\log p_\theta(\tau)
=−τ∑R(τ)pθ(τ)∇logpθ(τ)
将
p
θ
(
τ
)
p_\theta(\tau)
pθ(τ) 看作是
R
(
τ
)
∇
log
p
θ
(
τ
)
R(\tau)\nabla\log p_\theta(\tau)
R(τ)∇logpθ(τ) 的概率分布,则可改写为期望的形式:
=
−
E
τ
∼
p
θ
(
τ
)
[
R
(
τ
)
∇
log
p
θ
(
τ
)
]
≈
−
1
N
∑
n
=
1
N
R
(
τ
n
)
∇
log
p
θ
(
τ
n
)
=-E_{\tau\sim p_\theta(\tau)}[R(\tau)\nabla\log p_\theta(\tau)]\thickapprox -\frac{1}{N}\sum_{n=1}^N R(\tau^n)\nabla\log p_\theta(\tau^n)
=−Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]≈−N1n=1∑NR(τn)∇logpθ(τn)
上式中由于前一项没法直接结算,所以可以通过采样的方式获取多个轨迹
τ
\tau
τ 来计算,其中 N 是轨迹的个数,
τ
n
\tau^n
τn 表示是第 n 个轨迹。
如公式(1) 所示,轨迹的概率
p
θ
(
τ
n
)
p_\theta(\tau^n)
pθ(τn) 的表达式中的
p
(
s
t
+
1
∣
s
t
,
a
t
)
p(s_{t+1}|s_t,a_t)
p(st+1∣st,at) 来自环境,而
p
θ
(
a
t
∣
s
t
)
p_\theta(a_t|s_t)
pθ(at∣st) 来自决策网络,前者是不带参数
θ
\theta
θ 的,对其求导没什么用。所以
p
θ
(
τ
n
)
p_\theta(\tau^n)
pθ(τn) 可以写作
p
θ
(
τ
n
)
=
p
θ
(
a
1
n
∣
s
1
n
)
⋅
p
θ
(
a
2
n
∣
s
2
n
)
⋅
.
.
.
⋅
p
θ
(
a
T
n
n
∣
s
T
n
n
)
p_\theta(\tau^n)=p_\theta(a_1^n|s_1^n)\cdot p_\theta(a_2^n|s_2^n)\cdot ...\cdot p_\theta(a_{T_n}^n|s_{T_n}^n)
pθ(τn)=pθ(a1n∣s1n)⋅pθ(a2n∣s2n)⋅...⋅pθ(aTnn∣sTnn),对其取对数后变为求和的形式,即:
=
−
1
N
∑
n
=
1
N
∑
t
=
1
T
n
R
(
τ
n
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
=-\frac{1}{N}\sum_{n=1}^N\sum_{t=1}^{T_n} R(\tau^n)\nabla\log p_\theta(a_t^n|s_t^n)
=−N1n=1∑Nt=1∑TnR(τn)∇logpθ(atn∣stn)
其中
T
n
T_n
Tn 是第 n 个轨迹的长度。然后更新模型参数:
θ
=
θ
−
η
⋅
∇
L
(
θ
)
\theta=\theta-\eta\cdot\nabla L(\theta)
θ=θ−η⋅∇L(θ)
其中
η
\eta
η 是学习率。
Tip1:增加基准
由于采取的行动概率和为一,可能存在归一化之后,好的 action 的概率相对下降,坏的 action 概率相对上升的情况,因此需要引入一个基准线 b,让
∇
R
ˉ
θ
\nabla\bar R_\theta
∇Rˉθ 变得有正有负,将其改写为:
∇
R
ˉ
θ
≈
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
R
(
τ
n
)
−
b
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
\nabla\bar R_\theta\approx\frac{1}{N}\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 ≈ E [ R ( τ ) ] b\approx E[R(\tau)] b≈E[R(τ)]
Tip2:设置适当的置信度
∇
R
ˉ
θ
≈
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
∑
t
′
=
t
T
n
γ
t
′
−
t
⋅
r
t
′
n
−
b
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
\nabla\bar R_\theta\approx\frac{1}{N}\sum_{n=1}^N\sum_{t=1}^{T_n}(\sum_{t'=t}^{T_n}{\gamma^{t'-t}\cdot r_{t'}^n}-b)\nabla\log p_\theta(a_t^n|s_t^n)
∇Rˉθ≈N1n=1∑Nt=1∑Tn(t′=t∑Tnγt′−t⋅rt′n−b)∇logpθ(atn∣stn)
用
∑
t
′
=
t
T
n
γ
t
′
−
t
⋅
r
t
′
n
\sum_{t'=t}^{T_n}{\gamma^{t'-t}\cdot r_{t'}^n}
∑t′=tTnγt′−t⋅rt′n 代替了
R
(
τ
n
)
R(\tau^n)
R(τn),将从当前状态以后产生的回报作为当前状态的奖励值。
γ
<
1
\gamma<1
γ<1 表示折扣系数,一个状态离当前状态越远损失越大,即与当前越不相关。