用于实现近乎实时匹配的机器学习系统的架构

本文档可让您了解机器学习 (ML) 解决方案的架构,此解决方案可学习和提供内容嵌入。嵌入有助于您理解客户认为相似的商品,从而在应用中提供实时的“类似商品”建议。

本页详细介绍了解决方案架构。如需查看有关实现解决方案的说明,请参阅 bqml-scann GitHub 代码库中的解决方案自述文件。

此解决方案介绍如何识别数据集中的类似歌曲,然后使用此信息提供歌曲建议。

本文档适用于想要构建机器学习系统以实现商品匹配和推荐用例的数据科学家和机器学习工程师。假设您拥有以下技术经验:

示例数据集

此解决方案使用公开的 bigquery-samples.playlists BigQuery 数据集,该数据集包含超过 1200 万个播放列表记录。它会根据播放列表数据,基于歌曲与播放列表中的共同出现次数学习这些嵌入。然后,它会使用学到的嵌入来根据给定的歌曲识别和推荐相关歌曲。

清除数据以移除缺少标题或 ID 的曲目后,数据集将包含 10 万首以上的歌曲,每首歌曲至少存在于 15 个播放列表中,有 50 万个以上的播放列表,每个播放列表分别包含 2 到 100 首歌曲。

解决方案架构

机器系统使用四个主要组件来执行实时相似性匹配和检索任务:

  • 一个组件,用于学习可捕获歌曲语义相似性的内容嵌入。为此,本解决方案使用 BigQuery ML 矩阵分解模型。
  • 项嵌入查询组件,它返回与给定歌曲 ID 对应的嵌入向量。此解决方案使用 Keras 模型来提供此信息。模型的预测函数接受一个或多个项 ID 并返回相应的嵌入向量。
  • 嵌入式匹配组件,可将最相似的嵌入向量映射到给定的嵌入向量,然后将这些返回的矢量映射到相应的歌曲 ID。您可以通过设置变量来确定相似向量的数量。该解决方案使用 ScaNN 框架框架创建近似邻域 (ANN) 索引,以识别大型项目中的类似项集合。ANN 索引部署为模型,以便可以实时查询。我们之所以选择此方法,是因为这种方法比扫描所有嵌入更可靠,但查找输入项嵌入向量的最近邻近项(如果有数百万项,这将变得不那么麻烦)。
  • 商品信息查询组件,用于为返回的歌曲 ID 提供歌曲名称和音乐人信息。此解决方案使用 Datastore 数据库来快速查找歌曲信息。

机器学习系统的工作原理如下:

  1. 将公共数据集数据导入您创建的 BigQuery 数据集。
  2. 使用 Dataflow 将歌曲标题和艺术家信息导出到 Datastore。当系统推荐歌曲时,这使得歌曲信息可用于实时查找。
  3. 使用 BigQuery,根据播放列表中的歌曲出现顺序,计算歌曲之间的逐点互信息 (PMI)
  4. 创建一个 BigQuery ML 矩阵分解模型,该模型使用 PMI 信息学习歌曲的嵌入。
  5. 使用 Dataflow,将嵌入格式化为 CSV 文件,并将它们从 BigQuery 导出到 Cloud Storage,以供查找。
  6. 创建 TensorFlow Keras 模型以查找歌曲嵌入并将其部署到 AI Platform Prediction。
  7. ScaNN 框架与 AI Platform Training 结合使用,可实现歌曲嵌入的近似邻域 (ANN) 索引。此索引创建为模型并在 AI Platform Training 中进行训练。
  8. 将 ANN 索引模型封装在 ScaNN 匹配服务应用中。
  9. 使用 Cloud Build,将 ScaNN 匹配服务打包为自定义容器,并将其部署到 AI Platform Prediction。

您也可以创建一个 TensorFlow Extended 流水线来自动执行系统。如需了解详情,请参阅流水线实现

下图简略展示了解决方案架构:

显示内容嵌入解决方案架构的图表。

解决方案工作流

部署后,此解决方案的工作原理如下:

  1. 客户端上的客户操作触发了对与给定歌曲相似的歌曲的请求,并将该歌曲的 ID 发送到 ScanNN 匹配系统。
  2. ScanNN 匹配系统将歌曲 ID 发送到嵌入查找模型,并获取该歌曲的嵌入。
  3. ScanNN 匹配系统将歌曲嵌入发送到 ANN 模型,并获取歌曲的近似最近邻的嵌入。
  4. ScanNN 匹配系统将返回的嵌入映射到相应歌曲 ID。
  5. ANN 模型会将类似歌曲的 ID 返回给客户端。
  6. 客户端使用这些 ID 从 Datastore 检索歌曲名称和艺术家信息以供显示。

流水线实现

