在Uber通过机器学习在模拟市场中获得洞察

0
在Uber通过机器学习在模拟市场中获得洞察

在优步,我们使用市场算法来连接司机和乘客。在这些算法在全球推广之前,优步会对它们进行全面测试和评估,以创建一个最佳的用户体验我们的核心市场原则

为了让产品测试更安全、更简单,优步市场模拟团队建立了一个模拟平台,该平台拥有一个由司机、合作伙伴和乘客组成的模拟世界,模拟现实世界中的场景。利用基于代理的离散事件模拟器,该平台允许Uber Marketplace工程师和数据科学家在无风险的环境中快速创建原型并测试新功能和假设。

模拟器利用历史数据来运行两个重要组件的模拟:市场服务和用户行为模型。市场服务利用这些见解来制定调度决策。用户行为模型使用模拟环境来确定乘客和司机的决策,例如行程取消和导航选择。

为了使模型部署和训练更容易、更准确,Uber的市场模拟团队构建了一个机器学习(ML)框架,可以在模拟平台上无缝地构建、训练和服务模型。由于它提高了仿真精度和真实感,ML在预测我们的仿真平台上的用户行为方面发挥了重要作用。事实上,我们平台上的大多数模拟用户行为都是基于模型的,并使用匿名聚合的历史数据进行训练。仿真还有助于开发和改进ML模型。新模型可以安装到我们的仿真平台上,并在推出到生产服务之前快速迭代。

我们的团队设计了一个ML模型训练框架,使用户能够在我们的仿真平台上快速构建和部署模型,同时通过仿真改进我们的ML模型。

仿真平台机器学习框架

ML是模拟平台中越来越多重要特性的核心。在我们将ML框架引入仿真平台之前,ML开发、培训和服务主要由临时的、不可重用的解决方案组成。例如,ML开发人员直接在模拟器中实现ML模型,并在模拟器运行时对模型进行实时训练。

随着开发人员实现多个模型并添加模型版本控制,这些一次性解决方案很快就在模拟器中积累了复杂性。模拟器变得难以维护,这些不同的模型需要大量的RAM和CPU资源进行训练,这导致模拟器性能下降。在这些类型的场景中,为每个模型定制从上到下的训练和服务代码是不成立的。

仿真团队开始构建一个单一的、高效的、可重用的框架,用于在我们的仿真平台上提供大多数ML训练和工作负载。我们的框架提供了开源系统和内部构建的组件的组合。它在四个层面上运作:

  • 由api和模块组成的Python ML库,用于在仿真平台上构建ML模型
  • 一个自动训练管道来训练模型并将它们保存到二进制文件中
  • 管理所有模型元数据的后端服务
  • 模拟器中的集中式模块,用于将选定的模型加载到仿真中

在我们的模拟ML框架训练工作流中,训练管道导入Python ML库,使用Apache Spark从Apache Hive中获取和处理原始数据,并根据历史时间序列数据自动训练模型。一旦管道完成了该数据的训练,它将其元数据发送到模拟数据库和检查点模型实例,然后将二进制文件保存在Uber的存储服务中。

在我们的模型服务工作流中,当我们的模拟后端服务接收到创建模拟的请求时,它会根据请求中的用户设置获取相关ML模型的元数据,并使用元数据将模型检查点下载到本地磁盘。之后,仿真后端服务开始运行模拟器,其中有一个模型工厂。然后,模型工厂导入其Python ML库并扫描本地磁盘中的检查点,在那里实例化相关模型并将实例输出到模拟核心流。

下图1和2展示了机器学习框架的训练和服务流程:

图1。自动训练管道(中)使用Spark(上图)从Hive中获取原始数据,并使用仿真ML模型(左)将数据保存到存储服务(右)和仿真数据库(下)。
图2。要创建一个模拟,程序首先请求一个模拟(左上)。接下来,它获取后端服务模型元数据并将其输入到数据库中。然后,数据库根据该元数据从其存储服务获取检查点,并将检查点下载到其磁盘。这些检查点然后与模拟器中的仿真ML模型(中间上方)结合,其中Model Factor将模型实例化到核心流中。

在这个框架中,我们在很大程度上解耦了培训和服务工作流。这种变化为模型开发人员提供了不断发展模型所需的灵活性。有了这个系统,如果开发人员想要改变用户行为模型,他们所要做的就是更新Python ML库中的实现。然后,框架将自动触发训练管道,并将最新模型填充到所有模拟器。

通过从模拟器中移除模型训练工作负载,我们简化了模拟器的复杂性,从而显著提高了它的RAM和CPU使用率。此更改还增加了模拟器的吞吐量。这些简化结合起来节约了硬件资源并提高了系统效率。

市场模拟团队已经使用这个框架以标准化的方式将几个用户行为和其他ML模型集成到模拟平台上。

供给运动模型如何改善市场模拟

