美文网首页
强化学习4-PPO算法

强化学习4-PPO算法

作者: 大豆油 | 来源:发表于2024-12-02 21:06 被阅读0次

策略梯度算法

假设一条马尔科夫轨迹为 \tau,那么该轨迹发生的概率为:p_\theta (\tau)=p(s_1)\prod_{t=1}^{T}p(a_t|s_t;\theta )p(s_{t+1}|s_t,a_t)

不考虑折扣衰减,该轨迹获得的收益为累计回报:R(\tau )=\sum_{t=0}^{T}r_t

由于马尔科夫链是采样得到的,因此当前策略可获得的期望奖励为:
\overline{R_\theta } =\sum_{\tau}^{} p_\theta (\tau )R(\tau ) = \mathbb{E}_{\tau \sim p_\theta (\tau )} [R(\tau ) ]

策略梯度定义:
\nabla_{\theta} J(\theta)=\nabla_{\theta} \mathbb{E}[R(\tau)]=\nabla_{\theta} \sum_{\tau} p_{\theta}(\tau) R(\tau)=\sum_{\tau} \nabla_{\theta} p_{\theta}(\tau) R(\tau)

根据公式:\nabla \log{f(x)}=\frac{1}{f(x)}\nabla {f(x)},我们的目标是最大化期望值,故我们对目标函数进行求导:
\begin{aligned} \nabla \overline{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)} \\ & =\sum_{\tau} R(\tau) p_{\theta}(\tau) \nabla \log p_{\theta}(\tau) \\ & =\mathbb{E}_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right] \end{aligned}

最终策略梯度变成了求R(\tau) \nabla \log p_{\theta}(\tau)的期望,我们可以可以通过经验平均进行估计。我们可以使用当前策略\pi_\theta采样N条轨迹\tau后,利用N轨迹的经验平均逼近策略梯度(具体公式推导可查看上篇文档):
\begin{aligned} \nabla \overline{R}_{\theta} & =\mathbb{E}_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right] \approx \frac{1}{N} \sum_{n=1}^{N} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(\tau^{n}\right) \\ & =\frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) \end{aligned}

一个PG方法的完整流程如下:


首先采集数据,然后基于前面得到的梯度提升的式子更新参数,随后再根据更新后的策略再采集数据,再更新参数,如此循环进行。
注意到图中的大红字only used once,因为在更新参数后,策略已经变了,而先前的数据是基于更新参数前的策略得到的。

A2C方法

从上面可知:PG方法在更新策略时,基本思想就是增加reward大的动作出现的概率,减小reward小的策略出现的概率。

增加基线

假设现在有一种情况,我们的reward在无论何时都是正的,对于没有采样到的动作,它的reward是0。因此,如果一个比较好的动作没有被采样到,而采样到的不好的动作得到了一个比较小的正reward,那么没有被采样到的好动作的出现概率会越来越小,这显然是不合适的,因此我们需要增加一个奖励的基线,让reward有正有负。

\nabla \overline{R}_{\theta} =\frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}(R(\tau^{n}) - b) \nabla \log p_{\theta}(a_{t}^{n} \mid s_{t}^{n}),b \approx E [R(\tau )]

增加折扣因子

