近端策略优化
近端策略优化
同策略与异策略
对于上篇文章所得的同策略优化算法
其中$E_{\tau\sim p_\theta(\tau)}$是对策略$\pi_\theta$采样的轨迹$\tau$求期望。一旦更新了参数,从$\theta$变成$\theta’$,概率$p_\theta(\tau)$就不再正确,之前采样的数据也就不能用了,所以策略梯度是一个会花很多时间来采样数据的算法, 其大多数时间都在采样数据。智能体与环境交互以后,接下来就要更新参数。我们只能更新参数一次,然后就要重新采样数据,才能再次更新参数。这显然是非常花时间的。
所以我们引入了异策略算法,用另外一个策略$\pi_{\theta’}$,另外的参数$\theta’$与环境交互,($\theta’$是被固定的),用$\theta’$采样所得的数据去训练$\theta$,我们就可以多次使用$\theta’$采样得到的数据,可以多次执行梯度上升。
重要性采样
假设我们采用大数定理,x服从分布p,如果我们不能从分布 p 采样数据,只能从另外一个分布 q 采样数据 x,q 可以 是任何分布。如果我们从 q 采样$x^i$,也可以获得函数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)}]
$$
$$
E_{x\sim p}[f(x)]=E_{x\sim q}[f(x)\frac{p(x)}{q(x)}]
$$
理论上我们可以用任何q分布来计算上式,但是在实际情况下,p和q的差距不能太大。这是因为他们虽然期望相同,但是方差不同,如果p和q的差距很大,其方差也差距很大,如果我们采样次数不够,就有可能得到差别非常大的结果。
现在要做的就是把重要性采样用在异策略的情况中,把同策略训练的算法改成异策略训练的算法。怎 么改呢?如式 所示,之前我们用策略$\pi_{\theta}$ 与环境交互,采样出轨迹 $\tau$,计算 R(τ )∇ log pθ(τ )。现在我们 不用 θ 与环境交互,假设有另外一个策略$\pi_{\theta’}$,它就是另外一个策略,它的工作是做示范:
现在与环境交互的是 θ ′ 而不是 θ,所以采样的数据与 θ 本身是没有关系的。因此我们就可以 让 θ ′ 与环境交互采样大量的数据,θ 可以多次更新参数,一直到 θ 训练到一定的程度。更新多次以后,θ ′ 再重新做采样,这就是同策略换成异策略的妙处.
实际在做策略梯度的时候,我们并不是给整个轨迹 τ 一样的分数,而是将每一个状态-动作对分开计 算。实际更新梯度的过程可写为:
我们用agent θ 采样出 st 与 at,采样出状态-动作的对,我们会计算这个状态-动作对的优势(advantage) $A^θ (s_t , a_t)$,就是它有多好。$A^θ (s_t , a_t)$ 即用累积奖励减去基线,这一项就是估测出来的。它要估测的是,在状态 st 采取动作 at 是好的还是不好的。接下来在后面乘 $\nabla \log p_θ (a^n_t \vert s^n_t )$,也就是如果 $A^θ (s_t , a_t)$ 是正的, 就要增大概率;如果是负的,就要减小概率。
再一步变换:
又因为环境返回状态其实和agent网络参数$\theta$的相关性是比较小的,所以我们可以近似看做$p_\theta(s_t)=p_\theta’(s_t)$,上式化简为:
注意,对 θ 求梯度时,$p_{\theta’}(a_t\vert s_t)$ 和 $A^{\theta’}(s_t,a_t)$都是常数。
记我们需要优化的f(x)为:
近端策略优化:PPO
我们可以通过重要性采样把同策略换成异策略,但重要性采样有一个问题:如果 p 与 q相差太多,即这两个分布相差太多,重要性采样的结果就会不好。怎么避免它们相差太多呢?这就是 PPO 要做的事情
在异策略的方法里优化目标函数$J^{\theta’}(\theta)$。但是这个目标函数又牵涉到重要性采样。在做重要性采样的时候,p 不能与 q 相差太多。做示范的模型不能与真正的 模型相差太多,相差太多,重要性采样的结果就会不好。我们在训练的时候,应多加一个约束(constrain)。 这个约束是 θ 与 θ ′ 输出的动作的 KL 散度(KL divergence),这一项用于衡量 θ 与 θ ′ 的相似程度。我 们希望在训练的过程中,学习出的 θ 与 θ ′ 越相似越好。因为如果 θ 与 θ ′ 不相似,最后的结果就会不好。 所以在 PPO 里面有两项:一项是优化本来要优化的$J^{\theta’}(\theta)$,另一项是一个约束。这个约束就好像正则化 (regularization)的项(term)一样,它所做的就是希望最后学习出的 θ 与 θ ′ 相差不大.
$$
J^{\theta’}_{PPO}(\theta)=J^{\theta’}(\theta)-\beta KL(\theta,\theta’)
$$
近端策略优化惩罚
它先初始化一个策略的参数$\theta^0$。在每一个迭代里面,我们用前一个训练的迭代得到的agent的参数$\theta^k$与环境交互从而更新$\theta$
自适应KL惩罚
在这个方法里面,我们先设一个 可以接受的 KL 散度的最大值。假设优化$J^{\theta’}_{PPO}(\theta)$以后,KL 散度的值太大,大于我们设置的KL散度最大值,这就代表后面惩罚的项 β没有发挥作用,我们就把β增大。同理,设置一个KL散度最小值,如果KL散度比最小值海啸,表面最后一项效果太强了,我们减小β。
$$
\begin{cases}
增大\beta\ ,if KL(\theta,\theta^k)>KL_{max}\\
减小\beta\ ,if KL(\theta,\theta^k)<KL_{min}
\end{cases}
$$
近端策略优化裁剪
此方法目标函数中没有KL散度,其要最大化的目标函数为:
$$
J^{\theta^k}{PPO2}\approx \sum{(s_t,a_t)}\min\left(\frac{p_\theta(a_t\vert s_t)}{p_{\theta^k}(a_t\vert s_t)}A^{\theta^k}(s_t,a_t),clip(\frac{p_\theta(a_t\vert s_t)}{p_{\theta^k}(a_t\vert s_t)},1-\epsilon,1+\epsilon)A^{\theta^k}(s_t,a_t)\right)
$$
其中第二项前面有一个裁剪(clip)函数,裁剪函数是指,在括号里面有 3 项,如果第一项小于第二项, 那就输出 1 − ε;第一项如果大于第三项,那就输出 1 + ε
这个式子又是怎样让p和q接近的呢?
如果 A > 0,也就是某一个状态-动作对是好的,我们希望增大这个状态-动作对的概率。也就是,我们想让 $p^θ(a_t |s_t) $越大越好,但它与$p^{θ^k}(a_t |s_t) $的比值不可以超过 1 +ε。如果 超过 1 + ε ,就没有好处了。
如果 A < 0,也就是某一个状态-动作对是不好的,那么我们希望把 $p^θ(a_t |s_t) $减小。如果 $p^θ(a_t |s_t) $)比 $p^{θ^k}(a_t |s_t) $还大,那我们就尽量把它减小,减到$ \frac{p^θ(a_t|s_t)}{ p^{θ^k} (a_t|s_t)} $是 1 − ε 的时候停止