优化PPO

article/2025/9/21 9:03:50

优化PPO

  • 介绍
    • core implementation details
      • 1.Vectorized architecture 量化结构
      • Orthogonal Initialization of Weights and Constant Initialization of biases 算法权重的初始化以及恒定偏差的初始化
      • The Adam Optimizer’s Epsilon Parameter Adam优化器的ε参数
      • Adam Learning Rate Annealing Adam优化器的学习率退火
      • Generalized Advantage Estimation(GAE)广义优势估计 in theory
      • Mini-batch Updates 小批量更新 in code
      • Normalization of Advantages 优势估计的正则化 in code
      • Clipped surrogate objective 裁剪目标 in theory
      • Value Function Loss Clipping 价值损失函数的裁剪 in code
      • Overall Loss and Entropy Bonus 整体损失和熵平衡 in theory
      • Global Gradient Clipping 全局梯度裁剪 in code
      • Debug variables 调试变量 in code
      • Shared and separate MLP networks for policy and value functions 策略函数和价值函数共享or独立的MLP神经网络 in code
      • final
    • Atari-specific implementation details
    • details for continuous action domains
      • Continuous actions via normal distributions 对连续动作采取正态分布 in theory
      • State-independent log standard deviation 独立状态的log标准差??? in theory
      • Independent action components 独立动作组件 in theory
      • Separate MLP networks for policy and value functions 策略函数和价值函数共享or独立的MLP神经网络 in code
      • Handling of action clipping to valid range and storage 对于动作的剪切到有效的范围以及存储的操作 in code
      • Normalization of Observation 观测状态的正则化 in environment
      • Observation Clipping 观测状态的裁剪 in environment
      • Reward Scaling 奖励缩放 in environment
      • Reward Clipping 奖励裁剪 in environment
      • final
    • LSTM implementation details
      • Layer initialization for LSTM layers LSTM网络层的初始化 in network
      • Initialize the LSTM states to be zeros LSTM状态的初始化 in network
      • Reset LSTM states at the end of the episode 每次游戏结束时重置LSTM的状态 in theory
      • Prepare sequential rollouts in mini-batches mini-batch顺序收集rollout阶段的数据 in theory
      • Reconstruct LSTM states during training 训练过程中重构LSTM状态 in theory
      • final
    • MultiDiscrete action space detail
    • Auxiliary implementation details
      • Clip Range Annealing 裁剪区间退火 in code
      • Parallellized Gradient Update 并行梯度更新 in code
      • Early Stopping of the policy optimizations 策略优化(更新)的早期停止 in code
      • Invalid Action Masking 掩盖无效动作 in theory
      • final

介绍

本篇文章用于记录如何下手优化PPO表现效果。
37个实现细节:
在这里插入图片描述

core implementation details

1.Vectorized architecture 量化结构

针对于envs、obs、actions、done等数组维度的选择。(obs、actions、done维度与envs一致,所以这里主要针对于envs的维度选择)
envs的维度并不是越大越好。
在片描述
N:num_envs
N*M:iteration_size
增加N虽然会提高训练的吞吐量,但是会使性能表现更差,多数人认为是经验块缩小(M更小)的原因导致的,所以为何不增加M来使算法运行时间延长呢?
对于N的选择,常常还需要考虑在多个游戏下的多个玩家考虑:
在这里插入图片描述

Orthogonal Initialization of Weights and Constant Initialization of biases 算法权重的初始化以及恒定偏差的初始化

总的来说:

  • 算法隐藏层(hidden layer)权重的初始化常用np.sqrt(2)的比例(scale)。
  • 策略输出层(the policy output layer)权重的初始化常用0.01的比例。
  • 价值输出层(the valueoutput layer)常用1的比列初始化。
  • 偏差(biases)常设为0。
    介于此能够得到较优异的性能表现。
    在这里插入图片描述

The Adam Optimizer’s Epsilon Parameter Adam优化器的ε参数

  • PPO中常将Adam优化器的ε参数设为1e-5。
  • Pytorch中设为1e-8。
  • TensorFlow中设为1e-7。
  • 在这里插入图片描述

Adam Learning Rate Annealing Adam优化器的学习率退火

