我们如何选择建议的质量和速度

我叫Pavel Parkhomenko,我是ML开发人员。在本文中,我想谈谈Yandex.Zen服务的设计并分享技术改进,引入这些改进可以提高建议的质量。从这篇文章中,您将学习如何在短短的几毫秒内找到数百万个文档中与用户最相关的内容;如何对大型矩阵(由数百万列和数千万行组成)进行连续分解,以便新文档在数十分钟内获得其向量;如何重用用户文章矩阵分解以获得视频的良好矢量表示



我们的推荐数据库包含数百万种不同格式的文档:在我们的平台上创建的文本文章,这些文章取自外部网站,视频,叙述和简短帖子。这种服务的发展与大量技术挑战相关。这里是其中的一些:

  • 单独的计算任务:离线执行所有繁重的操作,并且仅实时执行模型的快速应用才能负责100-200 ms。
  • 快速考虑用户操作。为此,必须将所有事件立即传递给推荐者并影响模型的结果。
  • 制作磁带,以便新用户快速适应他们的行为。刚进入系统的人应该感到他们的反馈会影响建议。
  • 快速了解向谁推荐新文章。
  • 快速响应不断涌现的新内容。每天都会发布成千上万的文章,其中许多文章的寿命有限(例如新闻)。这与电影,音乐和其他长期且昂贵的内容创作不同。
  • 将知识从一个域转移到另一个域。如果推荐系统已训练有素的文本文章模型,并且我们向其中添加了视频,则可以重复使用现有模型,以便更好地对新型内容进行排名。

我将告诉您我们如何解决这些问题。

候选人选择


如何在几毫秒内将考虑中的文档集减少一千次,而实际上却不会降低排名的质量?

假设我们训练了很多ML模型,并基于它们生成了属性,并训练了另一个为用户排名文档的模型。一切都会好起来的,但如果有成千上万个这样的文档,您不能只是实时地对所有文档的所有符号进行计数,建议应在100-200毫秒内建立。任务是从数百万中选择将为用户排名的特定子集。此步骤通常称为候选者选择。它有几个要求。首先,选择必须非常迅速地进行,以便在排名本身上留出尽可能多的时间。其次,通过大大减少用于排名的文档的数量,我们必须使与用户相关的文档尽可能地完整。

我们的候选人甄选原则已经发生了演变,目前,我们采用了多阶段方案:



首先,将所有文档分为几组,并从每一组中获取最受欢迎的文档。组可以是站点,主题,集群。对于每个用户,根据他的故事,选择离他最近的组,并且已经从他们那里获取了最佳文档。我们还使用kNN索引实时选择最接近用户的文档。构建kNN索引的方法有多种,我们拥有赚得最好的HNSW(分层的可导航小世界图)。这是一个分层模型,可让您在几毫秒内从百万分之一的数据库中找到用户的N个最近的向量。以前,我们对整个文档数据库进行脱机索引。由于索引中的搜索工作非常迅速,因此,如果有多个强大的嵌入,则可以创建多个索引(每个嵌入一个索引)并实时访问每个索引。

每个用户仍然有成千上万的文档。计数所有属性仍然很多,因此在此阶段我们应用简单排名-属性较少的轻量级重排名模型。任务是预测重型模型将在顶部包含哪些文档。预测最高的文档将用于重型模型,即在排名的最后阶段。这种方法需要数十毫秒的时间,才能将为用户考虑的文档数据库从数百万个减少到数千个。

ALS进入运行时


单击后如何立即考虑用户的反馈?

推荐中的重要因素是对用户反馈的响应时间。这对于新用户尤为重要:当一个人刚开始使用推荐系统时,他会收到各种主题的非个性化文档流。他第一次单击时,必须立即考虑到这一点并适应他的兴趣。如果所有因素都是离线计算的,那么由于延迟,系统将无法快速响应。因此,您需要实时处理用户操作。为此,我们在运行时使用ALS步骤来构建用户的矢量表示。

假设我们对所有文档都有矢量表示。例如,我们可以使用ELMo,BERT或其他机器学习模型基于文章文本嵌入进行脱机构建。如何根据用户在系统中的交互作用获得相同空间中用户的矢量表示?

用户文档矩阵形成和分解的一般原理
m n . . m x n: , — . , ́ , . (, , ) - — , 1, –1.

: P (m x d) Q (d x n), d — ( ). d- ( — P, — Q). . , , .


矩阵分解的一种可能方法是ALS(交替最小二乘)。我们将优化以下损失函数:

minq,pi=1(ruiqiTpu)2+λ(||qi||2+||pu||2)


