文章目录
在上一篇强化学习应该知道的一些概念当中我们已经介绍了许多相关理论要点以及给出部分公式,下面就结合相关代码进行实践,由于篇幅过长,会分为两部分(或以上)进行讲解。
另外,可能有些地方名字不一样但指的是同一个东西的地方也请大家见谅,因为很多专业名词都暂时没有找到相关的翻译,后续会慢慢更改的~
一、算法简介
PPO受到与TRPO相同的问题的启发:我们如何才能使用当前拥有的数据在策略上采取最大可能的改进步骤,而又不会走得太远而导致意外导致性能下降?在TRPO试图通过复杂的二阶方法解决此问题的地方,PPO使用的是一阶方法,它使用其他一些技巧来使新策略接近于旧策略。PPO方法实施起来非常简单,而且从经验上看,其性能至少与TRPO相同。其次PPO算法也是AC架构。
PPO有两种主要形式:PPO-Penalty和PPO-Clip。
PPO-Penalty:近似地解决了TRPO之类的受KL约束的更新,但对目标函数中的KL偏离进行了惩罚而不是使其成为硬约束,并在训练过程中自动调整惩罚系数,以便对其进行适当缩放。
PPO-Clip:在目标中没有KL散度项,也完全没有约束。取而代之的是依靠对目标函数的专门裁剪来减小新老策略的差异。
在这里,我们只讨论PPO-Clip(OpenAI使用的主要形式)。
OPENAI的baseline里面有两个版本的ppo算法,安装他们的注释,ppo2应该才是正式版,其实两者差别不大,主要体现在算法的优化上面,基本思想还是限制新老策略的差别以防更新过快。
1、关键点
1.1 损失函数的设计
ppo算法最精髓的地方就是加入了一项比例用以描绘新老策略的差异,用 r t ( θ ) = π θ ( a t ∣ s t ) π θ k ( a t ∣ s t ) r_t(\theta)=\frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta _k}(a_t|s_t)} rt(θ)=πθk(at∣st)πθ(at∣st)表示,损失函数如下:
L ( s , a , θ k , θ ) = min [ r ( θ ) A π θ k ( s , a ) , clip ( r ( θ ) , 1 − ϵ , 1 + ϵ ) A π θ k ( s , a ) ] L(s,a,\theta_k,\theta) = \min\left[ r(\theta) A^{\pi_{\theta_k}}(s,a), \;\; \text{clip}\left(r(\theta), 1 - \epsilon, 1+\epsilon \right) A^{\pi_{\theta_k}}(s,a) \right] L(s,a,θk,θ)=min[r(θ)Aπθk(s,a),clip(r(θ),1−ϵ,1+ϵ)Aπθk(s,a)]
其中, ϵ \epsilon ϵ是一个(很小的)超参数,用以粗略限制 r ( θ ) r(\theta) r(θ)的变化范围。为了表达方便,我们将上面将该损失函数用 L c l i p ( θ ) L^{clip}(\theta) Lclip(θ)表示
在ppo2里面,如果critic和actor共享参数的话,损失函数定义为如下:
L C L I P + V F + S = L C L I P ( θ ) − c 1 L V F ( θ ) + c 2 S [ π θ ] ( s t ) L^{CLIP + VF + S} = L^{CLIP}(\theta) - c_1 L^{VF}(\theta) +c_2S[\pi_{\theta}](s_t) LCLIP+VF+S=L