Adam优化器的学习率可设为常数或者设置为从某一个值开始衰减,能够帮助提高智能体获得更高的episodic return。
通常默认:

  • 在Atari 实验环境中,Adam学习率从2.5e-4线性衰减至0。
  • 在MuJoCo实验环境中,Adam学习率从3e-4线性衰减至0。
    在这里插入图片描述

Generalized Advantage Estimation(GAE)广义优势估计 in theory

  • 如果下一个环境不是终态或没有被截断(截断一般是指智能体在环境中训练的时间限制),PPO估计子环境中下一个状态的价值作为价值目标。
  • TD(λ),PPO中returns=advantages+values作为return目标,和TD(λ)用来价值估计相一致。
  • 研究发现GAE的returns会使性能优于N-step returns。
  • 在这里插入图片描述

Mini-batch Updates 小批量更新 in code

在PPO实现的学习阶段(learn phase)中,将N*M量的数据分割成小批量来计算梯度和更新策略。
错误实现

  • 使用整个batch即N*M来更新。
  • 随机获取mini-batch。

Normalization of Advantages 优势估计的正则化 in code

正则化优势函数通常是通过减去均值后除标准差来正则化优势估计: In particular, this normalization happens at the minibatch level instead of the whole batch level!

Clipped surrogate objective 裁剪目标 in theory

在这里插入图片描述
基于此,可认为PPO裁剪可大大帮助PPO的性能,它能够达到和TRPO相类似的性能并且大大减少了计算能力。

Value Function Loss Clipping 价值损失函数的裁剪 in code

PPO更新价值网络通过使如下的价值损失函数最小化:在这里插入图片描述
其中 V_targ=returns=advantages+values
但是研究发现目前没有发现value function loss clipping能优化性能,甚至会伤害性能表现。

Overall Loss and Entropy Bonus 整体损失和熵平衡 in theory

整体损失:loss = policy_loss - entropy * entropy_coefficient + value_loss * value_coefficient能够使entropy bonus最大化,能够使智能体的动作概率分布更随机些。(应当注意策略参数和价值参数共享相同的优化器。)

Global Gradient Clipping 全局梯度裁剪 in code

每一次迭代中,重新调整策略和价值的梯度,使全局的l2范数不超过0.5,能够稍微提升性能。
在这里插入图片描述

Debug variables 调试变量 in code

在这里插入图片描述

Shared and separate MLP networks for policy and value functions 策略函数和价值函数共享or独立的MLP神经网络 in code

  • 默认地,PPO使用的MLP神经网络包含两层6各含4个神经元和
    双曲正切作为激活函数,policy_head和value_head共享MLP神经网络的输出:

在这里插入图片描述

  • 让策略函数和价值函数使用各自的神经网络
    在这里插入图片描述

final

通过github库中的ppo.py(使用 separate-networks architecture)和ppo_shared.py(shared-network architecture)性能的比较可以看出使用独立的神经网络在实验环境中性能表现更优,而共享神经网络表现低下的原因很可能是因为策略和价值的目标竞争所导致的。
在这里插入图片描述

Atari-specific implementation details

details for continuous action domains

Continuous actions via normal distributions 对连续动作采取正态分布 in theory

  • 策略梯度方法认为连续动作取样于正态分布,所以为了创建动作的正态分布,神经网络需要输出连续动作的均值和标准差
  • 当在连续动作空间中,常使用高斯分布来表示动作的分布。

State-independent log standard deviation 独立状态的log标准差??? in theory

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(也就是均值和标准差而非标准差的对数)两者性能相差无几。

Independent action components 独立动作组件 in theory

自认为是针对于多维度动作空间

  • 在许多机器人实验中,常需要有多个变量值来表示一个连续的动作,如在这里插入图片描述
    可能表示向左移动2.4单位 向上移动3.5单位。但由于大量文献表明这种行动是一个单一的标量值,所以为了统一,PPO将其视作为动作独立维度(组件)的概率如下:在这里插入图片描述
  • 这个方法来源于目前常见的假设,完全协方差的高斯分布用来表示策略,意味着对于每一个维度的动作选择是独立的。(但也有人认为不同维度间的动作是有所依赖的,如使用自回归策略来证明。)

Separate MLP networks for policy and value functions 策略函数和价值函数共享or独立的MLP神经网络 in code

与前方相同,不再赘述。在这里插入图片描述

Handling of action clipping to valid range and storage 对于动作的剪切到有效的范围以及存储的操作 in code

