深度强化学习笔记之PPO算法理解(1)

深度强化学习笔记之PPO算法理解(1)

笔记内容来源于李宏毅老师的深度强化学习的PPT。

关于PPO(Proximal Policy Optimization),李老师分为了三个部分进行了介绍。

深度强化学习笔记之PPO算法理解(1)_第1张图片

  • Policy Gradient:该方法是PPO的前身,与基于价值的强化学习方法不同,策略梯度法是对策略进行更新;
  • On-policy | Off-policy
  • Add constraint:对Policy Gradient进行一些限制,前者就变成了PPO。

1.Policy Gradient

与基于价值的强化学习方法不同,Policy Gradient通常会采集多组完整的状态序列用于actor的训练。所谓actor本质上也就是agent,它的功能在于给定一个环境状态,可以输出一个action。

actor在进行训练之前,会先与环境进行交互,然后得到一组训练数据(由多条状态序列构成)。
train data : { τ 1 , τ 2 , . . . , τ N } ,    τ i = { s 1 , a 1 , . . . , s T , a T } \text{train data}:\{\tau^1,\tau^2,...,\tau^N\}, \; \tau_i=\{s_1,a_1,...,s_T,a_T\} train data:{τ1,τ2,...,τN},τi={s1,a1,...,sT,aT}
深度强化学习笔记之PPO算法理解(1)_第2张图片

对于每条状态序列的奖励表示为该序列得到的所有的奖励之和,如下所示:
R ( τ ) = ∑ t = 1 T r t (1) R(\tau)=\sum_{t=1}^T r_t \tag1 R(τ)=t=1Trt(1)
但是Policy Gradient并不是只用一条状态序列来更新策略的,而是会根据所有的采集到的状态序列来计算它的期望奖励。
R ˉ θ = ∑ τ R ( τ ) p θ ( τ ) = E τ ∼ p θ ( τ ) [ R ( τ ) ] (2) \bar{R}_{\theta}=\sum_{\tau}R(\tau)p_{\theta}(\tau)=E_{\tau\sim p_{\theta}(\tau)}[R(\tau)] \tag2 Rˉθ=τR(τ)pθ(τ)=Eτpθ(τ)[R(τ)](2)
上式可以理解为:在使用参数为 θ \theta θ的actor与环境进行互动,采集到多条状态序列,其分布可以表示为 τ ∼ p θ ( τ ) \tau\sim p_{\theta}(\tau) τpθ(τ)。对于这些以参数为 θ \theta θ的actor所收集到的状态序列,Policy Gradient会计算它们的期望奖励值,然后以该期望奖励值来更新actor的参数,得到新的参数 θ ′ \theta' θ。如此往复,就是Policy Gradient的大致流程。 从这里可以看出,Policy Gradient是基于无模型的算法。

那么应该如何更新actor的参数呢?

Policy Gradient的后一个单词就告诉了我们方法,也就是采用梯度进行参数更新。即计算式(2)的梯度,然后朝着奖励值增加的方向更新参数。

对式(2)计算其梯度,我们可以得到:
∇ R ˉ θ = ∑ τ R ( τ ) ∇ p θ ( τ ) = ∑ τ R ( τ ) p θ ( τ ) ∇ p θ ( τ ) p θ ( τ ) (3) \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)} \tag3 Rˉθ=τR(τ)pθ(τ)=τR(τ)pθ(τ)pθ(τ)pθ(τ)(3)
根据导数公式 ∇ f ( x ) = f ( x ) ∇ log ⁡ f ( x ) \nabla f(x)=f(x) \nabla \log f(x) f(x)=f(x)logf(x),上式可以转化为:
∇ R ˉ θ = ∑ τ R ( τ ) p θ ( τ ) ∇ log ⁡ p θ ( τ ) = E τ ∼ p θ ( τ ) [ R τ ∇ log ⁡ p θ ( τ ) ]      ( 4 ) ≈ 1 N ∑ n = 1 N R ( τ n ) ∇ log ⁡ p θ ( τ n ) ( 5 ) = 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ( 6 ) \begin{aligned} \nabla \bar{R}_{\theta} &= \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)] \ \quad \qquad \qquad \; (4)\\ & \approx \frac{1}{N}\sum_{n=1}^N R(\tau^n) \nabla \log p_{\theta}(\tau^n) \qquad \qquad \quad (5)\\ &= \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) \quad \quad (6)\\ \end{aligned} Rˉθ=τR(τ)pθ(τ)logpθ(τ)=Eτpθ(τ)[Rτlogpθ(τ)] (4)N1n=1NR(τn)logpθ(τn)(5)=N1n=1Nt=1TnR(τn)logpθ(atnstn)(6)
因为我们并不知道 τ ∼ p θ ( τ ) \tau\sim p_{\theta}(\tau) τpθ(τ)的真实分布,因此只能通过采样的方式计算式(4)的数学期望,也就是式(5)的形式。

