Proximal Policy Optimization近端策略优化(PPO)

参考:蘑菇书EasyRL 

Policy Gradient梯度策略(PG)_bujbujbiu的博客-CSDN博客

PPO论文:

DeepMind Emergence of Locomotion Behaviours in Rich Environments

openAI Proximal Policy Optimization Algorithms 

目录

1.同策略和异策略 

2.近端策略优化(PPO)

2.1 近端策略优化惩罚(PPO-penalty)

2.2 近端策略优化裁剪(PPO-clip)​​​​​​​

1.同策略和异策略 

  • 同策略(on policy):要学习的智能体和与环境交互的智能体是相同的
  • 异策略(off policy):要学习的智能体和与环境交互的智能体不是相同的

策略梯度算法是同策略,交互和更新的参数相同,因此每次更新完参数后就要重新采样,并且一次只能更新一次参数,非常浪费时间。为此需要将同策略变成异策略,也就是用另一个演员\theta ^{'}与环境交互,用\theta ^{'} 采样的数据去训练\theta,这样可以多次更新参数。此处的采样就需要用到重要性采样这个概念(importance sampling)。

如果是从分布p中采样x,得到f(x),此时f(x)的期望值计算如下:

但是如果只能从分布q中采集数据x,那期望计算公式就要进行修正

这样我们不能直接从p中采样数据,但是可以通过从q里采样数据,再根据公式计算从p中采样x对应f(x)的期望值。\frac{p\left ( x \right )}{q\left ( x \right )}是用来修正两个分布的重要性权重(importance weight)。问题是即便两个分布的期望值相同,其方差也不一定相同,通过计算可得等式左右两边方差为:

 其区别在于\frac{p\left ( x \right )}{q\left ( x \right )},如果采样次数够多,可能结果也是一样,但是如果采样次数不够,因为方差差距的原因,其结果也会差很多。下图为例,从分布p中采样,期望值很显然为负,因为p(x)左边区域概率高,而f(x)<0。从分布q中采样,如果采样数不够多,很可能只采集到右侧,此时期望值为正,这样就会出现两个期望有较大差异,这个重要性采样存在的问题会在后面的PPO中解决,此处咱不说明。

 将重要性采样用到梯度策略中使其变成异策略,之前是用策略\theta与环境交互,采样出轨迹\tau,再计算R\left ( \tau \right )\bigtriangledown logp_\theta \left ( \tau \right )。现在用另一个策略\theta ^{'}与环境交互,就是这个演员做示范,\tau是从\theta ^{'}中采样出来的。此处和前文重要性采样关系可以理解为:p就是\theta,q就是\theta ^{'}

 实际上在策略梯度中提到权重使用的是每一对(s,a)的优势函数而非整个轨迹的奖励

再将重要性采样结合变成

拆解p_{\theta }\left (s_t,a_t \right )p_{\theta ^{'}}\left ( s_t,a_t \right )

 可以假设上述公式中红色框线比值为1,至于原因,直接点就是难以计算(对!就是这个原因!)就能得到如下梯度公式

由梯度反推目标函数

J^{\theta ^{'}}\left ( \theta \right ) 括号里的\theta 是我们要优化的参数,\theta ^{'}示范,也就是与环境交互的演员,通过交互采样出s_t,a_t,计算出其优势A^{\theta ^{'}}\left ( s_t,a_t \right ),再乘上前面的重要性权重。 

2.近端策略优化(PPO)

前文提到重要性采样时有一个问题:p_{\theta }\left (a_t|s_t \right )p_{\theta ^{'}}\left (a_t|s_t \right )不能相差太多,否则结果会非常不好,训练的时候要增加一个约束即KL散度(KL divergence),用于衡量\theta\theta ^{'}的相似程度,因此PPO有两项:原先就要优化的J^{\theta ^{'}}\left ( \theta \right ) 和KL散度约束。

 PPO有一个前身:信任区域策略优化(trust region policy optimization,TRPO),TRPO表示如下,其与PPO区别在于:TRPO将KL散度作为约束,PPO将KL散度放进优化式子中。TRPO额外约束的方式比较难计算,虽然两者性能差不多,但是PPO在实现上简单许多。

 KL散度不是\theta\theta ^{'}参数上的距离,而是一种行为距离,行为距离(behavior distance)就是,给定同样的状态,输出动作之间的差距。这两个动作的分布都是概率分布,所以我们可以计算这两个概率分布的 KL 散度。把不同的状态输出的这两个分布的 KL 散度的平均值就是我们所指的两个演员间的 KL 散度。

PPO有两个主要的变种:近端策略优化惩罚(PPO-penalty)近端策略优化裁剪(PPO-clip)

2.1 近端策略优化惩罚(PPO-penalty)

 使用KL散度解决重要性采样问题,此处的\theta ^{k}是前一个训练迭代得到的演员参数。在DeepMind的论文中带KL的PPO算法如下,\theta ^{k}​​​​​​​是根据上一次的\theta,因此关于ppo是on policy还是off policy存在争议。

KL散度前面的\beta需要动态调整,称为自适应KL惩罚(adaptive KL penalty),设置KL最大值和最小值,如果KL\left ( \theta ,\theta ^{k} \right )>KL_{max},表明惩罚项没有发挥作用,增大\beta;如果KL\left ( \theta ,\theta ^{k} \right )<KL_{min},表明惩罚项效果太大了,减小\beta

2.2 近端策略优化裁剪(PPO-clip)

如果觉得KL计算比较复杂,可以使用 PPO-clip,其目标函数中没有KL散度

min操作符表明只需在两项中选择最小的那个,第一项为常规目标函数,第二项为裁剪的目标函数。第二项中的clip裁剪函数括号里有三项,第一项最大不能超过\varepsilon +1,最小不能小于\varepsilon -1,在这个范围内就等于本身。\varepsilon是一个超参数,需要调整,可以设置为0.1或0.2。

了解裁剪函数的输出后,结合起来看,下图中绿色的直线为常规目标函数,蓝色的线为裁剪目标函数,红色为执行min操作后得到的目标函数值。在A>0时,也就是某个状态动作对是好的,就要增加这个状态动作对的概率,也就是p_\theta \left (a_t|s_t \right )越大越好,但是其与p_{\theta ^{k}}\left ( a_t|s_t \right )比值不能超过\varepsilon +1。在A<0时, 也就是某个状态动作对是不好的,就要减少这个状态动作对的概率,p_\theta \left (a_t|s_t \right )越小越好,减到\varepsilon -1为止。这样我们在更新策略的时候又不会是采样误差过大。

 在openAI的论文中比较了PPO和其它算法,PPO为紫色,多数情况下,PPO表现都更好。

 

猜你喜欢

转载自blog.csdn.net/weixin_45526117/article/details/126333385