推荐系统介绍及测试推荐系统的完整教程

729 阅读23分钟

推荐系统从根本上解决了一个问题--人们想要什么?

虽然这是一个广泛的问题,但在像电子商务这样的消费应用中,答案可能是为消费者提供价格和质量最好的产品。对于一个新闻聚合网站,它可能是显示可靠和相关的内容。

在一个用户必须通过数千或数百万个项目来寻找他们正在寻找的东西的情况下,一个推荐引擎是不可或缺的。根据 lighthouselabs.ca的一篇关于Netflix使用数据科学的文章。

该引擎根据用户的喜好,使用1300个推荐集群,一次过滤超过3000个标题。它是如此准确,以至于该引擎的个性化推荐推动了80%的Netflix观众活动。

然而,与单一的ML模型相比,构建和评估一个推荐系统在设计决策、工程和指标方面有很大不同。在这篇文章中,我们将重点讨论测试一个推荐系统。我们还将谈及。

  • 1推荐系统的类型
  • 2最流行的模型概述--协作过滤

推荐系统的类型

推荐系统主要有三种工作模式。

  1. 基于查询内容的相似性:系统根据相似性来检索内容。例如,如果你喜欢一个足球视频,它将向你展示另一个视频。或者,如果你搜索一件蓝色T恤,它将向你展示更多的蓝色T恤。匹配是基于项目的内容,如图片、描述、标题等。

2.群众的智慧:社交媒体中使用的现代推荐系统是基于此的。如果用户A喜欢电影X、Y和Z,用户B喜欢电影X和Z;那么用户B可能会喜欢电影Y。这些推荐模型不是依靠物品内容,而是考虑用户的偏好。这些模型之所以受欢迎,是因为它们超越了主题和内容。它们可以彻底地向一个爱好体育的用户推荐一个棒球视频,而这个用户刚刚喜欢一个足球视频。

  1. 基于会话:基于会话的系统捕捉用户在特定会话中的意图,并根据会话级别的上下文信息来推荐物品。例如,如果你正在购买一个新的工作站,并打算购买显示器、键盘、鼠标、椅子等,你希望网站在这个会话中向你展示与设置工作站有关的项目,即使你可能早些时候喜欢某本书。

阅读更多

第二种和第三种需要大量的用户-项目互动数据。如果没有这些数据,人们可能会从第一种类型的推荐系统开始。即使有很多现有用户的数据,人们也可能没有足够的数据给新用户。这种情况被称为推荐系统中的冷启动问题。在这种情况下,基于内容的推荐系统可以是一个很好的代理,直到人们有足够的交互数据给新用户。

概述完了,现在让我们简单看看其中一个流行的推荐系统,看看我们如何测试它。

基于协作过滤的模型概述

协作过滤是最流行的经过战斗检验的推荐模型之一。这里的目标是训练一个物品和用户的向量表示,使具有表示(嵌入)Vu的用户喜欢具有表示(嵌入)Vi的物品I 的概率为

Overview of collaborative filtering based models

Collaborative filtering is one of the most popular battle-tested recommendation models

协作过滤是最流行的、经得起考验的推荐模型之一。作者

模型的训练是如何进行的?

对于数据集中的M个独特的用户和N个独特的项目,我们创建一个维度为D的嵌入表**。** 我们有D*(M+N) 参数需要学习。假设我们正在为YouTube建立这个系统,并希望预测一个用户是否会按下视频上的喜欢按钮。我们的训练数据将有数十亿对像**(userId, postId)** ,如果拥有该userId的用户喜欢过该postId的视频。

Train/test split under the case of recommendation

在推荐的情况下,训练/测试分离

我们随机地初始化嵌入。然后,在训练期间,我们计算标签为1的概率和交叉熵损失。在多个历时中分批进行,训练用户和项目嵌入。

Model training in recommender systems

推荐系统中的模型训练来源:作者

训练和验证的分离发生在用户层面。这意味着,每个用户的X%的喜欢都在训练集里,100-X%在验证集里。X通常是80-90%。

推荐系统:目标设计

在前面的例子中,我们训练了一个模型来预测一个用户是否会喜欢YouTube上的一个视频。预测的变量是相当直接和明确的。然而,并非所有的信号都是明确的。例如,考虑一下预测变量,即用户是否会按视频长度观看95%的视频。如果是,我们就把**(userId,postId)** 列入数据集。

