近端策略优化 (Proximal policy optimization, PPO):强化学习中的一种策略优化方法,其相比 TRPO 更简单、稳定与高效。

1 重要性采样的局限

上一篇文章策略梯度算法尾部提到了从 On-Policy 转换到 Off-Policy 的方法,从数学上看起来这个转换是无损的,但在实际情况中它是有代价的。

例如对于以下例子,蓝色为 p(x),红色为 q(x),绿色是 f(x).

显然,Exp[f(x)]<0,那根据重要性采样:

Exp[f(x)]=Exq[p(x)q(x)f(x)]<0

这在数学上当然是成立的,但实际中需要考虑的是采样数量是有限的。

很有可能我们在 q 分布中采样得到的 x 全部都是 >0 的,这就会导致算出 Exp[f(x)]>0 的错误结果。只有采样数量足够多(或者运气够好),采到 x<0 的情况,才有可能得到更加正确的结果。

这便告诉我们,即使重要性采样在数学中是完全正确的,但在实际中需要保证 p,q 两分布的差异不要太大,过大的差距会导致采样得到的期望有很大的偏差。

2 添加约束

首先来看重要性采样的策略梯度算法的目标:

maxθE(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]

最朴素的想法是添加一个约束条件,不要让 πθπθ 两个分布差异太大:

maxθ E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]s.t.  E[KL[πθ(st),πθ(st)]]δ

这个最朴素的思想便是 TRPO (Trust Region Policy Optimization) 方法了,不过带约束的问题较难求解,将硬约束转换为惩罚值,把问题变成无约束的来求解更方便:

maxθ E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)βKL[πθ(st),πθ(st)]]

但这又带来一个问题,β 这个超参数的选择较为困难。很难选择一个适应于多种问题的 β,甚至在单一的问题求解中,设定固定的 β 也表现不佳。

3 PPO 方法

在 PPO 的论文中,提出了两种方法,分别是:

  1. 截断代理目标 (Clipped Surrogate Objective)
  2. 自适应 KL 惩罚系数 (Adaptive KL Penalty Coefficient)

3.1 截断代理目标

这种方法的目标是:

maxθ E(st,at)πθ[min(pθ(atst)pθ(atst)Aθ(st,at),clip(pθ(atst)pθ(atst),1ϵ,1+ϵ)Aθ(st,at))]

其中:

clip(x,y,z)={y,ifx<yx,ifyxzz,ifx>z

这个公式看着花里胡哨的,那就先看期望值里面的内容,画个图出来就好理解了。左边是 A>0 的情况,右边是 A<0 的情况:

对于 A>0 的情况,学习时会设法通过变大 pθ(atst) 这个概率来最大化期望,但是变大 pθ(atst) 同时会导致 pθ(atst)pθ(atst) 变大。当这个比值大于设定的 1+ϵ 后,目标函数值将会被截断,“告诉”模型再往上调整也不会获得收益了。反之,对于 A<0 的情况也是一样的,就是加了个负号而已。

可以看到,这个方法的思路实际上很直白,就是通过限制模型通过加大 θθ 的差距获得的收益,来维持两个分布相似。

3.2 自适应 KL 惩罚系数

这种方法实际上就是让带惩罚的 TRPO 方法的惩罚值可以自适应,它的目标和上文一模一样:

maxθ E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)βKL[πθ(st),πθ(st)]]

唯一区别就是 β 会进行自适应。首先设定一个目标差异 dtarget

  • 计算 d=E[KL[πθ(st),πθ(st)]]

    • 如果 d<dtarget1.5,则 ββ2
    • 如果 d>1.5dtarget,则 β2β

其中的超参数 1.52 是启发式选取得到的,但这个算法实际上对这两个超参不敏感。

这个方法的思路实际上也很直白:如果我们发现 θθ 的差距太小,这代表 β 的限制可能太大了,模型不愿意去调整 θ 的分布,于是将 β 改小;如果发现 θθ 的差距太大,这代表 β 的限制不够,于是将 β 改大。

4 效果