在连续动作被取样后,该连续动作可能超出了环境的有效范围,为了避免此现象,加入了the rapper来裁剪动作至有效的范围,并且未被裁剪的action会作为episodic data的一部分存储。
由于高斯分布的取样没有边界,而环境通常对于动作空间有所约束,两种方法如下:

  • 采用裁剪到边界的有效范围
  • 采用对高斯样本使用可逆压缩函数如tanh来满足约束。
  • 两种方法相差无几,但使用裁剪方法可以更好地获得与原文PPO一致的性能,而且由于裁剪带来的偏差有解决办法可解决。

Normalization of Observation 观测状态的正则化 in environment

在每一个时间步,VecNormalize 包装类会对观测进行预处理(即未处理的observation通过减去运行时的均值并除其方差来正则化。)
输入使用正则化已成为训练神经网络的著名技术,对观测使用 a moving average normalization已成为默认的实现细节,值得指出的是对于观测的正则化对于性能的提升十分有用

Observation Clipping 观测状态的裁剪 in environment

在对观测正则化后,VecNormalize 包装类还会对观测进行裁剪到一个范围,常为[-10,10]
有人发现观测裁剪并没有改善性能,但猜测在观察范围很广的环境中可能会起到作用。

Reward Scaling 奖励缩放 in environment

VecNormalize 包装类对reward使用某种基于折扣的方式(对奖励除折扣后奖励和的标准差。)
reward scaling能够显著影响算法的性能表现而且建议使用reward scaling

Reward Clipping 奖励裁剪 in environment

在对奖励缩放后,VecNormalize 包装类还会对奖励进行裁剪到一个范围,常为[-10,10]
但有人发现奖励裁剪并没有改善性能。

final

通过github库中的ppo.py进行修改得到ppo_continuous_action.py。
在这里插入图片描述

LSTM implementation details

LSTM(Long Short Term Memory),是具有记忆长短期信息能力的神经网络。LSTM提出的动机是为了解决长期依赖问题。传统的RNN节点输出仅由权值,偏置以及激活函数决定。RNN是一个链式结构,每个时间片使用的是相同的参数。
在这里插入图片描述

Layer initialization for LSTM layers LSTM网络层的初始化 in network

LSTM网络层的权重中std=1、偏差为0

Initialize the LSTM states to be zeros LSTM状态的初始化 in network

所有的状态初始化为0(向量)。

Reset LSTM states at the end of the episode 每次游戏结束时重置LSTM的状态 in theory

无论是在rollout阶段还是在learning阶段,每一次游戏结束后将状态重置为0(向量)。

Prepare sequential rollouts in mini-batches mini-batch顺序收集rollout阶段的数据 in theory

若无LSTM,mini-batch随机从训练数据中获取数据且不会对训练性能造成影响。
但在有LSTM的神经网络中,mini-batch需要顺序地从下一个训练环境中顺序获取数据(该数据的获取顺序对于LSTM是十分重要的)。

Reconstruct LSTM states during training 训练过程中重构LSTM状态 in theory

算法在rollout前会利用initial_lstm_state来保存LSTM初始状态的副本,这可以确保我们能够重建在rollout中用到的概率分布。(可以重复相同的rollout以获取我们想要的过程中的数据也就是能够进行实验回滚操作。)
在这里插入图片描述

final

通过github库中的ppo_atari.py进行修改得到ppo_atari_lstm.py。
在这里插入图片描述

MultiDiscrete action space detail

MultiDiscrete action space 多重离散动作空间用来描述多重动作中每一动作的作用次数不同的离散空间(如键盘,其中的每一个键就代表着一个离散的动作空间)。
Gym官方解释如下:在这里插入图片描述
对于多重离散动作空间,使用独立动作组件来处理:
在多重离散动作空间中,动作由众多离散动作值组成,PPO将整个动作看作为所有独立动作组件的概率。在这里插入图片描述
通过github库中的ppo_atari.py进行修改得到ppo_multidiscrete.py。
在这里插入图片描述

Auxiliary implementation details

4个在特殊情况下能有效改善PPO实现的细节,(官方PPO未用这四个细节实现)

Clip Range Annealing 裁剪区间退火 in code

和学习率衰减类似, PPO的裁剪系数也可以衰减退火。

