# Proximal Policy Optimization(PPO)

OpenAI默认的强化学习算法, 是Policy Gradient的变形。

# On-Policy到Off-Policy

在RL中我们要学习的就是一个Agent

  • On-Policy: 和环境互动的Agent就是我们要学习的Agent; 一边做互动,一边学习。
  • Off-Policy: 和环境互动的Agent不是我们要学习的Agent; 通过看别人学习。

前面提到的Policy Gradient的方法就是一种On-Policy的方法。

Rθ=Eτpθ(τ)[R(τ)logpθ(τ)]\nabla \overline{R}_{\theta}=E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right]

前面提到了Policy Gradient的方法要玩很多次游戏才更新依次参数θ\theta,这样子就会变得超级不划算,有没有更合理的方法呢?

  • Goal: Using the sample from πθ\pi_{\theta'} to train θ\theta. θ\theta' is fixed, so we can re-use the sample data.

# 重要性抽样 Importance Sampling

我们已经知道:

Exp[f(x)]1Ni=1Nf(xi)E_{x \sim p}[f(x)] \approx \frac{1}{N} \sum_{i=1}^{N} f\left(x^{i}\right)

其中, xix^i 是从p(x)p(x)采样得到。但是假设现在的问题是,我们没有办法从p(x)p(x)里面采样数据, 我们只能从q(x)q(x)里面采样,那怎么算这个期望呢?

Exp[f(x)]=f(x)p(x)dx=f(x)p(x)q(x)q(x)dx=Exq[f(x)p(x)q(x)]E_{x \sim p}[f(x)] = \int f(x) p(x) d x=\int f(x) \frac{p(x)}{q(x)} q(x) d x=E_{x\sim q}\left[f(x) \frac{p(x)}{q(x)}\right]

这样就是从qq这个分布里面采样得到xx, 而不是从pp里面做采样了,真是神奇的变化啊! 这里的p(x)q(x)\frac{ p(x)}{q(x)}就是起到一个修正的作用的权值。

理论上分布q(x)q(x)为什么都可以,但是实作上qqpp不能差太多。虽然两个分布的期望是一样的,但是他们的方差呢?

提示

Var[X]=E[X2](E[X])2Var[ X ] = E[ X^2 ] - (E[ X ])^2

Varxp[f(x)]=Exp[f(x)2](Exp[f(x)])2Var_{x \sim p}[f(x)]=E_{x \sim p}\left[f(x)^{2}\right]-\left(E_{x \sim p}[f(x)]\right)^{2}

Varxq[f(x)p(x)q(x)]=Exq[(f(x)p(x)q(x))2](Exq[f(x)p(x)q(x)])2Var_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right]=E_{x \sim q}\left[\left(f(x) \frac{p(x)}{q(x)}\right)^{2}\right]-\left(E_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right]\right)^{2}

=Exp[f(x)2p(x)q(x)](Exp[f(x)])2=E_{x \sim p}[f(x)^{2} \frac{p(x)}{q(x)}]-\left(E_{x \sim p}[f(x)]\right)^{2}

两式中只有第一项不一样。因此,若是两个分布太大,就会出现很大的偏差。若是采样不够多就有可能出现偏差, 举个例子来说:

提示

Exq[f2(x)p2(x)q2(x)]=f2(x)p2(x)q2(x)q(x)dx=f2(x)p2(x)q(x)dx=f2(x)p(x)q(x)p(x)dx=Exp[f2(x)p(x)q(x)]\mathbb{E}_{x\sim q}[f^2(x)\frac{p^2(x)}{q^2(x)}] = \int f^2(x)\frac{p^2(x)}{q^2(x)}q(x)dx = \int f^2(x)\frac{p^2(x)}{q(x)}dx = \int f^2(x)\frac{p(x)}{q(x)}p(x)dx = \mathbb{E}_{x\sim p}[f^2(x)\frac{p(x)}{q(x)}]

本来两者的期望按理来说应该是一样的,但是由于两个概率分布p(x)p(x), q(x)q(x) 相差太大,若是采样不够就会出现得到的两个分布的的期望 不一样。

# 正式开始将On-Policy变成Off-Policy

疑问

可以这样理解吗? 原本τ\tau服从的分布pθ(τ)p_{\theta}(\tau)其实是不清楚的, 需要玩很多很多把的游戏才能够统计近似出来。而且每改变一次 θ\theta, 又要玩很多把游戏才能得到新的pθ(τ)p_{\theta}(\tau), 这样做是非常耗费时间的。于是我们就使用一个已知的概率分布去抽样,得到的 游戏记录可以保存起来,这样就可以不断地拿去更新。

将原来的:

Rθ=Eτpθ(τ)[R(τ)logpθ(τ)]\nabla \overline{R}_{\theta}=E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right]

变成:

Rθ=Eτpθ(τ)[pθ(τ)pθ(τ)R(τ)logpθ(τ)]\nabla \overline{R}_{\theta}=E_{\tau \sim p_{\theta^{\prime}}(\tau)}\left[\frac{p_{\theta}(\tau)}{p_{\theta^{\prime}}(\tau)} R(\tau) \nabla \log p_{\theta}(\tau)\right]

这里的θ\theta'是来给θ\theta做示范的, 实际当中都是拿θ\theta'来和环境做互动。

  • 使用θ\theta'采样得到数据
  • 使用采样得到的数据去训练θ\theta很多次

从Policy Gradient的方法中,我们知道

RθE(st,at)πθ[Aθ(st,at)logpθ(atnstn)]\nabla \overline{R}_{\theta} \approx 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}^{n} | s_{t}^{n}\right)\right]