深度强化学习笔记之PPO算法理解(1)_第3张图片

上图就是Policy Gradient的大致流程,也就是数据收集和模型更新的循环。这里需要注意的是,Policy Gradient每次收集到的数据只会对模型进行一次更新,并不会反复使用这些数据。 从这就可以看出,Policy Gradient是一种"On-policy"的算法。

那么应该如何在实际应用中使用式(6)来更新模型呢?

待续…

2.From on-policy to off-policy

下图说明了两种方式的区别。简单来说,"on-policy"就是指我们自己训练,然后自己学习。而"off-policy"就是指我们可以旁观别人的训练,从而得到学习。

深度强化学习笔记之PPO算法理解(1)_第4张图片

为什么我们要把on-policy方法转变为off-policy方法呢?

上一节我们提到Policy Gradient的训练方法,但是它的训练方法非常浪费时间。因为它获得的每一组训练资料都只能更新一次模型的参数,更新完之后又要重新收集训练资料。如果训练资料可以更新多次模型的参数,那么训练效率就会得到很大的提高。

在使用on-policy方法时,由于我们是使用参数为 θ \theta θ的actor收集训练数据的,一旦参数 θ \theta θ得到更新后,我们就必须重新收集数据,因为此时参数 θ \theta θ已经变化的。

为了可以使得训练资料可以反复使用,我们就必须固定actor的参数值。一个方法就是使用两个actor,一个参数为 θ ′ \theta' θ的actor用于收集训练资料,另一个参数为 θ \theta θ的actor用于训练。因为前者不参与训练,故它的参数也不会发生变化,如此就可以反复使用这组训练数据。

但这里需要解决一个问题,即两个不同参数的actor得到的训练数据的分布是不同的,如何将它们联系起来呢?从公式角度出发,假设前者actor采集的训练资料的分布为 q q q,后者的分布为 p p p,我们应该如何实现这两者之间的转化呢?
∇ R ˉ θ = E τ ∼ p → E τ ∼ q \nabla \bar{R}_{\theta}=E_{\tau \sim p} \rightarrow E_{\tau \sim q} Rˉθ=EτpEτq
这里就需要提到一种称为Importance Sampling的技术。
E x ∼ p [ f ( x ) ] = ∫ f ( x ) p ( x ) d x = ∫ f ( x ) p ( x ) q ( x ) q ( x ) d x = E x ∼ q [ f ( x ) p ( x ) q ( x ) ] (7) \begin{aligned} E_{x \sim p}[f(x)] &= \int f(x)p(x)dx \\ &= \int f(x) \frac{p(x)}{q(x)}q(x)dx \\ &= E_{x \sim q}[f(x)\frac{p(x)}{q(x)}] \tag7 \end{aligned} Exp[f(x)]=f(x)p(x)dx=f(x)q(x)p(x)q(x)dx=Exq[f(x)q(x)p(x)](7)
但是上述方法的应用需要满足一个条件:两类分布 ( p , q ) (p,q) (p,q)不能差异太大

原因在于,虽然通过式(7)使得两者的数学期望相同,但是两者的方差并不是相同的,如下图所示。

深度强化学习笔记之PPO算法理解(1)_第5张图片

p ( x ) , q ( x ) p(x),q(x) p(x),q(x)相差很大时,根据采样情况存在两种可能:

  • 当采样次数足够多时,虽然两者方差不同,但是最终得到的期望值是相同的。这种情况没有问题;
  • 但是当采样次数不够多时,此时方差不同的影响就会产生,会导致两者的期望值不一定相等。

