【详解+推导!!】PPO 近端策略优化

本文详细介绍了近端策略优化(PPO)算法,它是强化学习中的一种重要算法,尤其在OpenAI中被广泛应用。文章从On-policy与Off-policy的区别开始,讨论了Off-policy的效率优势。接着,解释了重要性采样(Importance Sampling)的概念及其在Policy Gradient中的作用。然后,推导了Off-policy下的梯度公式,并对比了TRPO和PPO。PPO通过使用clip操作来约束策略更新,以保持策略的稳定性。最后,文章提到了PPO2(PPO-Clip)算法,该算法不依赖KL散度约束,而是通过目标函数设计来平衡回报提升与策略变化的幅度。
摘要由CSDN通过智能技术生成

近端策略优化(PPO, Proximal Policy Optimization)是强化学习中十分重要的一种算法,被 OpenAI 作为默认强化学习算法,在多种强化学习应用中表现十分优异。

1. From On-policy to Off-policy

  • 如果被训练的agent和与环境做互动的agent(生成训练样本)是同一个的话,那么叫做on-policy(同策略)
  • 如果被训练的agent和与环境做互动的agent(生成训练样本)不是同一个的话,那么叫做off-policy(异策略)

换一种拟人的方式来讲:

  • on-policy:我们来学习下象棋,先和大家下若干把棋,然后总结经验提升自己,成为2.0的自己。2.0的自己再和大家下棋,再总结2.0期间下过棋局的经验,成为3.0的自己,以此类推。其中关键点在于,2.0升级到3.0的过程中不能利用1.0时的下棋经验。
  • off-policy:与on-policy不同的是我们,我们可以反复利用1.0期间的下棋经验,从2.0升级到3.0再升级到4.0,等等。甚至我们还可以用其他人的下棋经验提升自己。

为什么要考虑使用Off-policy?
我们可以回顾Policy Gradient的过程,Policy Gradient是一种on-policy的方法,他首先要利用现有策略和环境互动,产生学习资料(决策数据 τ \tau τ),然后利用产生的资料,按照Policy Gradient的方法更新策略参数。然后再用新的策略去交互、更新、交互、更新,如此重复。这其中有很多的时间都浪费在了产生资料的过程中,Off-Policy的目的就是更加充分的利用actor产生的交互资料,增加学习效率。

2. Importance Sampling

为什么要使用Importance Sampling呢?
我们可以看一下Policy Gradient的梯度公式
∇ R ˉ ( τ ) = E τ ~ p θ ( τ ) [ A θ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{\tau~p_\theta(\tau)}[A^\theta(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] Rˉ(τ)=Eτpθ(τ)[Aθ(st,at)logpθ(atnstn)]
问题在于上面的式子是基于 τ ~ p θ ( τ ) \tau~p_\theta(\tau) τpθ(τ)采样的,一旦更新了参数,从 θ \theta θ θ ′ \theta' θ,这个概率 P θ P_{\theta} Pθ就不对了。而Importance Sampling解决的正是从 τ ~ p θ ( τ ) \tau~p_\theta(\tau) τpθ(τ)采样,计算 θ ′ \theta' θ ∇ R ˉ ( τ ) \nabla\bar{R}(\tau) Rˉ(τ)的问题。

重要性采样(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 ) ] E_{x~p}[f(x)] = \int f(x)p(x)dx = \int f(x) \frac{p(x)}{q(x)}q(x)dx = E_{x~q}[f(x) \frac{p(x)}{q(x)}] Exp[f(x)]=f(x)p(x)dx=f(x)q(x)p(x)q(x)dx=Exq[f(x)q(x)p(x)]
上面的式子表示,已知 x x x服从分布 p p p,我们要计算 f ( x ) f(x) f(x),但是 p p p不方便采样,我们就可以通过 q q q去采样,计算期望。
E x ~ q [ f ( x ) p ( x ) q ( x ) ] E_{x~q}[f(x) \frac{p(x)}{q(x)}] Exq[f(x)q(x)p(x)]
这里我们用 q q q做采样, p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x)叫做重要性权重,用来修正 q q q p p p两个分布的差异。理论上利用重要性采样的方法我们可以用任何 q q q来完成采样,但是由于采样数量的限制, q q q p p p的差异不能太大。如果差异过大, E x ~ q [ f ( x ) p ( x ) q ( x ) ] E_{x~q}[f(x) \frac{p(x)}{q(x)}] Exq[f(x)q(x)p(x)] E x ~ p [ f ( x ) ] E_{x~p}[f(x)] Exp[f(x)]的差异也会很大。