正如由最近雷竞技是骗人的在拼车仿真中,驾驶员的运动是影响仿真精度和真实感的主要因素。在Uber的市场模拟平台上,实验性的市场算法导致了反事实匹配,导致司机的移动与现实世界历史数据中反映的不同。例如,模拟中的司机可能会与现实中不同的车手匹配。在这种情况下,模拟器不能简单地重复使用驾驶员的历史动作来模拟路线、行程长度和下车位置。为了解决这个问题,我们知道我们需要建立一个模型来精确模拟驾驶员的移动行为。有了合适的运动模型,我们可以增强骑手行为模型(例如,骑手取消模型),并减少匹配和定价算法中的噪声,我们这样做是为了确保这一点我们的市场原则是支持。

准确地模拟每个司机的动作是一项非常具有挑战性的任务,因为模拟世界运行在有限的历史数据上,缺乏许多可以影响用户行为的因素,如交通信息、天气和地理数据。

幸运的是,对于大多数Marketplace算法来说,单个驾驶员的移动不会对算法结果产生显著影响。这些算法利用了司机的总体分布,而不是单个司机的运动,特别是在乘客-司机匹配和定价算法上。出于这个原因,我们没有试图完美地模拟每个司机的动作,而是建立了一个模型来准确地模拟司机的分布。

为了在模拟世界中实现我们的目标,我们将在线司机的移动行为分为两种状态:行程中和行程外。我们根据这两种状态下司机的不同行为创建了一个混合模型,如下图3所示,以更好地预测Uber市场的用户需求:

图3。我们的驱动程序移动混合模型从一个模拟其移动的驱动程序请求开始,然后通过一系列分支“是/否”选项来得出结论,将驱动程序信息发送到路由引擎,估计驾驶速度,并在路线中移动模拟的驱动程序。

我们应用了一个基于规则的出行司机模型。当模拟司机接受一段行程时,该模型使用路由引擎引导司机沿着他们的路线到达预定的目的地。

模拟偏离行程的驱动器分布要困难得多。如前所述,模拟世界通常不能准确地再现历史驱动器的运动。因此,我们使用ML模型和历史数据来预测汇总的司机行驶情况。使用生产级算法,该模型模拟了开放驱动的分布,尽可能接近历史分布。我们训练了一个基于树的随机模型,以实现我们的目标,准确地模拟离车司机分布。下面的图4、5和6提供了该模型如何工作的示例:

图4。我们的随机模型的一个决策树结构用于模拟偏离行程的司机分布,从顶部的“司机是否在高峰时段”开始,并使用一系列“是/否”分支在底部产生叶节点。

当模拟想要预测一个非行程驱动程序的目的地时,它使用开放驱动程序的信息(例如位置、时间戳等)从树模型中获取相关的叶节点,如图4所示。叶节点包含一个预测模拟驾驶员未来运动的转换矩阵。在我们的模拟平台中,我们将地球的区域划分为可识别的网格单元H3,我们的开源六边形、层次空间索引。通过使用这些可识别的网格单元格,我们定义了我们的转换矩阵,如下图5所示:

图5。这个概率表(有三行和三列,分别标记为垂直和水平网格单元格1、网格单元格2和网格单元格3)显示了各种网格单元格的概率值,这些网格单元格表示地球上的位置。

转换矩阵中的值描述了假设驾驶员当前在网格单元X中,驾驶员将移动到网格单元Y的概率。

通过使用这种类型的转换矩阵,模拟可以预测开放驱动程序下一步可能移动到哪个单元。之后,模拟随机选择该单元格内的一个位置,并将其分配为开放驱动程序的目的地。下面的图6演示了这个过程:

图6。此流程图从叶节点开始,使用映射来解释模拟如何获取可识别的网格单元来精确定位驾驶员,移动到另一个突出显示的映射,以显示模拟如何使用转换矩阵计算驾驶员移动概率,并以第三个映射结束,以显示模拟如何选择一个位置作为驾驶员的目的地。这是我们基于树的预测司机目的地的随机模型。

一旦模拟器预测到开放驾驶员的目的地,它就会估计出驾驶员的路线和速度,然后将驾驶员移到目的地。旅行司机和旅行司机之间的一个关键区别是,开放司机在开车到目的地时可能会改变他们的状态(离线/被派遣)。

使用混合司机移动模型,我们的市场模拟平台获得了真实世界中司机分布的准确近似。我们使用相同的算法将这些分布与真实世界的分布进行了比较。下图7显示了高峰时段驱动程序分布对比:

图7。左边的地图突出了现实世界中司机分布的区域。右边的地图模拟了同一地区的司机分布情况。由于我们模拟的准确性,地图几乎是相同的。

模拟如何帮助我们实验匹配算法

优步的平台通过匹配算法将乘客和司机实时连接起来,匹配算法优化了各种因素,包括到达时间、路线、用户位置、行程偏好和价格。

基于最近雷竞技是骗人的在美国,拼车项目经常使用大规模组合算法来优化用户匹配。然而,随着拼车需求的多样化,这些算法必须考虑越来越多的因素。为了适应不断增加的匹配复杂性,我们的团队将机器学习(ML)模型集成到优化算法中,以提高仿真吞吐量。我们使用推荐系统和最大二部匹配的组合。我们在图8中描述了我们的整个工作流程:

图8。这张图的上半部分代表了推荐系统,它通过几个步骤来缩小和排名司机。推荐系统的流程图首先为每个车手找到所有可能的司机,将司机选项缩小到数百个,生成链接,将司机选项缩小到数十个,然后,当司机选项少于10个时,对它们进行排序。一旦这个过程完成,一个箭头显示这些建议进入匹配阶段。起初,算法可能会将多个车手与单个车手联系起来,但使用最大二部匹配算法,我们将单个车手与单个车手配对。

在我们的匹配解决方案中,推荐系统为每个车手推荐几个车手,每对车手都有分数。基于推荐结果,我们构造了一个具有加权边的二部图,该图匹配了一个驾驶员和一个骑手。我们采用最大二部匹配算法有效地解决了这一问题。

开发仅基于乘客和司机位置的推荐系统是一个挑战。由于缺乏特征,在没有其他上下文的情况下,使用传统的协同过滤、因数分解机或深度神经网络构建推荐系统是不可能的。为了解决这个问题,我们研究了大规模的社交网络推荐,它们也遇到了同样的挑战,并为它们设计了有效的解决方案(如所述)新一代电脑系统康奈尔大学,以及并行计算语言和编译器国际研讨会).

经过全面的研究,我们决定使用社交网络已经实现的解决方案之一来设雷竞技是骗人的计我们的推荐系统:图表示学习而且链路预测模型.如图8所示,我们构建了一个基于骑手和车手位置将顶点描述为骑手和车手的图表。我们使用一些规则约束,如车手ETA和车手与车手之间的距离,根据车手和车手之间的路线创建了图的边缘。在仿真器构建图后,我们可以根据历史调度结果预测每条边的得分。

然而,在构造的图中,每个节点和边的信息都是非常有限的,因为它只包含位置和路线。受图表示学习方法的启发比如GraphSAGE,我们从邻居处汇总信息,为每个节点提取足够的特征,如下图9所示:

图9。较大的外圈骑手节点使用从邻居到骑手节点再到较小圈内的驱动节点的聚合特征信息,然后再次聚合以将选择范围缩小到一个骑手节点。

这些特征反映了每个节点附近的网络结构信息。此外,我们将一些连续特征归一化,并将其嵌入到特征向量中,使我们的模型更具通用性,更具仿真性最近的研究雷竞技是骗人的

我们最终确定的用来预测每一对的分数的模型是带有dropout的梯度增强树.由于训练数据的很大一部分是负对(其中驾驶员和骑手不匹配),所以在训练模型之前,我们对负对进行下采样,对正对进行上采样(其中驾驶员和骑手匹配)。

在训练模型后,我们用它来预测每个车手的前k名潜在车手,基于他们的配对分数。在这种情况下,根据预测结果,每个车手都将被链接到多个车手,一个车手也可以被链接到多个车手。然后,我们构造一个基于链接的二部图,并应用a最大二部匹配算法解决二部匹配问题,实现最小平均驱动ETA。

前进

通过使用我们的ML框架逐步将ML模型集成到仿真平台中,我们可以在仿真中测试更多的用户行为和实验性市场算法和特性。该系统有助于Uber加快开发进程,提供安全可靠的运输产品。

在未来,我们打算通过以下特性来增强模拟ML框架:

  • 超参数自动调优。ML模型包含许多超参数,如学习率和树深度。调优这些超参数非常耗时且容易出错。我们计划将超参数调优工具集成到我们的模型培训管道中,以提高模型开发人员的生产力,并使工程师的工作更容易。
  • 在线模型性能监控。仿真平台上的大多数ML模型都直接受到时间、位置等环境因素的影响。随着时间的推移,模型性能会下降,因为模拟中的环境(例如交通模式)会发生变化。为了保持我们的模型在这些轮班期间的准确性,我们的模型需要用新数据重新训练。在线模型性能监测系统可以监测模型服务性能,并在性能低于一定阈值时触发训练管道。
  • 分布式机器学习服务。Uber的工程师正在将越来越多的机器学习模型集成到仿真平台中。因此,我们当前的框架遇到了计算资源短缺,这导致预测的延迟显著增加。因此,仿真吞吐量变差。一个高性能的分布式ML服务组件可以帮助解决这个问题。
  • 可配置的机器学习模型开发。仿真平台中的大多数机器学习模型共享公共组件,例如数据处理逻辑和底层机器学习算法。为了简化大多数用户的模型开发过程,我们计划构建一个配置驱动的模型开发框架。它可以根据仿真用户的输入配置构建行为模型。

这些只是我们进一步改进模拟机器学习平台并确保其平稳运行的计划中的一部分。

如果您有兴趣与我们一起塑造交通运输的未来,请考虑申请一个角色在乳房!

Adam Hotz和qiyi Wang也对本文有贡献。

评论

没有帖子显示