PPO:从策略梯度算法到近端策略优化算法
近端策略优化算法(Proximal Policy Optimization,PPO)是一种策略梯度优化算法,它对标准的策略梯度方法做了改进,使得训练更加稳定。PPO的主要思想是:在每个更新步骤中,我们要确保当前的策略参数不会偏离旧策略参数太远。
1 策略梯度算法
策略梯度算法带来了原始算法和总体框架,它告诉我们只要以奖励的期望式1.1为优化目标,通过采样足够多的样本来用均值估算数学期望,再用这个估算值对分布做梯度上升求式1.1的极大值,就可以优化我们所要优化的分布θ。
Rθ=Eτ∼pθ(τ)R(τ)=τ∑[R(τ)pθ(τ)](1.1)
∇Rθ=τ∑[R(τ)∇pθ(τ)]=τ∑[R(τ)pθ(τ)∇logpθ(τ)]=Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]≈N1i=1∑N[R(τ)∇logpθ(τ)](1.2)
θ←θ+η∇Rθ(1.3)
但是策略梯度算法存在问题,每轮训练结束之后参数θ都要更新,导致下一轮计算均值前仍要重新采样大量数据,训练的时间开销集中在了数据采样。
2 重要性采样
为了解决采样时间开销大的问题,引入了重要性采样,将式1.2换算成式2.1。这样我们可以对θ′采样一次之后,多次更新θ,大大节省了训练中采样数据的时间开销。
∇Rθ=Eτ∼pθ′(τ)[pθ′(τ)pθ(τ)R(τ)∇logpθ(τ)]≈N1i=1∑N[pθ′(τ)pθ(τ)R(τ)∇logpθ(τ)](2.1)
还原2.1式,得到我们的新的优化目标,如式2.2所示。
Rθ=Eτ∼pθ′(τ)[pθ′(τ)pθ(τ)R(τ)](2.2)
3 优势函数
式2.2的R(τ)是累积奖励,我们要优化的Rθ函数的实际意义是奖励关于完整路径τ的数学期望,我们希望这个值正负参半,因为这样就可以衡量策略是好还是坏,而不是比较谁更好。定义A(τ)等于R(τ)减去一个与路径无关的基线函数,比如状态价值函数,是不影响等式的。最终我们的优化目标确定了,如式3.1所示。
Rθ=Eτ∼pθ′(τ)[pθ′(τ)pθ(τ)A(τ)](3.1)
总之,如果A(τ)是正的,那就用梯度调整策略θ增大τ出现的概率;反之,如果A(τ)是负的,那就用梯度调整策略θ减小τ出现的概率。
4 KL散度的外在约束
在加入重要性采样之后,我们可以对θ′采样来计算θ的更新梯度了。在理想情况,即采样的次数足够多的情况下式1.2和式2.1是严格相等的,然而θ和θ′的分布有差异会带来估算结果差异很大的问题,因此必须有一个约束。TRPO算法引入了KL散度,并将其作为一个外在约束。KL散度可以计算两个分布的不相似度,两个完全相同时,它们的KL散度值为0,不相似度越高,KL散度也越高。TRPO算法的公式如式4.1所示。
{Rθ=Eτ∼pθ′(τ)[pθ′(τ)pθ(τ)A(τ)]KL(θ,θ′)<δ(4.1)
但是TRPO算法也存在问题,因为它把 KL 散度约束当作一个额外的约束,没有放在目标里面,所以它处理起来非常困难。
5 KL惩罚
我们现在既需要一个KL散度来约束θ和θ′分布的差异程度,又不能像TRPO算法那样将KL散度作为外在约束难以融入到梯度更新的操作中。因此考虑将KL散度加入到优化目标式3.1中,得到的新的优化目标如式5.1所示。
Rθ=Eτ∼pθ′(τ)[pθ′(τ)pθ(τ)A(τ)]−βKL(θ,θ′)(5.1)
我们的新优化目标和之前一样,也是越“大”,策略θ就越“好”。这个式子前半部分的数学期望,是之前3.1式给出的,用来计量策略θ′采样的好坏程度,对我们来说,这个值越大越好;而后半部分,是一个超参数β乘以θ和θ′的KL散度,用来计量θ和θ′的不相似程度,对我们来说,这个值越小越好。用梯度上升来优化这个新的优化目标,就是PPO算法。
在这个基础上,还能对算法进一步改进,引入自适应KL惩罚(adaptive KL penalty),给出一个KL的可接受区间[KLmin,KLmax],当KL散度小于最小值时,说明θ和θ′更新的幅度太小,即后面这一项效果太强了,应当减小β值;当KL散度大于最大值时,说明θ和θ′的差距过大,即后面这一项效果太弱了,需要增大β值。
总之,KL惩罚的优势在于,新的优化目标既将原始的优化目标包含在内,又包含了一个描述θ和θ′分布的不相似度的值,减小了对θ′采样来估算θ的优化梯度的误差。
6 PPO裁剪(clip)
近端策略优化裁剪是解决θ和θ′分布差异过大的另一种方法,它不使用KL散度来描述两种分布的不相似度,而是使用裁剪函数clip。近端策略优化裁剪的优化目标如式6.1所示。
Rθ≈N1τ∑min(pθ′(τ)pθ(τ)A(τ),clip(pθ′(τ)pθ(τ),1−ϵ,1+ϵ)A(τ))(6.1)
PPO裁剪实现的功能和KL惩罚一样,通过限定pθ′pθ的范围来约束θ和θ′分布的差异程度。一般基于KL惩罚的PPO算法称为PPO1算法,基于clip的PPO算法称为PPO2算法。