Big Data Management笔记06:Recommender Systems
Recommender System Model (RS Model)
对于推荐系统(Recommender System,以下简称RS)是什么,我相信不需要做过多介绍。简单的来说,就是系统会根据用户平时的喜好,为他推荐可能感兴趣的东西。也有一些推荐系统,比如Nextflix可以根据用户对电影的评分,来预测他对某一部电影会给出多少分,但它们的本质其实是一样的。
我们可以把RS看做一个函数(Function)
- 输入(Input)
- 用户模型 (User Model):该模型包含比如评分 (Ratings),偏好 (Preference)等信息
- 对象(Items):可能会有对该对象的特征描述 - 输出(Output):相关性得分 (Relevance score),用这个得分进行排名。
最终,我们认为具备高排名的对象与用户的关联性更强,因此将排名较高的对象显示给用户。但在这个过程中,我们也应当谨记,相关性可能取决于具体情况,而且推荐对象本身的特点可能也会很重要。
现在,我们来正式定义RS模型:
X = 用户集合
S = 对象集合
R = 评分集合(是一个有序集合,比如1-5星或是[0, 1]的实数)
定义一个效用函数 (Utility Function) u,它会以 X 和 S 作为输入,并输出评分R,即 X * S -> R,因此我们可以构建一个效用矩阵 (Utility Matrix)
我们要做的就是预测矩阵中空白处的得分。
这里有几个很关键的问题:
- 我们如何得到矩阵中这些“已知的”评分(Ratings)?
- 我们如何从已知评分推断未知的评分?
- 我们如何评估推断方式?
围绕以上问题,我们将逐一介绍。
Gathering Ratings(收集评分)
有好几种收集评分的方式,我们主要分为两类:
- 显式收集(Explicit):要求用户进行评分。但这个方法实际不太可行,因为太叨扰用户
- 隐式收集(Implicit):从用户的行为中学习评分。比如用户经常看某部电影,那么这部电影我们就会给它一个比较高的评分。
显式收集(Explicit) | 隐式收集(Implicit) |
---|---|
+ 可能是最精准的评分 | + 通常由嵌入了推荐系统的网上商店或应用程序收集,例如,当客户购买商品时,许多推荐系统会将此行为解释为好评 |
+ 大多使用5分制或者7分满意度制 | + 隐式评级可以不断收集,不需要用户方面的额外努力 |
- 用户不会总是愿意去给那么多对象评分 | - 不能确定用户行为是否被正确解释,例如,用户可能不喜欢他或她购买的所有书籍; 用户可能还为别人买了一本书 |
Predicting Ratings(预测评分)
推荐系统通过估计相关性来减少信息过载。这里给出一些推荐系统的范例:
图中主要有5种推荐系统:
- 个性化推荐(Personalized recommendations):使用用户的个人资料(Profile)和情境参数(Contextual Parameter)来进行预测,生成推荐列表
- 协同推荐(Collaborative):“告诉我同好中最受欢迎的东西”(该方法会评估用户之间的相关性)
- 基于内容的推荐(Content-based):“向我展示更多我喜欢的东西”(该方法会评估对象之间的相关性)
- 基于知识的推荐(Knowledge-based):“根据我的需求推荐适合的东西”
- 混合推荐(Hybrid):多种机制混合的推荐方法
Content-based Recommendation(基于内容的推荐)
该方法的核心思想是:为用户x推荐与他之前评出高分的对象相似的东西。
为此,我们需要:
- 一些可用对象(Available Items)的信息(“content”)
- 某些用户资料,可以描述用户的喜好(preference)
比如,电影推荐,推荐与用户喜欢的电影有着同样演员、导演、流派的电影。
看到这里,你可能还不明白,所谓的对象“信息”(“Content”)到底是什么,下面我们给出一些简易的介绍。大多数 CB(基于内容)推荐技术都用于推荐文本文档,比如网页或者新闻组消息。同时,对象的信息也可用文本文档来表示,这些文档会有对这些对象的特点的文字描述。这样的描述有结构化 (Structured) 和非结构化 (Unstructured)两种方式。
- 结构化最典型的就是用列表
- 非结构就有很多种类了,任何自由文本描述都有可能
至于 Profile,我们需要两种 Profile,即 Item Profiles 和 User Profiles
- Item Profiles:每一个对象都建立一个 Profile,Profile 是一个特征集合/向量,比如电影,它的 Profile 可能就是 (作者, 标题, 演员, 导演…)。至于如何挑选关键特征,文本挖掘的通常启发式方法是 TF-IDF(术语频率*反向文档频率)
- User Profile:最通常的形式就是已评分 Item Profiles 的加权平均,下图中用 u 表示用户,数字即为用户对 Items 的评分
预测公式(Prediction heuristic):
给定 User Profile x 和 Items Profile i
该公式衡量 x, i 之间的相似度,如果足够相似,则 θ 接近 0(cosθ=1),否则接近 π(cosθ=-1),我们想要取最大值。
基于内容的推荐系统有以下优劣点:
Pros | Cons |
---|---|
不需要其他用户的数据 | 选择合适的特征比较困难 |
能够向口味独特的用户推荐 | 对新用户进行推荐很困难(无法建立User Profile) |
能够推荐一些新的/不太流行的对象 | 过度专业化 (Overspecialization):只专注于该用户,不会推荐他Profile之外的对象 |
可以提供解释 |
User-user Collaborative Filtering(用户与用户的协同推荐)
该方法的核心思想就是:“为我推荐同好喜欢的东西”,这一方法是比较主流的推荐方法。它实质上是一种使用 “群体智慧” 进行推荐的方法。这一方法同时秉持着两个思想,就是用户或显式或隐式地为对象进行了评分,而且现在有同样喜好的人,未来也会有相似的喜好。
简单的来说就是我们考虑一个用户 x,先找到一批和他有相似口味(评分类似)的用户组成一个集合 N,我们根据 N 中用户的评分来预测用户 x 的评分
这里常用的算法是 User-based Nearest-Neighbor Collaborative Filtering(基于用户的最近邻居协同过滤)。该算法的基本思想是:
- 给定一个用户 Alice 以及一个她从未见过的对象i
- 找到一群同好/Nearest Neighbors,同时这些用好过去为 i 进行过评分
- 用这些同好对i的评分来对 Alice 对 i 的评分进行预测(比如可以用均值)
- 对所有 Alice 未见过的对象进行同样操作,找到评分最高的几个进行推荐
这里给出一个例子:
该表格中的?就是我们想要预测的对象。但这里还存在一些问题:
- 我们该如何找到与 Alice 口味相似的用户?
- 我们该找多少用户?
- 我们如何用同好的评分来预测 Alice 评分?
Finding “Similar” Users(找到同好)
我们用 rx 表示Alice的评分向量 rx = [⭐, _, _, ⭐, ⭐⭐⭐]
另一个用户的评分向量为 ry = [⭐, _, ⭐⭐, ⭐⭐, _] 。
回顾一下相似度搜索 LSH 以及机器学习中我们进行相似度计算的方式,这里我们有很多方法可以用,比如 Jaccard Similarity, Cosine Similarity, Pearson correlation coefficient。
这里直接给出计算方式:
下面给出一个具体的例子:
Rating Predictions(评分预测)
在前一步中,我们通过计算评分相似性,找出了最相似的几位其他用户。现在,我们仍用 rx 表示 Alice 的评分向量,用 N 表示已经为 i 评过分的 k 位与 Alice 口味最相似用户的集合。
这里就有多种可能的方式:
最后,我们要注意的是基于用户 (User-based) 的Collaborative Filtering有两种实现方式:
- Memory-based:评分矩阵直接用于查找邻居/做出预测。它不适用于大多数现实情况,因为大型电子商务网站拥有数千万的客户和数百万的商品
- Model-based:基于离线预处理或“模型学习”阶段。在运行时,仅使用学习的模型进行预测,需要定期更新/重新训练模型。这一方法使用多种技术,模型的建立和更新在计算上可能会有比较高的代价
Item-item Collaborative Filtering(对象与对象的协同推荐)
我们目前介绍的都是用户对用户 (User-user) 的协同推荐,现在来看一看对象与对象 (Item-item) 的协同推荐。从名字上就可以看出,该方法的基本思想是 “使用对象(不是用户)之间的相似度来进行预测”,即对于对象 (Item) i 找到其他相似的对象,然后基于对相似对象们的评分 (Ratings),估计用户对 i 的评分。这里的相似度计算和预测函数可以沿用 User-user 中的方法。
这里的 sij 表示对象 i 和 j 的相似度,rxj 表示用户 x 对对象 j 的评分,N(i; x) 一系列与 i 相似且被用户 x 评过分的对象。
这里我们给出两个例子:
第一个例子比较简单。我们想要预测 Alice 对 Item5 的评分,首先,找到与 Item5 相似的 Item,这里找到的是 Item1 和 Item4,然后用 Alice 对 Item1 和 Item4 的评分来预测对 Item5 的评分。
第二个例子比较具体。首先我们有一个评分矩阵,横轴为用户 1-12,纵轴为电影 1-6,评分标准为 5 分制。黄色区域为已知评分,白色区域为未知评分。
现在,我们想预测用户 5 对电影 1 的评分:
同样,我们需要先找到与电影 1 相似的电影。这里我们仍然使用 Cosine Similarity 进行计算,不同的是我们先将每部电影的评分减去它的平均分,然后再计算行与行(每部电影)之间的相似度。
经过计算,我们发现电影 3 和电影 6 与电影 1 相似度最高,因此我们用用户 5 对这两部电影的评分来预测其对电影 1 的评分
具体到应用场景上,User-user 因为是基于相似用户,所以对社交性有更高的要求,适用于新闻推荐场景。因为新闻本身的兴趣点往往是分散的,相比用户对不同新闻的兴趣偏好,新闻的及时性、热点性往往是其更重要的属性,而User-user 正适用于发现热点,以及跟踪热点的趋势。
另一方面,Item-item 更适用于兴趣变化较为稳定的应用。比如在Amazon 的电商场景中,用户在一个时间段内更倾向于寻找一类商品,这时利用物品相似度为其推荐相关物品是契合用户动机的。
在实际情况中,Item-item 协同推荐比 User-user 协同推荐效果更好,因为用户的口味可能是多样的,对象相对简单。
找到 k 个最相似对象/用户的复杂度为 O(|x|),在运行过程中可能过于高昂,可以提前进行预计算,复杂度为 O(|x|2)
最后看一下协同推荐的优缺点:
- Pros:适用于任何种类的对象,无需进行特征选取
- Cons:
1. Cold Start:系统中需要足够的用户以寻求匹配
2. Sparsity:用户/评分矩阵稀疏,很难找到评分相同的用户
3. First rater:无法推荐先前未评分的商品,比如新品或者冷门款
4.Popularity bias:无法将商品推荐给具有独特品味的人,倾向于推荐热门商品
Evaluation(评估)
与机器学习和深度学校类似,我们将划分训练集和测试集,用测试集与评估预测结果
具体评估的方法可以使用 RMSE 以及计算预测准确率等。
BellKor Recommender System
这里介绍一个推荐系统,该推荐系统赢得了 Netflix 竞赛。先大致介绍一下Netflix竞赛:该竞赛中,使用的训练集数据有一亿个评分 (Ratings),48万用户,17770部电影,总计是6年的数据(2000-2005年)。测试集是每个用户的最新评分(总计 280 万个),采用 RMSE 进行评估。参与该竞赛的队伍超过 2700 支,如果能对 Nextflix 的系统有 10% 的性能提升,奖励一百万美元。(Netflix 的系统 RMSE 为 0.9514)
BellKor Recommender System 采用的是数据的多尺度建模,它将数据的顶级“区域”建模与精致的本地视图相结合,该系统的 RMSE 为 0.8563。
其中我们主要关注三个层级:
- Global Effect(全局效应):关注用户/电影的总体偏差
- Factorization(因式分解):关注“局部效应”
- Collaborative filtering(协同推荐):提取局部模式
Modeling Local & Global Effects(局部和全局效应建模)
- Global(全局):
- 电影的平均评分为3.7分
- 《第六感》的评分比均分高0.5分
- 用户 Jack 的评分比平均分低0.2分
- 如此,我们可以预测 “用户Jack为《第六感》的评分可能为4分” - Local(局部:使用协同推荐/最近邻搜索):
- Jack 不喜欢类似的电影《天兆》
- 最终评估,“用户Jack为《第六感》的评分可能为3.8分”
在实际情况中,如果对偏差 (deviations) 进行建模,我们将获得更好的估计。
这里的 bxi 就是我们用全局效应估计出的评分
这里我们 wij 来计算加权总和,以从数据中直接进行评估,而不用使用相似度:
Matrix Factorization(矩阵分解)
我们之前使用权值 wij 得出了一个预测公式,权重 wij 根据其作用得出,不使用任意相似性度量,明确说明相邻电影之间的相互关系。接下来,要关注潜在因子模型(Latent factor model),以提取出 “区域” 相关性( “regional” correlations)。
这里再深入解释一下。我们之前介绍的 User-user 和 Item-item 都属于协同推荐 (Collaborative Filtering)。但是 CF 本身存在一些缺点,那就是它的泛化能力比较弱,换言之,无法将两个物品相似这一信息推广到其他物品的相似性计算之上。
这就会造成一个比较严重的后果,那就是很强的 “头部效应”,容易与大量对象有高相似性;而尾部对象 (冷门对象)因为特征向量比较稀疏,与其他对象的相似性就会比较低,因而很少被推荐。
举一个具体的例子,如下所示由 4 个对象组成的共现矩阵
根据这个矩阵去计算对象之间的相似度的话,可以得到右边的结果。可以看到 A, B, C 之间毫无相似性,但 D 却与 A, B, C 都有相似性。然而 D 的这些相似性仅仅因为它比较热门,很多人都会买。 这就是 CF 最大的缺陷,头部效应明显,无法处理稀疏矩阵。
为解决上述问题,同时增加模型的泛化能力,矩阵分解技术被提出。该方法在协同过滤共现矩阵的基础上,使用更稠密的隐向量表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征,在一定程度上弥补了协同过滤模型处理稀疏矩阵能力不足的问题。
我们这里主要介绍 Matrix Factorization(矩阵分解)方法,它实际上就是一种特殊的对矩阵的奇异值分解。即矩阵 M = U · Σ · VT。在在该模型中中,我们计算 𝑈,𝑉 和 Σ(借助一些线性代数软件),但通过取 𝑈 和 𝑉T 的前三列,仅保留了三个最重要的特征。
在本模型中,我们只用2个矩阵的积来表示原矩阵。即 R ≈ Q · PT
这里的 factors 是一个超参数(Hyper Parameter)(隐向量的维度)由设计者/用户决定,在这个例子中我们设为 3,在实际中,factor 数量越大,隐向量表达能力更强,效果会越好,但也会增大计算量,降低泛化性,因此这需要权衡。在该方法中,我们希望重构出的矩阵中 “已知” 评分的误差尽可能小,而未知评分的部分我们暂时忽略。比如,评分矩阵 [1][1] = 1,Q 与 PT 相乘计算得出一个评分为 0.85,误差为 0.15
接下来,我们看如何估计用户 x 对项目 i 的缺失评分。比如我们想知道用户 5 对对象 2 的评分,只需要用对应的行列相乘即可得到结果。
我们之所以说该方法中的 SVD 是特殊版本,就是因为一般的 SVD 当有缺失项目时,无法定义。这里有多种方式找到 P 和 Q,一般比较常用的是最小化误差:
注意,我们不要求 P,Q 的列为正交/单位长度,P,Q 将用户/电影映射到潜在空间。
该目标函数的目的是让原始评分 rui 与用户向量和物品向量之积 qi Tpu 的差尽量小,这样才能最大限度地保存共现矩阵的原始信息。这里的 K 是所有用户评分样本的集合。为了减少过拟合现象,加入正则化项后的目标函数如下所示:
使用该目标函数可使用梯度下降法 (Gradient Descent) 来进行矩阵分解。
优点 | 缺点 |
---|---|
泛化能力强。一定程度解决了矩阵稀疏问题 | 矩阵分解同样不方便加入用户、物品和上下文相关的特征,这使得矩阵分解丧失了利用很多有效信息的机会,同时在缺乏用户历史行为时,无法进行有效的推荐 |
空间复杂度降低。不再需要维护一整个用户-对象共现矩阵,复杂度从 n2 降为 (n+m)*k | |
更好的扩展性和灵活性。矩阵分解的最终产出是用户和物品隐向量, |