如果我们有一个近乎完美的模型,预测出>95%的观看概率,我们就可以说我们在推荐用户喜欢的视频,对吗?

这里有一个问题--考虑一个一分钟的视频(V1)与一个三十分钟的视频(V30)。观看95%的V1需要57秒,而观看95%的V30需要1710秒。V1也可能是一个点击率很高的视频,而一个用户可以喜欢V30,但仍然只看了1600秒。那么,我们的定义是否能保证正向标签代表用户的偏好?

其次,大多数平台有多种信号--喜欢、分享、下载、点击等等。应该用哪个目标来训练模型?通常情况下,一个是不够的。假设我们根据不同的目标来训练多个模型。我们有每个模型的多个**(userId,postId)** 分数。然后根据所有分数的聚合公式创建一个单一的数字分数,用来创建最终的排名。

重点是,如果训练目标没有仔细设计,即使是一个接近完美的模型也不会给出好的建议。

评价推荐人系统

离线评估

在你的本地机器上离线训练一个推荐模型,不能让你确信它的在线性能。然而,有一些指标可以分析预期的模型行为。

ROC-AUC

接收者操作特征或ROC曲线在Y轴上测量真阳性率(TPR),在X轴上测量假阳性率(FPR)。对于二元分类器,我们使用一个阈值,超过这个阈值的实例被预测为阳性,否则为阴性。对于一个特定的阈值。

TPR = 高于阈值的总阳性率% = TP/(TP + FN)

FPR = 高于阈值的总负数的百分比 = FP/(FP + TN)

在阈值=0时,所有的例子都被分类为阳性。因此,FN=0,因为没有例子被归类为负面,TPR=1。出于同样的原因,TN也是0。因此,FPR也是1。这就是图上的(1,1)点。

在阈值=1时,没有例子被预测为阳性。因此,TP和FP都是0,这代表图形上的(0,0)。

通过计算[0,1]中不同阈值的TPR和FPR并将其绘制成曲线。绘制的曲线看起来像这样。

曲线下的面积在最大时为1。沿着x=y的对角线是ROC曲线,如果分类器随机分配标签给例子的话。

PR-AUC

精度-召回AUC或PR-AUC与ROC-AUC类似,只是在Y轴上我们有精度,在X轴上我们有召回。如我们所知,精确度是正确的正向模型预测的比例。另一方面,召回率是模型正确分类的现有阳性总数的一部分。

为了更好地理解PR曲线,考虑一个二进制分类器。如果我们保持较低的分类阈值,例如0.05,大多数例子被预测为阳性。所有现有的阳性都会被正确地分类为阳性。尽管如此,我们还是会有很多假阳性,因为真正的阴性也被归类为阳性,这导致了高召回率和低精确度。

另一方面,如果我们保持一个非常高的阈值,模型所做的大部分阳性预测将是正确的,因为模型对它所称的阳性是非常保守的。然而,为了追求一直正确,我们将错过许多实际的阳性预测,这导致了高精确度和低召回率。

请注意,在优化召回率和精确度之间有一个权衡。与ROC-AUC一样,一个完美的分类器的PR-AUC=1。该曲线下的面积就是PR-AUC。

然而,在一个完美的分类器中会存在一个阈值,在这个阈值中,类的分离是非常清楚的。所有的正面例子都在这个阈值之上,而所有的负面例子都在这个阈值之下。在这种情况下,AUC是最大的,等于1。

PR-AUC相对于ROC-AUC的显著优势是,当出现类不平衡时,它不会误导。在不平衡的情况下,ROC-AUC可以比PR-AUC高。

参见

排名度量

除了类的分离,我们还想得到一些分数的排名顺序。推荐系统的目标不仅仅是挑选出相关的项目,而且还要根据偏好对它们进行排名。根据福布斯的一篇文章。

谷歌的第一页捕获了71%的搜索流量点击,据说近年来高达92%。 第二页的结果远远落后于所有网站点击量的6%以下。

如果你挑选出相关的项目,但不对它们进行排序,这并没有帮助。那么,我们如何测试我们的模型是否具有排名能力?

  • 归一化折现累积收益(NDCG)。

想象一下,你的模型向用户提出了一系列的十个建议。你想看看推荐的最佳顺序,以获得最大的喜欢。下面是用户对这十个视频的反应

1, 0, 0, 1, 0, 1, 1, 0,1, 0 ....(1)

用户喜欢第一、第四、第六、第七和第九个推荐。这里的最佳情况排序可能是什么?

