【深度强化学习】目前落地的挑战与前沿对策

news2024/11/27 6:25:46

到目前为止,深度强化学习最成功、最有名的应用仍然是 Atari 游戏、围棋游戏等。即使深度强化学习有很多现实中的应用,但其中成功的应用并不多。为什么呢?本文总结目前的挑战。

目录

  • 所需的样本数量太大
  • 探索阶段代价太大
  • 超参数的影响非常大
  • 稳定性极差
  • 总结与未来

所需的样本数量太大

深度强化学习一个严重的问题在于需要巨大的样本量。
用 Rainbow DQN 玩 Atari 游戏,达到人类玩家水平,需要至少1800万帧,且超过1亿帧还未收敛。(已经调优了多种超参数)
AlphaGo Zero 用了2900万局自我博弈,每一局约有100 个状态和动作。
TD3算法在MuJoCo物理仿真环境中训练Half-Cheetah、 Ant、 Hopper等模拟机器人,虽然只有几个关节需要控制,但是在样本数量100万时尚未收敛。甚至连Pendulum,Reacher这种只有一两个关节的最简单的控制问题,TD3也需要超过10万个样本。
现实的问题远远比Atari和MuJoCo复杂,其状态空间和动作空间都远大于Atari和MuJoCo,对于简单问题RL尚需要百万、千万级的样本,那对于现实复杂问题,可想样本量的恐怖。而且,在游戏中获取亿万样本并不困难,但是在现实中每获取一个样本都比较困难。举个例子,用机械手臂抓取一个物体至少需要几秒钟时间,那么一天只能收集一万个样本;同时用十个机械手臂,连续运转一百天,才能收集到一千万个样本,未必够训练一个深度强化学习模型。强化学习所需的样本量太大,这会限制强化学习在现实中的应用。

 

探索阶段代价太大

强化学习要求智能体与环境交互用收集到的经验去更新策略。在交互的过程中,智能体会改变环境。在仿真、游戏的环境中,智能体对环境造成任何影响都无所谓。但是在现实世界中,智能体对环境的影响可能会造成巨大的代价。
在强化学习初始的探索阶段,策略几乎是随机的。
如果应用到推荐系统中,上线一个随机的推荐策略,那么用户的体验会极差,很低的点击率也会给网站造成收入的损失。
如果应用到自动驾驶中,随机的控制策略会导致车辆撞毁。
如果应用到医疗中,随机的治疗方案会致死致残。
在物理世界的应用中,不能直接让初始的随机策略与环境交互,而应该先对策略做预训练,再在真实环境中部署。 其中涉及离线强化学习(Offline RL),是一个很有价值的研究方向。

  1. 一种方法是事先准备一个数据集,用行为克隆等监督学习方法做预训练。
  2. 另一种方法是搭建模拟器,在模拟器中预训练策略。

 

超参数的影响非常大

深度强化学习对超参数的设置极其敏感,需要很小心调参才能找到好的超参数。
超参数分两种:神经网络结构超参数算法超参数。这两类超参数的设置都严重影响实验效果。换句话说,完全相同的方法,由不同的人实现,效果会有天壤之别。

  1. 结构超参数: 神经网络结构超参数包括层的数量宽度激活函数,这些都对结果有很大影响。拿激活函数来说,在监督学习中,在隐层中用不同的激活函数(比如 ReLU、Leaky ReLU)对结果影响很小,因此总是用 ReLU 就可以。但是在深度强化学习中,隐层激活函数对结果的影响很大;有时 ReLU 远好于 Leaky ReLU,而有时 Leaky ReLU 远好于 ReLU。由于这种不一致性,我们在实践中不得不尝试不同的激活函数。
  2. 算法超参数: 强化学习中的算法超参数很多,包括学习率批大小 (Batch Size)、经验回放的参数探索用的噪声。(Rainbow 的论文调了超过 10 种算法超参数。)

实验效果严重依赖于实现的好坏。哪怕是一些细微的超参数区别,也会影响最终的效果。 即使都用同一个算法,比如 TRPO 和 DDPG 方法,不同人的编程实现,实验效果差距巨大。

在这里插入图片描述

实验对比的可靠性问题。如果一篇学术论文提出一种新的方法,往往要在 Atari、MuJoCo 等标准的实验环境中做实验,并与 DQN、DDPG、TD3、A2C、TRPO 等有名的基线做实验对照。但是这些基线算法的表现严重依赖于编程实现的好坏,如果你把自己的算法实现得很好,而从开源的基线代码中选一个不那么好的做实验对比,那你的算法可以轻松打败基线。

 

