本周多篇机器学习用于推荐系统的大科技文摘

有选择地从科技公司的工程博客中挑选了博客文章:

[Meta]扩展 Instagram Explore 推荐系统 
讲述了一个关于使用先进机器学习模型(如两塔神经网络)使 Instagram 推荐更具可扩展性的故事:

  • Explore是 Instagram 上最大的推荐系统之一。
  • 我们利用机器学习来确保人们始终看到最有趣且与他们相关的内容。
  • 使用更先进的机器学习模型,例如两塔神经网络,我们已经能够使 Explore 推荐系统更具可扩展性和灵活性。

为了构建一个能够从数十亿个可用选项中实时向人们推荐最相关内容的大型系统,我们利用机器学习 (ML) 引入任务特定的领域特定语言 (DSL) 和多 语言阶段性排名方式

两塔模型扩展了 Word2Vec 算法,允许我们使用任意用户或媒体/作者特征,并同时从多个任务中学习以进行多目标检索。这个新模型保留了 Word2Vec 的可维护性和实时性,这使其成为候选源算法的绝佳选择。

以下是双塔检索与模式的一般工作方式:

  1. 双塔模型由两个独立的神经网络组成——一个用于用户,一个用于物品。
  2. 每个神经网络仅消耗与其实体相关的特征并输出嵌入。
  3. 学习目标是预测参与事件(例如,某人喜欢某个帖子)作为用户和项目嵌入之间的相似性度量。
  4. 训练后,用户嵌入应接近给定用户的相关项目的嵌入。因此,接近用户嵌入的项目嵌入可以用作排名的候选。 

两塔方法的主要优点是可以缓存用户和项目嵌入,从而使两塔模型的推理极其高效。

我们还可以直接使用项目嵌入来检索与用户交互历史记录中类似的项目。

检索到候选者后,系统需要根据用户的价值进行排名。

  1. 第一阶段排序器(即轻量级模型),精度较低,计算强度较低,可以召回数千个候选者。
  2. 第二阶段排序器(即重模型),更加精确且计算密集,并且对第一阶段的 100 个最佳候选进行操作。

最终还需要重新排名:应用业务规则使我们能够更好地控制最终推荐,这有助于实现更好的在线参与度。

[Swiggy]预测购物车的送餐时间
您在上班的路上打开 Swiggy 应用程序,导航到您最喜欢的咖啡店的菜单,然后将您最喜欢的咖啡添加到购物车。在您付款并确认订单之前,您会在购物车页面看到熟悉的景象 - 预计交货时间位于顶部,让您知道订单需要多长时间才能送达。

对于大多数客户来说,这是一个核心决策变量。

承诺的交货时间是客户下订单时决策过程的关键数据点。这也是一把双刃剑。如果订单延迟,顾客最终会不高兴。但如果交货时间承诺保守,就会降低客户下订单的倾向。

鉴于准确预测送餐时间的重要性,人们自然会问如何实现这一目标。交货时间受到许多不同因素的影响

  • 餐厅类型——云厨房准备食物的速度总是比传统餐厅更快
  • 订单中的商品数量 - 商品数量越多,准备订单所需的时间就越长
  • 订单中的菜肴种类 - 准备披萨比包装冰淇淋需要更多时间
  • 送货主管 (DE) 的可用性 - DE 可用性较低将导致 DE 分配较晚,并且很可能会行驶更长的第一英里(到餐厅)距离
  • 餐厅与顾客的距离——来自较远餐厅的订单将需要更多时间才能送达

所有这些因素以及订单所在的地理位置都相互作用。例如,班加罗尔晚高峰期间的出行时间与古尔冈有很大不同。为了准确预测交货时间,需要考虑所有这些因素及其相互作用。问题的复杂性使得机器学习 (ML) 模型成为解决该问题的明显选择。

为了对目标变量进行建模,我们使用MIMO(多输入、多输出)深度学习模型并辅以实体嵌入。

这些设计选择如何改善了我们的客户体验。

  1. 转向具有共享输入和隐藏层的 MIMO 网络设计帮助我们将训练内存占用减少了约 50%。这使我们能够在内存中训练模型,将训练时间减少到近五分之一。
  2. 由于相互依赖的结果的共同优化,我们还看到 O2A 预测的 MAE 提高了近 30%。这有助于我们的异常管理系统更有效地从 DE 分配的延迟中恢复。
  3. 模型内嵌入的引入帮助我们将整体 MAE(O2R 时间)减少了 5%。

[Expedia]在 Monorepo 中快速安全地合并代码 
描述了一种在使用 monorepo 时扩展 CI 基础设施的方法,作者:Dan Adajian


[DoorDash]《DoorDash 如何从 StatsD 迁移到 Prometheus》 
由多位作者概述了 DoorDash 在 StatsD 方面面临的挑战以及他们向 Prometheus 的迁移之旅

在使用基于StatsD的旧指标基础设施时会出现高峰流量故障。就在我们最需要可观测数据的时候,系统却让我们陷入困境。
这就是为什么我们决定将可观测性技术堆栈迁移到基于 Prometheus 的监控。随着我们继续使用Prometheus扩展 DoorDash 的业务让我们消除指标损失,扩大指标使用范围,标准化指标标签,并显着降低总体成本。

[Meta] Fixit 2:Meta 的下一代自动修复 linter,
作者:Amethyst Reese
Python 是 Meta 使用最流行的语言之一。Meta 的生产工程师 (PE) 是专注于可靠性、效率和可扩展性的专业软件工程师 (SWE)。

Meta 的 Python 语言基础团队是一个由 PE 和传统 SWE 组成的混合团队,帮助拥有和维护 Meta 的 Python 基础设施和工具。该团队支持工程师、数据科学家、研究人员和 Meta 的任何其他人使用 Python 完成工作。

我们实现这一目标的方法之一是构建工具,使 Python 开发人员能够更有效地编写更好、更可靠的代码。其中包括 自动格式化和 导入排序等工具,这些工具可以消除单调乏味的工作,也可以使用 linter 来指导工程师开发可维护且错误更少的代码。


[Databricks]结构化流中的多个状态运算符
作者:Angela Chu 和 Jungtaek Lim
在数据工程领域,自 ETL 诞生以来就一直在使用一些操作。你过滤一下、加入、聚合,最后,你输出结果。
虽然这些数据操作随着时间的推移保持不变,但延迟和吞吐量要求的范围却发生了巨大变化。一次处理几个事件或每天处理几千兆字节将不再适用。
为了满足当今的业务需求,每天需要处理 TB 甚至 PB 的数据,作业延迟以分钟和秒为单位。

Apache Spark中的结构化流是领先的开源流处理引擎,针对大数据量和低延迟进行了优化,它是使 Databricks Lakehouse成为[url=https://www.databricks.com/product/data-streaming]流式处理[/url]最佳平台的核心技术。得益于Project Lightspeed提供的增强功能,现在您可以在单个流中执行所有这些经典数据操作。

从 Databricks Runtime 13.1 和即将发布的 Apache Spark TM 3.5.0 版本开始,流可以包含多个有状态运算符。不再需要在连接后写入接收器,然后将数据读回到另一个流中进行聚合。在一个流中执行连接和聚合而不是将其分解为多个,可以降低复杂性、延迟和成本。

[Cloudflare] 2023 年第 2 季度互联网中断摘要