其中,R ui是用户u与文档i的交互,q i是文档i的向量,p u是用户u的向量。

然后,通过求解相应的线性回归,从均方误差的角度来看(对于固定文档向量而言)是最佳的用户向量。

这称为ALS步骤。 ALS算法本身包含以下事实:我们交替固定其中一个矩阵(用户和商品),然后更新另一个矩阵,以找到最佳解决方案。

幸运的是,找到用户的矢量表示形式是一项相当快的操作,可以在运行时使用矢量指令来完成。此技巧使您可以立即考虑排名中用户的反馈。可以在kNN索引中使用相同的嵌入来改善候选者的选择。

分布式协同过滤


如何进行增量分布矩阵分解并快速找到新文章的矢量表示?

内容并不是建议信号的唯一来源。协作信息是另一个重要来源。传统上,可以通过分解用户文档矩阵来获得排名的好兆头。但是,当尝试进行这种分解时,我们遇到了以下问题:

1.我们拥有数百万个文档和数千万的用户。矩阵不能完全适合一台机器,分解会很长。
2.系统中的大多数内容寿命很短:文档仅保持几个小时的相关性。因此,有必要尽快构建其向量表示。
3.如果在发布文档后立即构建分解,则足够多的用户将没有时间对其进行评估。因此,其矢量表示可能不是很好。
4.如果用户喜欢或不喜欢,我们将无法在扩展中立即考虑到这一点。

为了解决这些问题,我们对用户文档矩阵进行了分布式分解,并进行了频繁的增量更新。它是如何工作的?

假设我们有一个由N台机器组成的集群(数百个中有N台),并且我们想对它们上的矩阵进行分布式分解,这不适用于一台机器。问题是如何执行这种分解,以便一方面在每台计算机上都有足够的数据,另一方面又使计算独立?



我们将使用上述ALS分解算法。考虑如何以分布式方式执行一个ALS步骤-其余步骤将相似。假设我们有一个固定的文档矩阵,并且我们想建立一个用户矩阵。为此,我们将其分成N行,每部分将包含大约相同数量的行。我们将把相应行的非空单元格以及文档嵌入矩阵(整体)发送给每台计算机。由于它不是很大,并且用户文档矩阵通常非常稀疏,因此该数据将适合常规计算机。

这种技巧可以重复使用多个时代,直到模型收敛,交替更改固定矩阵。但是即使那样,矩阵的分解也可能持续数小时。并且,这并没有解决需要快速接收新文档的嵌入以及更新在构建模型时几乎没有信息的那些嵌入的问题。

快速增量更新模型的介绍对我们有所帮助。假设我们有一个当前训练的模型。自从她接受培训以来,出现了与我们的用户互动的新文章,以及与培训互动很少的文章。为了快速嵌入此类文章,我们使用在第一次大型模型训练中获得的用户嵌入,并采取一个ALS步骤来计算具有固定用户矩阵的文档矩阵。这样一来,您就可以在文档发布后的几分钟之内很快收到嵌入内容,并且经常更新新文档的嵌入内容。

为了立即考虑建议的人工操作,在运行时我们不使用离线接收的用户嵌入。相反,我们采取ALS步骤并获得当前用户向量。

转移到另一个域


如何使用用户的反馈来撰写文章,以构建视频的矢量表示?

最初,我们仅推荐文本文章,因此我们的许多算法都专注于此类内容。但是,当添加不同类型的内容时,我们面临着适应模型的需求。我们如何使用示例视频解决这个问题?一种选择是从头开始重新训练所有模型。但这是一个很长的时间,此外,一些算法要求训练样本的数量,对于在服务中使用的新型内容来说,对于一种新型内容而言,其数量还不够。

我们走了另一条路,为视频重用了文本模型。在创建视频的矢量表示时,使用ALS的相同技巧可以帮助我们。我们根据文字文章对用户进行了矢量表示,并使用有关视频观看次数的信息采取了ALS步骤。因此,我们很容易获得视频的矢量表示。在运行时,我们只需计算从文本文章获得的用户向量和视频向量之间的接近度。

结论


实时推荐系统的核心开发工作繁重。必须快速处理数据并应用ML方法以有效使用此数据;建立能够在最短时间内处理用户信号和新内容单元的复杂分布式系统;和许多其他任务。

在我所描述的设备的当前系统中,针对用户的建议质量随其活动和服务持续时间而增长。但是,这当然是主要困难所在:系统很难立即了解与内容很少互动的人的利益。改善对新用户的建议是我们的主要关切。我们将继续优化算法,以使与该人相关的内容更快地进入其供稿,并且不会出现无关的内容。

All Articles