3. 推导off-policy下的梯度公式

在on-policy情况下,Policy Gradient公式为:
∇ R ˉ ( τ ) = E ( s t , a t ) ~ π θ [ A θ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_\theta}[A^\theta(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] Rˉ(τ)=E(st,at)πθ[Aθ(st,at)logpθ(atnstn)]
由上面的推导可得,我们利用 θ ′ \theta' θ采样,优化 θ \theta θ时的公式为:
∇ R ˉ ( τ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( s t , a t ) p θ ′ ( s t , a t ) A θ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_{\theta'}}[\frac{p_{\theta(s_t,a_t)}}{p_{\theta'(s_t,a_t)}}A^{\theta}(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] Rˉ(τ)=E(st,at)πθ[pθ(st,at)pθ(st,at)Aθ(st,at)logpθ(atnstn)]
其中 A θ ( s t , a t ) A^{\theta}(s_t, a_t) Aθ(st,at)为比较优势,从该项的推导过程可以知道,它是由采样样本决定的,所以应该用 A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ(st,at)表示,所以式子变为:
∇ R ˉ ( τ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( s t , a t ) p θ ′ ( s t , a t ) A θ ′ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_{\theta'}}[\frac{p_{\theta(s_t,a_t)}}{p_{\theta'(s_t,a_t)}}A^{\theta'}(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] Rˉ(τ)=E(st,at)πθ[pθ(st,at)pθ(st,at)Aθ(st,at)logpθ(atnstn)]
p θ ( s t , a t ) p_{\theta(s_t,a_t)} pθ(st,at)展开可得:
∇ R ˉ ( τ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) p θ ( s t ) p θ ′ ( s t ) A θ ′ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} \frac{p_{\theta(s_t)}}{p_{\theta'(s_t)}} A^{\theta'}(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] Rˉ(τ)=E(st,at)πθ[pθ(atst)pθ(atst)pθ(st)pθ(st)Aθ(st,at)logpθ(atnstn)]
我们认为某一个状态 s t s_t st出现的概率与策略函数无关,只与环境有关,所以可以认为 p θ ( s t ) ≈ p θ ′ ( s t ) p_{\theta(s_t)} \approx p_{\theta'(s_t)} pθ(st)pθ(st),由此得出如下公式:
∇ R ˉ ( τ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} A^{\theta'}(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] Rˉ(τ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)logpθ(atnstn)]
根据上面的式子,我们就可以完成off-policy的工作,反推出目标函数为:
J θ ′ ( θ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] J^{\theta'}(\theta) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} A^{\theta'}(s_t, a_t)] Jθ(θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]
J θ ′ ( θ ) J^{\theta'}(\theta) Jθ(θ)中括号里的 θ \theta θ表示我们要优化的参数, θ ′ \theta' θ表示实际和环境互动产生样本的Actor的参数,在计算过程中 p θ ′ ( a t ∣ s t ) p_{\theta'(a_t|s_t)} pθ(atst) A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ(st,at)都是根据样本计算出的常数,所以也很好理解,我们优化的目标就是 p θ ( a t ∣ s t ) p_{\theta(a_t|s_t)} pθ(atst)

4. TRPO和PPO

TRPO

TRPO是PPO的前身,叫做信任区域策略优化(Trust Region Policy Optimization)。其思路如下:优化目标就是我们上面推出的 J θ ′ ( θ ) J^{\theta'}(\theta) Jθ(θ),但是我们使用了重要性采样,而重要性采样的要求就是原采样和目标采样不能相差太大,这里就是指 π θ \pi_{\theta} πθ π θ ′ \pi_{\theta'} πθ输出的动作不能相差太大。TRPO采用KL散度(KL divergence)的方法来评价二者的差异,记作 K L ( θ , θ ′ ) KL(\theta, \theta') KL(θ,θ)。算法规定,当进行优化时, K L ( θ , θ ′ ) KL(\theta, \theta') KL(θ,θ)要小于一个阈值 σ \sigma σ,TRPO公式如下:
J T R P O θ ′ ( θ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] , K L ( θ , θ ′ ) < σ J_{TRPO}^{\theta'}(\theta) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} A^{\theta'}(s_t, a_t)],KL(\theta, \theta')<\sigma JTRPOθ(θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]KL(θ,θ)<σ

PPO
TRPO相当于给目标函数增加了一项额外的约束(constrain),而且这个约束并没有体现在目标函数里,在计算过程中这样的约束是很难处理的。PPO的做法就是将这样约束融进了目标函数,其目标函数如下:
J P P O θ ′ ( θ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] − β K L ( θ , θ ′ ) J_{PPO}^{\theta'}(\theta) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} A^{\theta'}(s_t, a_t)] - \beta KL(\theta, \theta') JPPOθ(θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]βKL(θ,θ)
上面的式子我们可以理解为:训练一个累计回报期望更高但是又和 θ ′ {\theta'} θ很像的 θ {\theta} θ

PPO算法流程:

  • 初始化一组参数 θ 0 {\theta^0} θ0
  • 进行多轮迭代,每轮迭代中做以下工作:
    • 使用当前参数 θ k {\theta^k} θk与环境做互动,产生 { s t , a t } \{ s_t,a_t \} {st,at},并且计算出 p θ ′ ( a t ∣ s t ) p_{\theta'(a_t|s_t)} pθ(atst) A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ(st,at)
    • 利用 J P P O θ k ( θ k + 1 ) J_{PPO}^{\theta^{k}}(\theta^{k+1}) JPPOθk(θk+1),求得基于当前数据 { s t , a t } \{ s_t,a_t \} {st,at}的最优参数 θ k + 1 \theta^{k+1} θk+1(这个优化过程是多次反向传播的)

上面从 θ k \theta^{k} θk θ k + 1 \theta^{k+1} θk+1的优化过程中,可以更新很多次也没有关系,因为我们使用了重要性采样,也对 θ \theta θ的动作空间进行了约束,这一步的目的就是尽可能的最大化目标函数。

针对上面的算法还有一个自使用KL约束的方法,叫做adaptive KL divergence,其实就是动态调整 β \beta β,如下:
在这里插入图片描述
这个方法里面要设置一个我们可以接受的KL散度的上限和下限:

  • 当 KL 散度的项太大,超过上限时,我们认为是我们的KL约束太弱了,才导致 θ k \theta^{k} θk θ k + 1 \theta^{k+1} θk+1的差异那么大,所以就把 β \beta β调大。
  • 当 KL 散度的项太小,超过下限时,我们认为是我们的KL约束太强了,导致我们的训练目标变成了让 θ k + 1 \theta^{k+1} θk+1 θ k \theta^{k} θk一样,而没有充分学习 { s t , a t } \{ s_t,a_t \} {st,at}中的知识,所以要把 β \beta β调小。

5. PPO2

PPO2也叫做PPO-Clip,该方法不采用KL散度作为约束,而是采用逻辑上合理的思路设计目标函数,其目标函数如下:
J P P O 2 θ ′ ( θ ) ≈ ∑ ( s t , a t ) min ⁡ ( p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) , c l i p ( p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) A θ ′ ( s t , a t ) ) \begin{aligned} J_{PPO2}^{\theta'}(\theta) \approx \sum_{(s_t, a_t)} \min(&\frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}}A^{\theta'}(s_t, a_t), \\ &clip(\frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}}, 1-\epsilon, 1+\epsilon) A^{\theta'}(s_t, a_t)) \end{aligned} JPPO2θ(θ)(st,at)min(pθ(atst)pθ(atst)Aθ(st,at),clip(pθ(atst)pθ(atst),1ϵ,1+ϵ)Aθ(st,at))

clip 函数的意思是,在括号里面有三项,分别是(变量,下限,上限),如果变量小于下限,那么就输出下限,大于上限就输出上限,如果在二者之间,就输出变量的值, c l i p ( p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) clip(\frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}}, 1-\epsilon, 1+\epsilon) clip(pθ(atst)pθ(atst),1ϵ,1+ϵ)的函数图像如下。
在这里插入图片描述
直接分析目标函数,我们可以知道这个函数的取值逻辑如下:
在这里插入图片描述

  • p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) \frac{p_{\theta(a_t|s_t)}}{p_{\theta^k(a_t|s_t)}} pθk(atst)pθ(atst)是绿色的线;
  • c l i p ( p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) clip(\frac{p_{\theta(a_t|s_t)}}{p_{\theta^k(a_t|s_t)}}, 1-\epsilon, 1+\epsilon) clip(pθk(atst)pθ(atst),1ϵ,1+ϵ)是蓝色的线;
  • 在绿色的线跟蓝色的线中间,我们要取一个最小的。假设前面乘上的这个项 A,它是大于 0 的话,取最小的结果,就是左侧图片中红色的这一条线。
  • 同理,如果 A 小于 0 的话,取最小的以后,就得到右侧侧图片中红色的这一条线。

知道 J P P O 2 θ k ( θ ) J_{PPO2}^{\theta^k}(\theta) JPPO2θk(θ)的取值逻辑之后,我们就可以来分析将目标函数设计成这样的目的和想法。

目标函数想做的事情就是希望在提升累计期望回报的同时,保证 p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst) p θ k ( a t ∣ s t ) {p_{\theta^k(a_t|s_t)}} pθk(atst)不要差距太大,那他是如何做到的呢?

  • A是比较优势,A>0表示比较优势大,我们要提升 p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst),A<0表示这个决策不好,所以我们要减少 p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst)。这里说的是不考虑重要性采样的情况。
  • 当A>0时,我们要提升 p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst),可是受到重要性采样的约束,他不能和 p θ k ( a t ∣ s t ) {p_{\theta^k(a_t|s_t)}} pθk(atst)相差太大,所以当 p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst)大到, p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) > 1 + ϵ \frac{p_{\theta(a_t|s_t)}}{p_{\theta^k(a_t|s_t)}}>1+\epsilon pθk(atst)pθ(atst)>1+ϵ时,就不再让目标函数有benifit了,他的做法就是让 c l i p ( p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) clip(\frac{p_{\theta(a_t|s_t)}}{p_{\theta^k(a_t|s_t)}}, 1-\epsilon, 1+\epsilon) clip(pθk(atst)pθ(atst),1ϵ,1+ϵ)这一项恒定为 1 + ϵ 1+\epsilon 1+ϵ。因为固定后,无论 p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst)变到多大,目标函数都不会有收益,自然也就不会训练到更大。
  • 当A<0时,我们要减小 p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst),同样 p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) < 1 − ϵ \frac{p_{\theta(a_t|s_t)}}{p_{\theta^k(a_t|s_t)}}<1-\epsilon pθk(atst)pθ(atst)<1ϵ时,就会停止,没有benifit, p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst)自然也就不会过小了。

