天天看点

从预训练到微调:Nextdoor 实现有效嵌入应用程序的途径-译文

作者:闪念基因

背景

Nextdoor 的大多数 ML 模型通常由大量特征驱动,这些特征主要是连续或离散的。个性化特征通常源自历史聚合或交互特征的实时汇总,通常通过记录的跟踪事件捕获。然而,通过对其背后的信息(文本/图像)进行深入理解来表示内容对于建模细微的用户信号和更好地个性化我们许多产品的复杂用户行为至关重要。在快速发展的 NLP 领域,利用 Transformer 模型有效高效地进行表示学习对于理解用户和改善他们的产品体验变得越来越重要。

为此,我们构建了许多实体嵌入模型,涵盖帖子、评论、用户、搜索查询和分类信息等实体。我们首先利用对内容的深入理解,并根据用户过去交互的内容,为元实体(如用户)派生嵌入。这些强大的表示对于提取 Nextdoor 中一些最大的 ML 排名系统(如通知评分和 feed 排名)的有意义的特征至关重要。通过使它们随时可用并按比例构建,我们可以可靠地推动采用最先进的技术,并将它们交到 ML 工程师手中,以便在整个公司快速构建高性能模型。

本博客主要关注我们如何迭代嵌入模型的开发,如何将它们特征化并大规模应用于各种产品应用程序,以及在此过程中遇到的一些挑战。我们总结了三个部分的工作进展。在第 1 部分中,重点是利用最先进的预训练模型来快速评估嵌入模型作为特征提取器的价值。第 2 节描述了如何使用未标记数据针对某些产品微调嵌入,而第 3 节演示了如何使用标记数据微调嵌入以实现更好的任务预测。这项工作由 Nextdoor 的知识图谱团队推动,这是一个横向团队,与产品 ML 团队以及拥有 ML 训练和服务平台的 ML 平台团队以及为 Nextdoor 的 ML 模型提供支持的 FeatureStore 服务密切合作。

1. 利用预先训练的模型