稳定性极差

强化学习训练的过程中充满了随机性。除了环境的随机性之外,随机性还来自于神经网络随机初始化、决策的随机性、经验回放的随机性。想必大家都有这样的经历:用完全相同的程序、完全相同的超参数,仅仅更改随机种子(Random Seed),就会导致训练的效果有天壤之别。如果重复训练十次,往往会有几次完全不收敛。哪怕是非常简单的问题,也会出现这种不收敛的情形。
所以实验时即使代码和超参数都是对的,强化学习也有可能会出现不收敛的情况。监督学习则几乎没有这种担忧。

在这里插入图片描述

 

总结与未来

RL需要过多的数据量,且现实应用中收集数据成本和代价太大。即使收集到合适数据,训练网络时,超参数和随机种子等因素对模型的训练影响非常大,不稳定。
近年来,研究人员提出了多种方法来应对这些问题,提高RL的实用性和效率。以下是一些前沿的改进方法:

  1. 使用模拟环境和数据增强,减少对真实世界数据的需求,但是这样训练出来的模型如温室的花朵。
  2. 事先准备一个数据集,用行为克隆等监督学习方法做预训练,再进入现实做环境交互,进一步训练。
  3. 迁移学习与元学习,减少新任务所需数据量。
  4. 多任务学习和强化学习的结合,同时学习多个相关任务,共享知识以提高学习效率和泛化能力。
  5. 模型基的RL,构建环境模型以预测未来状态和奖励,减少对真实环境交互的依赖。
  6. 自适应超参数调整。
  7. 集成学习和强化学习结合,结合多个模型或策略,以减少单一模型或策略的不稳定性和偏差。
  8. 利用大模型,具身智能等技术,让模型更具泛化性。

本文内容为看完王树森和张志华老师的《深度强化学习》一书的学习笔记,十分推荐大家去看原书!

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

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

相关文章

【机器学习】机器学习四大类第01课

一、机器学习四大类 有监督学习 (Supervised Learning) 有监督学习是通过已知的输入-输出对(即标记过的训练数据)来学习函数关系的过程。在训练阶段,模型会根据这些示例调整参数以尽可能准确地预测新的、未见过的数据点的输出。 实例&#x…

【软件测试学习笔记6】Linux常用命令

格式 command [-options] [parameter] command 表示的是命令的名称 []表示是可选的,可有可无 [-options]:表示的是命令的选项,可有一个或多个,也可以没有 [parameter]:表示命令的参数,可以有一个或多…

Vue3在点击菜单切换路由时,将ElementPlus UI库中el-main组件的内容滚动恢复到顶部

功能:Vue3在点击菜单切换路由时,将页面el-main的内容滚动到顶部,布局如下,使用UI组件库为ElementPlus 在网上搜很多都是在route.js中的router.beforeEach中使用window.scrollTop(0,0) 或 window.scrollTo(0,0) 滚动,但…

【用法总结】LiveData组件要点

【用法总结】LiveData组件要点 1、如何实现和生命周期的关联&#xff1f;1.1 observe的实现逻辑&#xff1a;1.2 观察者的装饰者&#xff1a;ObserverWrapper1.3 观察者集合的存储&#xff1a;SafeIterableMap<Observer<? super T>, ObserverWrapper>&#xff0c;…

ChatGPT 商业提示词攻略书

原文&#xff1a;ChatGPT Business Prompt Playbook 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一、书系介绍 人工智能发展迅速。非常迅速。 所以我希望你做两件事&#xff1a; (1) 在 Twitter 上关注我&#xff1a;iamkylebalmer (2) 订阅我的免费电子邮件通…

springcloud Client端cloud-consumer-order80

文章目录 简介建立module修改pom修改yml主启动类把公共代码写在一个mudule 里面测试 简介 这个是和之前的8001相互配合端口测试 这里的80的用户测试端口。 代码在&#xff1a;GitHub 上&#xff1a;https://github.com/13thm/study_springcloud/tree/main/days2 建立module …

小程序 自定义组件和生命周期

文章目录 ⾃定义组件创建⾃定义组件声明组件编辑组件注册组件 声明引⼊⾃定义组件⻚⾯中使⽤⾃定义组件定义段与⽰例⽅法组件-⾃定义组件传参过程 小程序生命周期应用生命周期页面生命周期页面生命周期 ⾃定义组件 类似vue或者react中的自定义组件 ⼩程序允许我们使⽤⾃定义组件…