论文中将各种策略优化方法进行了对比实验,可以看到使用 Clip 方法的 PPO 算法在大多数场景下都优于其他算法。可以看到 PPO 算法的思路虽然朴素直白,但是效果是非常不错的。

5 Critic 模型的引入

在看了 PPO 相关的论文和博文后,我发现目前应用的 PPO 并不是原论文的原始版本。

原论文中,PPO 需要三个模型:Actor, Reference, Reward. 它们的功能上文介绍过了。

但阅读相关文献,可以发现现在最常见的 PPO 是四个模型的:Actor, Critic, Reference, Reward. 多的一个 Critic 模型便是本章的重点。

5.1 原始版本的缺点

首先,在 RL 训练时有很多随机性:

  • 行为是随机的:对于一个 State,Actor 选择要做的 Action 是随机的。
  • 环境是随机的:对于一个 State,在 Actor 做出一个 Action 后,转换为新的 State,新 State 的选择可能是随机的。

这给训练带来了非常大的不稳定性,对于同样的初始状态,多个 Episode 得到的 Reward 值可能是截然不同的。另外,多个随机变量叠加起来,方差会成平方增长,导致 RL 的训练非常不稳定。

用一个例子来解释:

例如我们训练一个 Actor 躲避对手的攻击,躲避得越好 Reward 越高,同时对手的出招随机,普攻好躲、大招难逃。

此时,如果使用普通 PPO 进行训练,对于同一个 Actor,如果对手出普攻时会发现躲避得比较好,Reward 比较高,但对手出大招时总躲不掉,Reward 很低。这就给 RL 训练带来很大得麻烦,对于同一个躲避的操作,Reward 很不稳定方差很大。

为了解决这个问题,可以让随机的 Reward 都减掉一个基准值 Baseline,从而降低方差、稳定训练。这个 Baseline 的值便是 Critic 模型来决定的,下面进行说明。

5.2 引入 Critic 模型

Critic 模型也叫做 Value 函数 V(s),它的作用是评估当前 Actor 在特定 State 情况下,可以得到的 Reward 的期望值。它的作用是评估在当前 State 条件下,该 Actor 能达到的平均水准。

继续沿用上面的例子:

  • 如果对手出大招 s1 时,V(s1) 就会比较低,代表这个 Actor 得分期望低
  • 如果对手出普攻 s2 时,V(s2) 就会比较高,代表这个 Actor 得分期望高。

那么我们将这个 Value 作为 Baseline,让 Reward 减去这个 Value: R(st,at)V(st). 就可以让不同随机情况下的奖励更加稳定。

继续沿用上面的例子:

  1. 如果对手出大招,Actor 躲避失败了:那么 R(s1,a)V(s1)不会过小,因为这个操作确实很困难,奖励时得补偿难度。
  2. 如果对手出普攻,Actor 躲避成功了:那么 R(s1,a)V(s1)不会很大,因为这个操作在期望之中,适当奖励即可。
  3. 如果对手出大招,Actor 躲避成功了:那么 R(s1,a)V(s1) 就会非常大,代表这个操作是超常发挥,得狠狠奖励。
  4. 如果对手出普攻,Actor 躲避失败了:那么 R(s1,a)V(s1) 就会非常小,因为这个操作是发挥失常,奖励值就是负数。

那么,对于同一个 Actor,最可能发生的事情就是 1 和 2,可以发现将 Reward 减去 Baseline 后,奖励值稳定多了,不会出现方差过大的情况。

综上,引入 Critic 后,PPO 总共需要四个模型:

  1. Actor:与环境交互的主体,基于当前环境观测到的 State 给出下一步 Action.
  2. Critic:评估 Actor 行为的教练,基于 Actor 在当前 State 的期望水准给出基准值。Critic 是和 Actor 一起训练的。
  3. Reward:给出最终分数的模型,基于环境规则给出 Reward. Reward 往往是预定义好的,因此参数冻结。
  4. Reference:参考模型,约束 PPO 训练不要让模型偏离原始模型过远,参数也是冻结的。
文章目录