首页 > 其他分享 > Apr 2021-Lucid Dreaming for Experience Replay: Refreshing Past States with the Current Policy

Apr 2021-Lucid Dreaming for Experience Replay: Refreshing Past States with the Current Policy

时间:2023-06-04 10:44:58浏览次数:51  
标签:A3C Current Refreshing 采样 States LiDER 刷新 缓冲区 SIL

摘要:经验回放(ER)通过允许智能体在回放缓冲区中存储和重用其过去的经验,提高了离线强化学习(RL)算法的数据效率。虽然已经提出了许多技术,以通过偏差如何从缓冲区中采样来增强ER,但迄今为止,它们还没有考虑在缓冲区内刷新经验的策略。本文提出了用于经验回放的清醒梦(LiDER),一个概念上的新框架,允许通过利用智能体的当前策略来刷新回放体验。

  LiDER由三个步骤组成:首先,LiDER将智能体移动回过去的状态。其次,从该状态,LiDER然后让智能体通过遵循其当前策略执行一系列动作——就像智能体在“做梦”过去,并可以尝试不同的行为以在梦中遇到新的体验。第三,如果新的体验结果比代理之前体验的更好,LiDER存储和重用它,即刷新它的记忆。

  LiDER被设计成可以轻松地合并到异策略中,使用ER的多worker RL算法;在这项工作中,我们提出了一个将LiDER应用于基于演员评论家的算法的案例研究

1 Introduction

最近成功地将强化学习(RL)与深度学习相结合的关键因素之一是经验回放(ER)机制[27]。

现有的ER方法通常基于一组固定的经验。也就是说,一旦一个经验被存储,它将在缓冲区中保持静态,直到老化。前几个步骤的经验对于当前策略的重演可能不再有用,因为它是在过去更糟糕的策略中产生的。

如果agent有机会在同一点再次尝试,其当前策略可能会采取不同的行动,从而获得比过去更高的回报。因此,agent应该重播的是更新的体验,而不是旧的体验

LiDER通过三个步骤刷新回放体验:

  • 首先,LiDER将agent移动回它之前访问过的状态。
  • 其次,LiDER让agent遵循其当前策略,从该状态生成新的轨迹
  • 第三,如果新轨迹带来的结果比智能体之前从该状态中经历的更好,LiDER将新经验存储到单独的回放缓冲区中,并在训练期间重用它。

我们将这个过程称为“经验回放的清醒梦”,因为这就好像智能体在“做”关于过去的梦,并且可以控制梦在过去的状态下再次练习,以获得更好的回报

LiDER的一个限制是它需要环境交互来刷新过去的状态。

2 Background

2.1 Reinforcement Learning
2.2 Asynchronous Advantage Actor-Critic
2.3 Transformed Bellman Operator for A3C
2.4 Self Imitation Learning for A3CTB

3 Lucid dreaming for experience replay

LiDER被设计为可以轻松地合并到使用ER的离线、多worker RL算法中。
我们使用SIL在A3C框架中实现LiDER有两个原因。

  • 首先,A3C架构允许我们方便地与A3C和SIL worker并行添加“刷新”组件,这节省了训练的时间。
  • 其次,SIL框架是一个非策略的actor-critic算法,它以直接的方式集成了经验回放缓冲区与A3C,使我们能够直接利用片段的返回G进行策略更新——这是liDER的一个关键组件

上图显示了LiDER实现架构。

  • A3C组件用蓝色表示:k个并行worker与它们自己的环境副本交互,以更新全局策略π。
  • SIL组件为橙色:一个SIL worker和一个优先重放缓冲区D被添加到A3C。
  • 缓冲区D以D= {S, A, G}的形式存储来自A3C worker的所有经验。缓冲区D按优势值优先,这样好的状态更有可能被采样。
  • SIL工作程序与A3C工作程序并行运行,但不与环境交互;它只从缓冲区D中采样,并使用具有正优势值的样本更新π
  • 引入了刷新工作者(绿色)的新概念,通过利用智能体的当前策略,从缓冲区D随机采样的过去状态中生成新的体验。如果新体验获得的收益高于当前存储在replay buffer D中的内容,则用于更新全局策略π,并将其存储到replay buffer R中以供重用。

我们引入了与A3C和SIL并行的“刷新”工作者的新概念,以从过去的状态生成新数据(以绿色显示)。刷新器可以访问环境,并从缓冲区D中随机采样状态作为输入。对于采样的每个状态,刷新器将环境重置为该状态,并使用代理的当前策略执行rollout,直到到达终端状态(例如,代理失去生命)。

如果新轨迹的蒙特卡罗返回值Gnew高于之前的返回值G(从缓冲区D中采样),则新轨迹立即用于更新全局策略π。更新以与A3C工人相同的方式完成(公式(1),用Gnew替换Q”)。
如果Gnew > G,则新的轨迹也存储在优先级缓冲区R = {S, new, Gnew}中(优先级由优势决定,就像在缓冲区D中一样)。

