我们如何预测Yandex搜索的未来:从错误修复到发现查询

人们并不总是准确地提出他们的查询,因此搜索引擎应该为此提供帮助。我的名字叫Sergey Yudin,我领导了Yandex中的一组搜索功能分析。每天我们都通过机器学习来改善一些东西。去年,我们一直在开发可预见人类利益的技术。

与我的团队的专家Anastasia GaidashenkoAvgaydashenko我将向Habr的读者介绍该技术的工作原理,并描述体系结构和应用算法。您还将学习下一个请求的预测与未来人类利益的预测有何不同。



用户想要什么?


让我们以一个虚构的用户为例,看看Yandex技术如何帮助解决问题。假设他在搜索框中打印“保存票证”。他想找到什么?要了解门票的积累,还是他只是错了?



是的,他被封锁了。他不想存钱,而是要买票。 Yandex理解他,监护人为此提供了帮助 -一种纠正错误输入请求的系统。从数学上讲,只要用户输入了文本,此系统就可以最大程度地提高正确输入查询的可能性。在Yandex中解决该问题已有十多年了。不仅在搜索中。

因此,我们的假想用户输入了“购买机票”的请求。在这一点上,过时(或搜索建议)。 Sajest帮助用户制定请求,以正确完成请求。



我们的言行很长。几年前,我们使任务复杂化了。我不仅要显示请求的最合逻辑的完成,而且要预测该用户最终将输入哪个请求并在单击之前开始其预渲染。如果您对它的工作方式感兴趣,那么可以看看Habré

我们的虚构用户从一系列提示中选择了请求的结尾:事实证明,他正在寻找Tretyakov画廊的门票。因此,推荐系统完成了其第一个任务-它帮助用户提出了请求

该任务已经完成,但是用户仍然有疑问。他接下来会寻找什么?也许他想知道如何去画廊?是的,他每打印10条Lavrushinsky以验证地址。



我们可以预测这个要求吗?是。我们已经做了很长一段时间了。有一个障碍-问题末尾的“也问”。它显示了人们在搜索字段中输入后通常会提出的查询。在其中,我们将看到带有Tretyakov画廊地址的请求。



我们最大化了一个请求受到前一个用户请求的可能性。系统完成了第二项任务- 预测下一个请求

然后发生了一些非常有趣的事情。用户打印请求“何时可以免费访问Tretyakov画廊”。该请求与其余请求不同,与用户任务相反,解决了一些正交任务。



但是让我们想想:如果我们正在寻找画廊的门票,我们希望看到什么作为推荐?很多人想知道可能不需要买票。这是任务的第三部分,也是最困难和最有趣的部分-向用户推荐一些新的有用的东西。他本人尚未想到的事情。

我们称此类请求为发现我们学会在搜索日志中识别它们,并在问题结束时进行保存并推荐它们。而这恰恰是我们现在正在积极努力的新的革命性任务。对于购买斯堪的纳维亚棍棒的人,Yandex可能会建议您如何按高度捡起它们。如果一个人经常旅行,那么他可能会对搜索查询“没有签证去哪里”感兴趣。等等。



在这种情况下,问题的数学公式如下所示:我们没有使下一个请求的概率最大化,而是使请求被点击的概率最大化,这是我们根据用户的上一次会话向用户推荐的。

怎么运行的?


让我们看看我们的推荐系统是如何实施的,其背后隐藏着什么架构。但是首先,我们将确定我们通常希望从推荐系统中获得什么。

1. 有用的建议!当然,我们希望我们推荐给用户的请求适合他的兴趣。它们应该是有用和相关的。

2. 可扩展性。我们希望系统会很好:用户将会越来越多,请求的数量也会增加。而且,我们希望增加可以提出建议的对象的覆盖范围。

3. 易于实施。我们假设我们的系统仍然可以运行,并且我们不想多次重写它。该系统应该易于实现,以便我们以后可以改进它,而不是启动新版本,而是改进当前版本。

决定了我们的愿望之后,让我们看看如何实现它们。

我们有一些发现数据库-一个查询数据库,对我们的用户而言可能看起来很有趣并且很有用。但是,如果我们开始对整个基础排名,我们将没有足够的计算能力。用户有许多请求,它们是多种多样的,因此首先我们需要过滤该数据库。



可以通过不同的方法进行过滤。在Yandex中,我们为此使用kNN(k个最近邻居)-机器学习中的基本分类算法,称为“最近邻居搜索”。使用此算法,我们要过滤数据库:选择最接近的查询以使用户感兴趣。为此,我们希望将用户的请求与我们准备在向量空间中推荐的那些请求进行比较。

但是,为了将这些请求带入一个向量空间,我们还需要提出一些建议。例如,您可以使用DSSM(深层结构语义模型)-一种黑匣子,可以将不同的实体转换为一个向量空间。最初,Microsoft在一篇文章中提出了这种方法。但是Yandex已经对其进行了非常强大的调整以适应其任务,并且与最初的想法相去甚远。如果您有兴趣阅读有关此内容的更多信息,那么可以在有关Palekh搜索算法的文章中找到相关信息



下一步是排名。当我们拥有与用户可能感兴趣的请求接近的请求列表时,我们想了解哪些对他来说更有趣,哪些对他来说更有趣。

例如,我们选择了100个查询。用户不太可能滚动全部100个。您需要选择前5个并推荐它​​。为此,我们为请求分配了评分。我们会根据用户上次会话推荐给用户的请求的点击概率来获得这些估算值。

我们如何获得下次点击的可能性?我们的系统已经启动并正在运行,因此我们仅收集用户的反馈-从而逐步改进我们的推荐系统。



既然我们已经分别回顾了所有步骤,那么让我们回到开头,将它们放在一起。总计:用户向我们提出了一些要求,我们有一些建议基础。我们采用此数据库并对其进行过滤,接收我们想要安排并推荐给用户的请求。



现在回想一下,我们通常对我们的推荐系统表达了愿望。让我们看看如何在最终的体系结构中实现它们。

例如,我们希望在改善基础方面具有可伸缩性。我们的实现方法具有进行此类缩放所必需的所有属性。我们不应该将整个基础都保留在内存中:一旦基础扩展到无法容纳一个群集的程度,我们就可以将其拆分为两个。而且,如果之前我们使用kNN遍历一个群集并选择了我们将排名的前100个群集,那么现在我们可以分别遍历两个群集并选择(例如)每个群集中的前50个群集。或者,通常,按主题分解集群,并仅在所需主题上使用kNN。

要扩展用户数量,您可以简单地增加额外的计算能力并分别处理每个功能,因为在我们的体系结构中,没有地方需要将所有用户同时保留在内存中。

在某些其他方法中,例如在分解矩阵时,存在可以过滤的位置。矩阵分解是建议中使用的另一种方法。实际上,Yandex也使用它,但不是将其用于过滤,而是将其用作训练的附加功能,因为仍然有很多信息可用于分析。

可以将其他功能,新算法和其他方法应用于体系结构的其余部分。当系统启动并运行时,我们可以开始对其进行改进。



它在哪里工作?


这种架构已经在Yandex中实现,并且与通常的重新设计相比,当我们试图建议用户找出Tretyakov Gallery的地址时,我们已经可以建议如何无需排队甚至免费就可以到达Tretyakov Gallery。



这是搜索引擎与用户之间互动的新水平。我们不仅纠正错误和补充要求,还学会预测一个人的兴趣并为他提供新的东西。也许这将是对未来的追求。你怎么看?

All Articles