chenchuang 2019-06-04
在过去的几十年里,随着Youtube、Amazon、Netflix等网络服务的兴起,推荐系统在我们的生活中占据了越来越多的位置。从电子商务(向买家推荐他们感兴趣的文章)到在线广告(向用户推荐他们喜欢的内容,匹配他们的喜好),推荐系统在今天的日常中是不可避免的。
一般来说,推荐系统是一种算法,目的是向用户推荐相关的商品(如要看的电影、要阅读的文本、要购买的产品等)。
在某些行业中,预测系统非常重要,因为当它们有效时,可以产生巨大的收入,或者是在竞争对手中脱颖而出的一种方式。作为推荐系统重要性的一个证明,我们可以提一下,几年前,Netflix组织了一个挑战(“Netflix奖”),其目标是制作一个比自己的算法性能更好的推荐系统,奖金为100万美元。
在本文中,我们将讨论推荐系统的不同模式。我们将分别介绍它们的工作原理,描述它们的理论基础,并讨论它们的优缺点。
在第一部分中,我们将概述推荐系统的两个主要模式:协同和基于内容的方法。接下来的两节将描述协同过滤的各种方法,例如user-user,item-item和矩阵分解。下一节将专门讨论基于内容的方法及其工作原理。最后,我们将讨论如何评价一个推荐系统。
推荐系统的目的是向用户推荐相关的项(items)。为了完成这一任务,存在两大类方法:协同过滤方法和基于内容的方法。
协同过滤方法
推荐系统的协同方法仅仅是基于users和items之间过去的交互记录,以产生新的推荐。这些交互存储在所谓的“user-item交互矩阵”中。
user-item交互矩阵的图示
其主要思想是,这些过去的user-item交互足以检测相似的users/items,并基于这些估计的接近性做出预测。
协同过滤算法类别分为两个子类别,通常称为memory based方法和Model based 方法。Memory based方法直接与记录的交互的值一起使用,假设没有模型,并且基本上基于最近邻研究(例如,从感兴趣的用户中找到最接近的用户并且建议这些邻居中最受欢迎的项目)。Model based方法假设一个潜在的“生成”模型,它解释user-item交互并尝试发现它以进行新的预测。
协同过滤方法模式概述
协同方法的主要优点是它们不需要有关items或users的信息,因此,它们可以在许多情况下使用。此外,越多的用户与项交互,新的推荐就越准确:对于一组固定的用户和项,随着时间的推移记录的新交互带来了新的信息并使系统越来越有效。
但是,由于它只考虑过去的交互来提出建议,因此协同过滤受到“cold start problem”的困扰:无法向新用户推荐任何内容或向任何用户推荐新项。这个缺点可以通过不同的方式解决:向新用户推荐随机项或向随机用户推荐新项(随机策略),向新用户推荐热门项或向最活跃用户推荐新项(最大期望策略),推荐一组各种项给新用户或新项到一组各种用户(探索性策略),或者使用非协同方法用于用户或项。
在以下部分中,我们将主要介绍三种经典的协同过滤方法:两种Model based方法(user-user和item-item)和一种Model based方法(矩阵分解)。
基于内容的方法
与仅依赖于用户 - 项交互的协同方法不同,基于内容的方法使用关于users/items的附加信息。如果我们考虑电影推荐系统的例子,这些附加信息可以是,例如,年龄,性别,工作或用户的任何其他个人信息,以及类别,主要参与者,持续时间或其他特征对于电影(items)。
然后,基于内容的方法的想法是尝试基于可用的“特征”来构建模型,该模型解释观察到的用户 - 项交互。仍然考虑到用户和电影,例如,建立这样一个模型,年轻女性倾向于对一些电影评价更好,年轻男性倾向于对其他电影评价更好。如果我们设法得到这样的模型,那么为用户做出新的预测是相当容易的:我们只需要查看该用户的个人资料(年龄、性别、……),然后根据这些信息,确定要推荐的相关电影。
基于内容的方法概述
与协同方法相比,基于内容的方法受cold start problem的影响要小得多:新用户或项可以通过其特征(内容)来描述,因此可以对这些新实体进行相关建议。从逻辑上讲,只有新用户或具有以前未见过的特性的项才会受到这种缺陷的影响,但是一旦系统足够成熟,这种情况几乎不会发生。
在本文后面,我们将进一步讨论基于内容的方法,并根据我们的问题,可以使用各种分类或回归模型,从非常简单到更复杂的模型。
模型,偏差和方差
让我们看一下建模水平对偏差和方差的影响。
在memory based协同方法中,没有假设潜在模型。这些算法直接处理用户-项交互:例如,用户由他们与项的交互表示,并使用对这些表示的最近邻搜索来生成建议。由于没有潜在模型的假设,这些方法理论上具有低偏差但高方差。
在model based协同方法中,假设了一些潜在的交互模型。该模型经过训练,能够根据用户和项的自身表示重构用户-项交互值。然后可以根据这个模型提出新的建议。该模型所提取的用户和项的潜在表示具有难以被人类理解的数学意义。由于假设用户-项交互是一个(相当自由的)模型,这种方法理论上比没有潜在模型的方法具有更高的偏差,但方差更小。
在基于内容的方法中,还假设了一些潜在的交互模型。在这里,模型提供了定义用户/项表示的内容:例如,用户由给定的特性表示,我们尝试为每个项建模,以确定喜欢或不喜欢该项的用户概要文件的类型。这里,对于基于模型的协同方法,假设为用户-项交互模型。然而,这个模型有更多的约束(因为给出了用户/项的表示),因此,该方法倾向于有最高的偏差,但方差最低。
不同类型的推荐系统算法的总结
user-user和item-item的主要特征是它们仅使用来自user-item交互矩阵的信息,并且他们没有假设任何模型来产生新的推荐。
user-user
为了向用户提出新的推荐,user-user方法大致尝试使用最相似的“interactions profile”(最近邻)来识别用户,以便推荐这些邻居中最流行的项(并且对我们的用户来说是“新”的)。这种方法被称为“以用户为中心”,因为它根据用户与项的交互来表示用户,并评估用户之间的距离。
假设我们要为给定的用户提供建议。首先,每个用户都可以用它与不同项的交互向量(交互矩阵中的“its line”)表示。然后,我们可以计算感兴趣的用户与其他用户之间的某种“相似性”。相似度测度是指在同一项上具有相似交互的两个用户应该被认为是接近的。一旦计算出每个用户的相似度,我们就可以将k-近邻保留给用户,然后在其中推荐最受欢迎的项(只查看参考用户尚未交互的项)。
请注意,在计算用户之间的相似性时,应该仔细考虑“公共交互”的数量(两个用户已经考虑过多少项?)。如果两个用户以相同的方式与许多常见项进行交互(类似评级,类似时间悬停......),我们认为两个用户是相似的。
user-user方法
Item-item
要向用户提出新的建议,item-item方法的思想是找到与用户已经“positively”交互的项类似的项。如果大多数与它们交互的用户都以类似的方式进行交互,那么这两个项就被认为是相似的。这种方法被称为“以item为中心”,因为它根据用户与项的交互来表示项,并评估这些项之间的距离。
假设我们想为给定用户提出建议。首先,我们考虑该用户最喜欢的项,并通过其与每个用户的交互向量(在交互矩阵中的“its column”)来表示它(作为所有其他项)。然后,我们可以计算“最佳项”和所有其他项之间的相似性。一旦计算出相似性,我们就可以将k-最近邻保持为我们感兴趣的用户所选的“最佳项”,并推荐这些项。
请注意,为了获得更多相关建议,我们可以完成这项工作,而不仅仅是用户最喜欢的项,而是考虑n个首选项。在这种情况下,我们可以推荐接近这些首选项的项。
item-item方法的插图
比较user-user和item-item
user-user户方法基于类似用户在与项的交互方面的研究。通常,每个用户只与一些项进行交互,这使得该方法对任何记录的交互(高方差)非常敏感。另一方面,由于最终建议仅基于与我们感兴趣的用户类似的用户记录的交互,我们获得更加个性化的结果(低偏差)。
相反,item-item方法基于user-item交互方面的类似项的研究。一般来说,很多用户已经与一个项进行了交互,这使得该方法对任何记录的交互都非常敏感(高方差)。另一方面,由于最终的推荐仅仅是基于为与我们感兴趣的用户相似的用户所记录的交互,我们获得了更加个性化的结果(低偏差)。
item-item和user-item方法之间差异的插图
复杂性和副作用
memory based协同过滤的最大缺陷之一是它们不容易扩展:为大型系统生成新建议可能非常耗时。实际上,对于具有数百万用户和数百万项的系统,如果不仔细设计,最近邻搜索步骤可能变得难以处理(KNN算法的复杂度为O(ndk),其中n个用户,d个项和k个被考虑的neighbours数量)。为了使计算对于大型系统更易处理,我们既可以在设计算法时利用交互矩阵的稀疏性,也可以使用近似最近邻法(ANN)。
在大多数推荐算法中,必须非常小心地避免对流行项产生“rich-get-richer”的效果,并避免让用户陷入所谓的“信息限制区域”。换句话说,我们不希望我们的系统倾向于推荐越来越多的受欢迎的项,我们也不希望我们的用户只收到那些非常接近他们已经喜欢的项的推荐,而没有机会去了解他们可能喜欢的新项。正如我们提到的,这些问题可能出现在大多数推荐算法中,尤其是memory based协同算法。
Model based协同方法仅依赖于user- item交互信息,并假设潜在模型应该解释这些交互。例如,矩阵因子分解算法在于将巨大且稀疏的user-item交互矩阵分解为两个较小且密集的矩阵的乘积:一个user-factor矩阵(包含用户表示)乘以一个factor-item矩阵(包含items表示)。
矩阵分解
矩阵分解背后的主要假设是存在一个相当低维的特征潜在空间,在这个空间中我们可以同时表示用户和项,这样用户和项之间的交互就可以通过计算该空间中相应密集向量的点积来得到。
例如,假设我们有一个用户电影评级矩阵。为了模拟用户和电影之间的互动,我们可以假设:
但是,我们不希望将这些特征显式地提供给我们的模型(因为它可以用于基于内容的方法,稍后我们将对此进行描述)。相反,我们更愿意让系统自己发现这些有用的特征,并对用户和项进行自己的表示。由于这些特征是学习的,而不是给定的,单独提取的特征具有数学意义,但没有直观的解释。然而,最终从这种类型的算法中出现的结构与人类可以想到的直观分解非常接近并不罕见。事实上,这种因素分解的结果是,在偏好方面的亲密用户,以及在特征方面的亲密项,最终在潜在空间中具有紧密的表示。
矩阵分解方法
矩阵分解的数学
在本小节中,我们将给出矩阵分解的简单数学概述。更具体地说,我们描述了一种基于梯度下降的经典迭代方法,这种方法可以在不同时加载计算机内存中的所有数据的情况下,获得非常大的矩阵的因子分解。
让我们考虑一个评级的交互矩阵M (nxm),其中每个用户只对一些项进行了评级(大多数交互设置为None以表示没有评级)。我们要因式分解这个矩阵
其中X为“用户矩阵”(nxl),其行表示n个用户;Y为“项矩阵”(mxl),其行表示m个项:
这里l是表示用户和项的潜在空间的维数。因此,我们搜索矩阵X和Y,它们的点积最接近现有的相互作用。我们想找到X和Y,使“评级重建误差”最小化
添加正则化因子并除以2,我们得到
然后可以在梯度下降优化过程之后获得矩阵X和Y。首先,不必在每一步中对所有对计算梯度,我们只能考虑这些对的子集,以便我们“按批次”优化我们的目标函数。其次,X和Y中的值不必同时更新,并且梯度下降可以在每个步骤交替地在X和Y上完成(这样做,我们认为一个矩阵是固定的,并在下一次迭代执行相反的操作之前对另一个矩阵进行优化)。
一旦矩阵被分解,我们就没有那么多信息可以处理来做出新的推荐:我们可以简单地用用户向量乘以任何项向量来估计相应的评级。注意,我们也可以使用user-user和item-item方法来表示用户和项:(近似)最近邻的研究不会在巨大的稀疏向量上进行,而是在小的密集向量上进行,这使得一些近似技术更容易处理。
矩阵分解的扩展
我们最终可以注意到,这种基本因子分解的概念可以扩展到更复杂的模型。我们可以想到的第一个直接适应涉及布尔交互。如果我们想要重建布尔交互,那么简单的点积不能很好地适应。但是,如果我们在该点积之上添加逻辑函数,我们得到的模型在[0,1]中取其值,因此更适合该问题。在这种情况下,要优化的模型是
用f(.)表示逻辑函数。在复杂的推荐系统中,通常使用更深层次的神经网络模型来实现接近最优状态的性能。
在前两节中,我们主要讨论了user-user,item-item和矩阵分解方法。这些方法仅考虑user-item交互矩阵,因此属于协同过滤模式。现在让我们描述基于内容的模式。
基于内容的方法概念
在基于内容的方法中,推荐问题被划分为分类问题(预测用户是否“喜欢”某个项)或回归问题(预测用户对某个项的评分)。在这两种情况下,我们都将设置一个模型,该模型将基于我们可以使用的用户/项特征。
如果我们的分类(或回归)基于用户特征,方法是以项为中心的:建模,优化和计算可以“按项”完成。在这种情况下,我们根据用户特征逐个构建和学习一个模型,试图回答“每个用户喜欢这个项目的概率是多少?”(对于回归时“每个用户给这个项的评分是多少?“)。与每个项相关联的模型自然是针对与该项相关的数据进行训练的,通常,由于许多用户都与该项进行了交互,因此会生成非常健壮的模型。然而,考虑学习模型的交互来自每个用户,即使这些用户具有相似的特征,他们的首选项也可能不同。这意味着,即使这个方法更健壮,它也可以被认为比下面的以用户为中心的方法更不个性化(更有偏见)。
如果我们使用项特征,则该方法以用户为中心:建模,优化和计算可以“由用户”完成。然后,我们根据项特征训练一个模型,这些项特征试图回答“此用户喜欢每个项的概率是多少?”(或“该用户对每个项目给出的比率是多少?”,用于回归)。然后,我们可以将模型附加到对其数据进行训练的每个用户:获得的模型比其以项为中心的对应物更加个性化,因为它仅考虑来自所考虑的用户的交互。然而,大多数时候用户与相对较少的项进行交互,因此,我们获得的模型远不如以项为中心的模型。
以项为中心和以用户为中心的内容方法之间的差异
我们还可以注意到,根据表示关系的复杂性,我们构建的模型可以或多或少地复杂,从基本模型到深度神经网络。基于内容的方法也可以既不是以用户为中心的,也不是以项为中心的:用户和项的信息都可以用于我们的模型,例如,通过叠加两个特征向量并使它们经过神经网络体系结构。
以项为中心的贝叶斯分类器
让我们首先考虑以项为中心的分类的情况:对于我们想要训练贝叶斯分类器的每个项,该分类器将用户特征作为输入并输出“喜欢”或“不喜欢”。因此,要实现分类任务,我们要计算
具有给定特征的用户与所考虑的项目相似的概率与其不喜欢它的概率之间的比率。定义我们的分类规则(具有简单阈值)的条件概率的比率可以在贝叶斯公式之后表示
其中
是根据数据计算的先验
概率假设服从高斯分布,参数也由数据确定。对于这两种似然分布的协方差矩阵可以做各种假设,从而得到各种众所周知的模型(二次判别分析、线性判别分析、朴素贝叶斯分类器)。我们可以再次强调,在这里,似然参数只能根据与所考虑的项相关的数据(交互)进行估计。
基于项中心内容的贝叶斯分类器
以用户为中心的线性回归
现在让我们考虑以用户为中心的回归的情况:对于每个用户,我们要训练一个简单的线性回归,将项特征作为输入并输出该项的评级。我们仍然将M表示为user-item交互矩阵,我们将矩阵X行向量堆叠成表示要学习的用户系数,并且我们将矩阵Y行向量堆叠成表示给定的项特征。然后,对于给定的用户i,我们通过解决以下优化问题来学习X_i中的系数
第一个总和只是涉及用户i的(用户,项)对。我们可以观察到,如果我们同时为所有用户解决这个问题,那么当我们保持项固定时,优化问题与我们在“alternated矩阵因子分解”中解决的问题完全相同。这一观察强调了我们在第一部分中提到的联系:基于模型的协同过滤方法(例如矩阵因子分解)和基于内容的方法都假定user-item交互的潜在模型,但基于模型的协同方法必须学习两个用户的潜在表示和项,而基于内容的方法为用户/项定义的特征构建模型。
基于用户的内容回归
对于任何机器学习算法,我们需要能够评估我们的推荐系统的性能,以确定哪种算法符合我们的最佳情况。推荐系统的评估方法主要可分为两组:基于明确定义的度量的评估和主要基于人为判断和满意度估计的评估。
基于度量的评估
如果我们的推荐系统基于输出数值(例如评级预测或匹配概率)的模型,我们可以使用误差测量度量以非常经典的方式评估这些输出的质量,例如均方误差(MSE) )。在这种情况下,模型仅在可用交互的一部分上进行训练,并在剩余的交互中进行测试。
如果我们的推荐系统基于预测数值的模型,我们也可以用经典的阈值方法对这些值进行二值化(阈值以上的值为正,以下值为负),并以“分类”的方式对模型进行评估。由于user-item过去交互的数据集也是二值的(或者可以通过阈值化进行二值化),因此我们可以在不用于训练的交互测试数据集上评估模型的二值化输出的准确度(以及精度和召回率)。
如果我们现在考虑一个不基于数值的推荐系统,并且只返回推荐列表(例如基于knn方法的user-user或item-item),我们仍然可以定义精度,如度量估计真正适合我们用户的推荐商品的比例。为了估计这种精确度,我们无法考虑用户未与之交互过的推荐项目,我们只应考虑测试数据集中我们收到用户反馈的项。
基于人的评估
在设计一个推荐系统的时候,我们不仅可以获得产生我们非常确定的推荐的模型,而且我们还可以期待其他一些好的特性,比如推荐的多样性和可解释性。
正如协同部分所述,我们绝对希望避免让用户陷入我们之前称之为信息限制的区域。“serendipity”的概念通常用于表达模型是否具有创建这样一个限制区域的趋势(建议的多样性)。可以通过计算推荐项目之间的距离来估计的意外发现不应该太低,因为它会产生限制区域,但也不应该太高,因为这意味着我们在制作时没有充分考虑到用户的兴趣建议。因此,为了在建议的选择中带来多样性,我们希望推荐既适合我们用户又非常相似的项目。
可解释性是推荐算法成功的另一个关键。事实上,已经证明,如果用户不理解为什么他们被推荐为特定的项目,他们往往会对推荐系统失去信心。因此,如果我们设计了一个清晰可解释的模型,我们可以在提出建议时添加一个小解释,说明为什么推荐了某个项目(“喜欢这个项的人也喜欢这个”,“你可能对这个感兴趣”,……)。
最后,除了多样性和可解释性本质上难以评估之外,我们还可以注意到,评估不属于测试数据集的建议的质量也很困难:如何知道新的推荐在实际推荐给我们的用户之前是否相关?
我们应该注意到,在这篇文章中我们没有讨论过混合方法。混合方法的组合主要有两种形式:我们可以独立训练两个模型(一个协同过滤模型和一个基于内容的模型)并结合他们的建议或直接建立统一两种方法的单一模型(通常是神经网络)通过使用先前信息(关于用户/项)以及“协同”交互信息作为输入。