利用重要性采样的技术,我们可以得到:

=E(st,at)πθ[Pθ(st,at)Pθ(st,at)Aθ(st,at)logpθ(atnstn)]=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'}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right]

=E(st,at)πθ[pθ(atst)pθ(atst)pθ(st)pθ(st)Aθ(st,at)logpθ(atnstn)]=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} \frac{p_{\theta}\left(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}^{n} | s_{t}^{n}\right)\right]

这里我们认为pθ(st)pθ(st)=1\frac{p_{\theta}(s_t)}{p_{\theta'}(s_t)}=1,这样就可以约掉,这里可以这样强行解释一下:

  • 看到什么样的画面可能跟你采取什么样子的动作没有什么关系
  • 这一项很难算,直接忽略掉 而这里的pθ(atst)p_{\theta}(a_t| s_t)pθ(atst)p_{\theta'}(a_t| s_t)很好算,就直接是两个网络θ\theta,θ\theta'的输出。

由下面的

关系

f(x)=f(x)logf(x)\nabla f(x)=f(x) \nabla \log f(x)

可以得到我们的目标函数:

Jθ(θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]J^{\theta^{\prime}}(\theta)=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right]

上面的式子中概率直接由神经网络的输出得到,Advantage可以通过采样估算,因此是可以算的。

目标函数有了,回到前面提到过的问题:p(θ)p(\theta)p(θ)p(\theta')不能差太多,差太多结果就会不好,那如何处理这个问题呢?

# Add Constrain

使用下面的技巧,在做训练的时候添加一个Constrain, 我们不直接训练Jθ(θ)J^{\theta^{\prime}}(\theta),而是训练下面的目标函数:

JPPOθ(θ)=Jθ(θ)βKL(θ,θ)J_{P P O}^{\theta^{\prime}}(\theta)=J^{\theta^{\prime}}(\theta)-\beta KL\left(\theta, \theta^{\prime}\right)

这里的βKL(θ,θ)\beta KL\left(\theta, \theta^{\prime}\right)是两个模型的输出的动作的的KL Diversion (opens new window),他是用来衡量θ\thetaθ\theta^\prime像不像的量, 这个值是一个非负数,当θ\thetaθ\theta^\prime相等时, KL(θ,θ)=0KL\left(\theta, \theta^{\prime}\right)=0, 相差越大这个值越大。

注意

这里的KL Diversion并不是参数上的距离,而是行为上的距离。因为有很多时候,参数变化了不一定行为就发生了改变。

说这么多, PPO算法就是下面的样子:

PPO Algorithm

  • 初始化Policy的参数θ0\theta^0
  • 循环
    • 使用θk\theta^k去和环境做互动,收集{st,at}\{s_t, a_t \}, 计算advantage Aθk(st,at)A^{\theta^{k}}(s_t,a_t)
    • 找使得JPPO(θ)J_{PPO}(\theta)更优的θ\theta: 这一步要多次更新θ\theta
      • JPPOθk(θ)=Jθk(θ)βKL(θ,θk) J_{P P O}^{\theta^{k}}(\theta)=J^{\theta^{k}}(\theta)-\beta K L\left(\theta, \theta^{k}\right)

      • Jθk(θ)(st,at)pθ(atst)pθk(atst)Aθk(st,at)J^{\theta^{k}}(\theta) \approx \sum_{\left(s_{t}, a_{t}\right)} \frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{k}}\left(a_{t} | s_{t}\right)} A^{\theta^{k}}\left(s_{t}, a_{t}\right)

      • KL(θ,θk)=?KL(\theta,\theta^k)= ?

    • 动态调整Constrain的权值β\beta, 也叫作Adaptive KL Penalty:
      • 更新θ\theta后, 如果发现KL(θ,θk)>KLmaxKL\left(\theta, \theta^{k}\right)>K L_{\max }, 说明后面的约束没有起到作用, 因此增大β\beta
      • 更新θ\theta后, 如果发现KL(θ,θk)<KLminKL\left(\theta, \theta^{k}\right)<K L_{\min }, 说明后面的约束作用太强,因此减小β\beta

上面式子中的KL(θ,θk)KL(\theta,\theta^k)还没有给出来,它需要通过采样数据得到,不是那么容易,因此为了逃避这个问题, 我们使用PPO2算法,它对应的目标函数是:

这个式子里面没有了KLKL, 看起来变得复杂了,但事实操作的时候变得很简单, ε\varepsilon是一个可变的参数。这个式子可以达到和KLKL一样的功能,就是使得pθp_\thetapθkp_{\theta^k}不要差距太大。它是怎么做到的呢?

注意到横轴是pθpθk\frac{p_\theta}{p_{\theta^k}}, 若是A>0A>0, 也就是说(st,at)(s_t,a_t)这组pair是好的,于是我们就想要增加(st,at)(s_t,a_t)这组pair的几率,也就是想要pθp_{\theta}越大越好,但是有不能太大,即pθpθk\frac{p_\theta}{p_{\theta^k}}的值不能大于1+ε1+\varepsilon。这样就避免了两者差别太大。注意到pθkp_{\theta^k}始终是不变的。

clip function

clip(a,b,c)={b,ifa<bc,ifa>ca,else\text{clip}(a, b, c)=\left\{\begin{array}{ll}{b,} & {\text { if } a<b} \\ {c,} & {\text { if } a>c} \\ {a,} & {\text { else }}\end{array}\right.

上次更新: 11/24/2021, 10:39:29 PM