1, 1, 1, 1, 1, 0, 0, 0, 0, 0 ...... (2)

意思是如果我们推荐了第一、第四、第六、第七、第九,然后再推荐其他的,我们就会取得最佳排名。请注意,第一、第四、第六、第七和第九之间的任何排列组合都会产生相等的排名。

要计算NDCG。

NDCG

NDCG

归一化折现累积收益(NDCG) |来源

reli表示项目i的相关性--在我们的例子中是0或1。 p是项目的总数。对于较低的等级(较低的i),总和下的项比高等级的项具有更多的权重。IDCGp只取相关的项目并计算出总和,这是将所有相关的项目排在最前面(表达式2),将不相关的项目排在最下面所能得到的最大DCG分数。

注意,对于不相关的项目,分子是0(20-1=0)。DCGp计算得分时,将所有的P(相关的和不相关的)按照代表我们的模型在对项目进行评分后对它们进行排名的顺序(表达式1)。

请注意,NDCG介于0和1之间。

  • 召回率@k

如上所述,召回率是模型捕获的阳性项目在现有阳性项目总数中所占的比例。对于一组排名的建议,考虑在位置k的特定排名。存在于位置1到k的阳性数除以阳性总数,就得到了k的召回率。

对于许多系统来说,获得所有相关的结果是至关重要的,甚至要以一些不相关的结果为代价。在这种情况下,recall@k给了我们一个关于覆盖率的概念。

  • 精度@k

与recall@k类似,precision@k计算的是模型在某一等级k的精度。这意味着它计算的是模型正确预测的阳性比例除以总的阳性预测的比例。

对于可能不需要全部,但只需要正确结果的情况,precision@k有助于量化它。

更深入的研究

推荐系统是出了名的有偏见。在我们关于为YouTube建立推荐模型的例子中,我们可能会发现整体的AUC很好。然而,当我们在不同层面上分析这些指标时,例如,长视频与短视频的AUCs,我们发现长视频的指标很差,这意味着模型没有学会很好地推荐长视频。

类似的效果可以发生在任何属性上--地理、用户人口统计学、主题。了解你的模型在哪里做得好,在哪里做得不好是很有帮助的。

解决偏差问题

推荐系统往往比不太受欢迎的长尾内容更容易推送热门内容。因为流行的内容更有可能被任何随机用户所喜欢。这使得模型能够找到一个 "快速修复 "的解决方案,以尽量减少损失。然而,用户有许多未开发的兴趣,或者用户可能喜欢许多不那么流行的东西。尽管如此,由于它们在训练数据集中出现的频率不高,它们的嵌入没有被准确地学习,导致了偏差。想象一下,在Spotify上的数百万艺术家中,只有少数流行艺术家会得到接近90%的播放。

推荐系统是在一个循环中训练的。如果系统向用户推荐有偏见的内容,下面的训练就会发生在这些有偏见的推荐上。随着时间的推移,分布会向受欢迎的项目倾斜,因为对这些项目的反馈比其他项目观察得更多--偏见变得更加复杂。

为什么解决偏见很重要?推荐热门内容有什么问题?如前所述,这使得我们很难探索用户的其他兴趣。在短期内,流行的内容可能会留住用户,但最终,用户会发现应用程序上没有什么新意。其次,这使得新的创作者很难在应用程序上获得牵引力。新创作者将没有动力去创造有吸引力的、多样化的内容。最终,他们可能会离开这个应用程序。

你如何衡量偏见?

一个简单的方法是查看视图分布。前1%、5%、10%......的视频占据了多大比例的浏览量,以及这些视频与其他视频相比被推荐给用户的频率如何。这种80-20效应可以在不同的主题(特定主题在应用程序中占主导地位)、创作者(少数流行的创作者与小众创作者)等方面看到。机器学习模型会学习数据集中的偏见,以及其他事情。因此,如果你的数据集是有偏见的,那么你的推荐结果有可能会反映它。

通常情况下,模型会根据某个特征隐性地学习某些偏见。例如,不久前,如果你在谷歌上搜索 "CEO "这个词,排名靠前的结果会是白人男性的照片。同样地,像 "护士 "这样的词的搜索结果大多是女性。然而,CEO这个词是不分性别的。

根据washington.edu的一篇文章。

研究发现,在一些工作中,这种差异是明显的。在谷歌搜索CEO的图片中,11%的人被描述为女性,而美国的CEO中有27%是女性。在作者的图片搜索结果中,25%的人被描述为女性,而美国实际作者的比例为56%。

