策略梯度

策略优化

本文内容摘自Open AI的深度强化学习资源Spinning Up,进入网址。

策略优化是无模型(model-free)强化学习方法的一类。它使用 π θ ( a ∣ s ) \pi_{\theta}(a|s) πθ(as)来显式地表示策略,对参数 θ \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=0TP(st+1st,at)πθ(atst)

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+1st,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=0T(θlogP(st+1st,at) +θlogπθ(atst))=t=0Tθlogπθ(atst)

4、策略梯度
策略梯度_第1张图片

可见,这是一个期望表达式,我们在训练中无法准确求得它的值,但是可以进行抽样估计

假设我们得到一个轨迹集合 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^=D1τDt=0Tθlogπθ(atst)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=0Tθlogπθ(atst)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=0Tθlogπθ(atst)t=tTR(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^tt=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 ExPθ[θ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πθ(atst)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πθ(atst)(t=tTR(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=0Tθlogπθ(atst)Φ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=tTR(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=tTR(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)。

你可能感兴趣的:(强化学习)