课程与实现Study阅读约 6 分钟6 MIN READ
PPO
This note is written in Chinese.
Alan Zeng/更新于 Updated 2026.10.28 目录Contents
https://arxiv.org/abs/1707.06347
PPO 与 TRPO 旨在解决相同的问题:在策略梯度定理的步长α的选取中,如何选取合适的步长,使得更新的参数尽可能对应最好的策略,但也不至于走得太远,以至于导致性能崩溃。
PPO 也继承了 TRPO 的核心思想:引入重要性采样,提高样本效率;同时,通过某种方式来约束新旧策略间的差异不要太大。
不同的是,TRPO 试图用复杂的二阶方法解决这个问题(对目标函数采取一阶近似,约束条件采取二阶近似),然而 PPO 采用了一系列的一阶方法(Clip),它们使用一些其他技巧来使新策略接近旧策略。PPO 在算法上更加简单,且效果不输于 TRPO 算法的效果。
回顾一下,TRPO 算法对以下目标函数进行优化问题的求解:
这里,θold是更新之前的策略参数向量,At是在时刻t的优势函数估计,期望E^t是在采样和优化之间交替的算法中,有限批次样本的经验平均值。求解的过程采用到了共轭梯度和线性搜索的方式。
TRPO 在目标函数中,另外增加了一个约束条件。在推导该式的过程中, 涉及到了一个将KL 散度作为惩罚项的极值问题,转化为 KL 散度作为约束条件的优化问题的过程。将 KL 散度作为惩罚项的问题,公式如下:
然而,因为权重难以选择和调整的问题,因此 TRPO 并没有采取这样的方式进行目标函数的设定。
01PPO-惩罚(PPO1)
PPO-惩罚(PPO1)用拉格朗日乘数法直接将 KL 散度的限制放入了目标函数,因此变成了一个无约束的优化问题,在迭代的过程中不断更新 KL 散度前的系数。这里,使用几个阶段的小批量 SGD,优化 KL 惩罚目标,其更新方式即为公式(2)
为了对β进行动态调整,作者提出了自适应 KL 散度(adaptive KL divergence)的思想。具体做法是,在每个 epoch 对 KL 惩罚目标进行优化后,计算d=E^t[KL[πθold (⋅∣st),πθ(⋅∣st)]]:
- 如果d<1.5δ,则β←2β。
- 如果d>1.5δ,则β←2β
- 否则,β保持不变。 在这里,更新的β用于下一次迭代时的参数更新。
PPO 这里使用了 GAE 进行计算
02PPO-截断(PPO2)
PPO2 在限制新的策略参数与旧的策略参数的距离上,相比于 PPO1 更加直接。区别于 PPO1 使用 KL 散度的方式进行限制,PPO2 直接在目标函数上进行限制:
其中,
- rt(θ)=πθold (at∣st)πθ(at∣st) 称为概率比,易得rt(θold)=1
- clip(rt(θ),1−ϵ,1+ϵ)指的是将rt(θ)限制在[1−ϵ,1+ϵ]的范围内。
- clip(x,l,r):=max(min(x,r),l)即把x限制在[l,r]内
- ϵ为超参数,表示进行截断操作的范围,一般取ϵ=0.2。
这样,就始终保证了新旧策略的比值在[1−ϵ,1+ϵ]的范围内,保证了两个策略的差距不会太大。
PPO2 中,较为精妙的一点是在clip操作后乘了A^i(以下用A表示),而优势函数A是有正负的。
如下面两张图所示
- πθold(at∣st)πθ(at∣st) 是绿色的线;
- clip(πθold(at∣st)πθ(at∣st),1−ε,1+ε)=max[min(rt(θ),1+ϵ),1−ϵ]] 是红色的线;
在绿色的线与红色的线中间,我们要取一个最小的结果。
文章配图如图所示,假设前面乘上的项 A>0 ,取最小的结果,就是黑色的这条线。如右图所示,如果 A<0,取最小结果的以后,就得到红色的这条线。
下面来做一个详细的讨论。
- 如果 A>0,也就是某一个状态-动作二元组相比于状态价值函数V更好,我们就希望增大这个状态-动作二元组的概率。也就是,我们想让 πθ(at∣st) 越大越好,但它与 πθold (at∣st) 的比值不可以超过 1+ϵ 。如果超过 1+ϵ,新策略与旧策略之间的差距就会过大而产生问题。所以在训练的时候,当 πθ(at∣st) 被训练到πθold(at∣st)πθ(at∣st)>1+ϵ时,训练就会停止。
- 如果 A<0,也就是某一个状态-动作二元组相比于状态价值函数V更差,那么我们希望把 πθ(at∣st) 减小。如果 πθ(at∣st) 比 πθold(at∣st) 还大,那我们就尽量把它减小,减到 πθold(at∣st)πθ(at∣st) 是 1−ϵ 的时候停止, 此时不用再减得更小,即新旧策略之间的差距不会过大。
原文 · 原始标签:RL、AI、Paper-Reading
下一篇Next
Deploy frp on mac and linux
↗