Sources
深度强化学习落地二三事 深度智能眼 2024年11月19日 21:31 北京 转载自https://www.zhihu.com/people/wei-zhu-50/zvideos?page=2 大家好,我是书籍深度强化学习落地指南的作者魏宁。很高兴通过视频的方式与大家分享我在工业界利用强化学习解决实际问题中的一些所思所想。在正式开始之前向大家安利一下我的智慧IDWYJJYN,欢迎大家经常过来与我交流,让我们共同进步。 好,我们接下来言归正传。首先必须得承认,关于深度强化学习的落地,到今天都是一个十分有争议性的话题。一方面隔一段时间就会有报考。文章还报道说世界上某个团队又用深度想要学习,把人类给碾压、吊打、秒杀,甚至按在地上摩擦了。相关的领域也是越来越多,医疗、教育、交通、能源、工程、艺术等不一而足。 但是另外一方面,业界一直存在一种比较悲观和质疑的声音。比较有代表性的是前几年国外一个大牛发了一篇博客,标题是reinforcement learning doesn't work yet。很多朋友可能对这个博客已经没有印象了。但是你们可能还记得这篇博客里边引用了一个卡通形象,就是这个插图。这个卡通人物旁边配了一句话翻译过来就是每当有人问我想要学习work的时候,我都告诉他们,十次里边有七次我都能蒙。对,当然这只是一个玩笑,但是这个玩笑也确实实反映了今天强化学习背后在原理上的一些固有缺陷。这些固有缺陷确实阻碍了这项技术在实践中的广泛推广。 面对这些争议,我认为我们应该有一个客观理性的评价,既不能捧杀,也不能一棍子打死。只有这样我们才能对这项技术有一个合理的期望,避免希望越大失望越大的惆怅。我个人觉得一个比较中肯的评价就是深度强化学习在今天有时能用有时更好,这八个字。 首先列举一些我曾经做过或者曾经接触过的强化学习在工业界的应场景。当然我是无法代表同行的。因为大家都知道腾讯在游戏领域,阿里在电商领域,滴滴在网约车的派单领域,都基于前后期做过很多有影响力的工作。我就只说自己熟悉的。包括大规模AGV集团集群的路径规划与任务调度,包括智慧交通灯的控制,以及基于强化学习的神经网络结构的自动搜索,也就是nas基于强化学习的数据增强模型,择优机械臂开门以及移动机器人的路径导航等等。 在落地实践中所面临的一些主要挑战,我大概总结了几点。第一点就是reality gap,当然这在强化学习的应用中是绕不开的话题。如果你所采用的模拟器在一些关键方面与真实的环境有较大的出入。那么即使在训练的时候把算法的性能刷的很高,但是部署以后表现也很有可能差强人意,这是第一点。 第二点挑战就是客户对安全性的要求。因为在实际的生产中的安全永远是第一位的,算法性能不光要高,而且要保证百分之百的安全。但是作为统计学范畴的一种优化方法,强化学习是很难做到百分之百的这是第二点。 第三点挑战就是算法对突发状况的应对能力。在实践中当一个训练好的policy部署的生产环境中,在工作的时候,有可能会遇到一些训练时没有见过的或者极少出现的一些情形。比如说由于设备故障所造成的一些意外。这种情况下,如果算法处理的不够好,或者完全没有办法处理,你有没有plan b能及时的接管? 最后一点挑战也是我想着重说的,因为我自己真的是感同身受。就是在工业界与学术界有点很大的不同,就是对于算法的性能相对于baseline的优势,有这个要求是不一样的。对于学术界来说,只要新算法的性能超过了baseline,可能超过的都不用很多,那你就可以发可以发一篇paper了。但是在工业界这样是不够的这不仅仅是一个技术问题,更多的时候是一个经济问题。大家可以这样想,客户在寻求新的解决方案之前,往往已经有一套已经成熟的或者经过市场验证的方案,我们一般称之为贝斯兰那。相应的也会有团队来不断的维护和升级这套方案,这些都是有前期的投入的。如果客户后边决定说应用强化学习的策略了,那么前期的这些投入都变成沉没成本了。 所以说强化学习的策略,一定要对于客户来说要形成一个非常强的理由。就是你能说服客户我没有办法拒绝,一定要去更换它。因为它在性能上真的对原来的贝斯莱构成了碾压的效应,或者说性能达不到这种程度,那你至少在其他方面有显著的优势。就比如说在资源消耗上,客户的贝斯在巅峰期的内存占用可能达到了GB的级别,比如说2GB3GB那么你的算法的你的强化学习的policy能不能在在内存消耗上把它控制在100兆以下呢?如果你能做到,那客户也可能是能接受,觉得这是一个很突出的优点。如果你的算法在各方面都表现的平平,那就很难说服客户去去更换你的算法。即使你的算法在性能上可能相对于客户的贝斯曼超过了5%甚至10%,但是客户可能都不会心动,因为他觉得不划算,不值得。 针对这些挑战,我们根据实践经验也总结了一些解决方案,大概介绍一下。首先就是在立项之前,一定要慎重评估项目的可行性。具体的就是说是否有把握用深度强化学习来做,在性能上或者是一些主要的方面能够符合客户的预期,让客户愿意去推广你的算法。如果你比较有把握,那就接下来继续做。如果你觉得比较悲观,那就要慎重了。 关于reality gap,在现阶段强化学习的成功应用,很多时候是离不开优质的模拟器的。但是这个模拟器的开发不一定是算法团队来做,很多时候其实是提出需求的甲方的业务部门来提供的。因为他们的baseline往往也是需要模拟器的。而这个模拟器可能已经经过了多年的验证,已经比较成熟了。这时候拿过来用,这是最好的。或者说可以从第三方与第三方合作,或者这个模拟器。就比如说智慧交通灯的控制,我们就用了苏某这个模拟器。 关于安全性的要求,我们要因地制宜,首先在训练中就尽可能的想办法让算法,让让强迫性的policy能够学会来遵守安全规范。但是我们又不能完全信任他,所以这个时候往往就需要一种兜底安全策略,在最后关头能够守住安全的红线。再就是在立项的时候,一定要明确这个性能指标以及性能测试的一些环境以及流程。这一点其实也很重要。一开始大家一定好省得到极限的时候,甲方说我们没有达到他们的要求,而我们又坚持说我们达到了,这个扯皮就没有意思了。再就是我们虽然在工业界做落地,但是也不能闭门造车,一定要持续的跟踪学术界的前沿进展。很多时候我们在工作中遇到的性能瓶颈,是可以在学术界得到灵感,得到启发的。 接下来的两点可能大家会比较陌生,尤其是学术界的朋友会比较陌生,我着重介绍一下。一个是我们在落地中,不光是依赖算法,一定要充分的挖掘问题定义的潜力。问题定义其实就是比如说状态空间的设计,动作空间的设计和回报函数的设计,这个是一定要为算法提供最大的支持的。一定要形成一种合力,才能保证我们的魄力积极性能达到最优。另外就是强化学习算法与传统的方案。他并不是那种最后不隆,有你没我,你是我和这种对立的关系,很多时候是可以进行融合,互相取长补短的,这个我稍后也会专门说明。 说到问题定义的重要性,这里就不得不交代一下深度强学习的算法在落地中的地位的变迁。这一点与学术界其实是有很明显的区别的。在学术界的算法的的角色可以形容为独当一面,因为大家比的就是算法,就是说是否在一些公开的现存的问题上,固有缺陷上取得了一些进展。 算法之外的一些因素,比如说状态设计、动作设计、回报设计,以及训练调试超参数的调整,这些都处于边缘地位。开句玩笑,就处于吃瓜群众的地位。很多时候学者是不需要去关注这些的,甚至对于超参数的精细调整,学者们都是比较排斥的。因为这只能说明你的算法还不够鲁邦。而且有的时候为了突出算法本身的优势,其他的这些因素还会给算法挖坑。就比如说回报把它变得更加稀疏状态空间里面包包含更少的信息,这些都是有可能的。 但是在工业界是不一样的,工业界它的baseline怎么说呢?是比较强大的,这个我稍后还会说,baseline的强大是有原因的。那么面对更加强大的baseline,光靠算法本身的优这就不够了,我们是需要把其他的因素也糅合进来形成合力,大家共同配合来把算法的性能做的高高的,从而才有希望超过工业界的这些比较强大的贝斯特,从而使我们的算法具备落地的价值,被客户所接纳。 如果也用一个成语来形容算法的在落地角色,我认为就是众星捧月。关于强化学习与传统的融合方式,我根据实践的经验,我大概总结了四种。第一种模式是将传统方案作为强化学习动作空间的一部分。在这种模式下,强化学习的policy学习的是如何适时的切换到传统方案,以及适时的收回控制权。 第二种模式是强化学习,在传方案的基础上学习一种增量的策略,然后与传统方案的输出叠加,形成最终的输出。这种模式下强化学习的是如何适时的校正传统方案。第三种模式是在传统方案和强化学习之上,还有一个high level的规则,来决定什么时候切换到前后学,什么时候切换到传统方案。它与第一种模式的区别就是在这里边传统的方案和相互学习的地位是对等的,只不过由第三方的规则来决定什么时候用哪种方案。 第四种模式或者说第四种方式,它是将传统方案的一些中间结果来扩充强化学习的状态空间,来辅助强化学习的策略的决策。这种模式其实有监督学习里面也是比较好用的。就比如说我们拿RGB3通三通道的图像作为深度网络的输入。那么它的性能是有可能不如我在这三通道图像原始图像基础上,我再通过一些传统的图像算子处理,然后再形成第四个channel然后can开到一起。再再再用同样的方法,用同样的网络来用有监督性的这个任务,它可能是能获得额外的性能增益的。 根据实践经验我将强化学习落地的一般流程总结成了这张流程图。从上到下依次是需求分析、动作空间设计、装作空间设计、规划式设计。当然这三者就是我们平时所说的强化学习的问题定义。在这三者中间我用了若干的双向的箭头,其实是想表达一个协同设计的理念。就是三者之间的设计并不是孤立存在的,而是很多时候是要协同的。其中一个改变了,另外一个也要跟着变化。我其实在深度强学习落地指南这本书里边相关的章节做了详细的介绍。 完成了问题定义之后,就该做算法选择。我选择一个针对我特定问题最合适的算法,然后再经过训练调试之后,如果这个时候的性能还不太满意,那我可能会用一些特殊的技巧,比如说课程学习,或者是增加额外的监督信号,做性能冲刺。完成了这些工作之后,我再把我的policy部署到工作环境中。当然这个流程不是一次性的,如果我我们发现在部署以后,性能还不能满足要求,或者是还存在其他的一些重要的问题,重要的缺陷。这个时候我们要回过头来重新把这些流程再走一遍,并且在相关的环节继续做优化,循环复制到满足要求为止。大家可以看到这些环节里边的绿色的这些这七个环节恰好构成了深度强化学习落地指南这本书的七章。当然受限于时间,我在这次视频分享中只会挑一些我认为比较重要,容易被大家忽视,比较有意思的环节做做一些介绍。比如说需求分析,比如说回报函数设计里边的一些内容,以及算法选择。 所谓需求分析,其实就是要依次回答四个问题,是不是值不值,能不能和边界在哪里?是不是其实就是要判断这个问题是不是一个MDP或者POMDP问题,在这次分享中我就略去不说了。我从第二个问题开始就是值不值。值不值其实就是在说如果一个问题它符合MDP或POMDP的定义,它可以用强化学习做。但是强化学习在这个问题中是不是的话?大家都所熟知的投资大师查理芒格特别喜欢引用一个例子。就是说人们的手中只有锤子的时候,在他们的眼中所有的问题都很像钉子。也就是说手中有锤万物皆钉。其实我我也想提醒大家,在应用深度强化学习的时候,也要避免这种铁锤人倾向。 我们平时可能会见到很多关于强化学习的入门教程,看到一些demo task或者toy task,里面有很多很简单的任务。就比如说这幅图里面的小车爬坡,当然它很适合通过AD的探索,然后摸索出来一条最优的policy。但是像这种问题我们人看一眼,带着自己的常识其实就知道小车如果向右,因为动力不足,一下冲不上去,那就应该先向左积累一些重力势能以后再再一股座机冲上去。这种情况下我们的常识就可以形成一些强有力的规则。它本身就是一个非常强的baseline。我们没有必要有强烈学习去from scrub的像没头苍蝇一样去探,这不是最优的方案。那么对于一些表面看起来较为复杂的任务,强化学习是否就可以成为首选方案呢? 说到这里,我就不得不花一页的篇幅向大家介绍一下工业界的在长期的实践中形成的一种思维方式或者方法论。就是工业界其实很擅长把它的应用场景高度可控。就比如说右边的四幅图里面的左上角这个工业机器人在安全门之内来重复的做一个抓死铁板并放在导轨上的任务。首先它在安全门内部,相关人员或者身体部位是不能进入这个安全门的,否则会触发急停。这个其实就是一个工业界和学术界很典型的不同,学术界可能相关的约束会少一些,并且把可能存在的安全隐患的消除作为一种学术的目标去研究。但是在工业界,这种技术问题会变成一种管理问题,所以有很多类似的这种问题就会被扼杀在摇篮里,被提前规避了。 另外关于这个工业机器人所重复做的这个工作,看起来还是挺复杂的。但其实因为现在的工业机器人都具有高度可控的精度,非常高,可能会达到0.0几毫米的这种定位能力。现在工业机型的主流应用方式都是由机器人工程师乃至石雕器预定路径中间的几个关键点记录下来,然后再由机器人去反复的重复这些路径,然后再到达一些关键的位置。比如说铁板所在的位置的时候,会有一些接近开关来辅助判断他是否到位了。然后加载关闭之后是否成成功的抓牢了这个铁板,以及说在导轨上方把铁板放掉之后,它是否成功的释放掉了铁板。其实这些都是有高精度的接近开关或者传感器来告诉在这种模式下,前后学习是没有什么用武之地的。 第二个方法论是工业界非常擅长充分挖掘底层的物理本质。刚才我举的左上角这个例子,大家可能会说这种机械性的工作模式只能做一些刚性的任务,就是所有的点都是固定的。但是像一些柔性装配,就比如说右边这个离合器的齿轮箱的装配,在装配之前,里边的那个齿轮都是相互之间杂乱错开的那这个时候就不能用蛮力去解决。那在这种场景下是不是就应该用深度强化学习了呢? 其实工业界还是有它的办法。大家可以看到,右边这幅图里边是库卡的LBR伊娃协作机器人。在这个机器人的七个轴里边,每个轴内部都装安装了高精度高灵敏性的立即传感器。利用这些力矩传感器的反馈,它可以在弓箭和齿轮箱即将接触的时候,开启一些特殊的预定模式。包括红利模式,也就末端受力保持恒定,以及正弦模式里萨隆模式,还有螺旋曲线模式。意思就是说这个弓箭像图中这样的左右反复的旋转,其实施模仿了人类在安这个零件的时候采用的一种正弦曲线模式。 在这些特殊的模式中的机器人的末端是具有一定的柔性的,也就是说它要受力的上限。一旦哪里不对了,超过了这个受力,这个机器人也会启发一种做保护的机制。这样就保证了说机器人自己或者说是弓箭会造成一些损伤。在这种形势下还是没有强化学习的用武之地,对吧? 三种方法论就是工业界非常擅长,喜欢用一些显眼知识先总结起来,然后把它加入到我的方案内部。大家看右下角这幅图,它其实左边这幅室内的场景下,AGV集群的分拣工作的一个画演示。我还记得我第一次用强化学习算法跑出一个效果的时候,我惊奇的发现虽然我事先没有加入任何的限制,但是这几百辆AGV自发的形成了一些固定的车道,就比如说这条车道指向左边走,这些都指向右边走,这条车道指向下,另外旁边的车道指向上。我当时是非常震撼以及兴奋的,觉得这是浑然天成的一种秩序,我甚至也产生了一种哲学家的错觉。但是我当我兴奋的把这个结果展示给客户看的时候,客户相关人员就微微一笑,然后拿出了他们的图纸。然后告诉我说他们在第一次拿到一个新的地图,就会找几个有经验的同事花上几天的时间去标出车道线,也就是类似的这种单向车道线。那就是相当于强行学习,通过探索形成了这种知识,人类靠自己的的智慧就能把它实现掉。而且这种标好的地图结合A型上效果也是很棒的这是一件非常让人沮丧的事情,但是这就是工业界的方法论。 当然A型算法它本身可能是消耗内存是比较大的。因为它要提前去规划比较远的距离,去解决未来可能遇到的任何AGV之间的冲突或者拥堵,在巅峰时期它可能会消耗很多资源。但是对工业界来说,如果我掏钱多配置几块GPU或者是CPU,那对我来说我承担得起没有问题,我愿意付出这个成本,那你也没什么好说的是吧?那我就用传统的方法好了。 大家可以看到工业界的这这些套路,它的本质其实是在拼命的压缩问题的解空间。大家想一想是不是其实他在拼命的压缩问题的解空间。我举一个最简单的例子,比如说左上角这个工业机器人在做这个任务,大家想想它的状态空间。如果用强化学习的角度来看,它的状态空间其实就是若干个接近开关,也就是零一开关的的状态。其实它们属于低维伯努利分布。然后在机器达到一个位置,它就关上夹爪,关上夹住之后,铁板就一定会被夹住,这个工业界是能做到的那相当于说它的状态转移概率它不是一个分布,或者说它是一个脉冲分布,它就是百分之百不存在意外。 既然如此的话,那我还需要探索吗?我还需要不需要?我只需要人工社交就好了。这就是工业界的套路,它通过极大的压缩问题的空间,从而避免了尽或者尽最可能大的去避免不确定性。而是我的场景非常简单,我只需要一些简单的规则,或者一些奇葩说的搜索,就可以把效果做的很好了,不需要用到强化学习。强化学习在在这种模式下也确实是缺乏优势。 在上一页我们提到工业界很喜欢主动压缩问题的解空间,从而为简单的规则或者奇葩说搜索的传统方案创造条件,从而把问题也很好的解决掉。这里所说的解空间,大家可以按照前后学习的概念去理解为状态空间和动作空间的联合空间。在我看来根据解空间的类型,其实可以把所有的任务划分为大概四类。就像现在这幅图上所示的这种类型,大家可以把它理解成类似以q learning里面的Q表的内部不同位置的灰度值,可以代表不同的状态动作组合的得分。 在左上角A所代表的第一种解空间类型,这种节空间它本身比较小,或者是在添加了某种特别的限制以后,使得它实际的解空间较小。这种限制其实就是上一页所提到的工业界特别喜欢用的方式。还比如说在一条宽阔的大街上,本来是没有任何限制的,但是交通部门给这条道路划分了车道,而且还规定行人,那车辆只能靠右行。这属于人为的添加了额外的限制,使得这个本来很大的一个解空间被大大的压缩了。我举一个例子,总之就是对于一个实际解空间较小的任务。在这种情况下,其实基于规则或启发式搜索的方式能更有优势,强化学习在这里边通常是没有什么优势的。 在B所示的第二类空间里面,它本身可能比较大。但是它的Q值的分布具有一些显著的模式,可以被捕捉到,可以被数学建模的模式。比如说汽车加速,比如说火箭发射,空间站的对接,他们背后往往存在一些明确的物理模型。那么在这种情况下,就适合用数学建模加采样校正的方式,而不是用自由探索永强学习来解决。大家可以这么想,如果一个问题已经有的一个解析解或者近似的这些细节,我们难道还要用自由探索来像没头苍蝇一样盲人摸象吗?这个是我认为是不合适的。 在C所代表的第三类解空间中,本身具有一定的规模比较大。而且它内部的Q值分布也没有一个明确的可以捕捉的、可以建模的模式。那么在这种类型的任务中,前后协议是可能有优势的。只不过可能传统的一些基于Q表的前后协议,比如说Q20或者是算法。这种传统的前后协议算法就已经可以把这个问题解决的很好了,而不一定非得用深度强化学习。 在知乎上曾经有一个挚友向我咨询,他有一个问题,本来已经q learning已经很好的解决了,但是当切换为IDQN算法的时候结果却不尽如人意。在这种情况下一个可能的原因就是在不太大的这个空间里边,神经网络这种信息介质相对于表格它不一定有优势。无论是学习难度上还是科技性上不一定有优势有。 在D所代表的第四类解空间中,它本身规模非常的大,而且内部也的Q值分布也呈现多模态特征。那么这种情况下,就比较适合用深度强化学习来做了。所以总结一下,使用深度强化学习或者DRL的理由有三点。第一点是因为解空间太大了,超过了人脑的极限或者是硬件的极限,没有办法使用规则和启发式搜索。第二个理由就是因为这空间太大了,我们基于表格的传统的强化学习的算法作为信息载体难以为继。因为你想一旦装的空间或者动作空间有一个是连续的那理论上的这个空间就是无穷大的那这种情况下,使用Q本我就没有办法穷举了,是吧?所以只能深度调整期,借助深度神经网络的内插泛化能力,来对一些我们探索不到的状态和动作,仍然给它们赋予一个合理的Q值。第三个理由就是如果状态信息中存在一些高维的特征,那这个时候我们需要借助深度神网络的对高维特征的处理和特征提取的优势。这个时候也是需要用到深度强化学习的。 总结一下,其实就是我们的问题,是否在可穷举或者是去偏见层面存在超越传统方法的这种可能性。这种可能性性能往往存在于不可压缩的、足够大的可以自由探索的解空间里边。如果一个问题具有这样的特征,我们会倾向于判断说深度强学习很有希望获得一个理想的结果。但是我也需要提醒各位的是在深度学习时代,大家都很容易高估一项任务的可优化的空间,但同时又低估这个问题本身的科学性程度。总是喜欢拎着深度强化学习的工程锤到处乱飞,最后可能白白忙活一场,发现还不如传统的算法。这一点我觉得作为算法工作者是需要反思和回避的。 在回答完值不值的问题之后,接下来就要回答能不能的问题。要回答这个问题,核心就是要抓住两个要点,一个是场景固定,还有一个是数据廉价。所谓场景固定就是要求珀利斯在训练的过程中,他的训练和测试的环境一定要保证状态分布一致,状态转移概率不一致。这两个分布一致。 大家仔细回忆一下,在我们所熟悉的分类目标检测和分割的这种有监督的模式下,它其实针对训练集中数据分布的一种单分布的定制优化。大家想想是不是这样。但是对于强化学习来说,它其实是一个双分布定制优化,就是针对状态分布的定制优化,以及状态转移概率分布的这种定制优化。当然这个要强调一下,就是强化学习在训练的过程中,它是不符合独立同分布,在理论上是不符合的。但是从最终来看,从整体上这个算法还是会对他的训练环境的状态分布和状态转移做一个双分布的定制优化的。它比有监督模式要多了一个要求。所以这说明强化学习其实是一个设定更难的一种。 其实业界有一种针对强化学习的吐槽,就是说强化学习是唯一允许在训练集上进行测试的算法。其实我个人觉得这个吐槽有点刻薄。所谓的在训练集上进行测试,意思就是说测试集中遇到的状态全部在训练集中出现过。这其实是不严谨的,只能说是以一定的概率曾经在训练中遇到出现过。 但这并不是百分之百的,而且随着解空间的扩大,这种概率是会降低的那经过良好训练的策略,他在测试的时候遇到训练中完全没有出现过的状态。比如说在一个连续的状态空间或者动作空间中,我们真的没有遇到过这种情况。但是策略也照样可以输出一个比较合理的动作。那这种内差泛化能力难道不算泛化吗?所以我认为没有必要这么刻薄。 另外我还是用实际的例子来说明。就比如说左边这张围棋棋盘,我们用强行算法来训练agent来下棋。那么这个棋盘它可能有一些固定的属性。比如说像左半边的这种原木黑白字,右上角的这种抽象化的棋盘,以及右下角的这种重颜色的石头来代替棋子和背景上增加了一些挂饰的图样。那如果我的策略直接在原始这个图像上进行训练,比如说我在原木背景黑白紫的这种设定下进行训练。那训练好以后的策略,即使它性能再高,但是我把它放到其他材质的棋盘和棋子的设定下,那它很有可能就会失效,是吧? 为了防止这种情况,为了保证场景固定的要求,像阿尔法狗其实它就采用了类似的抽象化预处理的方案。也就是说我将一整张棋盘抽象为一个19乘19的矩阵。我在对应的位置根据有没有棋子,是有黑还是有白纸,我们分别填上012。这样就可以保证各种不同性质的棋盘和棋子的属性,我们都可以用相同的方式进行表达。这样训练出来的策略就具有通用性,而且也不用担心泛化问题。这就是场景固定要求的一种很生动的写照。 当然并不是所有的任务都可以通过抽象微处理来就完成了。状态分布的一致性。就比如说右边这个任务,agent要从起点在不同的和障碍物的排布下穿梭,然后最后达到终点。如果我们的策略只在左边这张地图上进行训练,训练完成后的策略logo直接放到右边这幅不同的地图上训练了测试了的,那它很有可能会出现过拟合。这就是一种状态分布和状态转移概率分布不一致的情况。这种不一致来源于地图中不同障碍物的排布形状小的位置的不同。 为了保证场景固定的要求,我们在训练的时候就要采用一种随机生成的策略,尽可能的生成丰富多样的地图排布。当然你生成的时候一定要保证确实存在一条通路,从起点到终点。通过这种训练策略就可以使得我们policy所支持的状态空间扩大到一定范围。从而在这种模式下能学到一种通用的导航知识,也就保证了场景固定的需求。 另外一个要点就是数据廉价,其实就是四个字,多快好省。对不起,不是省时费。我逐字解释一下,多其实也很简单。因为前后学习目前是对数据的要求是比较高的。它需要很多很多的数据,大量的探索才能这么一个性能比较高的策略。所以说你训练的环境一定要能够具有源源不断提供数据的能力,要尽可能的多。 然后快的话就是我怎么样保证我的数据采集的速率带宽要尽可能提起来。只有这样我算法训练的绝对时间或者叫workload时间会比较短。大家回忆一下我们平时读的那些爆款文章,动不动就说我的这个policy训练的过程。相对于人类的几百年、上千年甚至上万年的经验,那你是怎么做到这一点?除了大规模的并行化,本身对你的训练环境的数据生成采样速率就有一个很高的要求,要越快越好。 好,其实就是说它它跟场景固定的要求是一致的,就是怎么样保证你的这个数符合状态分布一致,状态转移概率分布一致是这两个一致。如果这两个一致做的不好,意味着你的reality gap比较大。那这种情况下,你要么就直接在你的工作环境中进行训练,但是我们知道很多时候是这一点是做不到的。如果你用模拟器的,你就要尽可能保证你的模拟器的质量尽可能高,尽可能逼近的真实的环境,这就是好。所谓的费就是说毕竟现在的随机的算法,它的data efficiency或者数据效率比较低,所以是需要很多数据来供我这算法进行回火的。所以目前而言在工业界还是基本离不开比较优质的模拟器的。 说到模拟器,其实我个人认为这个维度上其实也可以把任务分成两大类,分别是game a simulation和game assimilation。这两个名字也是我起的。所谓game a simulation顾名思义就是任务,就是仿真环境。仿真环境就是一般能做到这一点的。要么是电子游戏类,比如说deep mind开放的星际争霸二的仿真平台,它其实就是与暴雪公司合作,采用了原装的游戏引擎。要么就是像棋牌类,或者是去年发布了一篇paper上面提到的芯片布局的任务。这一类任务它的特点是具有明确完备、可穷举的规则。无论是仿真环境还是现实中,这些规则是保持不变的。这种情况下也是可以做到game simulation的。 就目前而言,强化学习落地最成功的领域也就是game of stimulation这一大类任务了。当然这个不代表说game assimilate tion的任务在训练过程中不存在状态分布不一致的问题。就比如说星际争霸的这项任务,在训练的过程中,因为采用了ska,如果只是自己和自己打的话,那么在训练的过程中对手的状态,对手的水平风格是一直在变化的那训练到一定程度,那之前的可能相关的技能会出现遗忘。所以学术界也提出了联盟学习,刻意的通过在过去的不同阶段的check point,来生成一些水平和风格不一样的对手,来保证你的target policy具有应对不同情况的通用的一种技能。 另外一类任务就是game to simulation,就是凡是做不到game sync的,就只能是game to simulation了。这一类任务的特点是往往与硬件相关,就比如图中所示的四角机勤爬行,以及用来开抽屉的机械臂。因为这类涉及到硬件的任务往往是承受不起自由探索过程中造成的这种硬件的损坏的,所以很多时候也必须求助于模拟器。 当然模拟器是很难做到百分之百精确的,但是在工业界我们也不要求百分之百精确,只要达到了一定程度,我们就认为它已经有实用价值了,这个没有问题。但是对这个模拟器的对真实环境的精确度,细节的还原度,其实是可以进行量化的评估的。就比如说变了变在时间轴上评估电机的角度在仿真环境和真实环境中的波形的差异。只要在一定的误差范围内,我们就认为是可以用的。当然就像我前面说过的,算法团队规定来完成模拟器的创。这个模拟器可能是来自业务部门或者是当然近些年南京大学俞扬老师的团队提出来通过离线的数据来用学习的方式学出一个模拟器,来用一条学习算法的训练,大家可以关注这个方向。 需求分析需要回答的最后一个问题是边界在哪里?顾名思义,其实就是前后学习policy的智能边界应该如何划分?在学术界存在一种倾向,就是大家喜欢用end to end或者端到端的方式来解决一个复杂的任务。有强化学习的policy,站在高处大包大揽。其实我们在实践中发现,这种方式其实并不明智。因为一个复杂的任务,它内部可能可以分为好多功能模块。有的功能模块可能用强学习做更合适,但是有的功能模块反而用传统方案做,也就是用规则做,它要比前后学习要更有优势。与其让前后学习大包大揽,从头开始学得所有的技能,不如就是让他与创作方互相配合。 就比如说这页PPT里面所显示的麻将AI下这幅流程图,来自于未来亚洲研究院都发表了一篇用强化学习来打日本麻将的一篇论文。大家可以看到这个流程图本身是非常复杂的,而真正用强化学习做的部分,只有左下角这个框框里面的气排模型。像其他的相关的一些判断,以及比如说吃杠碰不排模型,全部都是基于规则的。 像这种方式其实就对应于我之前所说的强化学习传统方案融合模式的第三种模式,就是有一个hello的规则来在前后学习方案与传统方式之间进行切换。除了这种方式,甚至不同的功能模块分别采用前后学习来做,都可能比端到端的方式更好。就比如说这幅图是清华大学自动驾驶团队发表了一篇paper,把汽车控制的功能分成了几个基本单元。可能这个单元只负责换挡杆,这个单元只负责油门,那个单元只负责刹车,那个单元负责离合。总之就是不同的单元分别用一个独立的policy来训练,再采用一个更高level的master policy来决定什么时候调用哪一个policy。这是一种层级强化学习的架构。 虽然看起来汽车行驶是一个整体的任务,但是当你对这个任务的不同的功能进行划分之后,用这种方式来学习出来的整体性能反倒更高。这充分说明了在追求性能的道路上永远不要放弃,永远不要低估对任务的深度解析,不要低估任务的可解析程度。这就有点像我们东北的一道名菜地三鲜,里边的三种不同的食材都要事先经过各自的预处理方法,然后再炒到一块儿去,如果你在一开始的时候就把它们一锅乱炒,那最后那个味道是很差的。我在这方面是有惨痛的教训的,希望大家不要学。我。 接下来说一下我们眼中的深度强化学习的发展脉络。其实在宏观上,深度强化学习可以被划分为model base的和model free的方法。我这次分享中还是着重分享了model fried的方法,因为moto base的方法目前并没没有得到广泛的应用。因为model本身的学习复杂度可能比较高,它的学习误差可能对后续的规划算法的性能造成比较严重的影响。所以我们还是关注model free的方法。 首先model free的方法我们认为存在DDPG和A3C这三种经典的算法占据比较基础的生态位。有两种不同的划分体系,比如说value based还是policy base,还是off policy,还是on policy的这三种算法都在这里边占据了比较基础的位置。其次我们认为任何深度想要学习的算法,其实都可以被解构成四元核心组件。它们分别是基本原理、探索方式、样本管理、梯度计算。而我们今天所熟悉的这些sota算法,比如说TD3萨克BPPG这些算法,其实都是刚才的这三种经典算法的四元核心组件的基础上,对其中的一种或者几种做了改进之后得到的。大家想想是不是? 关于这个次元核心组件,我可以举一个例子,以DQN为例,DQN的基本原理是什么?其实它是沿袭了q learning的原理,利用贝尔曼公式的boot trap原理来产生了学习的信号。那么DQN的探索方式是什么?D use grady对不对?然后样本管理DQN借鉴了replay bullet的思想,它利用reply bubble来存储一些过去采集的样本,从而提高数据利用率。 梯度计算DQN为了保证梯度的稳定性,保证算法更新的稳定性,它在梯度计算的时候专门设置了一个目标网络延迟更新,相对于主网络做延迟更新。大家想一想,是不是这样,这样就可以避免因为误差在主网络上形成了刺激效应,使得误差越来越大。那么这个四元核心组件它就构成了DQ这一套算法。在DQN的基础上做一些改进,其实就可以获得其他的一些更好的算。 在探索方式上的改进,原始的upgrade我把它换成noisy net,那它可能探索效率就会获得提升。比如说在样本管理上,我又把普通的replay prefer的换成优先级经验回放或者是inside replay buffer都可以提升算法的训练效率。在梯度计算上,我可以引入比如说double q learning,可以进一步压制它的over estimation过估计的这种效应。大家想一想其他的算法是不是也是这么逐渐的演化过来的。 需要说明的是,我们之所以用这种四元核心组件的体系来梳理深度强化学习技术的发展脉络,其实是为了方便我们去跟踪和借鉴学术界的前沿发展。说的功利一点,是为了方便我们的技术套利。因为新技术既然是按照这种模式不断的在演化,那么当我们在落地实践中算法性能遇到瓶颈的时候,我们会用这种思想到学术界去搜,看看哪种新的算法又诞生了。它是相对于原来的已经有算法的哪个核心组件上做了改进。我们可以保留大体的算法不动,我们只对这个核心组件模仿他们的改进方式。 甚至说某种核心组件的这种组合,是目前学术界没有专门拎出来给它起个名字的算法。但是我们仍然会采用这种缝合怪的套路去把它们缝合起来。比如说用了sac我印象中好像还没有什么一个专门的算法。就是把比如说优先级经验回访给跟sec结合,把它起一个别的名字,成为一个新的sota,没有,但是我们在实践中会采用这种方式,这就是技术套利,这就是四元核心组件这种划分方法的威力。 关于算法选择的一般性结论,我们根据实际的经验总结成了一张表格。而且可以看一下考虑的方面包括动作空间类型的兼容性,采样成本的容忍度,运算资源的需求,训练稳定性以及其他。我们可以根据具体任务的特点以及我们手头可用的运算资源,来筛选出一些之内特定任务的合适的算法。当然可能有不止一种算法满足需求,我们还需要接下来对他们来分别加以测试,从中选出新能最好的那种算法。如果到后边我们认为性能还有进一步提升的可能性,或者有相可提升的潜力。那么我们就会进一步优化这个算法的四元核心组件中的一个和多个大致的流程是这样的一的流程。 好,我们再说说回报书设计。回报书设计是强化学习应用中的非常重要的一环。回报函数其实就有点像面向强化学习的汇编语言一样。我们用一种强化学习算法能够识别也能够听懂的语言回报函数,来把我们人类的预期的目标来翻译一下,然后再交给算法去学习。 关于回报术设计,其实大家都知道一种显而易见的措施或者成分。就是当agent探索到我们所希望它实现的目标的时候,一般都会给他一个正向的奖励。相应的事件我们称之为主线事件,相应的奖励或称之为主线奖励或者主线回报。但是现实中的问题可能会比较,就比如说图中所示的这个任务,我们想让机器人抓起这个积木,然后打开盒子的盖子,然后把积木放进去,再把这个盖子盖上。只有完成了这一系列动作之后,我们才认为主线事件发生了才能获得主线奖励,是如果之前的读者没有任何反馈信号,那么机器人靠随机探索探索到这个主线事件的概率几乎为零,就好像一根针扎在平面上的预定的一个点一样,虽然看起来是有可能,但其实概率就等于0。这种时候,就是我们平时所说的稀疏回报问题。学术界其实在这一块是搞得热火朝天的。 稀疏回报问题是学术界想要解决的一个很重要的问题。但是实践中的算法虽然重要,效果更好,收益更高。其实往往还是人工的review的设计,这个大家应该能理解。就是我们如何在中间环节增加一些反馈的信号,使我的回报数变得更加稠密一些,从而更好的引导agent项目的最终的目标去探索。 常用的手段主要是三种,一种是基于人工credit assigned和贡献度分配的子目标回报。再就是采用回报塑形技术,reward shipping这样的回报我们称之为塑形回报,以及学术直接用来处理吸收回报的一类回报,称之为内需回报。比如举个例子,基于计数的或者count base的这种回报,它跟前两种回报不一样。它没有说特别针对预期的目标来设计回报,而是单纯的鼓励agent去多探索状态环境中之前没有见过的状态,或者出现次数很少的状态。这个在实践中证明也是很有用的,尤其是对于一些复杂任但是又具有吸收回报的情形。时间关系,我就不对这三种手段具体怎么实现详细介绍了。有相关需求的朋友或者感兴趣的朋友可以阅读一下行动强化学习落地指南这本书的第四章的相关,一边对他们进行了详细的介绍。 接下来的时间我介绍一下在实现这些辅助回报的过程中,由于病态的设计导致的几种常见的异常行为。根据实践的经验,用拟人化的词总结了三种异常行为,分别是鲁莽、贪婪和诺诺。接下来我将分别对他们予以介绍。因为我觉得在绘画书的设计中,如何避免这些异常行为是非常重要的。 接下来我将依次介绍我所划分的几种因为病态回报式设计导致的异常行为。首先是鲁莽异常,鲁莽异常的原因往往是一些关键惩罚项的缺失,或者是绝对值设计过小所导致的。我举两个例子。 左边这个例子是著名的古希腊神话里面米达斯国王的故事。这个国王为了过上更加锦衣玉食的生活,他就祈求神灵赋予他触骨成金的本领,神灵就答应他了,结果他摸到的东西,包括食物在内,立刻就变成了黄金。锦衣玉食的生活是没有过上,但是差点饥渴而死。这就说明眼睛里只有主线回放,但是没有一些关键的制衡的惩罚项,那就有可能闹meta国王的笑话。 右边这个任务取自2017年的一篇发在尼普斯尔的文章,叫design。这个例子是强化学习算法工程师爱丽丝,他希望训练一个机器人通过这条道路来找到一块黄金,同时避开致命的浓颜和拿走的草地。那1正确的回报函数设计应该是像图中这样的,就是找到黄金加十分,走难走的草地扣两分,然后走正确的道路扣0点5分,这就是我们说的一正多负的原则。即使是正确的道路,我也应该给他一个微小的惩罚。更重要的是如果他走了自己的浓颜应该减100分。但是在实际设计伙伴的时候,爱丽丝打了个盹,她把这个走到龙岩的惩罚给忘记了。从而导致说这个机器人为了尽快的找到黄金,就赴汤蹈火了,抄近路了,从而牺牲掉了。这就是因为关键惩罚项的缺失造成的鲁莽异常。 第二种异常行为,我称之为贪婪异常。这个在学术界其实也有一个专门的名词,称之为revert hacking,或者翻译过来叫回报劫持。就比如说最左边这个例子,agent本来他应该是去到模型所在的目标位置,并且领取十分的正向奖励。但是不过我的回报还是设计成了上面这种形式。为了鼓励他靠近终点,我给他加一分的奖励,他远离终点我不给他惩罚。这种情况下A人的通过自由探索就会发现它不直接到target位置获得一次性的加十分的奖励,而是不断的重复靠近远离的动作,那就可以积少成多,并且超过到达终点的一次性的奖励。这就是一种投机取巧策略,就是贪婪异常。 为了避免这种情况,其实我刚才已经又提过一次,就是一正多副的原则。我为了鼓励agent到达终点,我对靠近终点这种行为我不一定给他奖励,我给他一个比较小的,不说减一分。而对于远离终点的行为,我给一个更大的惩罚,比如说减二分。那这种情况下其实就可以避免真的学会刚才那种投机取巧的策略。 类似的逻辑其实也发生在中间的这个例子中了。说扫地机器人它主线目标是把地板上所有的杂物全部清扫干净并出来加十分。同样是加十分,但是这个机器人发现了扫了一堆杂物,再把这个杂物排出来,然后反复的吸入排出,那我就可以不断的积累一分的奖励,那我干嘛把它们清扫干净呢?养寇而自重不是更好吗?这就是也是类似的贪婪行为。 第三个例子是雅达利的一个著名的游戏,蒙特祖玛的复仇agent在某个房间里面拿到钥匙,比如说得到一分的奖励,然后再通关,比如说得到10分的奖励。那假如说这个房间里面的钥匙不是只有一把,而是很多把甚至无限量供应的那A就很有可能在房间里面乐不思蜀了。他根本就忘了通关这个事情了,就不断的捡钥匙就完了。或者说是虽然只有一把钥匙,但是我一直是可以捡起来再扔掉的,扔掉以后再捡起来,这样是不是也是一种取巧的策略,是一种贪婪异常呢? 为了避免这种情况发生,我们其实有几种措施是可以做的。一种是我将简要是的奖励改为微小的惩罚,我也可以设计只奖励一次占钥匙的行为,那后边我就意见再多,我就不奖励了,这样也可以避免产生贪婪的行为。当然还有一种策略就是我直接把扔掉钥匙作为一种非法动作屏蔽掉,作为我的非法动作屏蔽机制的一部分。包括左边这个扫地机器人的例子,我只允许这个机器人西路,但是不允许它突出,这也是一种办法。 第三种异常行为,我称之为糯糯异常。造成诺诺异常的原因往往是A醇的受到的正向奖励过于稀疏,或者说这个正向奖励相对于其他的惩罚项的绝对值过低造成的。就比如说最上面这个例子,agent到达目标位置以后,会获得加十分的正确奖励。但是在到达之前的这个中间,他可能会受到很多绝对值很大的惩罚。比如说减20、减100、减200、减666。那么A真的很有可能为了避免获得这么高的惩罚,他宁愿苟在原地。我不去获得家属们的可怜的奖励,我当了一只鸵鸟也挺好,这就是懦弱一场。 大家如果还有印象的话,可能就是在今年的早些时候,有一个火爆全网的内卷的AI了。这个新闻他的设计者在希望训练两匹狼和绞合为一只羊。在抓到羊之前,每一个step都会给这两匹狼一个固定的惩罚。有可能是这个惩罚相对于抓到羊的奖励绝对值太大了。同时在训练的突击而不是冷,宁可选择撞石头自杀,提前结束了这个XO的,从而使他的return也不至于那么低,对吧?其实解决这个问题也很简单,只需要把抓到羊之前的每一步的惩罚,比如说降低一个数量级,或者说把抓到羊的奖励提高一个数量级,这样就可以有效的避免这种懦弱异常的出现。 第三个例子是雅达利游戏的一个称之为名字叫Peter ford游戏。这个游戏是一个公认的比较难的游戏,难点体现在它的的正确奖励很提出,而负向的奖励很频繁。这样就导致说强化学习的一个算法,如果你不采取一些特殊的设计的话,雷正他就容易学会留在原地打转或者反方向逃跑,他就是不去通关的这种懦弱异常。当然了,这个懦弱异常的原因是一个游戏内部的打分体系决定了它已经固化好了。如果我们自己来设计回报函数的时候,我们应该避免设计成这个样子。我们应该让它的惩罚项绝对值小一些,正向的奖励绝对值稍微大一些,避免出现这种情况。 同步该文章 询问ChatGPT 微信扫一扫 关注该公众号
Podcast Editor
Podcast.json
Preview
Audio