1.C语言基础知识

这里写目录标题 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

RHCE9学习指南 第21章 用bash写脚本

grep的用法是&#xff1a; grep 关键字 file 意思是从file中过滤出含有关键字的行。 例如&#xff0c;grep root /var/log/messages&#xff0c;意思是从/var/log/messages中过滤出含有root的行。这里很明确的是过滤含有“root”的行。 如果我要是想在/var/log/messages中过滤…

『 C++ 』红黑树RBTree详解 ( 万字 )

文章目录 &#x1f996; 红黑树概念&#x1f996; 红黑树节点的定义&#x1f996; 红黑树的插入&#x1f996; 数据插入后的调整&#x1f995; 情况一:ucnle存在且为红&#x1f995; 情况二:uncle不存在或uncle存在且为黑&#x1f995; 插入函数代码段(参考)&#x1f995; 旋转…

阿里云服务器4核8G配置最新优惠价格表(2024活动报价)

阿里云服务器4核8g配置云服务器u1价格是955.58元一年&#xff0c;4核8G配置还可以选择ECS计算型c7实例、计算型c8i实例、计算平衡增强型c6e、ECS经济型e实例、AMD计算型c8a等机型等ECS实例规格&#xff0c;规格不同性能不同&#xff0c;价格也不同&#xff0c;阿里云服务器网al…

Smart Tomcat

Smart Tomcat插件可以让idea图形化界面让代码部署到tomcat上达成一键打包部署的过程 下面是idea安装使用Smart Tomcat的过程 我们直接在plugins(插件)里搜索Tomcat 然后下载第一个 然后点击Apply(应用) 在一个项目中 第一次使用时要进行配置Smart Tomcat Name 可以不配置…

npm超详细安装(包括配置环境变量)!!!npm安装教程(node.js安装教程)

安装node.js:(建议选择相对低一点的版本&#xff0c;相对稳定)​下载完成直接点击next即可(安装过程中会直接添加path的系统变量&#xff0c;变量值是自己的安装路径&#xff0c;可自行选择&#xff0c;比如&#xff1a;D:\software\)​安装完成:winR打开电脑控制台&#xff0c…

【每周AI简讯】GPT-5将有指数级提升,GPT Store正式上线

AI7 - Chat中文版最强人工智能 OpenAI的CEO奥特曼表示GPT-5将有指数级提升 GPT奥特曼参加Y-Combinator W24启动会上表示&#xff0c;我们已经非常接近AGI。GPT-5将具有更好的推理能力、更高的准确性和视频支持。 GPT Store正式上线 OpenAI正式推出GPT store&#xff0c;目前…

20240117-【UNITY 学习】增加墙跑功能和跳墙功能

替换脚本PlayerCam_01.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening;public class PlayerCam_02 : MonoBehaviour {// 视觉灵敏度参数public float sensX 400;public float sensY 400;// 视角垂直旋转角度限制publ…

平衡操控应用场景探讨及RTSP技术实现

平衡操控应用背景 平行操控场景&#xff0c;通过超低延时视频通信技术与实时信令技术结合&#xff0c;使得操作者可以实时的驾驶/操作远端的无人车或机械设备。 相比传统近距离的遥控&#xff0c;平行操控的传输网构建在互联网之上&#xff0c;突破了传统距离限制&#xff0c…

防火墙如何处理nat(私网用户访问Internet场景)

目录 私网用户访问Internet场景源NAT的两种转换方式NAT No-PAT NAPT配置思路规划 NAPT配置命令配置接口IP地址并将接口加入相应安全区域配置安全策略配置NAT地址池配置源NAT策略配置缺省路由配置黑洞路由 私网用户访问Internet场景 多个用户共享少量公网地址访问Internet的时候…

go语言(三)----函数

1、函数单变量返回 package mainimport "fmt"func fool(a string,b int) int {fmt.Println("a ",a)fmt.Println("b ",b)c : 100return c}func main() {c : fool("abc",555)fmt.Println("c ",c)}2、函数多变量返回 pack…

《Linux C编程实战》笔记:出错处理

这一节书上把它放到线程这一章&#xff0c;按理说应该在前面就讲了 头文件errno.h定义了变量errno&#xff0c;它存储了错误发生时的错误码&#xff0c;通过错误码可以得到错误的信息 程序开始执行时&#xff0c;变量errno被初始化为0。很多库函数在执行过程中遇到错误时就会…

oracle篇—19c新特性自动索引介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…