强化学习技巧

news2024/11/14 15:17:50

此软件包处于维护模式,请使用Stable-Baselines3 (SB3)获取最新版本。您可以在 SB3 文档中找到迁移指南。

 

本节的目的是帮助您进行强化学习实验。它涵盖了有关 RL 的一般建议(从哪里开始、选择哪种算法、如何评估算法等),以及使用自定义环境或实现 RL 算法时的提示和技巧。

使用强化学习时的一般建议

长话短说

  1. 阅读有关 RL 和稳定基线的信息
  2. 如果需要,进行定量实验和超参数调整
  3. 使用单独的测试环境评估性能
  4. 为了更好的表现,增加培训预算

与任何其他主题一样,如果你想使用 RL,你应该首先阅读它(我们有一个专门的资源页面来帮助你入门)以了解你正在使用什么。我们还建议您阅读稳定基线 (SB) 文档并完成教程。它涵盖了基本用法并指导您了解该库的更高级概念(例如回调和包装器)。

强化学习在几个方面不同于其他机器学习方法。用于训练代理的数据是通过代理本身与环境的交互收集的(例如,与具有固定数据集的监督学习相比)。这种依赖会导致恶性循环:如果智能体收集到质量差的数据(例如,没有奖励的轨迹),那么它就不会改进并继续积累不良轨迹。

除其他因素外,这个因素解释了 RL 的结果可能会因一次运行而异(即,只有伪随机生成器的种子发生变化时)。因此,您应该始终进行多次运行以获得定量结果。

RL 中的好结果通常取决于找到合适的超参数。最近的算法(PPO、SAC、TD3)通常需要很少的超参数调整,但是,不要指望默认算法在任何环境下都能工作。

因此,我们强烈建议您查看RL zoo(或原始论文)以了解已调整的超参数。将 RL 应用于新问题时的最佳做法是进行自动超参数优化。同样,这包含在RL zoo中。

将 RL 应用于自定义问题时,您应该始终规范化代理的输入(例如,对 PPO2/A2C 使用 VecNormalize)并查看在其他环境(例如,Atari、frame -stack 等)上完成的常见预处理。有关自定义环境的更多建议,请参阅下面创建自定义环境段落时的提示和技巧。

强化学习的当前局限性

你必须意识到强化学习目前的局限性。

无模型 RL 算法(即 SB 中实现的所有算法)通常样本效率低下。他们需要大量样本(有时是数百万次交互)来学习有用的东西。这就是为什么 RL 中的大部分成功都是在游戏或模拟中取得的。例如,在苏黎世联邦理工学院的这项工作中,ANYmal 机器人只接受了模拟训练,然后在现实世界中进行了测试。

作为一般建议,为了获得更好的性能,您应该增加代理的预算(训练时间步数)。

为了实现期望的行为,通常需要专家知识来设计足够的奖励函数。这种奖励工程(或Freek Stulp创造的RewArt)需要多次迭代。作为奖励塑造的一个很好的例子,你可以看看Deep Mimic 论文,它结合了模仿学习和强化学习来做杂技动作。

RL 的最后一个限制是训练的不稳定性。也就是说,您可以在训练期间观察到性能的大幅下降。这种行为特别存在于 中DDPG,这就是它的扩展TD3试图解决该问题的原因。其他方法,例如TRPOPPO利用信任区域通过避免太大的更新来最小化该问题。

如何评估强化学习算法?

因为大多数算法在训练期间使用探索噪声,所以您需要一个单独的测试环境来评估您的代理在给定时间的性能。建议定期评估您的智能体的n测试集(n通常在 5 到 20 之间)并平均每个集的奖励以获得良好的估计。

由于某些策略默认是随机的(例如 A2C 或 PPO),您还应该在调用.predict()方法时尝试设置deterministic=True,这通常会带来更好的性能。查看训练曲线(时间步长的情节奖励函数)是一个很好的代理,但低估了代理的真实表现。

笔记