第一代嵌入是使用 Sentence-BERT 范式 ( https://www.sbert.net/ )从预训练语言模型构建的。众所周知,与原始 BERT 模型 [1] 相比,SBERT 可以产生更好的嵌入表示。这里的主要目标是快速试验嵌入作为特征,并尽快在产品中实现它们的价值。内容实体(即 Nextdoor 帖子和评论)的文本分别从帖子的主题和正文以及评论文本中提取,然后输入到多语言文本嵌入模型中,以得出 Nextdoor 运营的所有国家/地区的相应实体嵌入。对于给定用户,他们的历史交互帖子的嵌入会根据交互类型进行加权聚合,以告知用户(交互)嵌入。例如:与印象等更被动的互动相比,帖子创建/评论/点击等主动互动具有更高的权重。这些信号在线上(feed)和离线(电子邮件)产品表面进行聚合,以整体表示用户嵌入,并为平台上的所有用户每天更新。

这些功能被发现是多个排名模型中最重要的功能之一,并在 2022 年初发布时显著提升了通知和信息流中关键产品 OKR 指标的性能。预训练模型还充当了良好的概念验证,可以构建可靠的功能提取管道和监控系统,识别任何潜在的功能漂移和中断。这有助于形成一个强大的剧本,用于部署几个下一代嵌入功能。

从预训练到微调:Nextdoor 实现有效嵌入应用程序的途径-译文

2. 从无标记数据中微调嵌入

下一代嵌入描述了训练自定义模型,这些模型通过利用微调技术对预训练版本进行了改进。之前用于生成嵌入的信号直接或间接地来自用户与通知和主页动态产品的交互。相比之下,本节详细介绍了一个使用未标记数据进行表示学习以改善用户搜索体验的用例。

我们的邻居使用 Nextdoor 搜索通过明确表达意图来查找有用的本地信息。我们试图捕捉长期和短期意图,以确定并满足用户的长期需求(例如:房屋维护)以及短暂需求(例如:失物招领)。搜索查询——虽然本质上意图强烈,但本质上很短而且嘈杂。搜索者可能会连续尝试查询的多种变体,以尽可能满足他们的意图。此外,由于本地搜索的性质,依赖搜索结果中的标记反馈可能无法完全捕捉用户意图,因为流动性有限。

为了全面捕捉用户意图信号,我们依靠自监督训练策略来学习任何给定查询的微调表示。具体来说,我们首先构建了一个 SBERT 支持的查询嵌入模型,该模型学习在低维空间中嵌入搜索查询。然后,我们汇总来自不同时间窗口(每周/每月/每季度)的用户查询的嵌入,以生成多个用户(意图)嵌入。同一模型还提取帖子的意图以生成相应的帖子嵌入。生成的用户、帖子和查询嵌入将按照后面的部分所述进行转换和特征化,以提高排名模型的性能。

查询嵌入模型最初是为了在 Nextdoor 搜索管道 [2] 中驱动上下文查询扩展而构建的。该句子转换器模型基于历史搜索查询进行训练,以便最好地学习查询表示。我们首先收集了一段时间内所有搜索者在会话中搜索查询序列组成的搜索日志。然后, 使用词形还原、拼写检查、重复数据删除等传统 NLP 方法对它们进行预处理,以形成一个干净的标记语料库,该语料库由 n-gram(n=1,2,3)和整个查询组成。为了生成训练数据集,我们创建了在用户搜索会话中出现的正标记对和在会话中随机出现的负标记对。使用余弦相似度损失的对比学习来训练底层模型。

对于查询扩展用例,此模型通过识别相关候选词来提高召回率,从而获得了更好的上下文搜索结果。这不仅有助于改善 For Sale & Free 中的内容搜索和产品搜索的关键搜索指标,而且与之前的词嵌入模型相比,还显著降低了空查询率。我们还利用近似最近邻库HSNWlib [3]来实现这种基于深度学习的查询扩展,进一步将扩展延迟提高了 10 倍以上。对于通知和提要用例,从帖子和用户嵌入转换生成的意图特征有助于对我们的顶线参与度指标产生显着的积极影响。尽管只能为搜索者计算特征并且总体覆盖率较低,但发现这种明确的信号对于改善整体搜索体验非常有用。

从预训练到微调:Nextdoor 实现有效嵌入应用程序的途径-译文

3. 通过标记反馈对嵌入进行微调

在嵌入的下一次演进中,我们还将利用用户反馈来进一步微调模型。预训练的实体嵌入已经为我们服务了一年多,但它们是使用公共基准数据集训练的现成模型。因此,它们的语义在本质上与 Nextdoor 域完全不同。此外,它们的高但固定的模型维度会导致大量的存储和服务成本,尤其是当每天为所有 Nextdoor 邻居更新用户嵌入时。为了解决这些问题,我们构建了一个双塔框架,使用在 Nextdoor 表面上收集的用户反馈来微调嵌入,同时降低 维度、根据我们的域进行定制并提高成本效益。

经过微调的模型是分阶段开发和训练的,复杂性逐渐增加。在第一阶段,帖子和用户塔的输入是预先训练的嵌入,然后使用多个 FC 层对其进行转换,从而在每一步中降低维度。标准交叉熵用作损失函数,以预测给定用户和帖子的通知点击任务。为了生成训练数据集,我们从随机探索日志中抽样以减少选择偏差,这与下游排名模型的过程相同。一旦模型完全训练完毕,最后一层就会生成经过微调的用户和帖子表示。

这些 pytorch 模型使用具有不同超参数的 SageMaker GPU 实例在数百万条记录上进行训练,并选择具有最佳离线性能的模型来生成微调后的嵌入并将其存储到 FeatureStore 中。遵循前面描述的剧本来构建和监控离线和在线功能管道。将这些缓存的功能提供给下游模型已显示出所有参与度指标(CTR/会话/贡献/DAU/WAU)的可喜提升,同时保持衡量整个平台上有害/有害内容分布的护栏指标保持中立。

在下一阶段,我们直接将从帖子实体中提取的文本输入帖子塔,以便我们微调 SBERT 模型的参数。测试 AUC 分数被用作基准,以确定需要解冻多少层和变压器块来尝试不同的训练方案以及优化典型 DNN 模型的超参数。与相应的预训练版本相比,最佳模型还将微调嵌入的用户帖子余弦相似度提高了 16%——这是表征改进内在质量的另一个评估标准。同样值得注意的是,这种质量改进是在将维度降低 10 倍以上的情况下实现的!

在最近的阶段,我们扩展到多任务学习 (MTL) 设置建模,包括通知点击和 feed 操作,以联合优化微调嵌入的学习。同样,这些目标精确模仿下游排名器,以确保学习到的嵌入直接优化下游任务。MTL 模型的另一个优势是可以在多个产品界面上学习单一模型,从而减轻运营负担和维护成本,同时利用跨共享任务的知识转移来获得更好的表示。feed 和通知界面高度相关,因为点击电子邮件通知会直接进入新闻源中帖子的固定视图。此外,主页 feed 上的大多数操作都用作通知排名器中的功能,使得这些任务非常相关。

从预训练到微调:Nextdoor 实现有效嵌入应用程序的途径-译文

在 ML 模型中使用嵌入

由于我们的大多数下游生产模型都是基于树的模型,因此它们不会直接与向量特征(如深度神经网络的嵌入)集成。因此,我们主要使用嵌入模型的输出作为下游模型的特征提取器。具体来说,我们依靠这些实体嵌入之间的余弦相似度和点积等转换来生成有意义的亲和力特征。虽然目前正在过渡到神经网络系统 - 但这些向量转换提供了一种巧妙的方法,可以将基于嵌入的特征集成到现有模型中,并可以快速进行实验以评估新深度特征的性能提升。

我们首先创建架构并声明与每个嵌入相对应的特征组,以托管在我们的内部 FeatureStore 中。然后,在创建/更新基于内容的嵌入特征时,使用任务工作者作业将其近乎实时地提取到我们的 Featurestore 中。对于用户,Airflow 中的每日计划作业根据预先指定的回顾窗口计算嵌入聚合,对各种交互类型进行加权,并批量提取到 Featurestore 中。一旦系统设置为提取具有适当 TTL 的所有相关嵌入,我们就会编写日志代码来计算和记录派生的特征,例如用户与帖子、用户与用户之间的余弦相似度和点积。具体来说,在 feed 中,这些特征将表示帖子与查看者、查看者与作者之间的亲和力,以及通知世界中帖子与收件人、发件人与收件人之间的亲和力。同样,我们还计算评论实体之间的亲和力,以告知新闻提要中的基于活动的排名。从特征日志中获得的数据用于训练下游 ML 排名模型,以避免在线和离线偏差,并且使用新特征提升离线性能的最佳模型将被提升以进行在线 AB 测试评估,并进一步提升大多数会员体验。

挑战与未来

多个实体嵌入(即用户、帖子、评论、查询等)已成功大规模集成到 Nextdoor 的各种产品界面中。过去,基于评论嵌入的模型有助于促进和培养更友好的对话,从而提高平台活力指标 [4]。最近,还使用 ​BERTopic [5] 开发了上下文主题嵌入,以实现对邻居的更粗略的内容个性化,同时告知我们平台上内容类别和类型的流行程度。我们还在尝试使用 CLIP [6] 进行图像嵌入,以利用内容背后的图像/视频信息。

此外,作为标记微调的扩展,我们计划在两个维度上进一步改进表示。一种是通过将表示与图像嵌入和现有交互特征等附加特征连接起来,以利用多模态和密集信号。另一种是将任务扩展到其他层面,例如广告、待售和免费(市场)等,以使表示在产品之间更加全面。一旦下游模型完全现代化为基于 DNN 的方法,嵌入就可以直接集成到模型中,而不会丢失任何来自转换计算的信息。

随着我们构建越来越多的嵌入来捕获不同的信号,我们还需要注意新功能带来的额外成本。通过在 FeatureStore 中直接执行嵌入转换,而不是在微服务之间传递嵌入,可以减轻在推理过程中提供高维向量的一些初始挑战,从而最大限度地降低网络带宽和扩展成本。这在基于树的模型中效果很好,但是在未来,直接使用 DNN 模型提供嵌入可能会增加成本。缓存和提供经过微调的嵌入可以帮助控制维度,同时结合特定领域的知识。这使我们能够快速试验并在较小规模上快速评估 ROI,从而证明总体成本是合理的。从基础设施的角度来看,我们发现优化嵌入特征的有效负载格式以及对调用进行排序以有效地从 FeatureStore 读取/写入可以大大降低全面总体成本。

致谢

如果没有与各种 ML 产品合作伙伴(通知/Feed/搜索/Vitality)的密切合作和协作,以及 ML 平台团队对 ML 平台和 FeatureStore 服务的大力支持,这项工作是不可能实现的。我想借此机会向这些团队中所有致力于这项工作的 Nextdoor 员工致以诚挚的谢意。

Nextdoor 正在构建世界上最大的本地知识图谱 (LKG)。我们社区继承的本地知识图谱是 Nextdoor 独有的专有数据,可用于实现个性化的社区和邻居体验。知识图谱团队专注于通过使用最先进的机器学习方法创建标准化的邻居/内容数据来了解邻居和内容。

第三方大型语言模型 (LLM)(例如 GPT)以及基于这些语言模型构建的相应对话应用程序(例如 ChatGPT)无法访问 Nextdoor 的特定本地知识。因此,它们无法按照我们的意愿为用户提供基于位置的服务。对于我们来说,开发内部定制的 LLM 以利用我们独特的本地知识图谱至关重要。我们正在构建自己的大型语言模型 (LLM),这些模型基于 Nextdoor 的原始内容和结构化知识图谱,为多种产品提供支持。

如果您有兴趣了解更多信息,请联系我们——我们正在招聘!

参考

Sentence-BERT:使用 Siamese BERT 网络进行句子嵌入

https://engblog.nextdoor.com/modernizing-our-search-stack-6a56ab87db4e

https://github.com/nmslib/hnswlib

https://engblog.nextdoor.com/using-predictive-technology-to-foster-constructive-conversations-4af437942bd4

https://maartengr.github.io/BERTopic/api/bertopic.html

https://openai.com/research/clip

作者:卡提克·贾亚苏里亚

来源-微信公众号:https://engblog.nextdoor.com/from-pre-trained-to-fine-tuned-nextdoors-path-to-effective-embedding-applications-3a13b56d91aa

出处:

继续阅读