该轨迹获得的收益为累计回报:R(\tau )=\sum_{t=0}^{T}r_t,它是有问题的,当前动作与过去时刻的回报可能并没有多大的联系,故我们可以把每个动作的reward期望值修改为,该动作之后接收到的reward值,并且按照累积折算进行计算,因为某个动作在时间间隔上产生的影响,应该是越接近,影响越大。即R(\tau )=\sum_{{t}'=t}^{T_n} \gamma^{{t}' - t} r_{{t}'}^n。因此梯度表示为:
\nabla \overline{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}(\sum_{{t}'=t}^{T_n} \gamma^{{t}' - t} r_{{t}'}^n - b) \nabla \log p_{\theta}(a_{t}^{n} \mid s_{t}^{n})

优势函数

在AC方法中,使用Q^{\pi \theta}(s_{t}^{n}, a_{t}^{n})来替代R(\tau^{n}),同时使用一个独立的Critic网络来计算该Q函数值。现在,我们假设基准偏置b表示为状态的价值函数V^{\pi \theta}(s_{t}^{n}),因此梯度可以表示为:
\nabla \overline{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}(Q^{\pi \theta}(s_{t}^{n}, a_{t}^{n}) - V^{\pi \theta}(s_{t}^{n})) \nabla \log p_{\theta}(a_{t}^{n} \mid s_{t}^{n})

这时需要分别计算两个网络:状态-动作价值函数Q和状态函数V,再根据贝尔曼方程,上式表示为:
\nabla \overline{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}(r_t^n + V^{\pi}(s_{t+1}^n) - V^{\pi}(s_{t}^{n})) \nabla \log p_{\theta}(a_{t}^{n} \mid s_{t}^{n})

以上就是优势函数的概念:在状态s_t下,选择动作a_t比其他动作的优势有多少,即A(s, a)=Q(s, a) - V(s)

重要性采样

在第一节的PG算法中有个问题,PG方法一个很大的缺点就是参数更新慢,因为我们每更新一次参数都需要进行重新的采样,这其实是中on-policy的策略,即我们想要训练的agent和与环境进行交互的agent是同一个agent;与之对应的就是off-policy的策略,即想要训练的agent和与环境进行交互的agent不是同一个agent,简单来说,就是拿别人的经验来训练自己。
举个下棋的例子,如果你是通过自己下棋来不断提升自己的棋艺,那么就是on-policy的,如果是通过看别人下棋来提升自己,那么就是off-policy的。

那么为了提升我们的训练速度,让采样到的数据可以重复使用,我们可以将on-policy的方式转换为off-policy的方式。即我们的训练数据通过另一个Actor(对应的网络参数为θ'得到)。这要怎么做呢?通过下面的思路:

基于重要性采样的原则,我们可以用另外一个策略\pi_{\theta}',与环境互动采样数据来训练\theta,从而间接计算R(\tau) \nabla \log p_{\theta}((\tau)

重要性采样原理如下:
\begin{aligned} \mathbb{E}_{x \sim p}[f(x)] & =\int f(x) p(x) dx \\ & =\int f(x) \frac{p(x)}{q(x)} q(x) d x \\ & =\mathbb{E}_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right] \end{aligned}

w(x)=\frac{p(x)}{q(x)}即重要性权重(importance weight)。通过这个恒等式,我们可以将求\mathbb{E}_{x \sim p}[f(x)]期望的问题转到另一个分布q(x)下面!即当我们当前的目标分布不太方便得到的时候,我们可以通过另外一个较容易得到的分布,来求得当前的目标分布。

因此,我们可以将梯度表示为:
\begin{aligned} \nabla R_{\theta} & =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta}}\left[A^{\theta}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t} \mid s_{t}\right)\right] \\ & =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(s_{t}, a_{t}\right)}{p_{\theta^{\prime}}\left(s_{t}, a_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t} \mid s_{t}\right)\right] \\ & =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} \mid s_{t}\right) p_{\theta}\left(s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} \mid s_{t}\right) p_{\theta^{\prime}}\left(s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t} \mid s_{t}\right)\right] \\ & =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} \mid s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} \mid s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t} \mid s_{t}\right)\right] \end{aligned}

基于重要性采样的原则,由于A^{\theta}(s_{t}, a_{t})是Actor与环境交互的时候计算出来的,所以当从\theta换到\theta^{\prime}时候,就需要变换成A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)。并且最后一项假设两个分布不能差太远,所以认为他们是相等的,为了求解方便,我们直接划掉。

但是,基于重要性采样有个缺点,就是p(x)q(x)的分布不能差别太大(这点可根据两个分布期望和方差的差异得出)。当两个分布差距比较大的时候,通过重要性采样得到的样本数据可能就不对了,如下所示:

如图所示,p(x),q(x) 两个分布差距较大,当使用 p(x) 采样少量的样本的时候,f(x) 停留在左边,这时f(x) 的期望是负的;如果我们使用q(x)分布进行一些重要性采样,得到的样本期望可能是正的。这与f(x)在左边得到的期望值就不相符合了。当然如果q(x)采样足够多的话,还是有希望采样到左边的数据,进而得到负的期望值。 那么,如果可以保证p(x)和q(x)这两个分布是在某个程度内相似的,是不是就可以解决这个问题了呢?

PPO

对上面的梯度公式,根据\nabla f(x)=f(x)\nabla logf(x),反过来用,可以得到PPO的目标函数为:
J^{\theta^{\prime}}(\theta )=E_{(s_{t}, a_{t}) \sim \pi_{\theta^{\prime}}}[\frac{p_{\theta}(a_{t} \mid s_{t})}{p_{\theta^{\prime}}(a_{t} \mid s_{t})} A^{\theta^{\prime}}(s_{t}, a_{t})]