有一点可以可能不清晰的是,为什么A>0时,下限不做约束,A<0时上限不做约束。原因是,如果A>0, p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(atst)一定朝着变大的方向优化,不可能变小,所以不需要约束下限;A<0时也是同理。

FusionCharts是一个强大的数据可视化库,可以帮助开发人员创建漂亮而交互式的图表和图形。下面是一个关于如何使用FusionCharts的详细说明,包括实例、图解和Demo。 1. 安装FusionCharts:首先,你需要从FusionCharts官方网站下载和安装FusionCharts库。你可以选择下载免费版本或购买商业许可证。 2. 引入FusionCharts库:将FusionCharts的JavaScript文件引入你的HTML文件中。你可以通过将以下代码添加到`<head>`标签中来实现: ```html <script src="fusioncharts.js"></script> ``` 3. 创建一个容器:在HTML文件中创建一个用于显示图表的容器。你可以使用一个`<div>`标签,并为其指定一个唯一的ID。例如: ```html <div id="chartContainer"></div> ``` 4. 准备数据:准备用于绘制图表的数据。你可以使用JavaScript对象或从服务器获取的JSON数据。 5. 创建图表对象:使用FusionCharts提供的API创建一个图表对象。你需要指定图表类型、数据和容器ID。例如,下面的代码创建了一个柱状图: ```javascript var chart = new FusionCharts({ type: 'column2d', renderAt: 'chartContainer', dataSource: { data: [ { label: 'January', value: '100' }, { label: 'February', value: '200' }, { label: 'March', value: '150' } ] } }); ``` 6. 渲染图表:调用图表对象的`render()`方法,将图表渲染到指定的容器中。例如: ```javascript chart.render(); ``` 7. 自定义图表:你可以使用FusionCharts提供的各种配置选项来自定义图表的外观和行为。例如,你可以更改图表的颜色、字体、标题等。你可以参考FusionCharts的文档以获取更多自定义选项。 8. 实例和图解:根据你的具体需求,可以参考FusionCharts的官方文档和示例来学习更多关于使用FusionCharts的实例和图解。 9. Demo:你可以在FusionCharts的官方网站上找到各种示例和演示,以帮助你更好地理解和使用FusionCharts。你可以尝试运行这些Demo,并从中获取灵感和指导。 希望这个详细说明对你有所帮助!如果你还有其他问题,请随时提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值