0.引言
PPO算法(Proximal Policy Optimization)[1]是目前深度强化学习(DRL)领域,最广泛应用的算法之一。然而在实际应用的过程中,PPO算法的性能却受到多种因素的影响。本文总结了影响PPO算法性能的10个关键技巧,并通过实验结果的对比,来探究各个trick对PPO算法性能的影响。同时,我们将代码开源在了github上,分别提供了PPO算法的离散动作空间实现和连续动作空间实现(见下面github链接中的4.PPO-discrete和5.PPO-continuous(包括了Gaussian分布和Beta分布))
PPO算法的核心是使用如下策略损失函数:
以上便是PPO原始论文的核心内容。其实在PPO的原始论文中,除了利用GAE计算优势函数外,并没有提到其他的实现细节和技巧。但是在实际的各种代码实现,例如Open AI Baseline、Open AI Spinning Up中,却包括了许许多多的“trick”,实验表明,这些trick都会在一定程度上影响PPO算法的性能。我在参考了《PPO-Implementation matters in deep policy gradients A case study on PPO and TRPO》[3]这篇论文,以及下面这篇博客后
通过自己的亲身实践,总结了影响PPO算法性能最关键的10个trick,如下表所示:
在这一节中,我们将逐一介绍上述PPO-max中10个trick的具体实现细节,并通过对比实验来探究这些trick究竟对PPO算法的性能有什么影响。(注:下面的实验讨论均已连续动作空间下Gaussian分布为例)
Trick 1—Advantage Normalization
在论文《The Mirage of Action-Dependent Baselines in Reinforcement Learning》[4]中提出了对advantage进行normalization的操作,可以提升PG算法的性能。具体代码实现层面,对advantage做normalization的方式主要有两种:
(1)batch adv norm:使用GAE计算完一个batch中的advantage后,计算整个batch中所有advantage的mean和std,然后减均值再除以标准差。
(2)minibatch adv norm:使用GAE计算完一个batch中的advantage后,不是直接对整个batch的advantage做normalization,而是在用每次利用minibatch更新策略之前,对当前这个minibatch中的advantage做normalization。( 这篇博客中使用的就是minibatch adv norm)
Trick 2—State Normalization
state normalization的核心在于,与环境交互的过程中,维护一个动态的关于所有经历过的所有state的mean和std, 然后对当前的获得的state做normalization。经过normalization后的state符合mean=0,std=1的正态分布,用这样的状态作为神经网络的输入,更有利于神经网络的训练。
具体实现方式如下: