我们如何学会推荐电影,以及为什么您不应该仅依赖评级



想象一下,您想度过一整晚看电影,却不知道该选择哪一个。 Yandex用户经常会遇到相同的情况,因此我们的团队会提出可以在Search和Air上找到的建议。看来这很复杂:我们会给用户打分,在他们的帮助下,我们训练汽车来寻找可能给满分5分的电影,并获得一份现成的电影清单。但是这种方法行不通。为什么?那就是我今天要告诉你的。

有点历史。早在2006年,Netflix发起了Netflix Prize机器学习竞赛。如果您突然忘记了,那么该公司尚未在Internet上流式传输,而是租借了DVD上的电影。但是即使如此,对于她来说,预测用户的评分也很重要,以便向他推荐一些东西。因此,竞争的本质是:根据RMSE指标,预测观众的收视率比Netflix推荐系统Cinematch好10%。这是此类首批大规模比赛之一。兴趣激起了巨大的数据集(超过1亿个评分),以及100万美元的奖金。

比赛于2009年结束。BellKor的Pragmatic Chaos和The Ensemble团队以相同的结果(RMSE = 0.8567)到达了终点,但是The Ensemble排名第二,因为他们比竞争对手晚了20分钟发送解决方案。结果和工作可以在这里找到但是最有趣的事情是不同的。如果您相信在专业会议上的重复报道,那么获奖算法就不会出现在即将推出的视频流服务中。我无法说出其他人做出决定的原因,但我会告诉您为什么我们这样做。

个人评价


在相当长的一段时间内,Yandex用户可以对他们观看的电影进行评分。不仅在KinoPoisk,而且在搜索结果中。随着时间的流逝,我们已经积累了数以亿计的估计数以千万计的人。在某个时候,我们决定使用这些数据来帮助用户了解他们想要一部电影的程度。实际上,我们解决了与Netflix奖竞赛中相同的问题,即我们预测了用户对这部电影的评价。那时,KinoPoisk和IMDB评级已经存在,它们是根据人们的评级建立的。我们建立了个人评分,因此我们决定使用单独的量表作为百分比,以避免视觉上的相似和混淆。



顺便说一下,需要将点数比例和百分比相关联是一个单独的,不明显的头痛,因此,我将简要地讨论一下。对于10分制,似乎每个分都占10%-而该分在帽子里。但不是。原因是心理和习惯。例如,从用户的角度来看,8/10的评分比80%好得多。如何关联呢?随着众包!因此我们做到了:我们在Tolok中启动了任务,其中射击者描述了具有一定分数或个人评价百分比的电影的期望。基于此标记,我们选择了一个功能,可将分数的预测从点转换为百分比,从而保持用户的期望。

Tolok的样本任务


预测电影的期望是有用的,但是也可以建立推荐。也就是说,立即向该人显示好电影列表。那时,您中的许多人可能会认为:“然后,让我们根据用户的个人排名对用户未观看的电影进行排序。” 一开始我们也是这么认为的。但是后来我不得不解决两个问题。

工具问题


当用户搜索特定电影(或想要租借特定DVD)时,服务必须预测该特定电影的等级。确实,在使用RMSE指标的Netflix竞赛中解决了这个问题。但是这些建议解决了一个不同的问题:您不必猜测成绩,而可以找到最终可以观看的电影。而且,RMSE指标在这方面做得不好。例如,预测等级为2而不是1的罚款与5而不是4的罚款完全相同。但是我们的系统绝不建议用户放2的电影!基于列表的度量标准更适合此任务,例如Precision @ K,Recall @ K,MRR或NDCG。我不禁要告诉您更多有关它们的信息(但是,如果您对指标不感兴趣,请跳过下一段)。

让我们从指标开始。MRR(平均倒数排名)。我们将看看在测试期间用户与之互动(例如,观看或称赞)的电影在排名中的哪个位置。 MRR度量是此类电影的用户平均反向位置。即MRR=1|U|u=1|U|1ranku。与RMSE不同,此指标可评估整个列表,但不幸的是,它仅查看第一个猜测的元素。但是,很容易修改度量标准以消除此缺点。我们可以计算与用户互动的所有电影的反向位置之和。此度量标准称为“平均倒数排名”。此度量标准考虑了该期中所有可能的电影。请注意,支出中的位置k对于猜电影,权重为1 / k,对于另一部电影,权重为0。通常,使用1 / log(k)代替1 / k:这更可能与用户滚动到k位置的概率相对应。结果是DCG指标(折后的累计增益)DCG=1|U|u=1|U|pos=1Ngainposmax(1,log(pos))但是不同用户对度量的贡献是不同的:对于一个我们猜出所有电影的人,对于一个我们什么都猜不到的人。因此,通常,该度量被标准化。将每个用户的DCG划分为该用户的最佳DCG。所得度量称为NDCG(归一化折现累计收益)。它被广泛用于评估排名质量。

因此,每个任务都有其自己的指标。但是下一个问题并不是那么明显。

选择问题


很难描述,但我会尝试。事实证明,人们对通常观看的电影没有给予很高的评价。罕见的电影杰作,经典作品,艺术工作室获得最高分,但这并不能阻止人们在下班后的晚上高兴地观看一部好的喜剧,一部新的动作片或一部壮观的太空歌剧。除此之外,Yandex上的用户并没有欣赏他们曾经在某个地方观看过的所有电影。而且,如果我们只关注最高收视率,那么就有冒险获得推荐的电影供稿的风险,该供稿看起来很合逻辑,用户甚至可能会意识到其质量,但最终他们什么也不会看。

例如,如果我们按个人评分对电影供稿进行调整,而过去对我的观看情况一无所知,这就是我的电影供稿的外观。很棒的电影。但是我今天不想复习它们。



事实证明,在收视率分散和缺少高收视率电影的情况下,不仅值得看一下收视率。好吧,然后我们训练汽车来预测推荐电影的观看情况,而不是评分。这似乎是合乎逻辑的,因为用户希望这样做。可能出什么问题了?问题在于,磁带上将充满胶片,每个胶片都非常适合在晚上轻松消遣,但是他们的个人评价会很低。用户当然会注意磁带中没有“杰作”的事实,这意味着建议的可信度将受到损害,他们将看不到他们会看到的东西。

结果,我们了解到,需要在两个极端之间取得平衡。有必要对机器进行培训,以便同时考虑观看和推荐的可能性。

我们的建议如何运作


我们的系统是搜索的一部分,因此我们需要非常快速地建立建议:服务的响应时间应少于100毫秒。因此,在数据准备阶段,我们尝试脱机执行尽可能多的繁重操作。推荐系统中的所有电影和用户均由配置文件表示(不要与帐户混淆,这一点很重要),其中包括对象键,计数器和嵌入(换言之,一定空间中的向量)。影片简介每天都在YT(读作“ Yt”)上准备,并加载到响应请求的机器的RAM中。但是对于用户而言,一切都有些复杂。

每天,我们还在YT上建立主要用户配置文件,并将其发送到Yandex商店,从那里您可以在几十毫秒内获得该配置文件。但是,如果有人积极观看和评估视频,数据很快就会过时。如果建议开始落后,那就不好了。因此,我们读取用户事件流并形成概要文件的动态部分。当有人输入请求时,我们会将存储库中的配置文件与动态配置文件结合在一起,并获得一个配置文件,该配置文件可能仅落后于实际情况几秒钟。

这是离线(即提前)发生的,现在我们直接进入运行时。这里的推荐系统包括两个步骤。对整个电影数据库进行排名的时间太长,因此第一步,我们仅选择几百个候选电影,也就是说,我们发现了观众可能感兴趣的电影。这既包括受欢迎的绘画,也包括在某些嵌入物中接近用户的绘画。有几种算法可以快速找到最近的邻居,我们使用HNSW(分层导航小世界)。有了它,我们可以在几毫秒内找到距离用户最近的电影。

在第二步中,我们按电影,用户和用户/电影对提取特征(有时也称为因子),并使用CatBoost对候选者进行排名让我提醒您:我们已经意识到,我们不仅需要专注于意见,还需要专注于建议的其他质量特征,因此,为了进行排名,我们采用了针对各种目标训练的几种CatBoost模型的组合。

为了找到候选者,我们使用了几种矩阵分解中的嵌入方法:从预测评估的ALS经典版本到基于SVD ++的更复杂的变体。作为排名的功能,使用了简单的用户事件计数器和影片,各种事件的CTR以及更复杂的预训练模型。例如,ALS预测也可以用作特征。最有用的模型之一是Recommender DSSM神经网络,我可能会再谈一点。

推荐DSSM


DSSM是一个两塔神经网络。每个塔都建立自己的嵌入,然后考虑嵌入之间的余弦距离,该数字是网络输出。也就是说,网络学习评估左侧和右侧塔楼中对象的接近程度。例如,在网络搜索中使用了类似的神经网络来查找与查询相关的文档。对于搜索任务,将请求发送到其中一个塔楼,将文档发送到另一个塔楼。对于我们的网络,请求的角色由用户扮演,影片充当文档。

电影塔基于电影数据进行嵌入:这是标题,描述,体裁,国家/地区,演员等。网络的这一部分与搜索部分非常相似。但是,对于观看者,我们想使用他的故事。为此,我们将故事中电影的嵌入与事件发生后时间的推移进行汇总。然后,在总嵌入的基础上,我们应用了网络的几层,因此得到了大小为400的嵌入。



如果您在嵌入时立即考虑到用户的整个历史记录,这将大大减慢培训速度。因此,我们将分两步进行学习,并学习网络。首先,学习更简单的InnerDSSM。在入口处,他仅接收用户历史记录中的最近50个事件,而没有划分事件的类型(观看次数,评分等)。然后,我们将在整个用户历史记录中对生成的InnerDSSM进行重新训练,但会细分为事件类型。因此,我们获得了OuterDSSM,它在运行时中使用。

在额头上使用运行时网络需要大量的计算资源。因此,我们将电影塔中的嵌入内容保存在数据库中,并且根据用户历史记录的嵌入内容几乎实时更新。因此,在处理请求期间,您仅需要应用OuterDSSM的一小部分并计算余弦,这不会花费太多时间。

结论


现在,我们的建议已经可以在Yandex.Air服务的搜索中找到(例如,通过请求[看什么]),并且Yandex.Station中也使用了该技术的改进版本。但这并不意味着我们可以放松。我们不断训练新模型,应用越来越多的数据,尝试新的训练方法和新的质量指标。我认为,该地区越老,开发难度就越大。但这是专家的主要兴趣。

All Articles