相比之下,图像搜索结果中描述的电话销售员有64%是女性,而该职业的男女比例是平均的。

衡量一个属性/特征所造成的偏见的一个常用方法是统计平价。简单地说,它衡量的是一个模型的结果(概率)在给定受保护的属性P(例如性别)与没有它的结果之间的差异。一个无偏见的模型会有。

How do you measure bias?

拥有关于p 的额外信息应该不会有什么区别。

如何减轻偏见?

创建更公平的推荐系统是一个活跃的研究领域。解决偏见的一个流行策略是负采样。在我们的YouTube推荐器的例子中,我们有点击率的数据。如果我们想创建一个基于点击预测的推荐模型,我们只有来自视频的点击数据,而这些数据是有流行度偏差的。为了平衡这一点,我们通过为用户随机选择视频并将其分配为负面类来创建样本。我们的想法是,用户喜欢一个随机视频的可能性非常低。这样一来,我们就对数据分布进行了去歪曲。

除了负向抽样,许多评分机制都会衡量候选人的多样性。在基于会话的推荐中,可以通过采取用户之前观看的N个项目,衡量更多不同的主题来推荐,从而引入更多的多样化推荐。例如,如果一个人读了一些关于政治和电影业的文章,下面的推荐可以包括一些体育产业的项目。

最大边际关联度(MMR) 是信息检索中用来平衡相关性和多样性的一种措施。根据该论文--

Maximum Margin Relevance (MMR)

最大边际相关性(MMR) |来源

C是一个文档集,Q是一个查询,R是一个由IR系统检索的文档排名列表,对于给定的C和Q,S是R中已经被选中的文档子集;R\S是R中但不在S中的文档集;Sim1是文档(段落)和查询之间用于文档检索和相关性排名的相似度指标;Sim2可以与Sim1相同或不同的指标。当参数λ=1时,MMR逐步计算标准的相关性排名列表,当λ=0时,在R中的文档中计算出最大的多样性排名。

在线评估

A/B实验

我们训练模型的目的和我们测量的离线指标可能不是我们在现实中寻找的东西。例如,如果YouTube创建了最准确的模型来预测点击量,可能并不意味着用户流失率会降低。虽然模型推荐了用户喜欢的所有视频,但他们可能还是会放弃,第二天不会再来。

其次,为自己想要的东西精确训练一个模型是很难的。例如,训练一个模型来推荐视频以减少用户流失,要比根据点击率来推荐视频更复杂。

标准的在线指标包括。

  • 用户保留率
  • 参与度(喜欢、书签、关注等)。
  • 点击率
  • 购买
  • 收入
  • 花费的时间
  • 建议中的多样性。

任何模型的最终真理时刻是现场A/B测试。新的变体与现有模型进行测试。例如,假设说学习率应该是当前学习率的10倍。我们用新的学习率为平台上的一组随机用户启动一个模型来测试。由于目前的模型和新的变化是在相同的用户分布上运行的,所以在线指标的任何变化只能归因于学习率的变化。人们可以根据净变化来决定新的变体是更好还是更坏。

测试推荐系统

模型评估与测试

我们看到了我们如何使用各种指标和分析来评估一个推荐模型,从而使我们的实验和假设成立。然而,当模型被运送到生产中时,事情仍然可能出错。即使是小的工程错误也会导致非预期的推荐和糟糕的用户体验。因此,测试每一个步骤--推理、重新训练周期、数据集创建和特征范围,对于在线部署来说是至关重要的。

在本节中,我们将看一下我们可以通过哪些方式来测试我们的整个推荐系统--从模型的行为到管道的健康。

推荐系统的行为检查

测量嵌入的更新率

由于RecSys模型是建立在嵌入上的,因此确保嵌入的训练正确是至关重要的。每次重新训练时,用户和项目的嵌入都会更新。要检查的一个重要指标是不同用户/项目嵌入版本的平均漂移。漂移可以通过测量余弦相似度来检查。

例如,如果一个用户A的嵌入昨天是e1,而在重新训练后是e2,漂移被测量为余弦(e1,e2)。理想情况下,这个数字不应该>0.9,但也不能太接近1。如果它太小,表明嵌入没有收敛。如果它太接近1,则表明该模型可能没有捕捉到用户的新兴趣。

不同切割上的度量

如前所述,单一的数字指标看了会有欺骗性。例如,10%的热门项目可以占到数据集的80%。在整个数据集上测量AUC可以给出乐观的数字,因为模型必须很好地学习这10%的项目。然而,这意味着该模型没有很好地学习长尾的项目。这种疏忽会导致多样性和新颖性差。在这种情况下,人们可以分析项目层面的指标,检查所有的项目是否都表现得很合理。这同样适用于许多其他属性,如用户、性别、地理等。

基于会话的模型的差异性测试

基于会话的模型要求新的信息被模型即时消费以更新推荐。一个好的基于会话的推荐模型能够快速而准确地适应用户当前的兴趣。

考虑一个基于RNN的模型,它吸收了之前的N次互动,为第N+1个位置推荐项目。如果该模型偏向于流行,它必然会在第N-2次、第N-1次和第N次互动后推荐流行的项目。然而,一个好的模型会在每次互动后推荐一个多样化的项目集。在数学上,人们可以看到RNN模型中每个时间步骤后隐藏状态的变化,就像我们计算嵌入漂移一样(上面解释过)。

同样,如果用户与不同主题的10个视频互动,如人工智能、喜剧或足球,并对喜剧视频作出积极反应,而对其他主题作出消极反应,那么下一个推荐应该包括搞笑视频。人们可以在会话历史中衡量对某些主题/类型的亲和力,以及它在下一组推荐中的表现。

推荐系统的软件检查

除了标准的单元和集成测试外,还有一些RecSys特定的行为测试你应该关注"

  • 特征一致性:在模型训练过程中,除了嵌入,我们可能会使用许多特征,如用户位置、年龄、视频长度等。在使用这些特征之前,通常会对其进行转换,如缩放。然而,这开启了在推理过程中由于对特征处理不当而犯错的机会。例如,如果你在训练中缩放了一个特征,但在推理中没有,你的模型预测可能会有变化。
  • 泄漏的特征:许多模型,如基于会话的模型,在每次互动中使用接近实时的信息。例如,用户互动的项目数量。 如果用户与六个项目A、B、C、D、E和F互动;这个特征的值将是0、1、2、3、4、5;因为用户在点击A之前与0项互动,在点击B之前与1项互动,以此类推。我们只使用事件发生前的可用信息。在离线训练中,我们应该问一下,在从表中选择数据时,是否会造成训练中的泄漏。
  • 更新嵌入:推荐模型,是定期训练的。在每个训练周期之后,应该使用更新的嵌入来推荐项目。使用旧的嵌入会导致不一致和不准确的推荐。

你可能也喜欢

测试推荐系统的工具

以下是测试推荐系统不同阶段的一些相关工具。

1.数据集创建和特征工程

追踪特征分布和特征值的异常情况是需要追踪的几个关键数字。通常情况下,推荐模型的训练是通过airflow或kedro等工具在DAG中执行。在数据集创建后,人们可以编写一个测试套件,将预期的统计数据与数据中的统计数据进行测试。根据可接受的误差范围,有可能创建警报。Pytest是编写这种单元测试的一个流行工具。

2.训练和部署

大多数推荐模型都是以深度学习的方式进行训练,使用基于梯度短语的优化。自然地,像学习率和权重衰减的训练步骤数这样的超参数会发挥作用。使用上面讨论的指标和训练-验证损失曲线,可以发现训练中的突然性。像Neptune这样的工具可以用最小的代码改动来监控模型训练。可以使用Neptune的简单API记录曲线、指标、超参数和脚本

RecList 这样的开源工具提供了一个易于使用的界面来计算推荐模型评估中最常见的指标。给定一个数据集和一个模型,RecList可以在目标数据集上运行指定的测试。除了指标之外,它还可以根据不同的片断产生图谱和深层次的聚合。

3.推断

推断需要特征的一致性、可用性、最小的延迟,以及对更新模型的访问。随着每一次代码的改变,数据科学家必须确保以上几点。软件工程实践,如代码审查,Git等版本控制,以及用CI/CD流程(Jenkins,GitHub行动)自动测试阶段,确保安全的软件发布。

结论

在ML的许多领域中,如NLP、计算机视觉等,推荐系统的研究相对不足。然而,它们是现代数字应用中最有影响的应用之一。虽然评估它们并不直接,但上述指标和想法是一个很好的开始。请记住,人们应该建立一个推荐 "系统",而不是一个 "模型"。从长远来看,投资建立一个坚实的基础设施将比制作一个SOTA模型更有帮助。