VPG && TRPO && PPO
PPO(Proximal Policy Optimization) 是一种解决 PG 算法中学习率不好确定的问题的算法,因为如果学习率过大,则学出来的策略不易收敛, 反之,如果学习率太小,则会花费较长的时间。PPO 算法利用新策略和旧策略的比例,从而限制了新策略的更新幅度,让 PG 算法对于稍微大一点的学习率不那么敏感。
PPO是2017年由OpenAI提出的一种基于随机策略的DRL算法,它不仅有很好的性能(尤其是对于连续控制问题),同时相较于之前的TRPO方法更加易于实现。PPO算法也是当前OpenAI的默认算法,是策略算法的最好实现,虽然已经不是连续控制领域的SOTA了(现在是SAC和TD3)。
Paper:
- TRPO:Trust Region Policy Optimization
- PPO:Proximal Policy Optimization Algorithms
- OpenAI PPO Blog:Proximal Policy Optimization
还不错的代码库
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能获得更好的策略估计
- 随机策略:
π
- 优化目标:最小期望回报,并使用梯度下降来优化策略,为了方便求导,假设R是无衰减reward,但跟衰减reward基本是一样的 期望回报 θ通过策略梯度更新
- 为了求梯度,需要计算(每个策略轨迹发生的概率x轨迹的回报),为了消除状态转移概率,使用下面第三个公式消除,这个公式可以通过 (log y)' = (1/y)*y' 简单变换得到,那么使用LogP就可以把相乘变成相加,轻易把连加项中,与状态转移概率相关但是与θ无关的常数项消除。
- 整合一下推导公式
- 如果通过蒙特卡洛采样一系列的轨迹样本,策略梯度的计算如下,对D集合里的所有轨迹求策略梯度再求平均:
【注意】
- 1、PG是一个on-policy的算法,数据分布依赖于模型参数
- 2、loss function不能反应性能,loss下降不代表模型收敛的好,因为loss是策略的梯度,跟return没有关系,loss可能被优化到负无穷但模型表现依然很差,有些研究者描述这种现象为policy『过拟合』到一个batch的data
Expected Grad-Log-Prob (EGLP) 定理
作者没有给这个定理命名,但实际上这个结论非常有价值,用于论证如何获得低方差的样本估计,详细见此链接,假设P是由参数θ(模型参数)决定的概率分布,变量是随机参数x,则有
并不是一条轨迹仅计算一次策略梯度
- action发生之前的reward与该action无关,只有该action发生之后的所有reward能评价这个action『改变了什么』,所以Rt的计算是从当前action开始往后的所有reward之和。
Vanilla PolicyGradient (VPG)
- 策略梯度背后的关键思想是提高导致更高回报的操作的概率,并降低导致更低回报的操作的概率,直到获得最佳策略。
Quick Facts
- VPG是一个on-policy的算法,随着训练随机性会降低,容易陷入局部最优,探索不足。
- VPG可以用于连续动作空间或离散动作空间的环境
关键公式
假设π
表示参数为θ
的策略,而J
表示该策略的预期有限的无折扣收益。 J
的梯度为
算法
TRPO 置信域策略优化
- TRPO论文:Trust Region Policy Optimization
- 一种随机策略搜索方法,解决了Policy Gradient更新步长的问题
-
信赖域(Trust Region):
二次曲面拟合多n维曲面,若拟合够好,二次曲面在一给定区间[a,b]内的最大值为梯度更新的方向和位移。这一区间[a,b]即为信赖域。 蓝色曲线是约束曲线,在这种情况下为下界。 如果我们最大化下限,将做出更大的改进 -
代理函数(surrogate function):
策略性能提高的下界。因此,找出下界的最大值则能够提高学习性能速度(加快收敛速度)。来自CPI(conservative policy iteration)方法,找出近似策略最优,进而推出代理函数。 -
TRPO可理解为一种变异的策略梯度算法
起因于策略梯度中没有细致考虑更新步长α
,造成可能出现越学越差导致崩溃。TRPO提出的是每次更新选择的步长要保证回报函数单调递增。将新策略回报拆分为旧策略回报加一个正值就能保证策略回报递增。① 以advantage value来评价策略π
,更新后的策略应该比旧的策略更advantage。② 用KL divergence来约束使得新策略与旧策略保持足够的相似。
推导:https://zhuanlan.zhihu.com/p/29918825
缺点
- 难以与具有多个输出的体系结构一起使用。 (例如Policy和Value function)(由于KL差异无助于更新value function,因此需要测量不同术语的距离指标)。
- 根据经验,在需要深度CNN和RNN的任务上执行不佳。
- 共轭梯度使实现比SGD更复杂,灵活性也更低。
算法
PPO
PPO受到与TRPO相同的问题的激励:我们如何才能使用当前拥有的数据在策略上采取最大可能的改进步骤,而不会走得太远而导致意外导致性能下降(也就是说原本的PG算法对learn_step的大小很敏感,因为如果学习率过大,则学出来的策略不易收敛, 反之,如果学习率太小,则会花费较长的时间)?
在TRPO试图通过复杂的二阶方法解决此问题的地方,PPO是一阶方法的族,它使用其他一些技巧来使新策略接近于旧策略。 PPO方法明显更易于实现,并且从经验上看,其性能至少与TRPO相同。
PPO有两种主要变体:PPO-Penalty 和PPO-Clip。
image.png
- PPO-Penalty近似解决了TRPO之类的受KL约束的更新,但是惩罚了目标函数中的KL背离而不是使其成为硬约束,并在训练过程中自动调整了罚分系数,以使其适当地缩放。
- PPO-Clip在目标中没有KL散度项,也没有任何约束。取而代之的是依靠对目标函数的专门裁剪来消除新政策远离旧政策的动机。
Quick Facts
- PPO is an on-policy 策略.
- PPO可用于具有离散或连续动作空间的环境。
PPO-Clip比较常用(OpenAI使用的主要变体)。
尽管这种削减对确保合理的策略更新大有帮助,但仍然有可能最终产生与旧策略相距太远的新策略,并且不同的PPO实现使用了很多技巧来避免这种情况 关。 在此处的实现中,我们使用一种特别简单的方法:提前停止。 如果新政策与旧政策的平均KL差距超出阈值,我们将停止采取梯度步骤。
PPO1
为了判定模型的更新什么时候停止,PPO 在原目标函数的基础上添加了 KL 散度部分,用来表示两个分布之间的差别,差别越大值越大,惩罚也就越大。所以可以使两个分布尽可能的相似。PPO 算法的损失函数如下:
相比较TRPO使用KL散度作为约束条件来说,PPO的表现形式更简单 TRPO损失函数
PPO 在训练时可以采用适应性的 KL 惩罚因子:当 KL 过大时,增大 β 的值来增加惩罚力度;当 kL 过小时,减小 β 值来降低惩罚力度。 PPO1 β自适应调整
PPO2
PPO2 在 PPO 的基础上去除了 KL 散度损失函数,但是引入了 Clip 损失函数,当Advantage函数值低于 1 − ϵ或大于 1 + ϵ 时进行截断,可以保证两次更新之间的分布差距不大。其损失函数为:
PPO2 clip的形象解释
上图中绿色虚线是原始的损失函数,蓝色虚线是 clip 函数,红色实线是实际上的损失函数,当优势函数 A 的值为正数或负数时,实际的损失函数有不同的情况。
综上,最常用的是PPO2。但现在连续控制领域的SOTA已经不是PPO了,TD3和�SAC在mujioco几个常用的环境中表现的都更好。