我们提供了一个EvalCallback用于进行此类评估的方法。您可以在回调部分相关信息。

我们建议您阅读Deep Reinforcement Learning that Matters以获得关于 RL 评估的良好讨论。

您还可以查看Cédric Colas 的这篇博文和这一期。

我应该使用哪种算法?

RL 中没有灵丹妙药,根据您的需要和问题,您可以选择其中之一。第一个区别来自你的行动空间,即你有离散的(例如左,右,......)还是连续的行动(例如:达到一定速度)?

一些算法仅针对一个或另一个领域量身定制:DQN仅支持离散动作,其中SAC仅限于连续动作。

可以帮助您选择的第二个区别是您是否可以并行化训练,以及如何进行(有或没有 MPI?)。如果重要的是挂钟训练时间,那么你应该倾向于A2C及其衍生物(PPO、ACER、ACKTR,……)。查看矢量化环境,了解更多关于多人培训的信息。

把它们加起来:

离散动作

笔记

这包括DiscreteMultiDiscrete,BinaryMultiBinary空格

离散操作 - 单一进程

带扩展的 DQN(双 DQN、优先重放……)和 ACER 是推荐的算法。DQN 通常训练速度较慢(关于挂钟时间)但采样效率最高(因为它有回放缓冲区)。

离散操作 - 多处理

您应该尝试 PPO2、A2C 及其后续产品(ACKTR、ACER)。

如果您可以使用 MPI 对训练进行多处理,那么您应该检查 PPO1 和 TRPO。

连续动作

连续动作 - 单一过程

Current State Of The Art (SOTA) 算法是SACTD3。请使用RL zoo中的超参数以获得最佳结果。

连续动作 - 多处理

看看 PPO2、TRPO 或 A2C。同样,不要忘记从RL zoo中获取超参数以解决连续动作问题(参见Bullet envs)。

笔记

归一化对于这些算法至关重要

如果可以使用 MPI,则可以在 PPO1、TRPO 和 DDPG 之间进行选择。

目标环境

如果您的环境遵循GoalEnv接口(cf HER),那么您应该根据操作空间使用 HER + (SAC/TD3/DDPG/DQN)。

笔记

工人数量是 HER 实验的重要超参数。目前,只有 HER+DDPG 支持使用 MPI 进行多处理。

创建自定义环境时的提示和技巧

如果您想了解如何创建自定义环境,我们建议您阅读此页面。我们还提供了一个colab 笔记本,用于创建自定义健身房环境的具体示例。

一些基本建议:

  • 尽可能规范化你的观察空间,即当你知道边界时
  • 标准化你的动作空间并使其在连续时对称(参见下面的潜在问题)一个好的做法是重新调整你的动作以位于 [-1, 1] 中。这不会限制您,因为您可以轻松地重新调整环境内的动作
  • 从形状奖励(即信息奖励)和问题的简化版本开始
  • 使用随机操作进行调试以检查您的环境是否正常工作并遵循健身房界面:

我们提供了一个帮助程序来检查您的环境是否运行无误:

from stable_baselines.common.env_checker import check_env

env = CustomEnv(arg1, ...)
# It will check your custom environment and output additional warnings if needed
check_env(env)

如果您想在您的环境中快速试用随机代理,您还可以执行以下操作:

env = YourEnv()
obs = env.reset()
n_steps = 10
for _ in range(n_steps):
    # Random action
    action = env.action_space.sample()
    obs, reward, done, info = env.step(action)

为什么要规范化动作空间