最后,SIL worker从两个缓冲区中采样如下。从缓冲区D和R 优先级各取一批样本。将两批样品混合在一起放入临时缓冲液中,如图1中绿橙圈所示;临时缓冲区以同等优先级处理所有样本。然后从两批的混合物中(如棕色箭头所示)取一批样品(替换),SIL使用该批的好样品进行更新

需要注意的是,虽然临时缓冲区中的样本以同等优先级初始化,但采样过程并不是均匀随机的,随机优先级的优先级采样实现。有了这个临时缓冲区来混合缓冲区D和R的transition,代理就可以灵活地选择过去和/或刷新的经验,而不需要固定的采样策略

我们总结了算法1中LiDER的刷新工作者过程。A3C和SIL工作者的完整伪代码。

Algorithm 1



LiDER的主要好处是,它允许代理利用其当前策略来刷新过去的经验。但是,LiDER确实需要刷新器使用额外的环境步骤(参见算法1行11:我们在测量全局步骤时考虑了刷新步骤),如果在环境中行动是昂贵的,这可能会引起关注。似乎刷新体验的高质量补偿了代理需要学习的额外体验数量。也就是说,通过利用刷新工作器,与没有刷新相比,LiDER可以在更短的时间内达到一定程度的性能——这是一个重要的好处,因为RL算法通常需要大量数据。

Algorithm 2

Algorithm 3

标签:A3C,Current,Refreshing,采样,States,LiDER,刷新,缓冲区,SIL
From: https://www.cnblogs.com/yunshalee/p/17447108.html

相关文章

  • 项目访问的端口是8018,但是真实接口地址是19080,导致访问这个地址http://9.6.237.104:80
    这个问题是由于您的前端页面与后端应用程序的接口地址不在同一个域名下所引起的跨域请求。在浏览器中,出于安全考虑,通常不允许JavaScript从一个域名下访问另一个不同域名下的资源,这种行为被称为跨域请求(Cross-OriginResourceSharing,CORS)。有一些方法可以解决跨域问题,下面是......
  • 为什么HashMap可以存null,而ConcurrentHashMap不可以?
    HashMap中,null可以作为键也可以做为值。而在ConcurrentHashMap中,Key和Value都不允许为null。ConcurrentMap(如ConcurrentHashMap、ConcurrentSkipListMap)不允许使用null值的主要原因是,在非并发的Map中(如HashMap),是可以容忍模糊性(二义性)的,而在并发Map中是无法容忍的。假如说,所有的......
  • An attempt has been made to start a new process before the current process has f
     Traceback(mostrecentcalllast): File"<string>",line1,in<module> File"E:\Eprogramfiles\Anaconda3\lib\multiprocessing\spawn.py",line116,inspawn_main   exitcode=_main(fd,parent_sentinel) File"E......
  • ConcurrentHashMap
    引言HashMap在我们日常的开发中使用频率最高的一个工具类之一,然而使用HashMap最大的问题之一就是它是线程不安全的,如果我们想要线程安全,这时候就可以选择使用ConcurrentHashMap,ConcurrentHashMap和HashMap的功能是基本一样的,ConcurrentHashMap是HashMap的线程安全版......
  • AopContext.currentProxy();
    获取代理对象的方法:AopContext.currentProxy();在同一个类中,非事务方法A()调用事务方法B(),事务失效,得采用((xxxObj)AopContext.currentProxy()).B()来进行调用,事务才能生效。B方法被A调用,对B方法的切入失效,但加上AopContext.currentProxy()创建了代理类,在代理类中调用该方......
  • Java并发编程之ConcurrentLinkedQueue详解
    简介在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循......
  • 理解ConcurrentHashMap的多线程执行
    理解ConcurrentHashMap的多线程执行多线程下ConcurrentMap单个操作的顺序性/原子性结论:ConcurrentHashMap单个操作,例如get/put/remove都有原子性,即使操作同一个key,在底层会通过synchronized锁去排队执行。所以多线程下,任意的执行结果都是合理的。lab1:三个线程,操作同一个Concur......
  • yum安装软件提示Another app is currently holding the yum lock
    关闭yum进程ps-ef|grepyum......
  • Flex实践——States Practice
      上一次用组合效果完成了一些变化,这一次,来学习一下如何实现当单击一个按钮时改变页面状态(包括布局,内容,颜色等)引:你可以在AdobeFlex中使用视图状态和变换来创建更为丰富、更为互动性的用户经历。举个例子,你可以使用视图状态去创建用户界面,它可以根据用户所执行的任务来改变它的......
  • new Date().getTime()和System.currentTimeMillis()获取时间戳的比较
    最近在优化项目代码,看项目组的代码时,发现了一个有趣的现象,有使用newDate().getTime()来获取时间戳的,也有使用System.currentTimeMillis()来获取时间戳的,这让我想到,好像我平时写代码也是想起哪种方式就用什么方式写。这两种方式都可以,仔细思考一下,两者应该会有区别的,应该有是最优......