Parallellized Gradient Update 并行梯度更新 in code

使用多进程来并行地进行梯度更新,常用在PPO1中,PPO2不常用。

Early Stopping of the policy optimizations 策略优化(更新)的早期停止 in code

  • 策略优化(更新)的早期停止,可以看作为一种对于PPO实现中的超参数noptepochs 的显式置信度取域约束的一种附加机制。
  • 更详细地来说,计算策略在更新前和更新一步后的网络权重的近似的平均KL散度,若此KL散度超过一个提前设置好的阈值,那么对于此策略的更新将会被提前停止。
  • 此方法即用于策略的早期停止,也可用于价值网络的早期停止。在这里插入图片描述

Invalid Action Masking 掩盖无效动作 in theory

  • Invalid Action Masking技术在AlphaStar和OpenAI Five中效果显著,主要用来在智能体训练过程中对于当前游戏状态避免执行无效动作
  • 更详细地说,在将logits传递给softmax前使用负无穷来代替无效动作的logits,这种操作实际上就是使无效操作对应的梯度为0。
  • Furthermore, Huang et al, 2021 demonstrated invalid action masking to be the critical technique in training agents to win against all past μRTS bots they tested.

final

通过github库中的ppo_multidiscrete.py进行修改得到ppo_multidiscrete_mask.py。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/Gs8eMmKL.shtml

相关文章

PPO Algorithm

‘‘目录 PPO ALGORITHM 进行看别人文章: 如何直观理解PPO算法?[理论篇] - 知乎 (zhihu.com) 【强化学习8】PPO - 知乎 (zhihu.com) PPO(OpenAI) Proximal Policy Optimization(PPO)算法原理及实现! - 简书 (jianshu.com) 1-Critic的作用与效果.m…

PPO算法实战

原理简介 PPO是一种on-policy算法,具有较好的性能,其前身是TRPO算法,也是policy gradient算法的一种,它是现在 OpenAI 默认的强化学习算法,具体原理可参考PPO算法讲解。PPO算法主要有两个变种,一个是结合K…

Proximal Policy Optimization(近端策略优化)(PPO)原理详解

本节开始笔者针对自己的研究领域进行RL方面的介绍和笔记总结,欢迎同行学者一起学习和讨论。本文笔者来介绍RL中比较出名的算法PPO算法,读者需要预先了解Reinforcement-Learning中几个基础定义才可以阅读,否则不容易理解其中的内容。不过笔者尽…

【强化学习PPO算法】

强化学习PPO算法 一、PPO算法二、伪代码三、相关的简单理论1.ratio2.裁断3.Advantage的计算4.loss的计算 四、算法实现五、效果六、感悟 最近再改一个代码,需要改成PPO方式的,由于之前没有接触过此类算法,因此进行了简单学习,论文…

【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

大家好,今天和各位分享一下深度强化学习中的近端策略优化算法(proximal policy optimization,PPO),并借助 OpenAI 的 gym 环境完成一个小案例,完整代码可以从我的 GitHub 中获得: https://gith…

autoit连接mysql数据库

原链接点我 一,准备工作 1, 下载mysql.au3(这个点击就下载了) 把mysql.au3放入到autoit的include目录下 2, 下载mysql驱动(根据自己系统选,下载完之后,双击运行会自动安装,一路next就行) 二,使用 #include "mysql.au3" #include <Array.au3> ;弹窗 Func aler…

AutoIt-v3的安装,和robotframework-autoitlibrary的导入

AutoIt 最新是v3版本&#xff0c;这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI&#xff08;图形用户界面)中进行自动化操作。它利用模拟键盘按键&#xff0c;鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的。 Au…

selenium 上传下载调用windows窗口--AutoIT

AutoIT解决自动化上传下载文件调用Windows窗口 AutoIT下载安装使用AotuIt 操作windows上传窗口1. 打开AutoIt定位窗口组件2. 定位上传窗口属性 &#xff08;鼠标选中Finder Tool 拖拽至属性窗口&#xff09;3. 打开autoIt编辑器&#xff0c;编写代码4. 将脚本文件转成exe文件5.…

软件质量保证与测试 实验十一:AutoIt的使用