大多数强化学习算法都依赖于高斯分布(最初以 0 为中心,std 为 1)来进行连续操作。因此,如果您在使用自定义环境时忘记规范化操作空间,这可能会损害学习并难以调试(参见附图和问题 #473)。

使用高斯的另一个结果是动作范围不受限制。这就是为什么剪裁通常用作绷带以保持有效间隔。更好的解决方案是使用压缩函数(cf SAC)或 Beta 分布(cf issue #112)。

笔记

此声明不正确DDPGTD3因为它们不依赖于任何概率分布。

实施 RL 算法时的提示和技巧

当您尝试通过实现算法来重现 RL 论文时, John Schulman 的RL 研究的具体细节非常有用(视频)。

我们建议按照这些步骤来使用有效的 RL 算法

  1. 多次阅读原始论文
  2. 阅读现有的实现(如果可用)
  3. 尝试在玩具问题上有一些“生命迹象”
  4. 通过使其在越来越难的环境中运行来验证实现(您可以将结果与 RL zoo 进行比较)

    您通常需要为该步骤运行超参数优化。

您需要特别注意正在操作的不同对象的形状(广播错误将无提示地失败,参见问题 #75)以及何时停止梯度传播。

个人选择(来自@araffin),用于在 RL 中具有连续动作的逐渐困难的环境:

  1. 摆锤(容易解)
  2. HalfCheetahBullet(具有局部最小值和形状奖励的中等难度)
  3. BipedalWalkerHardcore(如果它适用于那个,那么你可以有一个 cookie)

在具有离散动作的 RL 中:

  1. CartPole-v1(比随机代理更容易,更难达到最大性能)
  2. 月球着陆器
  3. Pong(最简单的 Atari 游戏之一)
  4. 其他 Atari 游戏(例如 Breakout)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式QT (Qt 信号与槽)

一、Qt 信号与槽机制 因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号(Signal)就是在特定情况下被发射的事件。 GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道…

MySQL_第05章_排序与分页

第05章_排序与分页 讲师:尚硅谷 - 宋红康(江湖人称:康师傅) 官网: http://www.atguigu.com 1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(desc…

物流管理APP软件开发公司 让货运变得更简单

随着互联网技术的发展,人们的生活方式也发生了很大的变化,移动互联网如今已经深入到生活的方方面面,就连物流运输行业也开始涌现出各种货运物流管理APP软件,让整个物流管理过程更加简单。下面我们一起来看一下为什么越来越多的运输…

数据库实验 | 第4关:修改多个数据表的存储过程

任务描述 本关任务: 图书管理数据库有读者reader图书book借阅数据表 读者表reader有读者证号dzzh、姓名xm、性别xb、身份sf、电话号码dhhm字段 图书表book有条形码txm、书名sm、分类号flh,作者zz,出版社cbs,出版日期cbrq,售价sj,典藏类别dclb,在库zk,币种bz字段 …

【DEBUG】错误手册集

文章目录 1.sshd启动报错,无法绑定端口2.克隆后的虚拟机可以联网,但是Xshell连接失败的解决办法 1.sshd启动报错,无法绑定端口 (1) 首先排查是否有端口占用(没有发现问题) netstat -ano | grep sshd(2) 查看 message 日志存在如下错误信息&…

MySQL数据库,联合查询

目录 1. 联合查询 1.1 内查询 1.2 外查询 1.3 自连接 1.4 子查询 1.5 合并查询 1. 联合查询 联合查询,简单的来讲就是多个表联合起来进行查询。这样的查询在我们实际的开发中会用到很多,因此会用笛卡尔积的概念。 啥是笛卡尔积?两张表…

深度学习 -- 张量操作与线性回归 张量的数学运算以及用张量构建线性回归模型

前言 这篇博客继承前篇博客的内容,将对张量的操作进行阐述,同时在理解张量的一些数学的基础上,配合机器学习的理论,在pytorch环境中进行一元线性回归模型的构建。 张量的拼接与切分 torch.cat() 功能:将张量按维度d…

Node.js四:包管理工具

1.介绍 2.npm安装 3.npm基本使用 属性翻译 4.搜索下载安装包 npm搜索网站: npm 5.生产环境与开发环境 开发环境 是程序员 专门用来写代码 的环境,一般是指程序员的电脑,开发环境的项目一般 只能程序员自己访问 生产环境 是项目 代码正式运行 …

海光信息业绩高歌猛进,但其作为国产CPU龙头的“地基”并不牢固

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在“芯片寒冬”的大背景下,2022年全球头部芯片半导体公司纷纷下调业绩预期,英特尔、英伟达、美光等无一幸免。但是随着AIGC异军突起,仿佛寒冬中的一股暖流,催生着半导体市场行…

第四章 面向对象(OOP)

目录 一、编程思想 1.1. 面向对象 1.2. 面向过程 1.3.举例说明(把大象装进冰箱) 1.4.二者的联系与区别 1.5.面向对象的三个阶段 1.6.什么是类,什么是实例,二者的联系 二、面向对象三大特征 2.1 封装 2.2 继承 2.3 多态…

go-zero入门

文章目录 简介框架设计环境准备go安装Go Module设置goctl安装安装(mac\&linux)安装(windows) protoc & protoc-gen-go安装 goctl 各层代码生成一览goctl 生成REST和RPC微服务生成数据模型层Model生成API服务目录结构开发者需要做的修改配置文件修改上下文依赖修改业务逻…

CMake基本使用

重要指令 cmake_minimum_required:指定CMake最小版本要求 project:定义工程名称,并可指定语言 set:显示的定义变量 include_directories:向工程添加多个特定头文件搜素路径 link_directories:向工程添加多个特定库文件…

Spring lettuce读写分离

Redis 的 Sentinel 模式默认配置下 Redis 的客户端只对 Master 读写,另外2个Slave闲置。若主从节点在不同机房,在读取时会有跨机房的网络时延,并且比同机房访问更容易发生网络丢包。故在一些场景可以考虑将跨机房的服务节点设置为读写分离 Re…

计算机组成原理——第五章中央处理器(下)

梦里不知身是客,一晌贪欢 文章目录 5.6.1 指令流水线的基本概念5.6.2 指令流水线的影响因素和分类五段式指令流水线5.7.1 多处理器的基本概念5.7.2 硬件多线程的基本概念 5.6.1 指令流水线的基本概念 想要对指令的过程进行优化,一条指令的执行过程可以被…

世界新冠疫情数countrydata.csv 表,实战分析

一、环境要求 Hadoop hive spark hbase开发环境 开启hadoop:start-all.sh开启zookeeper:zkServer.sh start开启hive:nohup hive --service metastore &nohup hive --service hiveserver2 & 打开hive界面:beeline -u …

单列集合之Set集合以及各种实现类

Set集合 Set接口也是Collection单列结合的一个子接口,set集合中没有提供其他额外的方法,但是相比较Collection集合新增了其他的特性。所有实现了Set接口的类都可以叫做Set集合。 Coliection接口中的方法:Collection集合的方法 Set集合不允…

更全面的对比GPT4和Claude对MLIR的掌握能力

本文构造了20个MLIR基础概念的问题以及使用OneFlow IR转换为Tosa IR的5个代码段来评测GPT4和Claude对于MLIR的掌握能力,我的结论是对于基础概念的理解Claude整体上和GPT4持平,而在阅读相关代码片段时Claude表现出了比GPT4更强一点的理解能力。 0x0. 前言…

【Python】读取r语言数据+NMF算法(完整代码+详细注释)

目录 依赖库代码功能完整代码总结 欢迎关注 『Python』 系列,持续更新中 欢迎关注 『Python』 系列,持续更新中 算法部分源码是我的数模兄弟想要深入研究nmf算法方面的内容发给我让我跑的 参考自博文 https://blog.csdn.net/atease0001/article/details/…

计及光伏电站快速无功响应特性的分布式电源优化配置方法(Matlab代码实现)

💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …

JS的函数定义和参数

文章目录 一、JavaScript 函数定义二、JavaScript 函数参数总结 一、JavaScript 函数定义 JavaScript 使用关键字 function 定义函数。 函数可以通过声明定义,也可以是一个表达式。 函数声明 function functionName(parameters) {执行的代码 }函数声明后不会立即…