信任区域策略优化(TRPO)

我们不希望\theta\theta^{\prime}两者分布的差距不能过大,所以需要进行约束。引入KL散度来做限制。KL散度也叫相对熵,可以用来衡量两个分布之间的差异性。所以最直接的办法,就是对目标函数增加一个约束条件让他的KL散度小于\delta。目标函数如下:
\underset{\theta }{max} J_{TRPO}^{\theta^{\prime}}(\theta )=E_{(s_{t}, a_{t}) \sim \pi_{\theta^{\prime}}}[\frac{p_{\theta}(a_{t} \mid s_{t})}{p_{\theta^{\prime}}(a_{t} \mid s_{t})} A^{\theta^{\prime}}(s_{t}, a_{t})] \\ subject to KL(\theta, \theta^{\prime})<\delta

TRPO 与 PPO 不一样的地方是约束项的位置不一样,PPO 是直接把约束放到要优化的式子里,可以直接用梯度上升的方法最大化这个式子。但TRPO是把 KL 散度当作约束,它希望\theta\theta^{\prime}的 KL 散度小于一个\delta。如果我们使用的是基于梯度的优化时,有约束是很难处理的,因为它把 KL 散度约束当做一个额外的约束,没有放目标里面。PPO 跟 TRPO 的性能差不多,但 PPO 在实现上比 TRPO 容易的多,所以我们一般就用 PPO,而不用TRPO

PPO1:近端策略优化惩罚(PPO-penalty)

实际上,直接求解TRPO这种带约束的问题是十分复杂的,需要计算二阶梯度。所以PPO-penalty直接将KL散度作为一个惩罚项放在目标函数中,如下所示:
\underset{\theta }{max} J_{PPO1}^{\theta^{\prime}}(\theta )=E_{(s_{t}, a_{t}) \sim \pi_{\theta^{\prime}}}[\frac{p_{\theta}(a_{t} \mid s_{t})}{p_{\theta^{\prime}}(a_{t} \mid s_{t})} A^{\theta^{\prime}}(s_{t}, a_{t})] - \beta KL(\theta , \theta^{\prime})

为了更进一步提高惩罚项的作用,论文加入自适应的思想,当两者分布KL散度较大的时候,增大惩罚,使策略更新更加谨慎;当两个分布较相似的时候,减少惩罚,使之学得更快。即
\begin{cases} & \text{ if } KL(\theta , \theta^{\prime}) > KL_{max}, increase \beta \\ & \text{ if } KL(\theta , \theta^{\prime}) < KL_{min}, decrease \beta \end{cases}

PPO2:近端策略优化裁剪(PPO-clip)

PPO2再次提出更简洁的改进方法来限制\theta^{\prime}两个分布的距离。直接引入一个小的修剪量\epsilon。使这两个分布的比值约束在[1-\epsilon, 1+\epsilon]之间。PPO-clip的目标函数如下:
\underset{\theta }{max} J_{PPO2}^{\theta^{\prime}}(\theta )=E_{(s_{t}, a_{t}) \sim \pi_{\theta^{\prime}}}[min(r_t(\theta), clip(r_t(\theta), 1-\epsilon , 1+\epsilon)) A^{\theta^{\prime}}(s_{t}, a_{t})]

其中,r_t(\theta)=\frac{p_{\theta}(a_{t} \mid s_{t})}{p_{\theta^{\prime}}(a_{t} \mid s_{t})}表示重要性采样比率;A^{\theta^{\prime}}(s_{t}, a_{t})表示当前策略下的优势函数,当A>0时,希望增加该p_{\theta}的概率;但是不能过大,过大会使与p_\theta^{\prime}差距大,导致效果不好。反之亦然。

如上图所示,图示中的x轴是r_t(\theta,y轴表示clip(r_t(\theta), 1-\epsilon , 1+\epsilon),绿色的点表示r_t(\theta)的值,蓝色表示的是clip(r_t(\theta), 1-\epsilon , 1+\epsilon)的值,红色则表示PPO2的取值。

参考文献

相关文章

网友评论

      本文标题:强化学习4-PPO算法

      本文链接:https://www.haomeiwen.com/subject/wmejsjtx.html