赞
踩
本篇文章用于记录如何下手优化PPO表现效果。
37个实现细节:
针对于envs、obs、actions、done等数组维度的选择。(obs、actions、done维度与envs一致,所以这里主要针对于envs的维度选择)
envs的维度并不是越大越好。
N
:num_envs
N*M
:iteration_size
增加N虽然会提高训练的吞吐量,但是会使性能表现更差,多数人认为是经验块缩小(M更小)的原因导致的,所以为何不增加M来使算法运行时间延长呢?
对于N的选择,常常还需要考虑在多个游戏下的多个玩家考虑:
总的来说:
Adam优化器的学习率可设为常数或者设置为从某一个值开始衰减,能够帮助提高智能体获得更高的episodic return。
通常默认:
在PPO实现的学习阶段(learn phase)中,将N*M量的数据分割成小批量来计算梯度和更新策略。
错误实现:
正则化优势函数通常是通过减去均值后除标准差来正则化优势估计
。注
: In particular, this normalization happens at the minibatch level instead of the whole batch level!
基于此,可认为PPO裁剪可大大帮助PPO的性能,它能够达到和TRPO相类似的性能并且大大减少了计算能力。
PPO更新价值网络通过使如下的价值损失函数最小化:
其中 V_targ=returns=advantages+values
但是研究发现目前没有发现value function loss clipping能优化性能,甚至会伤害性能表现。
整体损失:loss = policy_loss - entropy * entropy_coefficient + value_loss * value_coefficient
能够使entropy bonus最大化,能够使智能体的动作概率分布更随机些。(应当注意策略参数和价值参数共享相同的优化器。)
每一次迭代中,重新调整策略和价值的梯度,使全局的l2范数不超过0.5,能够稍微提升性能。
通过github库中的ppo.py(使用 separate-networks architecture)和ppo_shared.py(shared-network architecture)性能的比较可以看出使用独立的神经网络在实验环境中性能表现更优
,而共享神经网络表现低下的原因很可能是因为策略和价值的目标竞争所导致的。
PPO的实现输出logits 的均值和logits标准差的对数而非logits的标准差,另外log std
is set to be state-independent and initialized to be 0.(不懂)。
有人发现使用state-independent standard deviation性能和state-dependent standard deviation(也就是均值和标准差而非标准差的对数)两者性能相差无几。
自认为是针对于多维度动作空间
。
完全协方差的高斯分布
用来表示策略,意味着对于每一个维度的动作选择是独立的。(但也有人认为不同维度间的动作是有所依赖的,如使用自回归策略来证明。)与前方相同,不再赘述。
在连续动作被取样后,该连续动作可能超出了环境的有效范围,为了避免此现象,加入了the rapper来裁剪动作至有效的范围,并且未被裁剪的action会作为episodic data的一部分存储。
由于高斯分布的取样没有边界,而环境通常对于动作空间有所约束,两种方法如下:
在每一个时间步,VecNormalize 包装类会对观测进行预处理(即未处理的observation通过减去运行时的均值并除其方差来正则化。)
对输入使用正则化
已成为训练神经网络的著名技术,对观测使用 a moving average normalization
已成为默认的实现细节,值得指出的是对于观测的正则化对于性能的提升十分有用
。
在对观测正则化后,VecNormalize 包装类还会对观测进行裁剪到一个范围,常为[-10,10]
有人发现观测裁剪并没有改善性能,但猜测在观察范围很广的环境中可能会起到作用。
VecNormalize 包装类对reward使用某种基于折扣的方式(对奖励除折扣后奖励和的标准差。)
reward scaling能够显著影响算法的性能表现而且建议使用reward scaling
在对奖励缩放后,VecNormalize 包装类还会对奖励进行裁剪到一个范围,常为[-10,10]
但有人发现奖励裁剪并没有改善性能。
通过github库中的ppo.py进行修改得到ppo_continuous_action.py。
LSTM(Long Short Term Memory),是具有记忆长短期信息能力的神经网络。LSTM提出的动机是为了解决长期依赖问题
。传统的RNN节点输出仅由权值,偏置以及激活函数决定。RNN是一个链式结构,每个时间片使用的是相同的参数。
LSTM网络层的权重中std=1、偏差为0
所有的状态初始化为0(向量)。
无论是在rollout阶段还是在learning阶段,每一次游戏结束后将状态重置为0(向量)。
若无LSTM,mini-batch随机从训练数据中获取数据且不会对训练性能造成影响。
但在有LSTM的神经网络中,mini-batch需要顺序地从下一个训练环境中顺序获取数据
(该数据的获取顺序对于LSTM是十分重要的)。
算法在rollout前会利用initial_lstm_state来保存LSTM初始状态的副本,这可以确保我们能够重建在rollout中用到的概率分布。(可以重复相同的rollout以获取我们想要的过程中的数据也就是能够进行实验回滚操作。)
通过github库中的ppo_atari.py进行修改得到ppo_atari_lstm.py。
MultiDiscrete action space 多重离散动作空间用来描述多重动作中每一动作的作用次数不同的离散空间(如键盘,其中的每一个键就代表着一个离散的动作空间)。
Gym官方解释如下:
对于多重离散动作空间,使用独立动作组件来处理:
在多重离散动作空间中,动作由众多离散动作值组成,PPO将整个动作看作为所有独立动作组件的概率。
通过github库中的ppo_atari.py进行修改得到ppo_multidiscrete.py。
4个在特殊情况下能有效改善PPO实现的细节,(官方PPO未用这四个细节实现)
和学习率衰减类似, PPO的裁剪系数也可以衰减退火。
使用多进程来并行地进行梯度更新,常用在PPO1中,PPO2不常用。
超参数noptepochs
的显式置信度取域约束的一种附加机制。通过github库中的ppo_multidiscrete.py进行修改得到ppo_multidiscrete_mask.py。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。