VPG && TRPO && PPO

2021-02-02  本文已影响0人  臻甄

PPO(Proximal Policy Optimization) 是一种解决 PG 算法中学习率不好确定的问题的算法,因为如果学习率过大,则学出来的策略不易收敛, 反之,如果学习率太小,则会花费较长的时间。PPO 算法利用新策略和旧策略的比例,从而限制了新策略的更新幅度,让 PG 算法对于稍微大一点的学习率不那么敏感。

PPO是2017年由OpenAI提出的一种基于随机策略的DRL算法,它不仅有很好的性能(尤其是对于连续控制问题),同时相较于之前的TRPO方法更加易于实现。PPO算法也是当前OpenAI的默认算法,是策略算法的最好实现,虽然已经不是连续控制领域的SOTA了(现在是SAC和TD3)。

Paper

还不错的代码库
https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail
https://github.com/ray-project/ray/tree/master/rllib/agents/ppo
https://github.com/qingshi9974/PPO-pytorch-Mujoco

分析得很好的博文
PG-TRPO-PPO-PPG
分析ppo的各项tensorboard指标变化

PolicyGradient 最简单的策略梯度求导

Policy Gradient

【留下疑问】为什么用Advantage能获得更好的策略估计

【注意】

Expected Grad-Log-Prob (EGLP) 定理
作者没有给这个定理命名,但实际上这个结论非常有价值,用于论证如何获得低方差的样本估计,详细见此链接,假设P是由参数θ(模型参数)决定的概率分布,变量是随机参数x,则有

并不是一条轨迹仅计算一次策略梯度

Vanilla PolicyGradient (VPG)

Quick Facts

关键公式
假设π表示参数为θ的策略,而J表示该策略的预期有限的无折扣收益。 J的梯度为

算法

VPG

TRPO 置信域策略优化

推导https://zhuanlan.zhihu.com/p/29918825

缺点

算法

TRPO

PPO

PPO受到与TRPO相同的问题的激励:我们如何才能使用当前拥有的数据在策略上采取最大可能的改进步骤,而不会走得太远而导致意外导致性能下降(也就是说原本的PG算法对learn_step的大小很敏感,因为如果学习率过大,则学出来的策略不易收敛, 反之,如果学习率太小,则会花费较长的时间)?

在TRPO试图通过复杂的二阶方法解决此问题的地方,PPO是一阶方法的族,它使用其他一些技巧来使新策略接近于旧策略。 PPO方法明显更易于实现,并且从经验上看,其性能至少与TRPO相同。

PPO有两种主要变体:PPO-Penalty 和PPO-Clip。


image.png

Quick Facts

PPO-Clip比较常用(OpenAI使用的主要变体)。
尽管这种削减对确保合理的策略更新大有帮助,但仍然有可能最终产生与旧策略相距太远的新策略,并且不同的PPO实现使用了很多技巧来避免这种情况 关。 在此处的实现中,我们使用一种特别简单的方法:提前停止。 如果新政策与旧政策的平均KL差距超出阈值,我们将停止采取梯度步骤。

PPO1
为了判定模型的更新什么时候停止,PPO 在原目标函数的基础上添加了 KL 散度部分,用来表示两个分布之间的差别,差别越大值越大,惩罚也就越大。所以可以使两个分布尽可能的相似。PPO 算法的损失函数如下:

PPO损失函数
相比较TRPO使用KL散度作为约束条件来说,PPO的表现形式更简单 TRPO损失函数
PPO 在训练时可以采用适应性的 KL 惩罚因子:当 KL 过大时,增大 β 的值来增加惩罚力度;当 kL 过小时,减小 β 值来降低惩罚力度。 PPO1 β自适应调整

PPO2
PPO2 在 PPO 的基础上去除了 KL 散度损失函数,但是引入了 Clip 损失函数,当Advantage函数值低于 1 − ϵ或大于 1 + ϵ 时进行截断,可以保证两次更新之间的分布差距不大。其损失函数为:

PPO2 对目标值做clip
PPO2 clip的形象解释
上图中绿色虚线是原始的损失函数,蓝色虚线是 clip 函数,红色实线是实际上的损失函数,当优势函数 A 的值为正数或负数时,实际的损失函数有不同的情况。

综上,最常用的是PPO2。但现在连续控制领域的SOTA已经不是PPO了,TD3和�SAC在mujioco几个常用的环境中表现的都更好。

上一篇下一篇

猜你喜欢

热点阅读