Advertisement

RL 笔记(3)PPO(Proximal Policy Optimization)近端策略优化

阅读量:

RL 笔记(3) PPO

基本原理

PPO是在基本的Policy Gradient基础上提出的改进型算法

该方法的主要缺陷在于其对数据分布偏差的敏感性。由于Advantage函数估计不可避免地存在偏差,在策略的一次更新步长过大时可能会导致后续采样点严重偏离预期范围。这种情况下策略可能会被不断拉向极端位置而导致恶性循环现象的发生。为了克服这一局限性,在每次迭代过程中TRPO算法会严格限制策略参数的变化幅度

该方法属于基于策略梯度的方法,在传统上通常情况下会采用基于策略梯度的方法来训练模型。然而事实上传统上认为这种方法效率较低,并不能满足实际需求。因此尽管TRPO及PPO声称其属于基于策略梯度的方法论框架,在实际应用中大多数情况仍需采用离线策略评估的方式来处理问题,并且这种方法往往难以直接应用于在线学习场景中。具体来说就是采用分批采样来提高训练效率,并且为了进一步提高效率还可以重复利用这些样本信息以获得更好的收敛效果。同时对于后者而言最优的样本复用次数被证明为3次即一个样本可以被使用三次以达到更好的优化效果

因此,在训练过程中采用了off-policy的数据(仅在首次更新时采用on-policy策略,在后续更新中转为全采用off-policy策略),导致数据分布发生了变化。由于数据分布发生了变化(如前所述),我们需要引入重要性采样方法以进行必要的调整。

img

将期望值表示为\int f(x)p(x)dx后并引入新的采布q(x)进行变换,则此时我们发现这一过程与最大熵模型中引入潜在变量的方法具有相似性。从而可以将原始x_p的期望转换为x_q的形式,并由此可得:

E_{x~p} [f(x)p(x)] = E_{x~q}[f(x)\frac{p(x)}{q(x)}]

上述推导即为重要采样的技巧。其中\frac{p(x)}{q(x)}被称作重要加权因子。通过这一公式我们可以直观地理解:若所选取的采样分布p与真实分布q之间存在较大差异,则很可能导致两个期望值不一致性。
如图所示,通过一个具体例子进行了阐述

请添加图片描述

上图中的p(x)与q(x)存在显著差距,在左端为负值而右端为正值的情况下,在样本数量有限的情况下(即当右边被采样得较多时),可能会导致错误结论;然而当在左端也获得了一个样本时(即相当于赋予左边的样本更大的权重),就可以将结果修正为负值状态。因此可以看出重要的权重机制能够有效平衡两边的影响。不过我们也要认识到,在实际应用中需要保证足够的采样数量以避免仅在一个方向出现偏差的情况发生。

请添加图片描述

在进行重要性采样时, 我们希望避免出现分布之间的差距过大。因此, 我们需要对分布之间的距离——KL散度施加一个上限\delta, 这从而引出了TRPO方法

由于TRPO的损失函数包含条件约束项,在计算过程中需要引入共轭梯度法这一额外的技术手段来解决优化问题。这种做法将KL散度作为一个额外的约束项加入损失函数中,并未将其纳入目标函数部分因而难以直接求解。因此它难以在大规模问题上直接应用,并且需要进行一定的简化处理以便能够使用梯度下降法实现优化。随后PPO应运而生并将其KL散度作为一个正则化项整合到损失函数中以进一步提升算法性能

PPO算法还有两个主要的变种:PPO-penalty和PPO-clip

首先来看PPO-penalty ,也记为PPO-1

请添加图片描述

在该算法中, 我们会先设定一个策略变量\theta_0作为初始值. 在每个迭代步骤中, 我们将通过与环境交互生成一系列的状态-动作对. 接着, 我们计算其对应的Advantage函数值A^{\theta_k}(s_t, a_t), 并运用PPO优化公式来进行调整. 相较于传统的策略梯度方法, 后者每次只能调整一次模型参数\theta_{t+1} = \theta_t + \Delta\theta. 然而,在这种情况下我们可以让模型参数\theta进行多次更新

在PPO的相关论文中还有一种自适应的KL散度。这边会遇到一个问题:确定\beta的值是多少?它类似于正则化,在正则化项之前也会乘以一个权重系数;因此,在KL散度项之前也需要设置相应的权重系数。但是\beta的具体取值是多少仍是一个问题。为此需要一种动态调整\beta的方法。

我们首先设定一个\beta的上下限作为容许范围。在优化后的结果中发现KL散度指标过高,则应提高\beta 值;反之亦然,在发现KL散度指标过低时,则相应地降低\beta 值。

接着我们看PPO-clip ,也记为PPO-2。

KL散度的计算可能很复杂,PPO-clip里面就没有KL散度。

请添加图片描述
请添加图片描述

clip(x, 1-\epsilon, 1 + \epsilon)函数的作用是限制输入值x的范围,在x超过上限时将输入值截断为1 + \epsilon,在x低于下限时将输入值截断为1 - \epsilon;其余情况下保持输入值不变。

示范用于演示的教学案例与实际训练得到的学习模型经过优化后两者之间的差异不应过大

即当前策略与旧策略之间的偏差进行剪裁处理;当计算得到比率偏离超出\epsilon 时,则实施剪裁措施以控制偏差范围。从实现层面来看,在更新过程中不论进行多少次迭代或调整步骤都不会受到影响,在这层保护下确保了训练过程的有效性。

算法步骤

请添加图片描述

PPO收集一次样本训练几次?

根据上图,一次收集NT个样本,以某个minibatch size训练K个epoch。

从openai baseline的实现中可以看到,一般的设置是:

K=3,minibatch size = NT/4

K就是sample reuse的比率,表示一个样本用了多少次。

按照上面的设定,一次训练更新了12次。

在 PPO 方法中占据重要地位,在强化学习框架中对性能提升至关重要。由于当仅进行一次更新时, 这种情况将采用完全的 on policy 方法,并且设置 ratio=1 时, PPO 完全不依赖 clip 机制。这种情况下, 多次更新策略能够显著提高训练效率,并且能够在接近 clip 边缘的情况下最大化样本利用率。这将导致 policy 的训练效率显著下降。

此外,在上述设定下

此外,在上述设定下

在训练过程中,在每个32个步骤后会将最新的模型参数传递给Forward Pass GPU进行更新。采用异步策略以确保rollout始终使用最新的模型版本。随后Rollout Worker开始全盘异步运行,并进行大规模的数据采样。学习器持续从经验回放缓冲区中提取数据用于训练,并充分利用了所有计算资源。

参考

强化学习

全部评论 (0)

还没有任何评论哟~