Snap:如何加速推荐系统的特征工程


开发人员提高特征工程的速度是许多公司快速迭代和构建 ML 应用程序的重点。沿着Airbnb 的 Zipline和 Uber 的Michelangelo Palette的路线,Snap 撰写了关于其内部功能自动化框架 Robusta 的文章。

Snap 的特征工程挑战
对于许多 Snap 团队来说,提取建模信号一直是一项高难度的活动。从历史上看,团队仅依赖于需要在关键服务组件中实现和记录功能的前向填充过程。然后,他们在训练任何模型之前等待特征日志数周。
随着时间的推移,这个过程被证明是一个主要瓶颈:

  1. ML 工程师通常不熟悉在线服务组件,接触它们是有风险的。另一方面,委派给基础设施工程师会引入协调开销。
  2. 判断一个功能是否有用的周转时间非常长。
  3. 每个团队都构建自己的具有重叠功能的基础架构。虽然拥有更多工程资源的团队可以构建更复杂的系统,但较小的团队无法轻松访问更高级的功能。此外,几乎不可能共享功能。

正是在这种背景下,我们开始问自己:我们能否让 ML 特征工程变得更容易?

Robusta
功能自动化框架 Robusta(以咖啡豆命名)是我们解决痛点的初步尝试。它侧重于关联和交换聚合特征。这些特征在我们的 ML 应用程序中被广泛使用,有时占 ML 模型中超过 80% 的信号。关联和交换属性对分布式系统非常友好,允许我们做出方便的假设。事实上,业内许多公司都有类似的系统,例如Airbnb Zipline [1] 和Uber Palette [2]。我们从他们那里得到了很大的启发。
在设计和实施 Robusta 时,我们必须克服的一些显着挑战是:

  • Velocity:如何通过单一的声明性功能规范端到端启用新功能,无需手动服务部署,也不会给 ML 基础架构带来风险。
  • 规模:典型的 ML 用例具有数千个具有不同属性的聚合功能。例如,它们可能有不同的滑动窗口,有时按用户 ID 聚合,有时按快照 ID 或多个键的组合(即用户 ID + 发现频道 + 一天中的小时)。有些操作可以很容易地表示为关联和交换操作,但也有一些操作需要一些工作来调整和适应。我们需要设计一个框架来实现这些可能性,同时每天有效地处理数十亿个事件。
  • 正确性:如何支持近实时特征的离线生成,也就是解决所谓的时间点正确性问题 [3]。我们必须回答在线推理时的特征值是什么。当我们拥有可以以分钟级粒度更新的滑动窗口功能时,这尤其具有挑战性,因为对于大多数用户来说,即使没有任何新的参与事件,随着时间的推移,特征值可能每分钟都在变化。

我们将在以下部分深入探讨这些问题。

详细点击标题