参考:蘑菇书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)
策略梯度算法是同策略,交互和更新的参数相同,因此每次更新完参数后就要重新采样,并且一次只能更新一次参数,非常浪费时间。为此需要将同策略变成异策略,也就是用另一个演员与环境交互,用
采样的数据去训练
,这样可以多次更新参数。此处的采样就需要用到重要性采样这个概念(importance sampling)。
如果是从分布p中采样x,得到f(x),此时f(x)的期望值计算如下:
但是如果只能从分布q中采集数据x,那期望计算公式就要进行修正
这样我们不能直接从p中采样数据,但是可以通过从q里采样数据,再根据公式计算从p中采样x对应f(x)的期望值。是用来修正两个分布的重要性权重(importance weight)。问题是即便两个分布的期望值相同,其方差也不一定相同,通过计算可得等式左右两边方差为:
其区别在于,如果采样次数够多,可能结果也是一样,但是如果采样次数不够,因为方差差距的原因,其结果也会差很多。下图为例,从分布p中采样,期望值很显然为负,因为p(x)左边区域概率高,而f(x)<0。从分布q中采样,如果采样数不够多,很可能只采集到右侧,此时期望值为正,这样就会出现两个期望有较大差异,这个重要性采样存在的问题会在后面的PPO中解决,此处咱不说明。
将重要性采样用到梯度策略中使其变成异策略,之前是用策略与环境交互,采样出轨迹
,再计算
。现在用另一个策略
与环境交互,就是这个演员做示范,
是从
中采样出来的。此处和前文重要性采样关系可以理解为:p就是
,q就是
。
实际上在策略梯度中提到权重使用的是每一对(s,a)的优势函数而非整个轨迹的奖励
再将重要性采样结合变成
拆解和
可以假设上述公式中红色框线比值为1,至于原因,直接点就是难以计算(对!就是这个原因!)就能得到如下梯度公式
由梯度反推目标函数
括号里的
是我们要优化的参数,
示范,也就是与环境交互的演员,通过交互采样出
,计算出其优势
,再乘上前面的重要性权重。
前文提到重要性采样时有一个问题:和
不能相差太多,否则结果会非常不好,训练的时候要增加一个约束即KL散度(KL divergence),用于衡量
和
的相似程度,因此PPO有两项:原先就要优化的
和KL散度约束。
PPO有一个前身:信任区域策略优化(trust region policy optimization,TRPO),TRPO表示如下,其与PPO区别在于:TRPO将KL散度作为约束,PPO将KL散度放进优化式子中。TRPO额外约束的方式比较难计算,虽然两者性能差不多,但是PPO在实现上简单许多。
KL散度不是和
参数上的距离,而是一种行为距离,行为距离(behavior distance)就是,给定同样的状态,输出动作之间的差距。这两个动作的分布都是概率分布,所以我们可以计算这两个概率分布的 KL 散度。把不同的状态输出的这两个分布的 KL 散度的平均值就是我们所指的两个演员间的 KL 散度。
PPO有两个主要的变种:近端策略优化惩罚(PPO-penalty)和近端策略优化裁剪(PPO-clip)
使用KL散度解决重要性采样问题,此处的是前一个训练迭代得到的演员参数。在DeepMind的论文中带KL的PPO算法如下,
是根据上一次的
,因此关于ppo是on policy还是off policy存在争议。
KL散度前面的需要动态调整,称为自适应KL惩罚(adaptive KL penalty),设置KL最大值和最小值,如果
,表明惩罚项没有发挥作用,增大
;如果
,表明惩罚项效果太大了,减小
。
如果觉得KL计算比较复杂,可以使用 PPO-clip,其目标函数中没有KL散度
min操作符表明只需在两项中选择最小的那个,第一项为常规目标函数,第二项为裁剪的目标函数。第二项中的clip裁剪函数括号里有三项,第一项最大不能超过,最小不能小于
,在这个范围内就等于本身。
是一个超参数,需要调整,可以设置为0.1或0.2。
了解裁剪函数的输出后,结合起来看,下图中绿色的直线为常规目标函数,蓝色的线为裁剪目标函数,红色为执行min操作后得到的目标函数值。在A>0时,也就是某个状态动作对是好的,就要增加这个状态动作对的概率,也就是越大越好,但是其与
比值不能超过
。在A<0时, 也就是某个状态动作对是不好的,就要减少这个状态动作对的概率,
越小越好,减到
为止。这样我们在更新策略的时候又不会是采样误差过大。
在openAI的论文中比较了PPO和其它算法,PPO为紫色,多数情况下,PPO表现都更好。