您可以选择使用 TensorFlow Extended (TFX)(一个自动化机器学习系统的自动化框架)自动执行解决方案。TFX 流水线以可扩缩的方式提供机器学习系统的一系列组件,这些组件可扩缩且性能良好。组件是使用 TFX 标准组件自定义 Python 函数组件完全自定义组件进行构建。如果需要,您还可以在流水线之外使用这些组件。

您可以在 AI Platform Pipelines 上部署和执行 TFX 流水线。每个流水线组件都在对应的 Google Cloud 服务上执行,包括 BigQuery、Dataflow 和 AI Platform Training。流水线元数据存储在 Cloud SQL 上托管的机器学习元数据 (MLMD) 中,而流水线组件生成的工件存储在 Cloud Storage 中。

TFX 流水线的工作流如下:

  1. 使用自定义 Python 函数组件计算内容同现数据的 PMI。
  2. 使用 PMI 数据训练 BigQuery ML 矩阵分解模型,以使用自定义 Python 函数组件学习内容嵌入。
  3. 使用自定义 Python 函数组件,将嵌入从模型提取到 BigQuery 表中。
  4. 使用标准 BigQueryExampleGen 组件以 TFRecord 格式导出嵌入。
  5. 使用标准 ImporterNode 组件导入嵌入的架构。
  6. 使用标准 StatisticsGenExampleValidator 组件,针对导入的架构验证嵌入。
  7. 使用标准 Trainer 组件创建嵌入查询 SavedModel。
  8. 使用标准 Pusher 组件将嵌入查询模型推送到模型注册表目录。
  9. 使用标准 Trainer 组件构建 ScaNN 索引。
  10. 通过实现 TFX 自定义组件,评估和验证 ScaNN 索引延迟时间和召回率。
  11. 使用标准 Pusher 组件,将 ScaNN 索引推送到模型注册表目录。

下图显示了用于实现机器学习系统工作流的 TFX 流水线组件及其输入/输出工件:

显示自动实现解决方案的流水线架构的示意图。

了解内容嵌入

可通过匹配语义相似的推荐项(例如,匹配类似的产品、影片、歌曲等)来启用许多极具吸引力的推荐用例。为此,您可以使用机器学习来创建表示法空间,在其中放置彼此邻近的相似推荐项。

嵌入是一种将离散内容表示为浮点数向量的方法,这样一来,如果两项内容具有相同的上下文,两项内容的嵌入就相似。更准确地说,当内容通常在给定上下文中一起出现时,它们在语义上被认为是相似的。例如,在相同文本上下文中出现的单词通常很相似,假定同一个人观看的电影很相似,并且一起出现在购物篮中的产品往往很相似。

基于这种理解,学习内容嵌入的一种好方法是检查数据集中两项内容同时发生的频率。使用同现表示内容相似度时,您可以使用非监督式机器学习学习内容嵌入,这意味着,您就不必创建一个带有标签的数据集。获得内容嵌入后,您可以在监督式机器学习任务(例如分类、回归和预测)中使用这些嵌入。

使用矩阵分解来学习内容嵌入

内容/内容协作过滤是构建 Recommender 系统的常见技术。通过这种方法,您可以分析用户如何与客户端应用中的内容进行交互(例如,查看、共享、评估、购买等),以便了解哪些内容具有相似的内容交互行为。然后,它使用此信息(而不是项目说明和用户配置文件信息)向用户提出内容建议。后面的技术称为基于内容的过滤,也经常用在 Recommender 系统中。

使用矩阵分解模型进行内容/内容协同过滤是此解决方案中采用的方法。类似内容具有类似的嵌入向量,并且将在嵌入空间中彼此映射。

为了解协同过滤,我们以电影偏好为例。下图显示了矩阵分解模型如何在给定用户内容反馈矩阵 A 的情况下,使用协同过滤为用户学习嵌入矩阵 U 和为电影学习嵌入矩阵 V。产品 UVT 是反馈矩阵 A 的近似值,如下图所示:

显示与用户影片偏好设置相关的嵌入矢量的嵌入矩阵。

在内容/内容协同过滤中,您将此步骤抽象化,以便矩阵分解模型仅学习内容嵌入矩阵 V,从而乘积 VVT 是内容同现的精确近似值,如下图所示:

嵌入矩阵,显示与用户电影首选项中的电影同现相关的嵌入向量。

在此解决方案中,矩阵分解模型使用逐点互信息 (PMI) 学习嵌入。PMI 是一种衡量两项内容之间的关联的统计方式。它已被用于一些字词嵌入学习算法,例如 SwivelGloVe。数据集 D 中内容 xy 之间的 PMI 计算公式如下:

pmi(x,y) = log(|x,y|) - log(|x|) - log(|y|) + log(|D|)

请注意,内容之间的 PMI xy 随着它们的同现次数增加而增加,随着每项内容单独出现次数的增加而减少。

后续步骤