举一个极端的例子,如下图所示。当两者分布相差较大时,如果我们采样的次数不多,比如采样得到的样本全部都在 q ( x ) q(x) q(x)右侧区域上(下图右侧的绿点),那么最终计算得到的 E x ∼ q E_{x\sim q} Exq就是一个正值。但是 E x ∼ p E_{x\sim p} Exp却是一个负值,此时就会导致两者的期望不相同。但是如果再多采样几个点,也许就会得到位于左侧区域的样本,由于权重大的原因( p ( x ) / q ( x ) p(x)/q(x) p(x)/q(x)比较大),就会把 E x ∼ q E_{x\sim q} Exq拉到负值。

深度强化学习笔记之PPO算法理解(1)_第6张图片

3.Add Constraint

简单来说,PPO就是Policy Gradient的"off-policy"版本。为了满足Importance Sampling的使用条件,PPO在目标函数中加入了一个约束项。
J θ k = ∑ ( s t , a t ) p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) A θ k ( s t , a t ) ( 8 ) J P P O θ k = J θ k − β K L ( θ , θ k ) ( 9 ) J T R P O θ k = J θ k ,    K L ( θ , θ k ) < δ ( 10 ) \begin{aligned} J^{\theta^k}&=\sum_{(s_t,a_t)} \frac{p_{\theta}(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}A^{\theta^k}(s_t,a_t) \quad (8)\\ J_{PPO}^{\theta^k}&=J^{\theta^k}-\beta KL(\theta,\theta^k) \quad (9) \\ J_{TRPO}^{\theta^k}&=J^{\theta^k}, \; KL(\theta,\theta^k)<\delta \quad (10) \\ \end{aligned} JθkJPPOθkJTRPOθk=(st,at)pθk(atst)pθ(atst)Aθk(st,at)(8)=JθkβKL(θ,θk)(9)=Jθk,KL(θ,θk)<δ(10)
PPO算法与TRPO算法的区别在于前者把约束项放入了目标函数中,而不是作为外部约束。

关于PPO算法,还有一个更加容易实现的形式:
J P P O 2 θ k ≈ ∑ s t , a t min ⁡ ( p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) A θ k ( s t , a t ) , c l i p ( p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) A θ k ( s t , a t ) ) (11) J_{PPO2}^{\theta^k} \approx \sum_{s_t,a_t} \min (\frac{p_{\theta}(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}A^{\theta^k}(s_t,a_t), clip(\frac{p_{\theta}(a_t|s_t)}{p_{\theta^k}(a_t|s_t)},1-\epsilon,1+\epsilon)A^{\theta^k}(s_t,a_t)) \tag{11} JPPO2θkst,atmin(pθk(atst)pθ(atst)Aθk(st,at),clip(pθk(atst)pθ(atst),1ϵ,1+ϵ)Aθk(st,at))(11)
深度强化学习笔记之PPO算法理解(1)_第7张图片

注意:以上所有形式的目标函数的参数只有 θ \theta θ θ k \theta_k θk表示的是旧策略的参数,并不参与参数的更新。

关于式(11),有一个直观的解释:

  • A θ k ( s t , a t ) > 0 A^{\theta^k}(s_t,a_t)>0 Aθk(st,at)>0时,说明 ( s t , a t ) (s_t,a_t) (st,at)相对来说是比较好的,我们希望这一对出现的概率越高越好(即 p θ ( a t ∣ s t ) p_{\theta}(a_t|s_t) pθ(atst)越大越好)。但是为了不让 θ \theta θ θ k \theta_k θk相差太多,设置了一个上限值 1 + ϵ 1+\epsilon 1+ϵ
  • A θ k ( s t , a t ) < 0 A^{\theta^k}(s_t,a_t)<0 Aθk(st,at)<0时,说明 ( s t , a t ) (s_t,a_t) (st,at)相对来说是比较差的,我们希望这一对出现的概率越低越好(即 p θ ( a t ∣ s t ) p_{\theta}(a_t|s_t) pθ(atst)越小越好)。但是为了不让 θ \theta θ θ k \theta_k θk相差太多,设置了一个下限值 1 − ϵ 1-\epsilon 1ϵ

你可能感兴趣的:(机器学习笔记,强化学习,深度学习,python)