第二届北京智源大会上,南京大学人工智能学院俞扬教授做了《更好的环境模型,更好的强化学习》的报告。
北京智源大会是智源研究院主办的年度国际性人工智能高端学术交流活动,2019年举办了首届大会,今年为第二届。大会参会官网:2020.baai.ac.cn。
强化学习到底能不能用?有些观点认为它不能用,这里不能用主要指的是它在真实环境下很难用,但是在类似游戏这种封闭环境下强化学习其实都是很好用的,而且能够达到很好的效果。
我们该如何把强化学习用在真实的环境里面呢?针对于此,俞扬教授在这次分享中带来一个很简单很直接的办法:使用模拟器。模拟器就是强化学习所运行的环境,通过它我们就可以把强化学习跑出来并得到一个很好的效果。用一句话来说就是,真实环境不好用,模拟器来凑!
俞扬教授的团队已经和众多企业合作把基于数据驱动模拟器的强化学习技术用在了淘宝搜索、在线购物、滴滴出租车、仓库派单、砍价机器人等业务中并取得了很好的效果。另外基于数据驱动模拟器的强化学习技术途径,正在孵化南栖仙策公司,在制造、物流、营销等场景落地赋能,致力于将人工智能决策的力量转化为生产力。
在报告最后,俞扬教授总结了在真实场景下做决策这件事情的四个层次:1.人直接来做决策;2.人为设定模拟器; 3.用预测的方法来替代决策;4.数据驱动的模拟器。
以下为俞扬教授的演讲正文,感谢俞扬教授对本文的亲自确认:
今天这个报告主要是集中在强化学习里面的环境模型上面,我们经常说的 model指的是环境,像监督学习里面,我们经常说的model可能指的是神经网络的模型或者是其他的模型,像model based reinforcement指的就是环境模型。
一、强化学习VS监督学习
这里简单介绍一下强化学习和机器学习的关系,最经典的一个机器学习领域的划分包括:监督学习、无监督学习和强化学习。
这种划分基于对某一任务上面的不同反馈机制,监督学习是立即反馈,无监督学习是没有反馈,强化学习就是涉及他们两者之间的一种滞后的反馈。这种滞后的反馈对应的就是做决策这样的任务:做完决策过一段时间后才能看得到最终的决策结果是什么。
强化学习其实就是用来处理这样的决策任务,如果把它和监督学习做预测进行对比,那么我们主要回答的是怎么做,怎么做才能达到我们的目标,不同的任务就会导致我们的整个算法流程会有很大的不一样。
比如说在监督学习里面,做预测主要是解决数据里面是什么,做决策主要想回答怎么做能够达到我们的目标以使得我们的学习过程变得不一样。如监督学习会从环境里采集一些数据然后给数据打上标记。输入和输出都有了之后我们把中间对应的函数用监督学习的算法还原出来,此时这个可用模型指的就是做预测的输入到输出的模型。
强化学习模型则不一样,因为强化学习要考虑的是有没有达到想要设定的目标。我们从环境中通过我们自己的模型采一批我们自己的策略和一批数据以后,我们学好策略后又会回到这个环境中,我们去验证一下这个策略有没有更好、有没有达到我们的目标。所以我们从目标上面最容易看得清楚这件事情的过程是和监督学习不一样的。
监督学习通常是针对一个固定的数据分布来优化损失,但是在强化学习里面,我们的数据分布是Dπθ,θ就是我们自己的决策、我们自己的策略。也就是说当我们的策略发生变化时我们的数据也会发生变化,这样的一个性质就会造成多变。一个很重要的区别就是,监督学习是在一个固定的分布上面来优化损失,这里假定我们过去的数据和我们将来要应用的数据来自于同一个分布,这样学出来的东西就是可用的。
在强化学习里面做决策时会碰到什么样的数据,实际上取决于做的决策是什么样的,这就使得我们很难在历史数据上面训练得到一个比较好的策略。比如说下围棋,我们选择的不同走法会把我们带到不同的未来,那么要找到最好的未来光靠一个固定的数据集就不太可行,比如说在阿法狗的第一个版本里面用了到人类下棋的数据集,但是在后面就没有用到。
我们光从一个固定的数据集上很难去找到一个最优的决策,那么如果我们不能从数据上面直接找到最优的决策,我们应该怎么做呢?
实际上就是要靠试错,也就是说要试试看,今天走到这一步拿到了80分,那么走到另外一步会拿到多少分?我们去尝试一下,看到了这个结果,才能知道拿到多少分,这样才能找到比较好的一个决策。
有这样一个区别以后,虽然我们看到强化学习也是通过大量的数据在学,但是这个数据是我们所谓的agent,也就是我们在环境里面主动采样出来的策略。所以如果说监督学习依赖的原料是数据集,那么强化学习依赖的一个原料其实是它学习的环境。所以这个环境的存在与否直接决定了我们的强化学习能不能高效的运行起来。
那么我们现在能看到的强化学习用的比较好的案例,比如说下围棋打游戏这样的案例,其环境都是已经给定的。那里面的所有规则都是非常清楚的,所以我们可以在计算机的环境里面进行大量的采样,那么我们可以取得达到人类专家、甚至是能够超越人类水平的效果。所以我们可以看到,当强化学习能够取得这样好的结果时,它所运行的环境是一个我们已经非常清楚的或者是一个封闭的环境。
如果想把它用在一个真实业务上面,我们就会面临很大的问题。首先需要强调的是很多业务问题、很多真实的应用都是需要做决策的。如果我们确实能够把现在做决策的这种能力放到各种应用中去,那么就能够比人做的好、比专家做的还好,那么我们自然会有很大的收益。但是如果我们去看具体的这些应用时,我们会发现它和打游戏很不一样的地方就是我们没有一个现成的做好的一个环境,在真实业务中的环境都是一些真实、开放的、一些边界不那么确定的一些环境。
那么我们能不能直接把强化学习用在这样的环境里面呢?实际上如果我们去看任何一个强化学习运行的过程,我们都会发现它需要很多的探索。所谓的探索就是我们要去试错,所以这也引来了前段时间对于强化学习能不能用的这么一些批评,有些观点认为它不能用,其实不能用主要指的是它在真实的环境里面很难用,但是在游戏这种封闭环境下面其实都是很好用的,而且能够达到很好的效果。
二、模拟器
针对这样的情况,我们应该想些什么办法能够把强化学习用在真实的环境里面呢。其实有一个很简单很直接的一个想法,那就是使用模拟器,模拟器就是强化学习所运行的环境,通过它我们就可以把强化学习跑出来并得到一个很好的效果。
那么如何得到这样一个模拟器,如何让我们的模拟器能够和我们的真实环境对应上?实际上这并不是一个很新鲜的事情。我们可以看到在制造业和工业界里面有大量的模拟器的工作,所以以往的模拟器大部分是基于人类的知识来进行构造的,也就是用人工来构造的。里面包括比较常见的机器人控制、流体动力学、物流:我们可以把物流的整个场景虚拟的建模出来;上面这些已经有很多人研究了很多年,其实就是为了把里面的动力学模拟做的又快又准。
虽然在很多场景上面可以做出来模拟器,但是它们精度还是存在一些不足的,特别是当我们的场景稍微有点复杂的时候,我们很难完全准确的去模拟这个场景。那么当它出现误差的时候,我们能不能使用这样的模拟器呢?实际上是可以的。现在有一些技术能够让我们基于这些人工构造的模拟器做出一些比较好的决策出来。
举一个例子,这是我们之前做过的一个关于机械手臂的控制。在真实环境下我们可能不太清楚机械手臂具体有多长,但是由于我们有一个类似的人造的环境,我们可以通过这个环境产生大量的不同机械手臂的长度,使得我们在不同的环境中训练我们的agent以用来适应这样的环境。所以我们在真实环境中学出来的模型可以对环境做少量的试探,做完试探后的结果可以用来刻画这个环境的样子,它就可以很快地把经验用起来去适应环境。
比如说上图左右是两个不同的手臂,刚才执行的5个动作就是在试探这个手臂到底是多长,实际上它并不知道手臂有多长,那么做了5个动作的适应以后就可以完成这个问题了。也就是我们把经验的模型重用起来来完成这个任务。可以看到,使用这样的方法之后,我们在环境里面做少量的几个试探后就可以一定程度的完成任务。 但是如果我们从头来训练这个任务,可能需要上百万的试错才能完成。所以这是一种能够利用人工的模拟器方式。
另外虽然人工的模拟器不是很准确,但是也能够给我们的学习进行加速。之前我们做过这样一个工作:在新机的环境下把各种强化学习的技术整合起来,来看我们能够把这个问题解决的多快。之前在19年的工作中,我们做过在训练两天后,能在一台计算机上面打败它的内置AI的这样一个实验。
其实我们可以做一个对于星际争霸游戏这样复杂的任务:我们可以把它抽象,先做一个人工的小的模拟器,里面只有几条简单的规则。通过这个模拟器进行预训练以后,我们再把它搬到复杂的大的游戏上面来。这样的一个做法可以使得我们在任何一台计算能力更弱的机器上面做到在一个小时之内学会打败他的内置AI,只需要几个迭代,就可以达到一个非常高的胜利。这也说明人工设计的模拟器实际上是有很大用处的。
但是同时我们还在想,如果模拟器一直是人工设置的,那它会面临很多问题。第一个就是在人工设置的过程中人力开销是很大的,另外一个就是人工设置的模拟器都定下来以后不能很好地跟随环境的变化而变化。所以如果我们能够从数据上面还原模拟器,就可以缓解这两个问题。
从数据上面去做模拟器就是在当前的状态下做一个决策,然后确定下面会进到哪个状态去,这个则是模拟器希望给出的一个答案。我们看到这个也是一个输入输出的模型结构。而且如果我们有一些历史的数据,我们历史上看到了哪些状态、做了哪些决策以后,它随之进入到了哪些新的状态去,这个看起来很自然的是一个监督学习任务。
那么是不是可以用监督学习来帮我们把模拟器建好?实际上在一些情况下面是可以的,比如说这个是去年一个做机器人的工作。这个机器人的实体控制靠收集的大量数据,然后从它的数据上去做一个监督学习,来把这个模型还原出来,然后再在还原出来的模拟器里面学会怎么去控制机器人。结果它的控制会变得像生物一样更自然一些。
但是这种用法实际上有一个条件:机器人在实验室的环境下能够完全掌控。换句话说,我们在实验室的环境下能够收集到大量的它在各种状态下面做出控制决策后的响应,这样的数据我们是能够收集得到的。收集到这样的数据以后,我们可以做一个监督学习来还原出一个模拟器出来。
虽然更多的时候我们面对的数据会更复杂,但是如果所有的决策空间都被我们遍历过,拿到这样的数据之后,模拟器也是可以学出来的,可能只是需要一些更复杂的神经网络模型而已。
其实我们在很多实际应用的环境下做过的决策很少,我们不可能把所有的角色全部遍历过。那么在这样的情况下面,我们还有没有可能把模拟器建好,这个是我们面临的一个最关键的挑战。在缺少大量的响应数据和它的决策情况下,我们有没有可能做好?
在这一方面我们可以先来看一下用简单的监督学习来做会有什么样的问题。我们假设真实的环境就是M*,我们会有历史上的一个采样策略,我们历史上去做一些决策,然后能够收集到一些数据。
我们把我们历史上做了哪些状态、有了哪些状态、做了哪些决策作为我们的输入,然后把它下面变到哪些状态作为我们的标记,那么我们可以简单的训练一个监督学习。比如说我们可以用 KL作为我们的目标来训练监督学习的一个模型,那么这样我们构造出来的模拟器会怎么样呢?
实际上从我们最新的结果可以看得到,当我们构建的模型在KL上面有一个损失有一个界限以后,可以看得到它最后的结果。也就是说我们在模拟器里面去评估一个策略和在真实的环境下面去评估一个策略,它们两个之间的差别有多大,就是下面这个式子所展现出来的。
那么这里特别想强调的一点,关于1-γ这一项是什么意思?γ实际上就是我们在学强化学习的时候每一步会有的一个γ的折扣,折扣通常会选像0.99或者0.999这样的一个比较接近于1的数字。那么1/(1-γ)实际上就是全部的长度加起来以后,它的折扣的权重一共能有多大,所以我们也把它叫做effective horizon。它是我们做决策能够看多远的一个评价。
在公式右边我们可以看到是effective horizon 的平方,这实际上是一个很大的数,如果我们用这样一个方法去学一个模拟器出来,我们面临的问题就是当我们多走了几步以后,它的误差会迅速的放大,会导致我们最后学出来模型的策略很难用。
有没有办法能够缓解这件事情呢?实际上我们可以把这种简单的监督学习换成对于我们分布的一个匹配。这里的分布指的是我们一直在环境里面去运行的策略,我们会不断的收集数据,我们一直运行下去以后,我们收集到这个数据会呈现一个什么样的分布?
如果只看状态那就是上图第一行的stationary state distribution,如果看状态和动作的,就是第二行的样子,如果再把这个模型的某一步的转移概率加上去就是state-action-next-state distribution。所以这里我们发现我们其实可以把我们的目标从简单的监督学习换成 distribution的matching,主要是做后面这一个matching也就是state-action-next-state distribution matching。
那么如果换成这样的一个matching以后,我们的算法应该怎么实现呢,之前我们有一些论文的发表,实际上也涉及到了这个方面的一种新的损失,一种新的目标的使用。总的来说,从idea上来说,实际上是可以通过对抗学习的方法来使我们的distribution matching(分布匹配)做的比较好,那么如果我们换成这样的一个目标以后,我们能得到一个什么结果?
上面的设置和前面简单的监督学习是一样的,我们能得到的结果就是我们去掉了其中的γ一项的平方,就会使得我们这一项的误差降低1000倍以上。那么这个是我们这个理论上面的一点进步,实际上还有很多关于模型学习的问题没能得到完全的回答。但是我们在算法应用上面实际上已经做了一些尝试,所以下面我们就想做一些抛砖引玉,然后看看我们之前实践过的一些环境上面做出来的一些应用,希望能够给大家一些启发。
三、应用
1. 淘宝搜索
这个地方要做的决策是什么呢?就是来了一个用户的搜索请求以后,我们需要展示一个商品以及商品的顺序。以往的做法大多数是以预测的方法来做的,也就是说我们过去哪些人点击了哪些东西,然后我们总的来说是把这样的一个数据作为一个监督学习的方式来进行利用,然后把学到的模型拿到今天的场景下面来做推荐。
这里我们考虑到,对用户而言,实际上以什么样的顺序去呈现这个商品会带来很大的影响。我们想做决策,但是又不想去干扰真正的用户,所以我们这里的一个路径就是用历史上用户的数据来学一个模拟器出来。这个模拟器里面是虚拟的用户,所以我们在模拟器里面推荐一些商品以及商品的顺序出来,然后虚拟的用户就会来买,会点击或者是跳过去,那么我们就可以在模拟器上面去寻找怎样的方式能够有更好的销售,能够让用户有更好的体验。
之前我们做了实验的效果,在模拟器里面我们的GMV提高了4个点。然后我们就想在模拟器里面做的结果能不能拿到真实的环境下面直接去试试看,因为这是我们做的第一个应用例子的环境。
实际上在上图右下角显示的就是真实的淘宝数据分布和我们的模拟器里面生成的数据分布,红色的是真实的,蓝色的是模拟器的,可以看到它们已经比较接近了。所以我们当时也是把模拟器里面训练出来的决策的模型,比如说怎么去做推荐的模型,直接放到了真实的环境下面去做测试。AB测试的结果显示处比最好的baseline提高了两个百分点。所以这个可以看得到我们即使是没有做任何的迁移、没有做任何的环境的扰动这些事情就直接把这个模型拿出来,也是在一定程度上是可以用的。
2. 在线购物
这个例子实际上和淘宝是比较像的,它也是一个在线购物的环境。但它要做的事情是在另外一个侧面,也就是怎么样去设计这个商品才能够更好地去满足我们的消费者。这里以冰箱举例,冰箱有很多属性,消费者可能更喜欢哪些属性呢?
我们的做法其实是一样的,我们把这个买家虚拟出来,然后我们去调整商品的属性,我们可以看到下面是一个实验的结果,橙色的柱子是现有的在数据上面的商品的一个分布,蓝色的是我们在模拟器里面寻找到的更好的一个分布。
比如说我们看第一个图上面,它会预测现在卖双开门的冰箱比较多,但是实际上我们的模拟器里面求解出来的结果认为喜欢的用户可能不是那么多,反而是对开门的冰箱可能会卖得更好。
这个例子就是在右上角画的这两个冰箱。
3. 滴滴出租车
这里要做的事情是如何给司机推荐一个他的program和plan,然后能够使得司机的收入尽可能的增加,这里我们的做法也是类似的。
我们从历史的数据里面去把司机的虚拟模型学出来,这就是我们的模拟器。然后我们在模拟器里面给司机安排一些程序使得司机的收入能够提高。我们在去年4月份的时候完成了这个事情的线上测试,在线下的我们自己测试的时候差不多提高了13个点左右的完单量,然后在线上测试实际上提高了11个点多的完单量,同时还提高了司机的8%的这么一个收入,这也是一个有意义的应用环境。
4. 仓库派单
在这个仓库里面,我们实际上要做的是在一个仓库里面进行一个派单的这样一件事,这是很小的一个环节。在这个环节我们要把很多订单给一个工人,工人拿订单去把我们下单的商品放到袋子里面去,那么把哪些订单给同一个工人去拣货,这就是一个优化的问题。
以往在物流场景上面的做法通常是运筹学这种传统的做法,它首先需要去制定目标,这个目标怎么制定呢?以往的做法就是我们去把地图给拉出来,然后我们看每一个商品在地图上放在什么位置,然后我们就按照这个商品在地图上的位置规划出一个最短的路径来作为指标给工人进行派单。但是如果是针对人造的地图来进行这么一个派单,有很多细节其实没有办法体现进去。
比如说工人拿货的时候有不同的高度,这个货物有不同的重量和不同的形状,这些实际上都会影响他拣货的效率。如果我们只是看地图的路径长度,则就会忽略掉这些因素。所以用我们的方法来做的时候,也是从数据上面去把这个功能给还原出来,所以我们就会有虚拟的功能,然后我们就给虚拟的工人来派单,然后看这个虚拟功能它怎么派会完成的时间会最少。这个事情做完了以后,我们去年5月份的时候在这个仓库里面做了对比实验。这个对比就是现有的系统派一单、我们的系统派一单,对比的6天下来,我们可以看到上面的数字显示的是:针对每一个商品,工人去拣货平均下来的时间是多少秒?6天平均完以后,我们可以看到我们的效率提升了10%以上。
5. 砍价机器人
有人买东西的时候经常会砍价,那么我们能不能自己做一个机器人出来和那个人来砍价,目标可能是希望我们的这个二手货平台的成交率要尽可能的高。
这个是当时在云栖大会上的一个展示,这里面还涉及到一些别的像自然语言处理不是我们做的,我们做的是里面的砍价策略。当对方出了一个价之后,我们要决定是卖了还是说我们要还一点价。所以我们这个实验做完了以后,我们和人去比砍价,要比历史数据上面的成交率提高一倍。
我们在历史数据上面去学出来一个买家,然后这个买家来和我们砍价,所以在模拟器里面就有很多买家来和我们砍价,然后我们就和买家来学习我们怎么砍价使它的成交率会更高。
四、总结
以上的这几个案例希望能够抛砖引玉、给大家一些启发。另外我们在做了这些实践以后,现在做一个总结,看看对于在真实场景下面做决策这件事情,我们都有哪些做法。
1. 人直接来做决策。人们亲自来做决策来使目标最优化,这可能是最原始的做法。
2. 人为设定模拟器。在模拟器里面去求解最优的决策,然后把它放到真实的环境去用。这样的好处就在于我们有了模拟器,我们可以用很多算法来求解最优的决策。
3. 用预测的方法来替代决策。比如说以前做推荐系统基本上是从数据里面来做一个预测,然后将预测的结果交给人或者人做的一个规则,以此来把它变成一个决策的结果。举个例子就是我们在做推荐的时候通常会有一个预测模型,然后它能够告诉我们什某样商品购买率可能是多少,然后我们就按照购买率从高到低来把它展现出来,把商品展现出来。
实际上在真实的系统里面已经看到从高到低这个规则已经不是一个最优的规则了。实际上我们在用预测来解决决策问题的时候,中间都有一个转换。但是如果我们把第二种方式和第三种方式进行对比就会发现第三种方式很好的一个地方就在于它是从数据出发的,当环境发生变化时,它能够适应得上,但是它的缺陷就在于他没有办法去寻优,没有办法自己去寻优,因为它没有一个模拟的环境。
4. 数据驱动的模拟器。我们首先具有从数据出发这样的一个优势,我们可以根据数据来适应环境。另外我们可以在模拟器里面去寻找最优的决策,所以这一条路线有可能实现人不在回路里面。
上面的前三种方法都是人在环境中、在整个过程中起到关键的作用。而第四种方法人则是可以在旁边,这不代表人不做监管,所有的决策当然都是需要符合我们设计者的目标,但是它可以完全自动运行,这也是我们现在希望能够完全实现的一条路径。