策略优化
本文内容摘自Open AI的深度强化学习资源Spinning Up,进入网址。
策略优化是无模型(model-free)强化学习方法的一类。它使用 π θ ( a ∣ s ) \pi_{\theta}(a|s) πθ(a∣s)来显式地表示策略,对参数 θ \theta θ直接利用梯度下降来优化(或者间接优化)。策略优化是on-policy的,即仅使用遵循最新策略所获得的数据来更新参数。
最简单的策略梯度
我们考虑随机策略
π
θ
\pi_{\theta}
πθ的情况。目标是最大化期望回报
J
(
π
θ
)
=
E
τ
∼
π
θ
[
R
(
τ
)
]
J(\pi_{\theta}) = E_{\tau \sim \pi_{\theta}}[{R(\tau)}]
J(πθ)=Eτ∼πθ[R(τ)] 。可以采用梯度上升来优化目标:
θ
k
+
1
=
θ
k
+
α
∇
θ
J
(
π
θ
)
∣
θ
k
\theta_{k+1} = \theta_k + \alpha \left. \nabla_{\theta} J(\pi_{\theta}) \right|_{\theta_k}
θk+1=θk+α∇θJ(πθ)∣θk
优化目标的梯度 ∇ θ J ( π θ ) \nabla_{\theta} J(\pi_{\theta}) ∇θJ(πθ)就是所谓的策略梯度,用梯度上升来优化策略的算法就是策略梯度算法。
现在,我们需要得到一个可以数值计算的策略梯度表达式。下面来推导这个表达式。
1、目标函数
上一篇文章提到目标函数是
J
(
π
)
=
∫
τ
P
(
τ
∣
π
)
R
(
τ
)
=
E
τ
∼
π
[
R
(
τ
)
]
J(\pi) = \int_{\tau} P(\tau|\pi) R(\tau) = E_{\tau\sim \pi}[{R(\tau)}]
J(π)=∫τP(τ∣π)R(τ)=Eτ∼π[R(τ)]
其中
P
(
τ
∣
θ
)
=
ρ
0
(
s
0
)
∏
t
=
0
T
P
(
s
t
+
1
∣
s
t
,
a
t
)
π
θ
(
a
t
∣
s
t
)
P(\tau|\theta) = \rho_0 (s_0) \prod_{t=0}^{T} P(s_{t+1}|s_t, a_t) \pi_{\theta}(a_t |s_t)
P(τ∣θ)=ρ0(s0)t=0∏TP(st+1∣st,at)πθ(at∣st)
2、对数求导技巧
可以看到 P ( τ ∣ θ ) P(\tau|\theta) P(τ∣θ)是一个连乘积的形式,直接求导比较麻烦,因此,可以使用对数化积为和。根据 ∇ x l o g x = 1 / x \nabla_{x}logx=1/x ∇xlogx=1/x以及链式法则,可以得到: ∇ θ P ( τ ∣ θ ) = P ( τ ∣ θ ) ∇ θ log P ( τ ∣ θ ) \nabla_{\theta} P(\tau | \theta) = P(\tau | \theta) \nabla_{\theta} \log P(\tau | \theta) ∇θP(τ∣θ)=P(τ∣θ)∇θlogP(τ∣θ)
3、轨迹的Grad-Log-Prob
ρ
0
(
s
0
)
\rho_0(s_0)
ρ0(s0)、
P
(
s
t
+
1
∣
s
t
,
a
t
)
P(s_{t+1}|s_t, a_t)
P(st+1∣st,at)和
R
(
τ
)
R(\tau)
R(τ)都不含参数
θ
\theta
θ,因此可以得到:
∇
θ
log
P
(
τ
∣
θ
)
=
∇
θ
log
ρ
0
(
s
0
)
+
∑
t
=
0
T
(
∇
θ
log
P
(
s
t
+
1
∣
s
t
,
a
t
)
+
∇
θ
log
π
θ
(
a
t
∣
s
t
)
)
=
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
\nabla_{\theta} \log P(\tau | \theta) = \cancel{\nabla_{\theta} \log \rho_0 (s_0)} + \sum_{t=0}^{T} \bigg( \cancel{\nabla_{\theta} \log P(s_{t+1}|s_t, a_t)} + \nabla_{\theta} \log \pi_{\theta}(a_t |s_t)\bigg) \\ = \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a_t |s_t)
∇θlogP(τ∣θ)=∇θlogρ0(s0)
+t=0∑T(∇θlogP(st+1∣st,at)
+∇θlogπθ(at∣st))=t=0∑T∇θlogπθ(at∣st)
4、策略梯度
可见,这是一个期望表达式,我们在训练中无法准确求得它的值,但是可以进行抽样估计。
假设我们得到一个轨迹集合
D
=
{
τ
i
}
i
=
1
,
.
.
.
,
N
\mathcal{D} = \{\tau_i\}_{i=1,...,N}
D={τi}i=1,...,N (遵循
π
θ
\pi_\theta
πθ),则策略梯度可以这样计算:
g
^
=
1
∣
D
∣
∑
τ
∈
D
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
R
(
τ
)
\hat{g} = \frac{1}{|\mathcal{D}|} \sum_{\tau \in \mathcal{D}} \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a_t |s_t) R(\tau)
g^=∣D∣1τ∈D∑t=0∑T∇θlogπθ(at∣st)R(τ)
注意:
对上述目标函数取负,得到一个loss,训练过程对这个loss应用梯度下降。但这里的loss不是传统意义上的loss!不同点在于:
-
数据分布依赖于参数:传统loss使用的数据(包括 X X X、 y y y,不包括 y ^ \hat{y} y^)与参数无关,而这里的loss使用的数据是基于一定参数(策略)得到的。
-
它不是性能的度量:传统的loss是性能的度量,我们的目标就是让它越来越小。而对于策略梯度中的loss,我们仅仅是使用一下它的负梯度,用于更新参数。参数更新之后,基于新的策略收集数据,计算新的loss,这时候不能保证新loss比原loss更小。所以,如果你运行Spinning Up提供的代码,会看到loss一直在增加!
因此,在策略梯度中,不必关注loss的值,我们只需要关注平均回报的值。
Reward-to-go策略梯度
目前得到的策略梯度公式是:
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
R
(
τ
)
]
\nabla_{\theta} J(\pi_{\theta}) = E_{\tau \sim \pi_{\theta}}[{\sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a_t |s_t) R(\tau)}]
∇θJ(πθ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)R(τ)]
其中,
R
(
τ
)
R(\tau)
R(τ)是一个轨迹中所以奖励之和。也就是说,对于某个时刻
t
t
t,我们把时刻
t
t
t之前的奖励也考虑进去了。我们可以忽略这些项,从而得到下面的策略梯度:
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
∑
t
′
=
t
T
R
(
s
t
′
,
a
t
′
,
s
t
′
+
1
)
]
\nabla_{\theta} J(\pi_{\theta}) = E_{\tau \sim \pi_{\theta}}[{\sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a_t |s_t) \sum_{t'=t}^T R(s_{t'}, a_{t'}, s_{t'+1})}]
∇θJ(πθ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)t′=t∑TR(st′,at′,st′+1)]
其中, R ^ t ≐ ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) \hat{R}_t \doteq \sum_{t'=t}^T R(s_{t'}, a_{t'}, s_{t'+1}) R^t≐∑t′=tTR(st′,at′,st′+1)称为reward-to-go,相应的策略梯度称为“reward-to-go策略梯度”。
可以证明,在期望意义上,reward-to-go策略梯度与前面的策略梯度是相等的。但为什么要使用reward-to-go策略梯度?因为实际中我们的策略梯度是一个抽样平均,因此,t’ < t 的项就相当于噪声了。去掉这部分噪声,就可以使用更少的轨迹来做一次估计。
策略梯度中的基准(Baseline)
首先介绍一下EGLP(Expected Grad-Log-Prob)引理:
EGLP引理:假设 P θ P_\theta Pθ是随机变量 x x x的参数化概率分布,则:
E x ∼ P θ [ ∇ θ log P θ ( x ) ] = 0 E_{x \sim P_{\theta}}[{\nabla_{\theta} \log P_{\theta}(x)}]= 0 Ex∼Pθ[∇θlogPθ(x)]=0
假设
b
b
b是仅依赖与状态的函数,那么根据EGLP引理,有:
E
a
t
∼
π
θ
[
∇
θ
log
π
θ
(
a
t
∣
s
t
)
b
(
s
t
)
]
=
0
E_{a_t \sim \pi_{\theta}}[{\nabla_{\theta} \log \pi_{\theta}(a_t|s_t) b(s_t)}] = 0
Eat∼πθ[∇θlogπθ(at∣st)b(st)]=0
因此我们可以在策略梯度上任意加上或减去这样的项,而不影响期望:
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
∇
θ
log
π
θ
(
a
t
∣
s
t
)
(
∑
t
′
=
t
T
R
(
s
t
′
,
a
t
′
,
s
t
′
+
1
)
−
b
(
s
t
)
)
]
\nabla_{\theta} J(\pi_{\theta}) = E_{\tau \sim \pi_{\theta}}[{\sum_{t=0}\nabla_{\theta} \log \pi_{\theta}(a_t |s_t) \left(\sum_{t'=t}^T R(s_{t'}, a_{t'}, s_{t'+1}) - b(s_t)\right)}]
∇θJ(πθ)=Eτ∼πθ[t=0∑∇θlogπθ(at∣st)(t′=t∑TR(st′,at′,st′+1)−b(st))]
b b b在这里称为一个baseline。
最常用的baseline是 b ( s t ) = V π ( s t ) b(s_t) = V^{\pi}(s_t) b(st)=Vπ(st),即on-policy价值函数。它能够有效降低抽样估计的方差(原理还没有搞懂)。
其他形式的策略梯度
可以看到,上面的策略梯度有着共同的形式:
∇
θ
J
(
π
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
Φ
t
]
\nabla_{\theta} J(\pi_{\theta}) = E_{\tau \sim \pi_{\theta}}[{\sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a_t |s_t) \Phi_t}]
∇θJ(πθ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)Φt]
Φ
t
\Phi_t
Φt有多种选择:
Φ
t
=
R
(
τ
)
\Phi_t = R(\tau)
Φt=R(τ)
Φ t = ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) \Phi_t = \sum_{t'=t}^T R(s_{t'}, a_{t'}, s_{t'+1}) Φt=t′=t∑TR(st′,at′,st′+1)
Φ t = ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) − b ( s t ) \Phi_t = \sum_{t'=t}^T R(s_{t'}, a_{t'}, s_{t'+1}) - b(s_t) Φt=t′=t∑TR(st′,at′,st′+1)−b(st)
也有其他选择:
Φ
t
=
Q
π
θ
(
s
t
,
a
t
)
\Phi_t = Q^{\pi_{\theta}}(s_t, a_t)
Φt=Qπθ(st,at)
Φ t = A π ( s t , a t ) = Q π ( s t , a t ) − V π ( s t ) \Phi_t = A^{\pi}(s_t,a_t) = Q^{\pi}(s_t,a_t) - V^{\pi}(s_t) Φt=Aπ(st,at)=Qπ(st,at)−Vπ(st)
其中, Φ t = A π ( s t , a t ) \Phi_t = A^{\pi}(s_t,a_t) Φt=Aπ(st,at)应用的最为普遍(它是在 Φ t = Q π θ ( s t , a t ) \Phi_t = Q^{\pi_{\theta}}(s_t, a_t) Φt=Qπθ(st,at)的基础上加了一个baseline)。