目录 实验概述实验内容1. 下载安装AutoIT。2. 测试win系统自带计算器程序&#xff0c; 246&#xff0c;是否正确&#xff1f; 写出Script。&#xff08;小提示&#xff1a;使用WinGetText获得输出&#xff09;3.测试win系统自带计算器程序&#xff0c; 写出3个以上的测试用例的…

selenium 用autoIT上传下载文件

一、下载安装AutoIT 下载并安装AutoIT&#xff0c;下载链接&#xff1a;https://www.autoitscript.com/site/autoit/AutoIT安装成功后&#xff0c;可以在开始菜单下看到AutoIT的所有工具&#xff0c;如下图所示&#xff1a; 其中分为几类&#xff0c;AutoIT Window Info用来识…

selenium autoit java_selenium+java利用AutoIT实现文件上传

转载自&#xff1a;https://www.cnblogs.com/yunman/p/7112882.html?utm_sourceitdadao&utm_mediumreferral 1、AutoIT介绍 AutoIT是一个类似脚本语言的软件&#xff0c;利用此软件我们可以方便的实现模拟键盘、鼠标、窗口等操作&#xff0c;实现自动化。 2、实现原理 利用…

autoIT 自动化上传/下载文件图文详解【python selenium】

情景&#xff1a; 在用selenium进行web页面自动化时&#xff0c;时不时会遇到上传附件的情况&#xff0c;常见的情况就是一个上传按钮&#xff0c;点击后弹出windows窗口&#xff0c;选择文件后上传&#xff0c;如下图1所示 图1 这种情况超出了selenium的能力范围&#xff0c;需…

AutoIt介绍

AutoIt的下载网址&#xff1a; https://www.autoitscript.com/site/autoit/downloads/ AutoIt在线文档&#xff1a;http://www.autoit3.cn/Doc/ AutoIt的优势&#xff1a; 简单易懂的类BASIC 表达式模拟键盘,鼠标动作事件操作窗口与进程直接与窗口的”标准控件”交互(设置/获…

AutoIt的应用

少数情况下需要操作系统级的弹窗&#xff0c;可以使用AutoIt。 AutoIt现在最新版是V3版本&#xff0c;这是一个类似BASIC脚本语言的免费软件&#xff0c;用于Windows GUI中进行自动化操作。利用模拟键盘按键&#xff0c;鼠标移动&#xff0c;窗口和控件的组合来实现自动化任务…

java 调用autoit_java和autoit连接

autoit可以实现本机文件的上传&#xff0c;修改&#xff0c;新建&#xff0c;也可以实现网页上文件下载到本地 连接步骤&#xff1a; (1)下载autoitx4java 包&#xff0c;地址在code.google.com/p/autoitx4java。解压后直接将jar包添加到工程里面。然后需要使用jacob包&#xf…

AutoIt在线使用手册地址

AutoIt 在线文档https://autoitx.com/Doc/

AutoIt3.0

autoIt主要用于窗口自动化&#xff0c;结合python&#xff0c;可解决web自动化&#xff0c;页面调出窗口的问题 autoIt脚本代码例子&#xff1a; 1.打开Windows 任务管理器 2.依次点击【应用程序、进程、服务、性能、联网、用户】按钮 3.再次点击应用程序按钮 4.点选第二个…

Python + Selenium + AutoIt 模拟键盘实现另存为、上传、下载操作详解

前言 在web页面中&#xff0c;可以使用selenium的定位方式来识别元素&#xff0c;从而来实现页面中的自动化&#xff0c;但对于页面中弹出的文件选择框&#xff0c;selenium就实现不了了&#xff0c;所以就需引用AutoIt工具来实现。 AutoIt介绍 AutoIt简单介绍下&#xff0c…

autoit 下载图片验证码

autoit 下载图片验证码 自动化测试中&#xff0c;我做了验证码识别的功能&#xff0c;那么接下来就是怎么获取验证码图片了&#xff0c;还好autoit 里面提供了一些方法。下面就介绍一下怎样利用autoit 下载验证码图片&#xff1a; 先说思路&#xff1a; 右键点击验证码 使用…

获取硬盘序列号的真正方法!!

最近要获取磁盘的序列号&#xff0c;在网上找了很久发现大部分都是通过diskpart来查询 这种查询方法只是查询的磁盘的id 真正查询磁盘序列号应该使用下面方法&#xff1a;wmic diskdrive get serialnumber 打开cmd后输入 serialNumber下面的就是硬盘序列号