Sources
欢迎收看IL china 2022强化学习暑期课,我是今天的主持人,中国科学院自动化所曾永成。2 china数学课是由国内外顶尖高校企业老师们联合分享给广大强化学习爱好者的免费网络直播课程。2r china 2022强学习暑期课为期两周,分为理论课、实践课、专题报告、前沿进展以及产业展望5月5个部分,在保持学术前沿性的同时,强化了教学的和实践属性,希望能给更广泛的爱好者带来帮助。然后本次的强化学习暑期课由上海数字大脑研究院和中科南京人工智能创新研究院联合承办,时间为8月15日至26日。每天都有非常丰富的课程。本周的课程主要是实践课,专题报告、前沿进展和产业展望。然后本节课程由秦军老师是为我们带来一实践课务一线强化学习算法。邱文君老师是南期限策联合创始人,CTO南京大学lambda博士生,师从于阳教授,主要研究方向为强化学习和博弈学习。 本节课程的最后是问答环节,欢迎大家在RL穿搭强化学习社区的本帖子下进行的评论区进行留言评论。本帖的编号是506。每节课程在直播的问答环节,由主持人提问到的前三个问题的用户,分别获得动手学强化学习一本。另外9月15日在社区课程主帖评论区留言的用户,都可以申参与随机幸运抽奖。RL china社区将另外提供20本同款幸运书籍给幸运玩家,老师们也会在社区和大家互动的,所以同学们快来社区留言互动。 下面请秦荣军老师共享PPT老师您准备好了吗?好,OK各位同学,各位观众,大家早上好。非常有幸在今天给大家介绍一下离线强化学习的算法,以及它在它的一些应用的实践。我是秦荣军,来自南极先测科技有限公司,我们公司是18年注册成立。然后主要做的这个方向其实就是强化学习的落地,也就是智能决策在现实业务场景当中的应用。在本节课程当中,我们会从这个强化学习以及离线强化学习的一些基础的要素出发,为大家介绍现在主流学术界的一些离线强化学习算法,以及它的实现的一些介绍。在后面我们也会为大家介绍我们自己开源的这个离线强化学习的算法库,以及我们提出的一套可能更适用于实际的业务场景的,这样一套离线强化学习的一个基础数据集。 在最后,我们也会介绍一些我们公司自己正在使用的工具包。在一些现实的业务当中也会有啊取得了比较不错的效果。在介绍工具包的时候,我会以一个具体的案例来为大家演示我们的这个工具包如何使用。使用这个工具包如何来更好的完成我们离线强化学习的任务。今天的这个内容主要从这边列了六个子标题来介绍。 第一个是在这个现实的应用场景当中,我们为什么需要去做离线强化学习这样一个问题。我们首先来回顾一下强化学习它本身的一个框架。其实最近几年强化学习也非常火热,得到了很多的关注。包括像china我印象中应该是从20年开始就举办课程,然后有邀请到了很多的专家学者来做报告。 强化学习它本身是去解决一个续贯决策的问题的一个很好用的框架。虚幻决策它的一个特点就是说我们并不是走完一步以后就会拿到最终的奖励,而是要经过很长期的一个决策的序列才能拿到最后的结果。那么我们行动的目的通常我们会用一个agent智能体去在这个环境当中和环境不断的交互,来得到我们最后的一个奖励,或者说得到我们最后的一个策略。这个策略的目的就是使得智能体在环境当中收到的这个奖励越高越好用这样一个框图来表示如果我们以这个地球来表示我们智能体所处的环境,那么在这个过程当中,通常是一个迭代去优化的过程。假设我们现在在第七次第K次迭代的当中,实际上它的行为策略是派K那么派K就会通过这个智能体,通过派K去执行它的动作A当然是在当前的这个观测状态S下面。那么执行完这个动作A以后,环境会返回下一个时刻的状态,以及执行完这个动作以后,这个智能体它收到的一个单部的奖励项目。 在一个环境当中,智能体通过不断的去执行这个行为策略派K和环境交互,然后会得到一个长期的一个行动序列。那么智能体的目的就是在这个环境当中不断的去,总的来说就分为两个大的步骤。一个是探索,另一个就是根据探索到的这些轨迹,如何去利用这些经验来提高自己的一个收益率。所以在强化学习的过程当中,它本身是在一开始本身是没有数据的。而是通过智能体和环境不断的去交互,产生了一堆数据。再由这堆数据去更新自己当前的一的行为策略,得到下一次的行为策略派K加1,然后再用这个派K加一去在环境里面继续进行交互。它是一个迭代提升的过程,这个过程在今年的课程当中,可能前面的讲强化学习的时候,有些老师也会提到,比如说有这个policy improvement策略提升的这个框架,基本上就是每次迭代的去更新得到新的策略。 所以强化学习作为一个序列决策的框架,它主要关注两部分。第一就是如何在环境当中去做探索。第二探索到了比较好的轨迹以后,我们怎么去利用这些轨迹来提升策略的性能,从而使得我们最终的这个策略性能是最优的。 强化学习其实最近也在很多的这种大型的复杂的决策系统当中,取得了很很不错的一个效果。包括很早的在15年的时候,当时是deep man他们用深度K网络这个技术去玩Carry这个游戏。他的游戏是有一点像任天堂或者小时候的这个学习机上面的那种像素游戏。结合了CNN这种,这个是计算机视觉的网络,主要是浅层的一个the duke five,用这种网络以后,作为强化学习在做特征提取的一部分。然后底层用强化学习算法就能够在很多的游戏场景中取得接近人类,甚至在有些游戏中超越人类的这样一个水平。那么在后来,特别是在17年阿尔法狗系统出来以后当时也是以一个很高的胜率4比1击败了李世石,这个可以说是一惊四座。 接下来的一段时间的强化学习,也在国内外的很多这种mobile类的游戏当中发挥了重要的作用。比如说像腾讯的觉悟,在王者荣耀的场景下有有很不错的一个效果。还有在这个OpenAI他们自己开做了一个dota 2的这样一个系统。主要的技术也是基于强化学习的,包括像后面的这个新技也是基于强化学习。 把这个强化学习作为这种复杂的任务下,把最优策略求解的一个核心的工具。当然由于列的这几个场景,其实它都是会涉及到自我博弈的,所以会加入一些其他的包括种群对抗的技术,或者说这个对手时在里面来使整个过程迭代的进行。强化学习给这些工具可以说是做提供了一个基础的求解这个最优策略的一个支持。 我们可以看到,无论是现在在图上列的这几个游戏的场景,还是说我们大家自己去用强化学习的时候看到的。比如说像Terry或者说这种很经典的一些benchmark的场景下面他们都有一个特点,我们可以发现这些环境它的规则是很明确的那也就是说我们可以在计算机仿真程序当中,很清晰的把不管说是游戏还是环境,它所有的运行的机理都给描述出来。用if else或者用一些微分方程等这些工具都可以把它给清楚的描述出来。 另一个就是这些环境他们的仿真都是非常精准,并且很迅速的。比如说像阿尔法狗的这个围棋的仿真,一般来说下一局棋可能我们人去下的话要好几个小时。那对这个计算机程序来说,可能快一点的一秒不到就可以下完了。在这有这样的一些仿真环境的情况下其实强化学习也需要很多局的或者说很大量的一个探索,才能够找到最后的一个决策的策略。 以阿尔法go这个为例的话,我记得当时看到一个数据,就是说阿尔法构是经过了3000万局的一个自博弈,同时还加上人类棋谱的初始化。所以如果把这个时间放到我们人类的这个世界时间下,可能就是需要几百年才能够完成这个事情。而阿尔法go这个系统,利用这个仿真程序,它本身是比较快的,并且可以去做并行的这些优势,把这个时间得到了一个很大的节省。所以让这件事情在让我们能够看到它的发生。从这个地方可以看到强化学习在做探索的时候,它的效率目前来说可能是比较低下的那也就是需要很多的一个在环境中不断去探索,才能找到最后的策略。 但是另一个方面,虽然说强化学习的里面这个探索是一个至关重要的环节。但是我们在做现实的一些应用场景的时候,如果我们想去部署强化学习,我们会面临的第一个问题就是很多的现实场景它没有对应的仿真环境。那么这个时候怎么办呢?我们可以选择把强化学习的系统训练系统直接部署到真实的环境中去进行训练。流程其实也是一样的,就是和这个环境去进行交互。然后用我们的策略去收集策略,把这个收集到的样本用来进行更新,再迭代的去进行。所以在这个过程中,强化学习的整个框架或者说流程还是一致的,也是探索和利用。只是现在处在了这个真实的应用场景当中,现在这个环境没办法并行,可能去采样是比较慢的,你要真的经历那个物理世界的时间。 另一个更关键的因素,其实是说我们在现实世界中,往往是不允许我们去做特别多的探索和尝试的。比如说像一些移动的这个任务当中,可能在仿真环境里面,我们移动的时候去进行这个尝试,发现撞墙了也就撞墙了。其实也没什么,这个小车可能翻了,对吧?我们把这个环境reset一下,然后小车又回到它的初始状态,反正继续开始。但是我们在现实的这个场景当中,可能撞了一下这个小车上面的一些仪器就歪了,你还得重新把这些仪器给归位。 另一个,就是像在这个机器人的这些控制场景当中,你去把这些东西你可能剪完了,然后你的这个机械臂抓取的任务没有完成的时候,你还要重新把这些道具给归位,这样才可以进行下一次的训练,另外,在我们一些商业场景或者说是这个促销的场景下面,如果我们去探索。比如说今天打一个折扣,今天打个一折打一折可能会有很多的顾客来抢购。但这个时候对我们的商家来说,可能是有一个比较大的成本的。因为打一折可能很有可能会亏钱。所以基于这些基础的观察,我们就能发现,如果我们想直接把强化学习这门技术部署在我们真实的这个现实世界的应用当中,它是有很高的风险的。它会给我们带来不可承受的一些代价。 主要是由于强化学习它本身的一个探索的性质导致的,这是一个比较有有危险的因素,所以也限制了强化学习在很多系统当中的应用。那么有没有一种办法来解决上面所说的在现实世界中试错的方法呢?最近学术界也是,其实也不是最近了,几年前,学术界也开始关注到了这个问题,他们提出了一种比较新的叫离线强化学习的一个框架。 离线强化学习的框架和我们经典的强化学习它的一个区别。或者经典强化学习,我们有的时候会把它叫做在线强化学习。它在整个的数据流的处理上有一个本质的区别,就是我们在做离线强化学习的时候,如右图所示,我们通常是没有一个对应的仿真环境的。我们有的是从这个真实的环境当中去采样收集到的一批历史数据。比如说我们推荐系统有大量的用户交互的数据。比如说我们的机械臂,它有运行的去抓取完成这个任务的数据。又或者自动驾驶的场景,有很多的车辆行驶和驾驶的这些数据。 那么离线强化学习它的目的就是说在训练的时候,我们只用历史上已经收集到的这一批数据,offline data去做策略的训练。然后从这个离线的数据当中训练的策略,我们就把它通过训练以后,得到最优的策略,放到真实的环境去部署。所以这个地方对离线强化学习来说,主要的就是这个虚线框起来的部分,它只能从数据上去做训练。这个地方数据通常是预先收集的,不管是由人类人类的操作员去实际在系统中实施以后得到的数据,或者说是用一些系统,比如说像推荐系统里面,它可能会更智能化一点,有自动的数据的记录。Anyway,这些数据都是事先收集好的,我们通常是没有办法干预的。 在这一批收集好的数据上面,我们接下来的目的是要去改善这个系统的性能,对吧?就是强化学习的目的本身是找到最佳的策略,或者说至少你找到一个比之前更好的策略。所以有了这批离线的数据以后,我们去进行一个离线的策略训练。在训练的过程中,我们不会把这个策略拿到真实环境当中去探索采样来帮助我策略的更新。严格的这个离线场景下是不允许这样做的。另一个就是得到这个训练策略以后,我们还要去对离线得到的策略进行一个评估选择。总的来说就是对策略进行一个验证,然后再把这个策略部署到我们真实的环境当中去执行。最后再来看这个效果,当然策略上线以后,是可以收集到新的数据,那么这个时候可以再把数据给重新加回到这个buffer里面,来进行下一次的策略的迭代更新。 所以从这两个流程上的对比,我们可以看到,在这个传统的在线强化学习的框架下面,我们可能需要在训练过程中和环境去交互很多次,得到一个海量的数据来帮助我们策略更新。但是对离线强化学习来说,在至少在这个训练的过程中,我们通常是不需要去额外收集数据的,或至少不需要额外收集很多数据,有的这个特定的算法可能会收集一点点数据。在这种情况下,我们可以发现,这个可能是更适合我们真实应用的场景的。 他在训练的时候不需要和环境去交互,而训练得到一个性能还不错的策略的时候,我们就可以拿到线上去进行一个部署和使用。这样就避免了我们在强化学习的过程中,训练的时候有大量的试错这样一个危险的因素。所以离线强化学习也逐渐的成为了一种非常有前景的对于部署强化学习的这样一个框架。那么离线消学习最近几年受到关注程度其实也是越来越高。基本上去看各大顶会的投稿,apply和IL很多时候是连在一起的。 刚才讲到了我们经典的强化学习和离线强化学习它的一个区别。那是不是我们就可以很方便的来用离线强化学习的呢?其实也是由于我们刚才讲到这个强化学习它本身的探索特性导致的。这就会给我们在做离线的时候,如果没有这个环境交互的话,它会有一个非常基础的困难在里面。这个困难explosion itself就是外推的这样一个挑战。 因为我们在做在线强化学习的时候,我们如果想去看一个动作它表现怎么样呢?我们直接在训练环境当中去试一下。试完以后,环境会返回给你这个动作执行以后,它真实的这个收益小这个小儿以及对应的下一个时刻的状态。所以你可以通过在环境当中试错,去拿到一些动作真实的信息的。那么对于离线强化学习来说,这一步可能就不能去执行了。因为我们看到的只有这一批静态的数据,不允许你在真实的环境中去通过试错的方式来收集新的数据。所以很多时候对于这个在线的经典的强化学习算法来说,他们天然就没有外推的这样一个问题。这个外推的意思就是我要去看一下在数据以外我历史上可能没有见过的那些状态下面,我做了某个动作会得到什么样的结果。 对于离线强化学习来说,因为他没有一个仿真环境可以让他去试错,并且告诉他把这个动作做完以后真实的结果是怎么样的。所以离线强化学习它在一定程度上就会是被这个外推因素给影响。通常一个比较理想的离线强化学习算法,它在训练的过程中要去或多或少好的考虑这个外圈的因素。因为我们收集到的数据通常是有限的,很难去做到一个把全空间都给覆盖,并且所有可能情况都给枚举出来的这样一种数据集。同时在做这个离线强化学习的时候,我们还要更多的去考虑我们尝试的这个动作是否是安全的。当然这些数据上很有可能没有这个答案。所以从这个图上来看的话,如果我们正常的经典的在线讲话学习训练的时候,他可以去试很多奇怪的动作,来看这个动作是好是坏。而离线强化学习,我们并不知道这些动作试完以后它的一个结果。 可能有细心的同学也会想到,我们前几节有其他老师在讲强化学习的时候,也会讲到一个同策略和异策略的区别,异策略就是这个off policy的算法。那么大家回顾的时候可能会想起来这个off policy的算法,它在训练的时候就有一个特性。就是我们在做这个实际到环境中执行的策略和我们正在更新训练的这个策略,它可以不是同一个。所以这种场景下它叫off policy。我们在离线强化学习的时候,也可以这样做一个类比。我们去收集数据的这一批策略和我们最后在训练的这个策略,他也不是同一个,那天然的好像这两个就有一个对应的关系。 我们是不是可以直接用这个off policy的一些算法来解决离线强化学习的问题呢?比如说大家比较熟知的DQN,或者说在连续状态空间下面有DDPGSAC这样的算法。但比较遗憾的是其实这样做是有风险的。我们接下来先快速的回顾一下这个off policy的强化学习,它主要做的一个事情以及它的的目标。对于off policy reforming来说,它的优化目标还是一致的,就是要去最大化这个轨迹上的回报,找到一个策略来最大化轨迹的回报。 但是我们就以这个DQN为例,DQN是一个比较经典的好讲解的例子。那么对于TQN来说,他要去做的就是找到一个Q函数。他的策略就是通过去选这个Q函数,下面动作最大的就能够导出我现在用什么策略最好。所以在GQN当中对Q函数的学习也是去估计我在当前的状态ST下面执行动作AT以后会得到的一个期望收益,如右图所写的,在执行完这个动作以后得到的一个期望收益。那么在接下来的过程中,会不断的去做这个策略的迭代和策略提升,通过这个贝尔曼最优方程来做这个事情。在这个过程中,就是我们每一次会根据当前得到的这个替换数,去选择最佳的那个动作来作为我们的策略。它基本上是一个接近确定性的策略。 然后在更新的时候,我们会去做这个Q函数的更新,只是对于DQN来说,在更新这个Q函数做贝尔曼方程的时候,下一个时刻会用下一个时刻的最优的Q函数来作为它的target。那么不断的去重复这个过程,在做的事情就是在所有的这个状态上,所有可能遇到的状态上面,不断的去强化那些会带来更高收益的动作。那么就去得到了这样一个对应的Q函数和策略。 在做Q函数的时候,就是去做一个最小化miss error的这样一个事情。当然在做这个Q函数的学习的时候,这个数据是从replay offer里面来的,尤其是在GQN当中,是从一个历史的offer里面来。那么这个buffer里面,它包括了早期的这个策略才能得到的这个样本,也包括了可能最近的策略才能得到的样本。放到一个先进先出的这样一个八分里面,那么每次可以从这个buff er里面有优先级的采样。比如说我的这个q loss比较大的,我先裁出来,或者如果不加任何权重,那就是从这个buffer里面均匀的去采样来更新我的Q函数。 那么从这个过程当中对,还有补充一点的就是在这个策略执行的时候,通常为了保证有一定的它的索性,因为从Q函数直接导出了这个策略,它是一个去接近确定性的策略,为了保证探索的过程,我们会对这个策略的执行加一点点扰动,通常用的技术就是这个ipsen greedy在一开始会用一个比较大的FCM的值,去以if CO的概率去随机的执行所有的动作。然后随着训练进行的这个ex会慢慢衰减到一个很小的值。总的来说这个过程在做of policy的训练的时候,其实它是比较接近on policy。就是说我们的这个行为策略和更新的策略,它的差异还是没那么大的比较接近的。在这个过程当中,of policy做的是用一个near on policy的探索策略在环境中去执行,同时还会用一个reply buffer收集历史上的这些station pair,主要是这个tradition,还包括了裆部的奖励和下一个时刻的状态来放到这个buffer里面,供后面的这个更新。所以我们可以看到,这个off policy并不并并不是会让这个更新的策略和采样的策略完全不一样,它或多或少还是有一些限制在里面的。 那么回到刚才我们的那个问题,我们是不是可以把off policy的算法直接用作offline 21的算法呢?很遗憾的是在SML19年的这个工作上就有研究者发现这样做是不行的。他们的一个实验的设置是通过在这个module的offer这个任务上,这是一个连续控制的任务,所以他们用的是DDPG这样一个算法。然后在DDPG的算法当中,他们做了三个尝试。首先第一个是说我用DDPG去跑跑一兆的这个样本,收集到了一个buffer。我再用另一个策略,只用这个buffer来训练。我不去收集更多的样本,也不和环境交互,就用这批固定的buffer来训练。可以看到在这种情况下,原始的这个DDP计算法训练的这个曲线是橙色,而用这个固定buffer同样用DDPG算法来更新的时候,它的性能只能到成了蓝色的这一部分,是远远低于DDPG正常的更新过程的。 在第二个这个setting当中,他们进行了一个修改,修改就是我们在训练DDPG这个算法采样的同时,我直接就另外再起一个进程去跑这个策略优化的用另一个DDPG去优化一个策略。但这个策略他自己不会到环境中去采样交互,而是用当前在训练的这个DDPG,就是呈现出他的buffer,用他的这个reply buffer来更新这个DDPG的策略。也可以看到在这种同时更新的情况下,特别of policy的这个策略,它的更新也是失败的,很难的取得和我们正常的这个DDPG同样的性能。 第一个和第二个的主要的两点区别是,第一个他为了做做final buffer这种city里面,它为了让数据的探索或者说数据的覆盖比较充分,它稍微加了大一点的探索。另一个就是收集到全量的数据以后,再去给我们更新的策略来看的。那么在中间这个concurrent的设置上面,它是同时把这个训练过程中的buffer,就给这个of policy的算法DDPG去做训练,只是注意这个of policy的算法它更接近于一个offline city,不会去和环境交互收集数据。所以在这两种情况下,可以发现我们直接把of policy的算法对着一个。固定的打法去更新自己,不和环境交互都是不行的。 第三个city下面就是我们这个研究者,他已经把一个训练好的收敛的ETPG的策略单独拿出来去重新采样,得到了这个一兆的样本。然后用这个一照的收集到的固定的样本,同样的用一个DDPG的算法对着这个buffer去训练,可以发现这个也是完全训练不上来的,甚至它的这个收益会更低。上图是在这个训练的过程中,我们把这个策略单独拿去测试。或者就是用这个训练的策略,他在训练过程中的这个曲线得到的一个真实环境下的回报。那么这个会带一点这个行为策略他探索的噪声。 下面是对应的DDPG里面Q值函数的估计,可以看到在学习的过程中,我们如果对着那个相对固定的版本,自己不到环境中去采样的话,他的Q值的估计可以上升。但是对应的这个策略是不行的,和真实的这个Q值的估计这个真实Q值估计是用蒙特卡罗在环境中去采样近似得到的,也就是这个带点的线表示的会比它更高,然后也会有一些差异。那么在最后的这个city用训练好的策略去重采样的这个buffer下面,甚至这个Q值的学习都发散了。所以从这样的一个经验观察可以发现,我们直接在offline city下面去用off policy的这个算法来学策略,对着一个静态的buffer,通常是会失败的。它的这个算法的学习效率是很低效的。 所以在这个过程当中最主要的一个因素,应该就是由这个外推误差导致的。就是你会在训练的过程当中去尝试很多之前没有见过的动作。但你需要知道尝试完这些动作以后,它的答案是什么。也就是你需要得到环境的反馈。但这个时候由于你和环境没有交互,你只能通过数据集以及自己学的这个类网络。我们现在用的比较多的也就是神经网络了,它的一个泛化性能来进行外推。所以在这个过程当中外推误差可能是一个比较主要的导致off policy的训练算法失败的因素,或者说是对我们的一般的强化学习算法而言,直接把它用到offline city下它失败的一个因素。 那么我们如何来避免这种外推误差带来的影响?通常我们现在比较主流的一个做法就是我们去加一点保守性。在策略估计的策略学习的过程中去限制我们当前的更新,不要离这个数据特别远。接下来我会从model free还有model list的一些方法里面去介绍这个保守性是怎么体现的,以及是怎么加到我们我fend的训练里面的。接下来的几部分在这个三我会介绍这个model free的离线强化学习的算法,在第四节我会介绍这个model base基于模型的一些强化学习的算法。同时完了以后,还会向大家简单介绍一下,怎么去做离线的这个策略选择。因为离线强化学习训练的时候,也会有一堆超参。我们要从这些超餐里面选到可能最好的那一组超餐,或者说离线训练出来的性能最好的模型,然后再拿到线上区域部署OK。 我们先从这个model free的离线强化学习算法开始,其实离和离线强化学习比较相关的还有另一个领域,他们这个叫模仿学习。模仿学习很从这个字面就可以看到很直观,就是现在我们有一批历史的行为数据了,或者说历史的交互数据。它是由一个行为策略和环境交互产生的。我们可以从这批数据上面去把这个行为策略给还原出来,就在做模仿。 在接近强化学习里面,对模仿学习有另一个叫法叫行为克隆BC。BC的做法非常简单,它可能是最天然的一种模仿学习的方式,但是很多时候我们可以看到它还是比较有效的一个比较强力的一个贝斯兰。当然在很多的离线强化学习算法当中,也会很自然的把BC作为一个对比的基线。那么BC在做的事情就是从这个数据集我们收集到这批离线数据集D上面去做一个动作上的最小误差。或者说如果是这个策略是一个概率分布形式的,我们去做最大似然的估计,得到这个参数就可以还原出一个行为策略。那么这个行为策略就对应了收集到这一批buffer的行为数据行为策略。 我们可以想象一下,在这个过程当中,BC它更新只需要看到每一个不同的状态下面对应的action。他不需要知道我执行完的这个reward是什么。也就是说BC是和reword无关的。那么我们我们做一个很大胆的假设,或者是从直观上来看,因为BC和这个奖励没有关系,他只是在做一个简单的模仿。我们甚至可以大胆的断言,这个BC不会比行为策略来收集或者说产生这一批数据的行为策略表现的更好。通常情况下确实也是这样的。另一个就是在做这个策略模仿的时候,它非常简单,通常也是一个很快就能完成的过程。那么BC它的一个不好的地方就是它的上限。 大家也很清楚的能够看到,就是采样数据的这个行为策略。但是我们在做离线强化学习,它的目的本身是说从现在已经收集到的这批离线数据当中,我们要去找到一个更好的策略来提升改善系统的性能。所以光做到和这个行为策略产生这批数据的行为策略一样好是不够的。我们要超过它,并且超过的越多越好。但是BC天然又是一个和这个奖励无关的,所以他很难去超过这个行为策略。那么有没有办法在BC上面稍微做一点改进的,把这个奖励给带进去,其实我们可以通过对这个BC更新的时候去做一个加权,让这个加权和奖励或者说是长期的回报关联起来。这样就可以去让我们BC有希望让我们的BC在做模仿的时候觉得更好。 我们来看一下原始的这个BC是上面这样一个形式在做这个最大自然或者是如果是一个确定性的策略,它可能就是在最小化这个策略输出的动作的误差。那么我们对它做一点点改进,加一个权重函数F那么这个权重函数F它通常需要满足的性质就是它是一个非负的,最重要的它是要和我们的这个收益Q函数是单调的。也就是在这个Q值高的地方它会变得更高,Q值低的地方可能它会变低。其实这个形式和我们做这个强化学习的策略梯度的形式非常像。如果我们在前面直接对这个目标来求梯度的话,对那么这样的一个更新公式可以看到,如果我们的选择了这个F函数,它就是满足这个性质和它是非负的,并且和Q函数也是一个单调的。那么用这个更新目标就可以看到,在做BC的时候,它是不断的在强化好的那些动作。 这个好就是通过我们训练过程中离线训练过程中的一个评估函数。比如说我们可以用上学期里面用的很多的优势函数来评估,甚至也可以直接用一个Q函数。那么我们是需要对它做一个指数的加权,来保证它的非负性,就可以满足这个性质。他在做的事情就是把那些好的动作不断的强化,让他的这个概率变得更高。然后让那些差的动作它的一个概率变得低一点。OK我们刚才其实花了比较多的篇幅来讲这个off policy的强化学习。 它失败的一个原因主要是由这个外推的误差导致的。这个外推误差又是离线强化学习它本身需要面临的一个问题。当然我们在做模仿学习的时候,不管是BC还是加权版本的BC,他很自然的就是有这个保守的性质在里面的,他不需要去做特别多的外推,本身就限制在了当前已有的这个数据集周围。如果说是完全不加权的BC的版本,它就是在做数据的模仿,那他就天然的没有,或者说这个外推误差的影响对他来说会很小。我们看到了在BC当中,他竟然天然的拥有这种保守性。那么在其他的这个离线强化学习算法里面,怎么去体现这个保守性,来缓解外推误差的问题呢?首先给大家介绍的是最近应该是20年在nx上面发表的一个算法叫CQL,那么CQL里面的C就是保守,具体来说它是怎么做的呢? 通常我们会对这个离线强化学习训练的过程当中,我们也会对他如果说是一个离线强化学习的算法,也会对策略进行一个一定的评估。比如说我们会学对应的这个Q函数,那么很多时候我们学到的这个Q函数和实际的去评估的值之间是有一个gap。比如说在DQN当中,就有很多学者观察到了DQN的Q函数有过估计的过高估计的这个现象。那么也提出了比如说像WQ或者命Q的一些方法去保障缓解这个过高估计的问题。 那么在离线强化学习的时候,如果我们去做策略的评估,用Q函数的话其实还是有这个风险。因为有一部分的这个数据你没见过,在外推的时候,很有可能这个模型就错误的告诉你,认为你执行完这个动作会得到更好的结果,这部分结果是由当前的你自己估计的Q来估计的。那么这个地方的外推误差影响就会很严重。比如说像上边的左边两幅图表示的,可能左边的这个是你在实际的执行的时候得到的收益,而右边是这个Q函数对应的收益。可以看到很多时候这两个是不一致的,包括它的这个趋势也是不一致的。有的上升的地方估有的实际的性能会下降的地方,这个估计出来的Q函数还在上升。这可能就是因为我们在训练的过程中有一些Q值被错误的放大了。 这是由于离线的训练过程中,在做外推的时候,有一些Q值我们拿不到他真实的这个值,我们只能用当前的学到的KU去进行外推的估计带来的。那么在CQL当中也是基于这样的一个假设发现,他想的是我们怎么去解决这个问题呢?很简单,我们把这些行为,就是数据集上以外的那些动作,把他的Q值给降低点,惩罚这些特别大的Q值。那么它的优化目标在学这个Q的时候就有两部分来组成,先看下面的一部分,下面的这一部分其实就是我们在做贝尔曼方程更新,从这个历史的buffer涉及到的这个数据集当中来更新的时候,一个常用的更新形式。但同时在CQL当中还会加上一个惩罚项,让这个惩罚项去把那些在当前学到的这个Q下面,同时又是在行为数据集上很大的那些Q值把它给压下去一点。所以两部分的优化目标合起来,就是总的再找一个q loss最小的在后面在做变量方程的更新最小化的这个Q函数。同时我们会去这个缪是啊行为策略,可以是行为策略,然后在某一个策略缪上面对应的这个Q值如果太大的话,我们就去把这个Q变得小一点。 然后这个谬的目的就是让这种最坏情况下的Q值尽可能的大,所以总的目标就直观的理解,就是不要让那些在某一个策略缪下面很大的那些Q变得特别的大,因为他这边在做一个min max,min max就是最坏情况下的这个Q不要熬太大。通过这样的一个更新,可以保障这个作者在CKU的论文定理一里面证明了,如果是通过这样更新的,我们实际学到的这个Q函数,就是这个更新完返回的这个Q函数和真实的Q函数相比,它是不会比这个真实的Q函数大的。所以在一定程度上可以缓解这个外推的时候过高过低的这样一个灾难性的问题。当然这个前提是我们的对这个阿尔法需要进行一些选择。那么也会有啊这个CQU里面的理论来指导怎么去写,但实际上上面这个优化目标会比较严格,因为我们在做策略更新和策略提升的时候,很多时候我们看的是这个V函数,也就是对应的这个Q函数在某个策略下它的期望的收益。那这个时候我们就并不要求严格的去保障我们学到的这个Q在所有可能的given一个state,然后所有可能的action上面都比真实的这个Q函数小。这样的一个放松以后,作者导出了一个更更紧的一个理论的保障,直观的来看,就是他对上面的一步进行了分解,之前做的是把那些特别大的,在行为策略上表现特别大的这个Q值给压低一点。 现在改成了我们无论这个策略是怎么样的,都会去把这个Q值把它给压低。但是我额外再加一,如果说这个QSA的值在数据上已经出现过了,我把它弥补回来一点。因为前面这个max me的时候把它给压低了,现在我在后面再添一个负号,再乘上这个阿尔法的系数,我把这个行为数据上已经有过的这个值数据集上有的,我把它给弥补回来,这样就是上面的这个优化目标可以理解成它的一个近似。那么有这样的一个修改以后,之前的在所有action上面都比真实的这个Q函数小的保障可能就不复存在了。但是这个对我们策略更新和提升来说几乎是没有影响的。因为我们只需要保证在期望意义下,我们学到的这个Q函数比这个真实的Q函数要低,那么就可以缓解外汇误差的这个问题。同时做完这个修改以后,就可以得到一个更紧的一个界,更紧的误差界是当前更新的得到的这个函数和真实的Q函数之间的一个误差界。 作者把这个记为CQL的一个loss去更新,找到一个q head派作为我们使用的,或者说是作为策略评估的一个q head派,然后再基于它去做一个提升。当然实际上作者最后用的这个版本还会在这个CQL的loss上面加一个正则项,是去限制这个策略的结构误差的。通常可能是entire y或者其他的一些regulate正则项的算子。那么总的这个CPU的目标就是这样一个形式,他会去加一个数据集,上面所有有的这个action的值它直接剪掉就好了。 这个CQL的算法,前面学到了一个保守的Q,那么有了这个保守估计的Q以后,在那些数据集上面可能没有见过的那些Q就不会变得特别大。那么这个时候就能够在外推的时候,减小这个外推误差的影响。有了这个估计的Q以后,我们就可以用标准的强化学习的算法,特别是和这个Q紧密相连的SACDDPG、TT3等等,离散的情况下可能就是DQN这些算法来更新我的策略,然后不断的去重复这两步,得到最后的一个策略。 OK接,以上讲的是在离线强化学习里面model free的一些方法。这个model其实通常指的就是这个environment model和和我们经典的在线强化学习里面的model 3和model base的术语是对齐的。接下来我会带大家简单回顾一下这个model base的方法。 我们首先来看一下这个model base的方法它是怎么运行的。我们在做在线的这个强化学习的时候,通常认为model base的方法它会利用这个会对当前的这个environment进行一个建模,得到model。有这个model以后,我们可以不和环境交互,而是和这个model交互去产生一些新的样本。通常会在学习的早期有更高的学习效率,也就是很多会会说会说他有更高的一个样本利用率,用取得同样性能的时候,比很多model free的方法用的样本要少。那么在这种情况下它会这个算法model base的方法会去对环境的model做一个学习,通常就是去你和这个环境转移的误差。 当我们在离线的这个city下面的时候,其实学一个model也是会更有用的。这个model它本质是一个生成式的模型,就是我们给了当前的输入,比如当前状态和当前动作,他会给你生成一个下一个时刻的A那么我们就可以用我们当前的策略派去和生成的这个SCP,生成的ICP去交互得到AEP。那么可以用model和策略去不断的roll out,得到一些轨迹,再用这个轨迹里面的数据来对我们的原始的数据集进行扩充。 这个地方和model free的方法的区别就在于,可能model free的方法里面很难去生成一些新的状态。它可以去在做Q函数的学习的时候,可能会生成一些新的动作我去更新。但是对于model base的方法,我们现在有一个环境model,我们可以去生成更多的SA,生成一些比较不一样的轨迹,然后用这些轨迹加到buffer里面,或者我们就用生成的这个轨迹来进行更新。所以它天然会有一些优势在里面。也就是我们有了这个模型以后,能够去看更多的,也就是如这句话所写的,去回答如果我这样做会得到什么样结果的一个反馈。然后在这个Q函数的学习过程中,和之前的model free里面Q函数的学习基本上也是一致的。只是可能有一部分样本是来自于我们用model look out生成出来的数据的。 当然这里面也会存在一个天然的问题,就是当我们模型的这个预测很不准的时候,特别是在数据集上没有见过的时候,这些生成的状态同样也是有这个外推误差的。甚至由于他推了多步,对吧?我们每一次在推的时候在外推的时候都是基于上一个自己的模型生成的,以及和策略交互以后生成的这个SA来推下一个时刻的这个SCP,然后又生成了一个SCP放到我们的这个环境模型和策略里面去进行外推。那么这个时候,这个外推误差可能会累积,带来更大的影响,所以在摸的不准的时候,我们也需要小心的去利用这些收集到的数据。 OK那么我们怎么去利用这些数据呢?就是比较直观的一个启发式的想法。就是当这个model他估计很不准的时候,我们去惩罚这些数据它带来的一个影响。所以在也是20年这个nx上面,mobo这个方法里面作者就提出了一种技术来对这部分的策略模型的你这环境模型的估计做一个乘法,来使得策略在更新的时候变得更加保守。 宏观的想法就是说当模型不准的地方,我对当前的这个值函数或者说奖励函数加一个乘法。在模型gucci的认为比较准的地方,我就不加这个乘法,让这个model round生成出来的数据来直接提供我们的学习。那么具体的来看在门口里面他会去对这个模型做一个集成。也就是这个集成学习里面的,他会同时去学好多个环境模型。用这个多个环境模型的,比如说对同一个状态估计的方差来等等,或者其他的指标来做一个不确定性的估计,来表示我们不同模型的来进行一个置信度的评估。那么有了这个值以后,再加到策略的更新里面,加到这个奖励函数里面,就可以用现有的这些任何的强化学习算法来更新这个策略。 大概的框架就是同样的,我们用这个模型去roll out。但是不一样的,学这个Q值的时候也是一样的。但是不一样的就是我们这个模型生成出来的数据并不是直接去计算奖励函数然后来更新的。 我们会去加一个不确定性的一个惩罚项,来使得那些模型他自己觉得不确定的地方,我给的这个奖励小一点。那么策略在这些地方的更新就会变得更保守一点。这个就是在这个model base的方法里面,通常是对模型去做保守。然后在moko里面作者也是去证明了一下,如果我们用这样这种更新的方式得到的这个策略模型经过强化学习的算法来更新它其实是有一个保障的。 在最后得到的这个策略派和任意给的策略派之间,它的差距都不会特别大。就差一个真实的评估减一个误差项,一个二维拉姆达乘上这个误差项。那么这个误差项体现的它定义就是这样一个值。它体现的就是总的这个策略集上面这些状态的一个支撑的这种概念,那个support的这种概念。那么当我们在这儿把这个派取为派星的时候,我们就可以知道,如果我们满足这个一些假设,满足论文模糊论文里面写的比较温和的一些假设的时候,策略的性能和在真实的model里面更新得到的最优的策略,它的差距也不会特别大。如果我们把这边这个定理4.4里面的派写成我们的采样策略,就是生成这批离线数据集的策略的时候,我们可以发现更新得到的策略不会比这个行为策略差。因为在行为策略上这边的这个误差通常是会更小的。那么有了这样的一些保障以后,作者就提出了这个moto算法的一个框架。 这个算法总的刚才其实也已经讲过了。总的来说就是会去先训练一个环境的模型,叫dynamic model,并且把这些环境模型都学到误差比较小的一个范围,认为它是可接受的。通常作者在实现的时候,还会去用多个环境模型做集成。这个也是方便后面来做不确定性的估计的使用,然后就用这个学到的环境模型这个m tube来做策略的更新。用它去生成这个数据,生成好多的轨迹。然后对这个reward做一个成把项加上去以后,来做这个策略的更新,把这个过程迭代,就一二两步不断的迭代得到收敛。最后得到这个策略就是我们要用的策略。 具体来说的话,这个模糊的某一个实例实现出来就是这样的,会在给定的一批历史数据上面去训练,先训练一个环境模型,训练环境模型就是去最小化这个tradition function它的一个损失函数。然后训练好了一批环境模型以后,这些环境模型就固定住。接下来去用这批环境模型不断的生成数据。然后从这个真实的初始状态,从数据集里面采用真实的初始状态出发,去root h bo这个小h bo。然后用某一个环境模型去返回下一个时刻的这个状态。就是把我们学到的环境模型当成真实的环境来用。然后再加这个reward的时候,会去加上一个模型的不确定性的估计,把这些存到这个model产生的这个数据集的buffer里面,再用一个强化学习的算法。比如说在连续的这个任务下面,就是SAC去更新当前的策略,得到最后的一个策略模型。 那么我们注意到在monto里面,它的这个roll out的horizon通常不会设的特别大。通常就是我们经验来看就是小于等于十的这样一个值,有时候就125或者十这几个值当中去选。那么这个也是有它的一个道理在里面的。因为我们学的这个模型在外推的时候,每一次都是基于自己生成的这个数据来外推的。所以如果模型去推很长的这个轨迹,可能它的外推误差就会很大。那么这个时候它的外推出来的东西就更不可靠。包括我们如果自己去做实验的时候,其实也可以发现,这个外推的轨迹也不能设得太长。 我们也就是我们公司自己也做了一个offline RO的库,包含了比较主流的一些offline IL的算法,有model free,有model base的方法。像刚才提到的这个CQL,还有比较早的发现这个of policy有外汇误差,对着固定八分来信的那篇文章其实是在BCQ这个算法里面,BCQ也可以作为一个offline的算法,我们也把这些算法给加进来了,当然也包括了BC这种invitation的算法,这个CRR就是加权的BC它可能更接近于这个模仿类的。这些model free的算法都包含在这个offline l的库里面,大家可以在agent点NAI下面去访问。在我们公司policy er的这个主页下面,同时我们在github上面也对这个库进行了一份镜像,大家都可以去使用里面的一些库。包括model free的一些方法,我们也在也添加到了这个库里面。接下来我会先切到这个库里面,给大家介绍一下这两个这个库里面的一些设计和怎么使用。 对,现在这边这个就是呃我把字体稍微放快一点。OK这个office l的库我们包含了有这个使用的样例。然后在下面这个offer 21这个蚊子文件夹下面就包括了具体的这个算法,那么算法的分类大概就分为这个啊对于offline来说主要是两类,这个model base的方法和这个model free的方法。Model free里面就有这个BCBCQBCQ的这个离散版本,还有比如刚才提到这个CQL,然后还有另外的几个方法。那么在model base的这个算法下面,就包括了我们刚才提到的这个model,当然还有童年的这个mario这个算法以及后面这个combo。它是把CQL和mobile进行了一个组合,在大多数的情况下,它的总体性能会比CKL和这个mobo都略好一点。 然后还有在这个S221上面的这个brim,brim其实它可以是一个在线的算法,也可以是一个离线强化学习的算法。因为它强调的是部署时候的一个一效率。也就是说我们通过离线训练得到这个策略,我们允许他去和环境交互,已经训练好的策略去和环境交互。然后和环境交互的时候,我们要交互的次数尽可能的少。交互完了以后可以把交互得到的这个数据放到offline的数据集里面再进行更新。如果我们把这个交互的次数设为零的时候,就是在训练这个策略,得到最终策略的过程中,这个deployment的次数设为零。那brief就是一个比较严格的offline算法。 Online这边对,所以brien也会归到这个online这边来,然后在这个库里面有不同算法,我们会对它去进行一些配置。这里面比如说有默认跑的这个任务是什么,以及这个任务的属性和你要用哪个数据集。这一部分是在指定我们要跑的这个数据集是谁,也可以去设一些其他的,比如说你要用什么GPU,然后如果你要特定的去设一些状态动作的维度也行,包括网络的这个结构,要说一下这个库都是用这个PyTorch实现的。所以如果有有土耳其使用经验的同学来看,这边的代码可能会比较快的上手。 然后包括像算法的一些超参,这个base size以及每次的这个更新过程中它迭代的次数,都可以在这儿进行配置。还有像学习率这些参数,比如说在CQL里面,因为刚才这个展示的是BCBC基本上它的超参就比较少,就关注这个best size和学习率。然后对CQL的话就会引入这个算法,它自己的一些超参,比如说用什么样的regulator,还有regulate调整的一些系数,还有在做这个命Q的时候,它前面的权重和使用的方式等等,有有多个这种选择的超参。大家可以在这个config algorithm面去找到具体的每一个超参的配置,可以在这儿来进行修改。 然后接下来就是有这个data文件夹。这个data文件夹是我们去获取这个离线数据集的接口,比如说我们要去下载用的比较多的这个DF2L数据集,在离线强化学习里面可能DF2L是目前用的最多的。当然还有我们我们公司自己去,根据我们在做现实业务的时候,有一些实际的观测发现,可能benchmark的数据集我们在做的时候也是有要求的。这个我们在在后面会讲到neo 2L的这个数据集,这边也是提供了neo 2L的数据密集的接口。这个数据集和算法的接口都是统一的,所以直接来下载就可以使用。然后接下来还会有一些评估的模块,比如说在DFIL上面,你跑完了DFIL的数据集,可以去调这个评估的这个模块。在IOIO上面我们也可以去调NOIL的这个评估模块,那对应的你也可以去跑一些离线评估的模块,在这儿暂时不展开。 那么我们来比如说来看一个特定的就看mobile这个算法。在算法的实现里面,总的也是分为了算法的初始化,会去读这个配置文件,指定它的一些网络的结构,输入输出的维度。同时在model里面会去多指定一个环境模型,这个集成的环境模型的一个训练。然后训练完了以后,就会开始后面的强化学习的训练。由于在mp里面它的强化学习算法默认是用AAC,所以这就写成实现的是这个SCC的形式。接下来就是都有的这个算法训练的框架,以及它具体的训练的这部分的一个调用。基本上所有的算法都是用同样的接口来实现的。比如说我们再看这个CQL,也有这个初始化的部分,会去初始化得到这些策略,然后同时在trainer里面也是有对应的train函数,这个比较长,应该在下面有对应的调用这个对群函数就可以去对策略进行训练。 当然这个库大家可以在刚才提到的两边,一个是edit,也可以在github github上面去对它进行一个下载。它的使用过程也比较简单,先close下来,因为这边我是从这个H上面拉的,所以这边的链接会是AH点ai。如果是github,这边就是github的链接,然后下载完了以后,进行到这个我们要因为要做离线的训练,所以通常要先有一个离线的数据集。那么我们通常也会用这个benchmark里面的数据集,比如说我们自己的这个NOIL,可以先去安装NOL的数据集,或者说想用DFIL的就需要额外去拉一下这个地方IL的它的仓库,然后对这个数据集进行一个下载安装。 安装完成以后,就是有了这个数据集以后,我们可以通过调用我们目前提供的这个examples文件夹下面有三个这个train task。Train task这里面是在我们自己的利用RIO的数据集上面去训练的,如果说train d方案L,那就是在D方案L的数据集上面训练。然后这边还有一个train tune,这个tune就是会进行一个超参搜索,也是在默认是在neo 21的这个数据集上面去训练的。这个超参搜索的范围也在刚才列的这个算法配置里面,比如说像这个CQL的话,就是在下面会列一个套餐搜索的范围,大家也可以对它去进行一个修改OK。 比如说我们来看这个train task里面,它的启动的过程其实很简单,就是会去调用根据你传入的这个套餐里面不同的算法,传了以后,他就会去指定对应的算法,然后去加载你指定的数据集,对算法做一些初始化,同时去调用这个评估模块。比如说我们想每隔一段时间去测一下当前的这个策略,它的实际环境中部署的性能,那我们就会调这个online back这个回调函数来得到它的结果。那么你根据默认设的这个频率,它就可以去进行一个训练和切分,然后再调用这个算法的train就可以了。 然后我们现在已经提供了一个比较方便的接口,就是让大家去直接调用这个算法。在启动的时候,比如说我们要用neo 2O的数据集的这个哈佛切塔,我们就可以指定train task。然后对应的算法,我们想调用这个CQL以及要的这个数据集的任务的名字,对应的这个数据用多少。接下来就可以用默认的这个config里面默认的超参进行训练。如果我们想去做一个搜参,就是在刚才给的那堆算法的超参范围下进行训练的话,我们就需要调用这个train tune这个文件。那么如果我们想去训练这个DFRL的话,那我们就要直接去调用DFIL的这个文件就好了,基本上的结构也是一致的。 OK这边也有一些超山的讲解,我们也内置了这个AM,但目前用的是M2.0的一个系统,暂时还不支持升级到最新的3.7亿上的版本。那么用in的时候,它会有一个网页的那个界面。对,主要是有有这样一个监控工具,这个监控工具会去做一些训练过程中的确定的一些指标的监控,这个外部嵌入的我们暂时就不过多的展开。也可以启动这个im以后,就可以在这个端口去查看这过程中的一些training的一个结果。 OK, 这个offline 2U库,我们当时是根据开源的一些算法,或者说根据这个算法它自己的流程,我们去进行了实现。然后在这个公开的数据集DFRL上面,因为这些实现的算法的默认都会在DFRL上面先去跑。那么我们去进行了一个结果比对,就是尝试验证一下复现的结果基本上是和这个公开的结果基本上做到的是差不多的性能,或者说能够复现这个结果。有的这个算法就是从开源的代码里面,然后再把它统一到我们的这个接口下面,因为可能不同的这个开源算法他自己有他们自己实验室的一些框架会比较臃肿,甚至有的可能还是TensorFlow写的。然后我们进行了一些转化,得到了一个统一的offline 2L库。对,回到这边,也欢迎大家去贡献一些新的算法来加到这个库里面。 OK接下来要讲的这个是离线策略选择。我们为什么要做离线策略的选择呢?我们先来回顾一下我们在做这个监督学习的任务的时候它的一个流程,我们在做监督学习,通常比如说我们做一个视觉的识别的任务。我们会对数据集进行一个划分,把它划分成训练数据集和验证数据集。有这两部分划分的数据集以后,我们通常是在这个训练的数据集上面去做模型的训练。我们用这个验证的数据去做比如说超参的调试和验证来做模型的早停,防止模型出现过拟合的这种情况。那么得到这个模型训练完以后,我们再拿到额外的一个在训练过程中和一可验证过程中完全没有见过的测试数据集上面去测得到我们模型的性能。比如说它的精度,它的分类的准确率等等。 从这样一个流程我们可以看到,其实和在做离线强化学习部署的时候,和监督学习也会比较类似。我们在做离线强化学习的时候,从这个历史课上这个数据,然后我们在做这个离线强化学习的时候通常我们会有一个事先收集好的数据集。这个数据集在很多我们现实的业务当中,它是由系统正在运行的一个policy。这个policy可能是基于规则的,也有可能是由人类的一些运营专家运营人员来制定的。通常这个策略是为了保障我们系统的收益或者性能,不会做特别多的探索。对应的得到的这个数据,我们把它叫做保守数据。这个数据它的特性就是没有太多探索性的行为在里面,然后也不会尝试很多危险的动作。导致的结果就是这个数据集它本身的覆盖范围可能很小。Anyway, 但我们对这个数据通常来说是没有办法进行过多的干预的。 那么在得到这批数据以后,我们如果来做离线强化学习,其实也是在这个数据集上面进行一个划分划分得到训练的数据来训练多个策略。然后我们需要离线的去选出最好的那一个策略,因为离线强化学习算法本身也有一些超参。刚才就如同给大家展示的,这个不同的算法里面它会有多种可能的超参的组合。 然后我们要选出最好的那个超参,这和在线的时候有一个不一样的,是我们在线的可以直接在环境里面去测试。因为我们训练和验证的环境是一致的,并且都能拿到这个结果,就是在线的环境可以直接来为我们提供一个评估的结果。所以在这个时候,我们要在不能在在做离线训练的时候,不能在我们最后部署的环境里面,直接把所有得到的这些策略一到N都挨个去试一遍。我们只能事先的去做一些离线的评估。比如说后面马上就会讲到的这个of policy,evaluation的这些,sorry,应该是offline policy evaluation的这些方法。去得到它评估的一个结果。然后从中选出最好的一个策略,拿到我们真实的环境当中去部署,最后再得到这个策略的性能。所以比较完整的严格的一个a fine的流程大概是这样一个形式。Of land训练,然后of land去做验证或评估,选出最好的策略,最后再得到它的一个在线的性能。 这个就和我们之前做监督学习的任务基本上是完美匹配的。那么在做这个离线策略选择的时候,它是一个很天然的需求。因为我们现实的系统,如果我们想去部署这个强化学习算法,即使是在这个容忍度很高的推荐系统里面,也不允许你有一堆策略去上线部署。肯定是你事先评估好其中的策略,你觉得比较靠谱的,可能推荐系统的话会允许你有两个或者三个策略,然后你到线上去做一个test。那么测试的时候,通常也会采用分组测试AB size的这种方法,A组通常是这个对照组,B组是这个实验组,就是我们上这个新的模型算法的这一组。去和之前的对比。然后经过一个时间窗口,比如说七天或者14天的一个时间窗口,有的甚至会更久一个月,测试完以后再来得到离线训练的这个模型,它的一个线上表现的真实性能。所以我们训练完以后,要对事先训练的多个超参组合下面的离线策略去进行一个评估。 我们直接能够用的一些方法,就是我们把这个of policy的一些方法做一些修改,把它用作of land policy variation的方法。从这个of policy的评估那边,主要有三大类。第一个叫直接法,典型的代表就是飞机的Q,这个做法就是在我们的数据集上面去学到这个对应的Q函数。因为我们学单步的这个Q函数的时候,这个SA和S一撇他是已经见过的。这个数据没有外推误差,它只走了一步。然后所有用到的这个数据集都可以由自己产生,那么FCE的q event简写就是这个FQE。 他的做法就是用这个贝尔曼更新的等式,不断的在数据集上面去训练得到这个q star作为当前某个策略的评估。如果说我们这边的派是我们当前的训练得到的策略,那这个评估的值就是我们当前的这个训练的策略它的一个评估的性能。如果这边用其他的策略就可以进行一个对应的替换,然后得到对应的这个Q值。这个Q值注意其实是带了一个派的参数在里面的。然后用这个Q值FQA的评估在初始状态上去估一个Q值,然后算它的均值,作为最后这个策略性能的一个估计。 我们对不同的策略,比如刚才训练得到的策略,一到策略N都去跑这个FQE的一个实例,那么就会得到N个Q函数,那么分别去评估,就得到了近似得到了这N个策略它的一个评估的结果。有了这个评估的结果以后,我们就可以去对这个策略进行一些筛选。我们可以选这个评估结果最高的策略拿到线上去部署。 如果我们这个FQE的训练没有出现发散的这种情况的话,那么第二个方法是基于这个important sampling relate的这种方法。因为important sample ling介绍也比较多了,我就不再过多的去展开。它的一个核心的想法就是说我们在做这个策略的估计的时候,我们要用行为策略和我们实际的这个策略的一个比值去作为权重来校正我们的比如说Q函数的一个评估。那么在a fend setting下面,这个behavior policy通常还需要额外去对这个数据集上面的这个策略做一个行为克隆来得到。 第三个可能在目前用的比较少的是mode waste的一种方法,就是我们学到了这个环境模型,就有点像摸破里的那种做法一样。我们先去学一个environment model,然后用这个environment model它的roll out出来的一些数据去对策略进行评估。大概的就是这个三类,当然也有一些特例,比如说像有些特定算法像CQL。那么在CQL的过程当中,就有这个应该是CQL的原作者的其中几位。他们在机器人上面去做的时候,就提出了一种新的专门针对CQL算法的一个评估的方案。他们会先去监测一下训练过程中的Q函数的损失啊不要发散,去评估一下下面的这个目标它的这个值。那么下面这个目标的值就是我们当前的这个CPL里面,当前训练的策略在数据集上面的一个平均性能的表现。同时它的后面还会加一项保守的估计项,就是当前的策略和行为策略的divergence。 某一个反读,比如KL或者其他的各种反读差的不要太多,然后去找最大的这样一个策略。那么结合这两个目标,他们去监督训练过程中的q loss越低越好,然后这个职能越高越好啊,就可以选出训练的最好的策略,这样也可以不用和真实的环境去进行交互,得到这个数据集。同样的我们也把一些fend policy evaluation一些方法集成到了我们叫D3PE deep data driver close event这个库里面,也是可以在阿吉特和pick ub去访问。在我们南极监测的这个公司下面,这些库都是开源的。接下来我也会到这个VS code里面为大家演示一下它的一个结构。 OK, 现在能看到的这个就是第三PE这个库。第三批这个库里面,它的设计会更简单一点,主要包括有一个实际去运行的evatt评估器这个类。现在我们包含了三大类,其实都有包含。第一个是double robust,这个是important sampling的一个加权的版本。然后还有刚才提到的这个FQE的评估,以及我们做了一个比较初初步的基于模型的评估的方法。这个是基于训练的模型,然后去root得到评估的结果,那么对应会去在这个metric文件夹下面会有一个算这个评估得到的分的一个函数,当然在做这个离线评估的时候,会额外关注两个指标,因为我们现在是从一堆策略里面去选比较好的那几个,所以会去看一个RC的系数。这个and creation就是排序相关性的一个系数,如果越高越接近于一就表示你和真实的这个排序是越匹配的。如果负一就表示你是完全相反的,如果接近零就表示你和随机选uniform选差不多,那么另外还会去算一个前K个的命中率的一个指标。 那么这个库的使用和安装基本上也是一致的。从对应的这个仓库拉下来以后去安装,安装完了调用这个evatt就行。那么这个库也可以直接用训练好的有有其他的这个offline 21的算法训练好的模型。只要它分成了这个对应的policy的形式,我们就可以去调这个对应的数据集来对它进行评估,得到最后评估的结果。 OK, 那么上面的两个库其实都是啊会和我们的这个new IL一起集成起来的。那么你有2O是我们提出的一个认为更加接近真实任务的near a world french mark。对于这个离线强化学习部署的一些需求可能会更有帮助的一个基准数据集。同时也包括了我们实现了一些离线强化信息的算法和刚才提到的这个离线评估的一些算法,因为我们自己在做强化学习的业务的时候,发现了很多时候我们真实能够接触到的数据,它天然就是很保守的。这个保守就体现在没有太多的探索行为,同时这个数据的覆盖也非常的窄。另外很多时候这个数据也很有限。所以在我们这个new IL的benchmark下面提供了保守和有限的数据集的一些性质。那么另521也可以在H和github去进行访问。同样的github也是的一个镜像。 好的,那个时间差不多,那我们继续。然后621是我们提出的一个接近我们认为更接近真实数据的一个情况的benchmark。在这个里面就是提供了保守数据和有限的数据集的一些限制。比如说我们之前在看到在即使是在参加比赛的时候,能够开放出来一些离线数据集,它也是很有限的有这些挑战,同时我们注意到在之前比较流行的这几个benchmark,尤其是DFRL上面,它的很多数据都是有探索的行为在里面的。我们直观的感觉,这种探索的数据可能会更有利于offline二元算法的训练。 作为benchmark来说,如果这个数据集过于这样有覆盖很广的话,那么对算法最终的评估可能会带来一定的影响。就是我们会过于乐观的去评估一个off IIO算法的性能。其实在前面几页的那个片子里面也看到了,就是当我们用一个off policy的算法去对着这个不同的buffer有3种设置。一个是训练过程中的那个完整的buffer。当时也可以大家还有印象的话,可以看到我可以回到前面那部分。对,在这个地方其实可以看到,如果说我们用的是训练过程中的整个的buffer,那么这个算法的训练,对于这个of policy的DDPG来说,它可以往上训练一点。 同时中间这个也是一样的,只是说中间这个数据集它的探索要稍微小一点,也加了探索也但这个蓝色的这个of policy的智能体,它是同步去训练的,和上面的这个behavior policy是同时在学。但是当我们换到第三个这种city,就是我们用一个训练好的策略去产生数据。然后这个收集到的数据用来给这个of那RO的算法去训练的时候,或者说follow的算法这边是palley算法去训练的时候他可能完全就不行了。那么对比这三个数据集就可以发现,最后的这个数据集,它的这个数据的覆盖范围会更窄一些。所以这天然的对欧弗兰阿油就是一个挑战。那么我们也是观测到这样的挑战,在这个实际的数据集当中,它天然就存在,所以我们就构造了neo RO这个数据集去看一下,现在的这些offline l的算法,它在有啊真实的接近真实数据的一些数据集的限制下面,会有怎样的一些额外的挑战。 接下来我也是会为大家介绍一下我们的这个benchmark它里面包含的内容。这个benchmark也可以在edit或者说这个github的链接下面访问到,也是公开的。也是只需要去先拉他的镜像,然后进行一个安装,就可以使用我们neo RO里面的一些数据集。当然如果要使用module的话,你还要额外去安装这个module le,因为我们当时做这个benchmark的时候,module还没有被deep man给长期购买。现在应该直接安装以后再下一个。好像新一点的这个某接口都不需要这个license,所以可以直接使用。那么在使用你有IL的数据集的时候,基本上和基本的用法或者说DFIL的用法是很接近的。 先import它这个包,然后在我们把对应的这个环境给生成,然后就可以去拿到这个数据集。通过这个get data,data set这个接口去拿到对应的数据集的类型,以及享有的享用的训练的数量。那么就可以去得到这个数据集以后,就会得去进行训练。我们默认是会根据你输入的这个数这个数量,训练集的数量去适配一个验证的数据集,来做策略的验证用的。在new IU里面,我们包含了五个环境。Sorry,这个得到github这边,这个wiki里面我们包含了5种,应该是六个环境。 对,这几个环境就是有各种不同行业的,其中有有三个是某交口的,用的比较多的,在benching mark里面的环境。然后看这边,这边的这个百科里面应该也有。对,OK这边有三个module的任务,这几个任务在benchmark里面用的非常多。然后另外还有我们额外提供,应该是额外有四个,一共有七个任务。 这个IB是一个工业的控制环境,它的观测的维度比较高,但是它的动作空间会不那么高,只有三维。然后这个环境的一个特性就是它内部的转移很随机。所以这个环境对即使是对在线的强化学习来说也是有一定挑战的,他可能需要很多的样本才能观测到一些准确的信息。 然后第二个是我们用应该是用finance AI他们提供的一个环境,金融的环境来造的数据集。我们把它叫finance,就是fin NIO。然后在这个环境上面,它的这个观测的维度是181维,动作的维度是三十维。同样的它的轨迹的步长会很长,有两千多位,这个大概对应了8到10年的工作日的一个时间。所以这个场景下面就是在模拟我们在这个股票市场上,每天去进行股票的交易,要买多少卖多少的这样一个环境。同时在这个环境上面比较有意思的一点,是在测试的时候,我们是用做一个比如说我们在有十年的数据,我们用前面八年的数据来训练,然后是用后面两年的这个数据来测试的。在量化里面这个好像叫回测。所以更能够体现我们策略的一个对环境不同的或者说不同时间窗口的股票市场的一个适应性。 然后还有一个城市能源管理,能源管理的这样一个环境CL它的观测维度是74维,他的这个动作的维度是14位。最后一个,这个是一个我们根据真实的项目去做的,然后把数据脱敏以后做的一个营销场景下面的案例。这个营销场景下面,它观测是思维。包括了历史上的这些用户他的一些购买的行为,以及购买的购买发生这些购买行为时它的一些特征。这个对应的动作是两维,就是决定给用户发什么样的折扣,以及发几张折扣的优惠券。 这个是营销CS portion的一个案例,在下面也会有这些数据集和案例的一个介绍,我们怎么去用这个货?我在生成的时候,用new IO make这个函数,然后去给它传。应该看下面这个案例,去首先去make这个不同的环境。然后有了环境以后,我们如果要做训练的话,就可以通过这个环境的get dinner set这个接口去调我们所需要的这个任务。下面你需不需要要有验证集?如果有验证集的话,就会对应的返回这个验证集,默认的是会返回验证集的。然后还可以去看需要用这个数据集上面的word,还是要单独用一个方形,这些都可以去进行一个修改。当然对于对于我们如果要去跑一个基准的这个数据集来说的话,这个的方式就应该用默认的,所以不会去提供修改。 然后new IL除了有这个接口来下载数据集以外,同时还把刚才提到的这两个库,首先是欧弗拉L训练的这个库,这个offer l里面包括了一些model free和model base的算法这个库在里面。然后同时还有这个评估的库也在里面,所以用62U上面大家可以比较方便的。如果说新加的算法是符合这个接口格式的话,可以比较方便的去做一个策略的训练。包括我们先去make这个环境,然后去取得对应的数据集,然后去做这个算法的训练。并根据训练得到的这些结果,我们直接可以调用这个D3PE里面的这个评估的模块和接口,来对我们训练得到的策略做一个离线的策略选择和评估。当然在OF21算法训练的时候,我们也可以事先得到每一个策略它在线的性能。我们去看离线评估的这个结果,或者说选出来的这个结果和我们在线评估的是否一致,可以去做一个比对。对,这边就是你有I库这个总的。那么在我们对应的跑这个benchmark的这个目录下面,会有一个更详细的介绍,就包括了怎么去使用。 如果是从这个H的上面拉了的话,它是把这个奥弗拉L和D3PE作为这个子模块拉的。所以要单独的去运行一下这个git update这个目录。然后运行完了以后,要分别在offline IL的这个库下面去对它进行一个安装,也要对这个第3PE进行一个安装,才可以使用这个模块。 然后为了跑这个official IL的算法,我们需要去下载对应的数据集。默认这个下载数据集会下载new IL上面的数据集。那么数据集下载完成以后,我们就可以启动不同的算法,在这个benchmark的这个分支下面,在UIL的这个benchmark分支下面,可以去运行启动某一个特定的算法,然后可以去指定这个对应的算法的名字。那么就会用这个算法它默认的配置的超参来运行。那结果会存在这个AM的隐藏目录下面,然后我们去启动M的话,也可以在一个网页里面去查看训练过程中的那些监控指标是怎么变化的。比如说我们想在刚才提到的营销的环境上来做训练的话,我们只需要去启动这个前面python,然后再加上这个launch agrees,后面指定我们的任务域是啊sales portion,proportion这样一个环境以及算法,我们用BC就可以了,就可以去进行训练。 需要注意的是,如果我们用的是model base的方法的话,因为我们在跑这个benchmark的时候,所有的model base的方法都用的是同样一套环境模型学习的方法。因为现在包含的这些这几个model base的方法,不管是。不管是maple mario maple Green camo等等,他们都是用在这个数据集上面去做最大似然估计,或者说做这个最小的最小化模型的转移的loss来更新模型的。所以他们的模型学习方法其实都是一样的。 所以为了加速这个model with的方法的训练,我们会事先去调用一个portrait dynamics这样一个模块,去得到对应的集成的模型。然后有了这个以后,当然对这边brief算法还有额外去做一个操作。那么有了上面的这些模块以后,就可以训练得到对应的奥弗兰2U的算法那么我们默认的会把这个算法的结果存在,或者说是这个训练得到的策略模型存在某一个路径下面。那么我们再去单独启动这个offline的时候,就可以得到评估的结果。启动这个OPE就可以得到这个评估的结果。去查看通过离线的这个方法评估得到的这个值是多少。这个就是我们如果去跑一个完整的在neo RIO上面去跑一个完整的offline确定的一个流程,就可以分为三步。当然大家也可以自己去添加一些新的算法到欧芙兰IU的库里面。 也可以比较方便的去看它的一个在线的性能和通过离线策略选择得到的最终策略的性能。好OK。到目前为止,我们已经介绍了一些我们在做离线强化学习的时候他的一些挑战,以及几类自己的算法。我们可以注意到在这个算法里面这个model base的方法,我们刚才看模糊的时候也可以发现,其实和我们最开始提到离线强化学习的挑战里面没有环境,对吧?这个mp里面学的环境,它的能够去做robot的轨迹是比较短的,通常就十步,这样的一个环境是由于它的学习方法导致环境的复合误差比较大,所以你不能用它去做很长的一个root。但实际上我们最理想的情况是学一个所谓的full model,就是一个完整的环境模型。我们有这个完整的环境模型以后,可以在这个环境模型里面去rot更长的轨迹,然后就直接把它当成一个完整的强化学习的训练环境,在里面去得到策略。 那么我们先来回顾一下现在的这个model list of fine RU算法里面,通常对model的学习就是会去集成好多个环境模型,比如五个或者十个,每一个都是通过最小化这个误差来去做roll out。在这种情况下会有一个天然的问题,就是如果我们用这个模型去执行的话,这边借用的这个compound的图,可能是在讲模仿策略的时候的一个可能一个复合误差。但实际上在模仿环境的时候,也是同样适用的。因为对于强化学习来说,这个策略它是一个可以理解成是一个条件概率,是基于当前的状态state得到的一个动作的概率分布,或者说得到的这个动作。那么对于我们去学环境模型的时候,只是他现在的条件变成了这个SA要基于当前的状态和动作,然后得到下一个时刻的这个状态的一个分布。 如果我们都是用类似BC的这种方法去直接做模仿的话,那这个复合误差的问题依旧存在。对于环境来说,它的复合误差就体现在,比如说我们这个看你先看右边这个图,红线是实际期望走出来的轨迹,然后这个黑线是我们实际训练过程中的走的轨迹。所以可以看到这两条轨迹在一开始这个time指的是一条轨迹上的那个轨迹的长度without the horizon。所以在比较短的时候,他们是会靠得比较近的当这个rot和horizon越来越长的时候,这个误差就会被放大的越来越多。 这是为什么呢?其实从很早之前有一个引领就表明了在随着时间累积,如果我们这个模型你每一步的error是ipsa那么在走了梯步以后,它的这个error大概是时间步乘上EPL这样的一个数量级。所以我们如果去看,注意这个刚才提到是单步的这个error,就是比如说当前是大梯步,那大梯步下它的error是T乘上epson这个数量级。所以如果我们去看整条轨迹上累积的数量,这个error的数量级的话其实要去做一个把每一步的误差的值给加起来,这个就是一个等差数列。再求和基本上就是和单部的epc o的数量级的平方,这个是在model去roll out的时候,就会存在这样一个,所以轨迹平方级放大的误差,就会使得我们rot越长的轨迹的时候,这个误差放大的越大。 为什么会出现这个现象呢?很多时候是因为我们在做这个环境模型学习的时候,看的是单部的误差,没有考虑到轨迹上的影响。所以我们在想如果我们直接去做轨迹的匹配,那是不是就可以缓解这个问题了? 通过我们实践的一些经验,包括后面做的一些理论上的分析,发现如果我们去匹配的这个轨迹的相似度的话,那复合误差在一定程度上是会减少的。那么直观的来理解,就是把这个gill,因为gill这个生成对抗模仿学习,它本身是在做策略的,策略级别的这个轨迹匹配,他去和专家的这个轨迹进行一个匹配。我们同样的可以把这个环境模型的输入和输出也对应到这个策略上面。我们把gill应用到环境模型的学习里面,是不是也有机会去减少这个复合误差?同时减少了这个复合误差以后,我们的这个环境模型在做更长的推理的时候,它的评估的趋势就会和真实的更加一致。这个对我们的决策和以及后面的模型评估都是更有帮助的。 总的来说,基于这样的一个做轨迹匹配的思想,我们也是经过了一段时间的摸索。包括实践上的,还有后面的一些理论的分析。得到了我们公司自己目前正在用的一套基于环境模型学习的一线强化学习算法,这个叫revive reinforcement learning with spiritualist environment。这个的一个总体的框架,其实和一般的model base offline 2U算法是很一致的。我们从离线的离线收集到的这些真实数据当中,通过中间的这个算法模块,我们把它叫revive,去得到一个虚拟的环境模型。然后这个虚拟的环境模型当中,去在这个虚拟环境上训练得到一个策略,再放到真实的环境中去部署。如果要不断的去优化这个虚拟环境和策略,那还可以把真实环境收集到的数据放进来重新去构建,然后不断的loop这样一个过程。 唯一的区别就是我们学到的这个环境模型,它是一个full environment model。也就是说我们会用学到的这个环境模型去做很长的轨迹的root,然后认为它就是从真实环境里面采样得到的这个数据。那么在这个revive的工具,我们目前开源了一个开发工具包SDK,大家可以在这个。可以在revive点CN在我们掀起的这个官网,这个rap的中文名叫掀起。然后在这个官网上可以去点击SDK,然后可以下载。下载以后还需要去对这个SDK进行一个用户注册注册,替换自己的一个密钥就可以了。目前都是啊可以免费来进行试用的。 那么对应的在这个SDK的这个帮助中心点过去,会有一个简单的说明文档,在这个说明文档里面会去讲怎么去安装使用。我们推荐这个平台是在linux上面。Windows上面应该也可以运行。然后mac的话,可能高版本的还运行不了,就是你mac的如果系统版本太高,可能还有点问题。 如果是直接去拉最新的这个SDK的代码,也可以从阿奇特上面去下载,下载完了进行安装,当然也可以通过这个docker的形式直接去进行安装。安装完以后,大家需要在官网上去注册一个账户,就是在这个FCN去注册账户。注册完了以后配置自己的账户信息,然后会得到一个密钥。需要在这个主目录的有一个样本文件里面去把这个key给替换成官网的用户中心里面得到的那个T把它进行替换,然后就可以使用这个工具。接下来我会用这个rave的工具包为大家演示怎么去做一个对冰箱的里面它的一个温度控制系统去进行一个调整,一个很简单的一个使用案例。这个使用案例的场景,模拟的是我们冰箱内部的一个控制器,目前这个冰箱的控制器可能用的比较多的就是基于这个PID,一种反馈控制的自动化控制工具。 在这个系统里面或者说在这个任务里面,我们要做的就是在冰箱有开关门的影响下的这样一个场景下,然后去尽快的保持冰箱内部的温度。关门的时候它内部的温度比较稳定。那么对冰箱来说,在开门的时候可能会由于外部的有散热的影响,它的温度会升高。然后关上以后,要能够比较快的去调节这个冰箱内部的系统。通过去调它的这个温度控制系统,来使得最后的温度能够维持在我们预期的这个范围。比如就把这个上面冷藏室的话可能是五度,同时要让这个调整的过程中消耗的控制它消耗的功率不要太高,来达到一个能效的平衡。 然后在这个案例下面,我们将会演示只有一条历史的数据。这一条历史数据大概是一个半个小时,可能有接近对强化学习的这个时间步来说的话,有接近2000步的一个时间步,半个小时的一个控制数据。这个控制数据里面就包括了每一次观测到外部温度以后,这个实际的控制器是一个基于PID的控制系统。它是怎么去调整输出的功率,来使得这个冰箱内部保持目标温度的。基于这样一条数据,我们来进行一个离线强化学习的应用。当然最后也会基于这个案例去做一个留了一个作业,一会儿再具体讲这个作业。 我们我们先来在这个系统里面演示一下怎么使用revive这个工具去做冰箱案例的一个离线强化学习算法。好啊,因为我已经事先把这个revive工具把我给下载下来,并且已经安装了。所以大家自己在用的时候,其实还需要先按照这个教程里面写的,就是这几步,下载完以后安装,然后要配置一个密钥。这个配置密钥的时候,需要到官网的这个用户中心。就是注册以后,你登录进去就会有对应的那个提示,能够看到找到这个访问的密钥,然后把把它贴到这个路径下面,在自己的主目录,然后是那个用户名,隐藏的这个点revive,然后点config点ym o这个文件下面就可以去得到这个密钥的文件。然后配置以后,就可以使用rev SDK。 那么在我们冰箱的这个案例,内置在哪?Revive点examples,这个task下面有一个refrigeration这样一个文件夹。在这个冰箱的案例下面,我们目前提供了对应的这个数据集,是以能派的压缩格式NPC来提供的。然后这边也有一个简单的训练的脚本,同时我们提供了一个notebook的使用工具,来让大家能够比较快的去了解怎么使用。 首先我们要来导入一下对应的一些数据分析和显示的包,以及包括这个测试的包,我们导入这个编法文件夹下面冰箱的这个数据集,就这个NPC的文件OK我们来导入。导入以后,这边可以看到它的一个数据的格式,就包括了冰箱当前是否有开门,这条这一条轨迹是一个两千步的,只有一条。然后以及当前的这个冰箱温度是多少,还有执行的这个输出的X其实是对应的这个功率的值是多少,以及执行这个action以后,下一个时刻对应的这个温度是多少,就是这样的一条轨迹序列。 这个数据集有了以后,我们可以对这个数据集进行一些可视化。来看一下这个NPC里面的文件画出来的这个图。这边就是历史收集的这个数据集的图。然后第一张是啊开门频率的一个表示,可以看到在每一步应该是一秒的间隔,所以看到可能隔个几分钟就有人来频繁的打开这个冰箱门取东西。然后这个是一个开门是一个零一的动作。 接下来是随着这个开门冰箱的一个温度的变化。可以看到一开始的这个温箱这个温度变化是从比较高的一个温度,然后降到一个温度。然后在开门的时候,由于散热的影响,它的温度会上去会往上升。我们的这个经过内部的PID控制器,它又能够把这个温度给降下来。如果每次开门温度都会上去,然后再很快的把它给降下来这样的一个过程。那么对应的这是数据集上面的动作。 可以看到,一开始为了要达到目标的温度,它会输出一个比较大的功率。然后在接近那个附近的温度的时候,它就会保持一个比较低的功率去维持这个温度。那一旦开门由于温度升高,它又需要去加大功率把这个温度给降下来。那么对应的下一个时刻的温度,其实和这个温度就错了一位,所以是一致的。 然后在这个地方我们可以用训练得到的这个数据,来对这个训练得到策略对它进行一个评估。然后训练的话就需要我们单独去启动冰箱的这个脚本。我们先切换到冰箱的这个任务下面。好,然后在冰箱的这个任务下面,我们可以用这边的命令来进行一个训练。那么我们把这个BC来学习环境模型,注意这个地方的BC指的是类似mobile的那种方式来学习环境模型。然后学完环境模型以后,我们把它当一个完整的虚拟环境来使用,在里面去跑一个强化学习的算法,比如说是PPO,来得到最后的策略,那么在这边这个案例下面的read me文档里面,我们提供了一个快捷的命令。有这个快捷的命令,大家可以直接来把它复制下来,就可以得到最后的结果。 从这个命令上面来看,就是会去调用这个训练函数,这里面有有一些和这个算法相关的配置的超参参,以及要去哪儿读这个路径的文件夹。然后接下来就是这个正常的训练,以及打一些训练过程中的日志。我们用的这个数据集,就是刚才看到的这个冰箱的数据集,这个南派的这个格式,然后还会用一个决策流图压缩文件。 这个压迫文件它描述的是我们这个冰箱的案例当中,我们的环境和策略是怎样的一个关联关系。同时为了做这个策略更新,我们还单独提供了一个对应的奖励函数。就是怎么从生成的这个环境模型当中去计算这个奖励函数。因为在实际的很多任务当中,我们并不会直接去指定这个任务的奖励函数,而是根据有不同的需求,比如说在这个发券的场景下面,我第一次是要去做这个总的收益的提升,我可能会写一个奖励函数。如果我下一次是去做用户的留存,可能我会根据这个状态去计算另一个奖励函数。 然后后面有两个训练的参数,两个都是once的话,指的就是我们用默认的这个套餐配置跑一次,然后这边会去调用这个VENV这个算法,这个是去指定我们训练虚拟环境的时候用的算法。然后这个run ID就是指的这一次实验我们给他的一个所有的log记录的文件夹命名。那么用BC来训练这个虚拟环境的时候,我们这个命名就建立为BC然后后面的这个强化学习跑的次数就是500次。那么这条命令运行以后,就可以开始先进行一个环境模型的学习。 OK随着这个环训练开始,他会先去训练环境。我们现在启动的这个环境训练的算法是BC然后他就会去训练这个环境。因为在训练环境的时候,我们策略模型还没有他这个任务状态可以看到还在等待。然后这个环境模型训练的时候,会用数据集的去评估模型的精度。我们可以大概看几个训练的loss的变化情况,因为这个训练的时间会比较久,我在这儿把这个完整的训练过程给放出来。然后我会用之前已经预训练完成的一个记录来做一个对比OK。 然后这边就先我先把这个终止掉,回到刚才说的,我们在这个参数指定的时候,会指定一个除了指定当前的训练用的数据集,还会指定当前的一个决策流图。这个决策流图其实是一个关系文件,他描述了我们的里面有哪些要素,然后这些要素它的一个对应的流向。这个决策流图在我们官网上面会有更多详细的介绍来对,在这个帮助中心会有一些详细的介绍,来告诉大家怎么去生成这个。生成这个emo文件,就是如何去写这个yammer文件,怎么配置的。它对应的一个决策流图就是上面这种形式,去从上一个温度到下一个这个温度,经过我们action的影响,当然这边还有一个冰箱门的开会,作为策略的观测一起输入进去。 在我们的工具里面,其实如果大家使用VS code的话,可以在这个市场里面去找这个插件有一个。Revive SDK, 安装这个SDK的这个插件,可以直接去绘制一个决策流图,就不用去写这个emo文件。具体的我这边因为已经安装了,所以在这儿我可以可以点右键,它会出现生成这个角色流组合,生成超参的这两个按钮。我们点完这个生成决策流图,它就会出来一个UI工具栏。在这个UI工具栏里面,大家可以通过这个拖动去绘制这个决策流图。然后可以去对它进行一些连线,然后把它的一些数据的流向给表示出来。同时也可以是对这个属性进行一些配置和修改。 对,然后这个角色流图的具体的绘制方法,也可以在SDK的,应该是首页的这个帮助中心里面,讲这个SDK的插件具体怎么使用的,就可以去看对应的这个决策流图以及对应的超参。那么在绘制完这个决策流图以后,我们可以这边有一个对它可以保存成这个压默的格式,就可以来跑我们revive的这个算法因为我们自己写代码的话会比较习惯直接来写这个样本文件,就不去点那个绘制决策流图的工具。OK然后还需要去指定的就是这个奖励函数。比如说在冰箱这个案例里面,我们最终的奖励函数就是由两部分组成的。第一个是关于是否到目标温度的一个控制的奖励,就是当前温度和这个目标温度的一个差值,绝对值的差作为它的奖励。还有一个是控制过程中用的这个功率,是一个乘法。所以如果你那个控制过程中用的功率越高你收到的奖励也会越低。那么通过这两个目标来定义的这个奖励,就是使得我们最后的策略它的能够达到目标温度,同时功率消耗也不要太多。 然后对刚才的训练,因为如果去跑完整的流程会比较久,我在这儿就用一个已经训练好的记录,那么默认会放在logs这个目录下面。然后我去打开这个BC portion这个文件,就可以看到在BC pretrail里面,它的训练过程分为两个。一个是这个环境,我们把它叫虚拟环境viral environment,简写VENV的训练。在这个训练的过程中,它会绘制很多的训练过程生成的图。比如说我们可以去看啊这个action的拟合程度,比如可以去看这个温度的温度变化的拟合程度,可以看到这个红线是我们训练的,这边写的是policy route,其实是那个环境模型rot出来的下一个时刻的温度变化和这个红线真实的温度变化的一个对比情况,以及对应的action。 Action是在学的过程中,我们会同时去学一个联合的策略,然后它的一个变化情况。这些,是在看训练过程中的一些指标,当然对应的也可以打开text board去看这个训练过程中的那些MSE的监督指标的变化情况。那么在环境模型学习完以后,我们会进行这个策略的训练,在进行策略训练的时候,会也会同样的去生成这个策略root,在寻找最优策略他rolt的一些数据和这个专家数据的进行一个对比。然后最关键的是啊当策略训练完成的时候,会绘制一个双环境验证的图。 大家可以回想一下刚才我们在讲离线策略评估和选择的时候,有三种方式。第一种是这个直接法,就是我们在离线数据上给当前训练的一个策略,去做FQE的评估,得到对应的结果。第二种是基于这个importance sampling去重新加权的那第三种是基于这个model base的方法,就是学一个环境模型然后去重新评估的。但是注意我们在revive这里面,它本身是一种基于环境模型的方法。无论这个环境适用BC这种方式去模仿,还是用revive这个算法去学的,它都是会有一个环境模型。所以天然的就能够来做这个环境的验证。 我们在这儿,其实在训练这个算法的过程中,我们是对数据集,就是在刚才这个运行算法的命令的时候,我们会对数据集去做一个切分,分成两部分。然后这两部分会分别的去跑同样的一套超参来学这个环境。然后在学策略的时候,我们这个数据集分成了训练数据和验证数据。那么在这两个数据集上学到的环境,就可以对应到一个训练环境和一个验证环境。我们可以分别在这两个环节上去进行一个交叉验证。因为我们现在已经有两个环境了,然后我们在两个环境上去学这个对应的最优策略的时候,我们可以把学到的最优策略放到另一个环境去进行一个对比,看这两个策略的趋势是否一致。这个就是我们的这个双环境验证机制,或者是一个交叉验证的方式,所以如果当验证出来的结果比较一致的时候,我们就觉得环境的训练是比较OK的。 这个环境可以用,当然还有一个大前提是啊学的两个环境两个策略在不同的环境下去去验证的时候,它的趋势一致,同时它要上升,还要超过这个数据集上面的一个性能。那么在这儿这个蓝线就是数据集上面的性能,可以看到用BC去学这个环境模型的时候,训练到后面,所以我们训练的进行基本上是符合这个趋势的,就是策略可以超过行为策略。然后到后面趋势大体上是一致的。 两个环境交叉验证就是把这个验证环境上面训练得到的验证策略放到训练环境上去跑,和直接在训练环境上得到的这个策略趋势比较一致,然后下面交叉的也比较一致。当然这个是在训练的比较后期才发生的情况。然后这个是BC得到的结果,我们可以对这个BC得到的结果进行一个测试。因为我这边预训练的其实已经把这个结果给跑完。然后我们在这儿替换一下,测试这个BC预训练的这个preaching目录下面的这个策略的性能。好,稍等,我又断开了OK。那么在这边测试的时候,就是得到的我们训练好的策略,拿到真实的环境去部署,会得到一个性能。重新启动一下,现在还在连接。 是不是要重新播一下? 好,这边这个测试的结果已经对,刚才跑重新去验证这个结果。可以看到,我们如果用BC去学这个环境得到的这个策略,先学了一个虚拟环境,然后在这个虚拟环境上面用强化学习的算法去优化得到一个策略,它的结果是-0.3918,大概这样一个值会比我们行为策略,就是这个数据集上的会高很多。因为数据集上面的是-0.518这个值,所以可以看到我们通过离线强化学习,在只有一条数据的这个情况下,有时候也是能够带来提升的。那么我们也可以看一下这个BC学到的环境和历史这个控制策略它的一个偏差,可以看到在开门的这个上面基本上是重合在一起了。然后在温度的这个动作上面,历史的这个和真实的大部分的趋势也是很一致的,然后执行的动作的趋势也比较一致。 之前在讲的时候提到了,其实BC在做比较长的轨迹的rot的时候,它由于学的过程中考虑的是单部的影响,所以它会存在一个复合误差的问题。那么我们在做环境学习的时候,如果我们直接考虑轨迹匹配,那就是revive的做法,那会不会得到更好的结果呢?接下来我们也可以对这个用revive的学习环境,就是在做环境学习的时候,我们不仅看的是单步的结果,更多的还要看一条轨迹和历史的专家轨迹比对的一个结果。同样的在这个冰箱的read me的案例下面,我们也提供了一个快速运行的脚本。 在和BC来对比,我们只需要把这个环境学习的算法进行一个修改,因为默认的这个环境学习的算法就是revive,所以我们就不用特意去指定这个环境学习的算法。然后其他的包括使用的这个角色流图,就是描述这些模型之间它的结构是怎么样的。那个文件也是一致的,包括用的这个数据集和对应的对策略的优化目标的奖励函数也是一致。然后在训练这个V的时候,我们指定这个环境训练的次数是迭代1000次,运行以后也可以得到这个rap对应的一个训练,得到环境模型的结果。当然这个需要训练,由于他在做轨迹的匹配会比这个BC的训练会稍微慢一点,我这也是启动,看一下这个初步的结果。 OK, 然后RAV也开始进行正常的训练。在这个训练过程中需要注意的是,由于BC是在做这个单步的匹配,所以很多时候它的这个单步的模型精度会比我们用rift要低一点。但是在一条轨迹的分布上的准确度,一般来说BC会做的会差一点。然后这边这个数据的值是十秒刷新一次,然后这边暂时没有刷新。他跑revive的时候和BC的这个过程也是一样的,要等环境训练完成以后在开始训练策略。所以现在策略的这个指标,它的性能现在也是没有的那我就不再具体的等他训练完,那我们我也用一个训练好的策略来直接对他进行一个查看。然后在这个revive,retrain. 这是刚才跑的这个样例生成的文件夹。我其实之前已经跑好了一个present的文件夹。我们同样可以去看一下它在这个环境学习的过程中生成的这些action的一个情况,可以看到如果大家还有印象的话,直接把这个BC的拿出来对比。刚才这个BC的action的贴合会比和这个真实的对比会有一点点过高或者偏差。然后如果我们用revive去考虑这个轨迹的匹配的时候,它能够贴的和真实的数据贴的更好,基本上是已经完全重合了。那么包括对应的这个开门和这个温度温度的变化,温度的变化和BC的应该,不好意思,这是BC的温度的变化,然后我们来看一下。嘿,点错了。 Revive这边训练的这个温度拟合的情况,还有这个BC预训练的温度拟合的情况这边是revive训练的虚拟环境,它去rot的这个温度和历史的这个温度对比,可以看到它会贴合的更紧一些。然后BC同样也会存在这个有些点会做得更高,虽然它大致的趋势是一致的。所以从这个结果大概也可以反馈在做环境模型学习的时候,如果我们去做轨迹的匹配,它能够取得一些更好的效果。 那么我们你想训练的时候就一个环境验证,就是我们环境交叉验证,去看对应的最优策略的一个结果,可以从这个结果上面,其实可以更直观的看到,用revive训练的这个虚拟环境,在这上面训练的时候,它的reward的提升会更加的一致。基本上是随着你的训练不断进行,他的奖励越来越高。交叉验证的这个曲线也会比DC的这个双环境验证的曲线会切的更紧一些,有类似的趋势,对吧? 这个是BC的,包括到后面也有一些震荡,然后和B3的对比也超过了一点。然后这个是revive得到的这个和BC的。对你从这个交叉验证结果,从这个也可以暗示我们,用revive学到的这个虚拟环境可能他稳定并且。会更有利于我们去做策略提升。然后从这个图上可以看到BC和这个叫啥基线,就是数据集上的behavior的对比,它的提升不是特别明显,当然从这个数量级来看也就是。这个值然后review出现那种大幅的震荡,所以它这个曲线更容易反馈这个值的变化和期限,也能够看稳定的聚集上面的值。那么我们也可以。 测试一下revive的结果,然后这边是用刚才预训练好的策略,刚才看到的就这一行应该是BC的-0.3918。然后这边用revive训练出来的这个会比刚才的-0.3918高一点点。同样的数据集,然后同样的行为策略,然后我们来看一下对应的。这个rot的这个data可以看到action和主要是action的贴合会更准确。也就是说在对应这个环境变化的时候,用revive的你学到的这个策略去做决策的时候,会更好的响应这个策略变化。我们觉得这个就是因为在做环境训练的时候,做长轨迹的row out,用revive训练的环境能够更好的反馈这个环境的一个变化情况。大家需要注意的是,在这个例子当中,所使用的这个数据集只有一条。对,OK刚才已经对那个演示完成了。 在这个例子当中所使用的数据集只有一条,并且这个数据集是由一个控制器的策略产生得到的。那么就基于PID就这种反馈控制的,他不会在这个冰箱的控制过程中去采集很多探索性的数据你。一些benchmark的书,它会提供。我们这种的用规划器去收集得到的,或者有一些人类的数据,但更多的这个数据集的属性,训练过程中的这个replay buffer,uniform random的策略放进去的数据。在这种情况下,去做offline policy的训练的时候,可能会对off policy的训练更有帮助一点。但我们实际面临的数据集,往往就是这种比较保守的,然后它的数据覆盖范围也比较少。在这种情况下我们如果直接去做这个model free的提升,很有可能就会数据的附近不会超过这个结果太多,不会超过这个行为数据的结果太多。另一个,如果我们想从这种比较覆盖范围很少的数据上面去做model based的学习的话,它存在的另一个问题就是这个模组的外推误差可能也没有办法解决。所以我们自己在做的时候,也是想办法去更小的减少外推误差,主要是模型的外推误差。 因为学了这个model以后,我们可以更天然的做一些其他的事情。比如说我们现在换了一个策略优化的目标,但是我们所处的这个环境还是同一个。那我们环境是可以不用重新学的,只需要把对应的奖励函数的计算方式进行一下修改,重新去训练这个策略就行了。因为当我们假设我们拿到一个比较对决策来说比较准的环境模型以后,这个准主要是指这个决策以后看到的结果的趋势倾向,这些是一致的。那么在这种情况下得到的环境模型,对于我们后面的决决策就是有帮助的。所以我们后面去做这个策略训练的时候,如果只是修改这个对应的优化的目标,然后重新去跑一个强化学习算法的,我们觉得后面那一步是比较行,关键就在前面怎么去得到这个还OK。然后在这边我们的这个说明文档上面,在这个revive的说明文档上面,也会有一些比较详细一开始的这个安装,然后怎么去准备你自己的以及你的数据集,怎么去书写这个决策流图对应的这个压没文它的格式进行一个训练,以及它需要满足什么要求。 通常来说对于强化学习的角色,有向无环图从当前的状态,然后你做了这个动作,这个动作可以是一个很复杂的好多组合的动作,甚至你的这个状态上面也可能会有一些外部因素的影响。然后你得到下一个时刻的这个状态。那么你再根据当前的状态,下一个时刻的状态以及对应的执行的动作,去计算一些奖励的指标来优化自己的这个呃在这个帮助中心会有一些更多的使用的。比如说去定一些预制的函数级到我们的这个模型里面。那么这个节点可以是。 这个项,那么你就可以去优化不同目标下,在同一个环境模型里面这个优化目标下,我要去做怎样的效率提升。OK也会有关于。在这个example的目录下面,就是以这个冰箱的案例去做了一个简单的讲解。然后包括他训练过程中的一些可以看到的is SHE is好的,下一批的。 OK, 通过这个冰箱的案例,大家可能对这个离线强化学习它在使用的时候的一些基础的用法,以及使用的一些条件也有了一个了解。那么这节课还留了一个课后作业。这个课后作业就是大家去下载real SDK,使用这个SDK来训练自己的一个离线强化学习的策略。然后最后提交到极地平台上面去进行一个评估。评估策略它要超过初始的随机策略,然后具体的这个例子可以在吉利的这个链接里面找到。OK,我今天讲的这个主要内容基本就是这些。 周同学,对,好的老师,非常感谢秦永军老师的进展课程。下面我们进入提问环节。对,好的,老师,您这边能结束下共享吗?好的,稍等找一下。好好。 第一个问题是想问一下老师,这个all fly 2L需要完全依赖于静态数据集,再没有办法与环境进行交互与探索。如果轨迹全部都是专家数据的话,那RL算法会学到更好的策略吗?然后它的数据集的复杂度对模型收敛又有什么影响呢? 对这个是一个很好的问题。因为我们在做这个其实有两个基础的假设。就是如果我们认为收集到的这一批数据已经是专家数据的话,很多时候我们做的是做这个模仿学习。 当然大家对不同的这个抖面对专家的定义会不一样。我觉得可能这位同学说的专家就是最优的策略,认为他是一个专家。那么在这种情况下,我们再去做offline l的提升,可能是比较难的。所以很多时候面临的场景是我们的这个数据是有一个四周的专家收集到的。这种情况下是用这个offline的算法是有可能去对这个策略进行提升的。如果已经是真实情况下最优的那个专家已经做到最优了,那这个时候奥弗兰的算法它的提升的空间就非常有限。 另一个就是这个数据集的复杂度对模型的收敛有什么影响,通常我们对这个数据集的要求或者说比较理想的数据集一般不会用这个复杂度来描述。更多的是说这个数据集它的一个覆盖程度,对整个策略空间的覆盖程度。如果说一个数据集它的覆盖程度越大通常这个欧芙兰IO算法它的上限就会越高,就是它更有可能得到更好的结果。因为如果你覆盖了所有的情况的话,那其实就和online的时候自己去做探索比较像。但很遗憾的是啊,我们如果去做真实的一些应用场景当中,这个数据集可能天然就是比较刚才提到的比较保守的。那么它的数据覆盖范围会很小。所以这个时候对offer IO是一个很大的挑战。 当然这种数据集如果需要去做提升的话,很多时候它也不是一个最优的专家产生的。比如我们自己在做工业控制的时候就能看到很多时候像PID或者一些自动化的控制工具,它控制的结果是不太好的。就是如果有一个人工的专家事后去看啊看一眼那个过程的数据,就能知道在某些点上面他需要做一些额外的修正,就能够控制得更好。好的,老师。 然后第二个问题是我想想问一下离线二条需要多少个多少最最少的最少最少多少的那个离线数据,有一个理论的下限估计吗?好的,这个据我所知目前应该还没有这方面的分析,或者说对这个数据聚集的解析可能也不是特别够。所以我们也提供了new IO这个benchmark。本身就是想更多的去至少从经验的角度来出发,去给大家展示一下在这个离线的场景下面,真正应用的时候,它数据集是怎样的一个属性。可能这个问题就这位同学问的问题是说我们比如说最少要几条数据就能够学到什么样的一个性能。这方面的理论的分析目前我好像还没有看到,但是有一些经验的分析,包括我们实践的来看。如果说我们的目的只是比离线的收集数据的行为策略做的好一点的话,可能很多时候并不需要特别多的充足的数据,有时候几条或者十几条的轨迹也能够取得一定程度的提升。对,然后这个下限估计暂时应该是没有。 好的,然后是想问一下老师,他这个of flight offline的话,数据它是来源于不可控的正式环境。然后最后他那个优化后的策略是部署到正式环境当中。如果把这些数据做处理,就可以用那个动态方法做优化。也可以采用虚拟的方法,虚拟的仿真环境来做试错优化。对,这个是我直接回答,因为已经看完了。 这个是这样的,如果说我们在这一批数据上做动态规划的话,其实做动态规划它本身的要求是一个不管是自底向上或者自顶向下的一个对所有的SA每一句型的去做一个动态规划。这个时候,就要求数据覆盖的足够多。并且在更新的过程中,你要去可能要询问一些新的数据。就你要有一个真实的环境模型告诉你这些是怎么变的。你执行完上一个动作以后,下一个时刻的是怎么变的?所以我们很难直接从这个数据上面去做动态规划。如果说是在强化学习里面基于MDP的动态规划的话,所以我们就是既然这个直接的动态规划很难去实现,那我们更多的就是采用这个虚拟的仿真环境,避免在真实的环境中去试错。 好的,然后是他这位同学他想问一下自己的算法在是什么mobo上面的时候会出现会出现这个if ret的先涨到上涨到正常值,然后突然掉下来保持到0。然后老师您觉得这个model base出现这种情况是等于零是什么原因呢?这个对等于0或者说掉到一个很低的值,有几方面的原因可能会来解释这个事情。一是算法本身训练的时候可能有一些不稳定性。就比如说你现在的这个学习利益,或者说更新的这个best set设的不太合适,导致这个训练过程它本身不稳定。然后你的性能会突然本来之前在正常的上升的,但是由于某一步的梯度更新走的比较大,这个性能就突然掉下来了。我相信这里的这个评估应该是在真实环境里面拿到就是单独跑一个去测试的进程。所以有可能是由一些超参的设置导致的训练过程不稳定。 然后第二个可能是因为我们在做mofo的时候,它的模型是事先学好的。这个模型学的时候它会有一些偏差,会去把这个采样的行为数据集上面的一些偏差给捕捉到,然后去放大这部分的偏差。那我们的这个策略训练的时候,有可能就会去利用这一部分的偏差,这个有一个术语叫模型利用,就是model exportation去利用了这些模型的漏洞,这就使得这个算法训练的时候,你在训练上面看它的这个模型上的return可能没有降,甚至在上升。但是放到真实的环境去测试的时候,突然的一个点掉下来了。就是你在其实就是在训练的时候看到的提升,并不是因为在真实的这个环境上的提升带来的。而是你利用了这个模型的漏洞,找到了它的bug,使得你训练过程中的那个策略,在训练的一些指标下评估提升了。但是如果拿到真实的环境去回放去测试的话,它的性能可能会掉下来,主要是这几方面的原因。 好的,然后想问一下老师,他学习是学习离现场化学习有什么好的材料吗?以及离线强化学习它在什么场景下使用的比较广泛呢?然后DDPG这个算法也能应用到离线强化学习当中去吗? 好的,第一个问题,这个离线强化学习的话,现在好像还没看到比较系统的教材。但是我记得从去年的这个21 china的报告里面就有离线强化学习的专题报告,还有今年的也涉及了这个离线强化学习,包括可能有一些模仿学习的报告里面也会涉及到。还有就是在这个IO china或者有有深度强化学习实验室里边,有一些整理的比较不错的教程材料,或者有一些系统的强化学习。特别是深度强化学习的介邵里面的后面一些章节进阶的那个讲法里面会或多或少的涉及到一些线上化学习。 然后离线强化学习一般使用的场景就是我们这个真实环境下面,没有仿真环境,只能从一些预先收集好的数据,同时这个数据也不是最优策略的专家收集到的。那么在这种场景下面,我们可以使用离线强化学习去做一定程度的策略提升。避免直接在真实环境中去跑一个强化学习的算法带来的试错的开销。 然后DDPG它本身可以用在离线强化学习里面,就是早一点的就前面的那个slide里面的那个案例,他就是把DDPG当做一个离线强化学习的算法去用。只是比较遗憾的是,由于离线强化学习的时候,那堆数据集是静态的,我们更新的这个策略和实际去采数据集的行为策略之间的偏差会比较大。那么在这种情况下学习的时候外推误差可能就不可控,导致DDPG在直接用作一个离线强化学习算法的时候,往往会失效。好的,然后还有一个问题是想问一下老师在学习环境的时候,如果同时如果存在policy也需要学习,那么如何利用GAIL这个方法,同时学习环境和策略呢? 对,这是一个很好的问题。这个同学关注的很细节。如果说这个标准的gale他的学习的是模仿策略,然后环境那部分的样本是和那个模拟器真实去交互产生的。所以在如果是把gill用来做这个环境模型学习的时候,有一般有两种。做法一就是先搞一个固定的行为策略出来。这个行为策略可以是从历史的这个数据集去模仿的,甚至如果我们只是做环境学习的话,可能就是你直接把生成数据的策略拿过来也行。但另一个,在我们实际的实现里面,是同时去学一个环境和策略,然后去把联合分布,就是环境和策略联合起来的这两个条件概率做连成,然后会得到一个相当于从当前的S生成一个A一撇,生成一个A和S一撇的分布,去做轨迹上的一个分布的匹配,所以具体实现的话会有两种可能不同的路径。那我们用的是后一种,就是同时去学这个环境和策略,然后让环境和策略都去与rot这个数据,再去进行生成对抗的学习。 好的,然后是想问一下老师在离线强化学习处理探索和利用问题上,有没有什么好的方法训练达到经验最小化的同时获得更高的奖励。好的。这个问题可能会和特定的算法有关,就好像目前没有一些比较普适的原则。比如说在CQL里面的话,就是用的去最小化他的CQL的q loss,那个Q函数的loss,这个就在做经验风险最小化。但同时他还会去做一个额外的评估,但这个评估也是和他的算法绑定的,会基于学到的这个Q函数以及和那个那个行为策略的一个散度,二者加权做一个评估,找一个最优策略。那么他结合这两部分,基本上就可以针对CQL这个特定的算法,在某些领域上能够去做到,就是后面说的达到经验最小化,应该是经验风险最小化的时候获得更多的奖励。好的。 基本上问题都已经问的差不多了,非常感谢秦秦老师为大家带来的精彩知识。老师我们这个我们就结应该这个课程就结束了。行,这时间没到,3个小时整也可以是吧?那在在老师还有这个问题,说在CQL那一页当中对这个就是因为在offline l的算法训练里面,有时候带来了更多数据,但是不一定你的算法的性能就能够单调的获得提升。因为数据更多了,有时候你需要去找其他的超参。这个可能是由于算法它本身训练并不是那么稳定,或者说对超参比较敏感导致的。 好的,老师,老师,我们基本我们今天课程基本上问题已经问的差不多了。以前好像没有什么的问题,我们今天课程就差不多结束了。好的,谢谢大家好的拜,非常感谢大家的关注。然后大家也可以继续在社区里面交流,然后还可以参与随机性抽奖。9月15号在社区中课程主题参评论区参与留言的用户都可以参与幸运抽奖。然后l china社区将会另外提供20版同款书籍送给幸运用户,老师也会和大家在社区进行互动,所以同学们快来社区留言互动。本节课程就到这里,大家再见。
Podcast Editor
Podcast.json
Preview
Audio
